diff --git a/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch b/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch deleted file mode 100644 index eabacbb..0000000 --- a/0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 71cd021b74a7094b5186a42bfe59a35e2fa66018 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Wed, 5 Sep 2012 16:18:16 -0500 -Subject: iscsid: fix iscsid segfault during qla4xxx login - -If the kernel sends multiple ISCSI_KEVENT_CONN_LOGIN_STATE -events for the same login event iscsid will segault. - -When we get a conn error we will set the r_stage to reopen, then when -session_conn_process_login handles the first login event we set the r_stage -to R_STAGE_NO_CHANGE. But then it looks like if we get a second login event -r_stage is no_change and session_conn_process_login will run again and -call mgmt_ipc_write_rsp on a bad qtask. ---- - usr/initiator.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/usr/initiator.c b/usr/initiator.c -index 79ca32c..d475358 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -993,7 +993,7 @@ static void session_scan_host(struct iscsi_session *session, int hostno, - exit(0); - } else if (pid > 0) { - reap_inc(); -- if (qtask) { -+ if (qtask && qtask->mgmt_ipc_fd >= 0) { - close(qtask->mgmt_ipc_fd); - free(qtask); - } -@@ -1618,6 +1618,9 @@ static void session_conn_process_login(void *data) - if (state == ISCSI_CONN_STATE_FREE) - goto failed_login; - -+ if (conn->state == ISCSI_CONN_STATE_LOGGED_IN) -+ return; -+ - conn->state = ISCSI_CONN_STATE_LOGGED_IN; - /* - * ok we were in_login and now we got the notification that we are --- -1.7.11.7 - diff --git a/0001-sync-to-2.0.873-134-g6aa2c9b.patch b/0001-sync-to-2.0.873-134-g6aa2c9b.patch new file mode 100644 index 0000000..24147ed --- /dev/null +++ b/0001-sync-to-2.0.873-134-g6aa2c9b.patch @@ -0,0 +1,40803 @@ +From 8353acb54ebc03da23b5fc904ff58513bd90a8b3 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Tue, 9 Jun 2015 10:09:25 -0700 +Subject: [PATCH] sync to 2.0.873-134-g6aa2c9b + +71cd021 iscsid: fix iscsid segfault during qla4xxx login +f0a8c95 ISCSISTART: Bring up the corresponding network interface for iboot +d81fd49 iscsi tools: fix compile error when OFFLOAD_BOOT_SUPPORT defined +13d08e7 ISCSID: Passing more net params from ibft to iface +9dd181d iscsi tools: Convert '-r' argument to an integer before checking if it is a path +97db3db Update README for removal of DBM requirement +2d086a8 iscsid,iscsiadm: fix abstract socket length in bind() call +5d0e19f iscsid: implement systemd-compatible socket activation +c34e0bd iscsid: add example unit files for systemd +a7afdf4 iscsi tools: fix get_random_bytes error handling +d571cdf ISCSID: Added socket communication hooks for uip +b255332 ISCSID: Modified the Makefile for iscsiuio compilation +fcab9b7 ISCSID: Added iscsiuio source to the open-iscsi pkg +42fa258 From: Adheer Chandravanshi +d64f50d Manpage changes for flashnode submode support for host mode. +3584b98 README changes for flashnode submode support for host mode. +fdac390 PATCH 1 of 1] correctly check return value of nice() +6674fd4 Allow firmware mode to use debug flag +fc2a8e9 iscsiadm: return error when login fails +8b33814 iscsiadm: bind ifaces to portals found using isns +ff4b2c1 iscsiadm: Check for mode is not required when creating params list +83d31c7 iscsid/iscsiadm: add support for emulex one connect storage +9a2bc38 ISCSIUIO: Updated iscsiuio to version 0.7.8.1b for perf optimization +d9e26d3 Fix discovery error return without return value +b0ba4d6 iscsid: Fix strlen parameter +3d7df63 iscsiuio: Change socket bind to use the same struct size as iscsid +bf39941 [PATCH] Make rescan run in parallel +3256b93 iscsiadm: Correctly check for invalid hostno and flashnode index +181af9a iscsi tools: Print additional session info for flashnode session +82c8533 iscsi tools: sync iscsi_if.h with kernel space +5992173 [PATCH v5 1/3] ISCSISTART: Saved ibft boot info to the session +487c312 ISCSID: Added the extraction of the session boot info +3b4b450 ISCSID: Added iface content override fix +1fa1b51 iscsi tools: Bug fix on IPC address copy (version 2) +360a40f flashnode: Add support to set ISCSI_FLASHNODE_CHAP_OUT_IDX param +b3913c5 iscsiadm: Use '-x' option instead of '-v' to specify chap_tbl_idx +0c4022d iscsiadm: Man page changes to use -x option for chap_tbl_idx +38b2993 README changes to use long option --index instead of --flashnode_idx +062718a iscsiadm: Add support to set CHAP entry using host chap mode +65ce3a2 iscsi tools: Correctly get username_in and password_in flashnode params +f1ed1f7 README changes for adding support to set CHAP entry +0a95bc4 iscsi tools: Setup iface conf file with all iface attrs exported in sysfs +026c8d7 iscsi_if.h: Remove numbers used for network parameter settings +d1e07af iscsi_if.h: Additional parameters for network param settings +466efaa iscsi tools: Use macro to set IPv4/IPv6 IP addresses +2220ee4 iscsi tools: Use single function to enable/disable network parameters +d8991c9 iscsi tools: Use single function to set integer network parameters +da404f2 iscsi tools: Ignore network parameter if not enabled/disabled +66d9f12 iscsi tools: Additional parameters for network settings +9260457 iscsi tools: iface params should be updated for node_rec as well. +75ee9d0 iscsi tools: Let default type of iface be ipv4 +4a5e9e2 iscsi tools: Show iface params based on iface type +072d8b9 iscsiadm: Added document for description of iface attributes +fe66238 iscsi_tool: Add offload host statistics support. +d1e8e68 README: Updated for host statistics. +4a3076b iscsiadm.8: Updated man page for host statistics. +77245b9 ISCSIUIO: Added tx doorbell override mechanism +df68365 ISCSIUIO: Added fix for the iface.subnet_mask decoding for IPv6 +817a083 ISCSIUIO: Added fix for the ARP cache flush mechanism +eb1d275 ISCSIUIO: Updated RELEASE note and version +9bd6fba ISCSIUIO: Updated the configure file to reflect the new version +505ed9d iscsi tools: Fix the iscsiadm help options for host mode +bd91b81 Man page correction for host mode options of iscsiadm +5f2f3d7 ISCSIUIO: Removed the auto-generated COPYING file +2b4a011 iscsiuio: Remove autogenerated files from tracking +91cc9c3 iscsiuio: Update automake files +c8113ad iscsiuio: Add .gitignore files +a877c9d iscsiuio: fix compilation +9ef01a7 Add missing DESTDIR +ea05be3 iscsi tools: set non negotiated params early. +f2ecc22 iscsiadm: Fix the hostno check for stats submode of host mode +b152630 iscsiadm: Fix the compile time warning +fabe160 ISCSIUIO: Fixed a pthread resc leak from excessive session recovery +36a8b41 iscsid: Fix handling of iscsi async events. +5f28b8b be2iscsi: Fix MaxXmitDataLenght of the driver. +e696b94 Fix StatSN in Open-iSCSI Stack. +c0e509e iscsid: retry login for ISCSI_ERR_HOST_NOT_FOUND +134f8dc iscsid: Fix double close of mgmt ipc fd +5762ac0 iscsiadm: Initialize param_count in set_host_chap_info +33cb16e iscsiuio: Rebranding iscsiuio +96eaaac iscsiadm : make iface.ipaddress optional in iface configs for transports that don't have a hard requirement on it. +21a7923 Remove unused variable 'path' +78e24f5 Parse 'origin' value from iBFT +c9d830b isns: Add docs for deregistering discovery domains. +147db3c Added new utility script to generate initiator name +76a441b Added new util script to aid in CNA setup +f6d7d30 iscsid: don't round up when modifying padding len +06309ad Fix build warnings for unused variables +9c5be24 Fix warning about possibly-uninitialized variable +e253c9a Fix bad sizeof in memset +6f6f2a0 Fix missing header +769b480 iscsiuio: Fix warning about non-matching types +d58864c iscsiuio: Fix strict-aliasing warning with struct mac_address +f7d4c02 iscsiuio: Resolve strict aliasing issue in iscsiuio/src/unix/nic.c +cd3d245 iscsiuio: Fix aliasing issue with IPV6_IS_ADDR_UNSPECIFIED +e2c9c58 iscsiuio: Use attribute(unused) for variables that are unused but needed +0a253d7 iscsiuio: Use attribute(unused) for *icmpv6_hdr +366f2f8 iscsiuio: Change nic_disable to return void +957ce0b iscsiuio: Remove set but unused variables +0fbf555 iscsiuio: Check return value from nic_queue_tx_packet +a125761 Code cleanup: no functional changes +4959a89 Represent DHCP "origin" as an enum, not a string. +defd640 fwparam_ibft: Check iBFT target and NIC flags +b8bb7ba Allow modifications for iface.gateway and iface.subnet_mask +6c14016 actor: Mark actor_check static +22c5038 actor: simplify actor_check +5e7f696 actor: s/ACTOR_TICKS/actor_jiffies/ +86b919e actor: Remove ACTOR_TICKS_10MS() +4190b2d actor: Unobfuscate ACTOR_MAX_LOOPS +4b5c01e actor: Simplify actor_poll a little +9981b06 Remove actor_init and rename actor_new to actor_init +6385e2d Make running actors event-driven +052fa50 Wake up to reap children +2966a92 fix regression in iscsi_tcp iface binding +51c0b6e Supply strings for newly-added error numbers +892ddaf Allow setting host params to return EAGAIN errors. +c7fbcd7 guard against NULL ptr during discovery from unexpected event +7acba59 add discovery as a valid mode in iscsiadm.8 +bc9b5c3 iscsid: fix order of setting uid/gid and drop supplementary groups +40616d1 iscsiuio CFLAGS fixes +32e2349 iscsiuio systemd socket activation support +def3161 Fix incorrect list operation leading to out-of-order items on pend_list +9297a47 Prevent spinning over poll() when reconnecting to an inaccessible target +c02b558 Add some more debug logging to actor.c +63d086c iscsid safe session logout +006270c iscsid: don't re-read config file for every session logout +a277d31 Remove duplicate newlines in log messages. +8da14e6 Fix iBFT target flags check. +3d04497 Fix small typo in iscsid.conf +4a4498b buildsys: make 'make clean' idempotent +da2473d buildsys: respect CFLAGS and LDFLAGS from the outside +312e904 Remove outdated Debian packaging code. +df602f0 Spelling and escaping error fixes. +6aa2c9b Reformat man page synopsis sections +--- + Makefile | 39 +- + README | 142 +- + debian/README.Debian | 44 - + debian/changelog | 6 - + debian/compat | 1 - + debian/control | 27 - + debian/control.modules.in | 20 - + debian/copyright | 12 - + debian/dirs | 3 - + debian/docs | 4 - + debian/postinst.modules.in | 11 - + debian/rules | 152 -- + debian/rules.modules | 39 - + doc/iscsi_discovery.8 | 12 +- + doc/iscsiadm.8 | 210 +- + etc/iscsid.conf | 5 +- + etc/systemd/iscsid.service | 13 + + etc/systemd/iscsid.socket | 9 + + include/fw_context.h | 15 + + include/iscsi_err.h | 4 + + include/iscsi_if.h | 468 ++++- + include/iscsi_proto.h | 1 + + include/list.h | 6 + + iscsiuio/.gitignore | 25 + + iscsiuio/AUTHORS | 0 + iscsiuio/ChangeLog | 7 + + iscsiuio/INSTALL | 290 +++ + iscsiuio/Makefile.am | 25 + + iscsiuio/NEWS | 0 + iscsiuio/README | 224 ++ + iscsiuio/RELEASE.TXT | 2032 ++++++++++++++++++ + iscsiuio/configure.ac | 78 + + iscsiuio/docs/iscsiuio.8 | 89 + + iscsiuio/iscsiuiolog | 10 + + iscsiuio/src/Makefile.am | 1 + + iscsiuio/src/README | 13 + + iscsiuio/src/apps/Makefile.am | 1 + + iscsiuio/src/apps/README | 2 + + iscsiuio/src/apps/brcm-iscsi/Makefile.am | 13 + + iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi | 1 + + iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c | 89 + + iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h | 91 + + iscsiuio/src/apps/dhcpc/Makefile.am | 13 + + iscsiuio/src/apps/dhcpc/Makefile.dhcpc | 1 + + iscsiuio/src/apps/dhcpc/dhcpc.c | 417 ++++ + iscsiuio/src/apps/dhcpc/dhcpc.h | 86 + + iscsiuio/src/apps/dhcpc/dhcpv6.c | 512 +++++ + iscsiuio/src/apps/dhcpc/dhcpv6.h | 253 +++ + iscsiuio/src/uip-1.0-changelog.txt | 98 + + iscsiuio/src/uip/Makefile.am | 18 + + iscsiuio/src/uip/Makefile.include | 47 + + iscsiuio/src/uip/clock.h | 87 + + iscsiuio/src/uip/debug.h | 13 + + iscsiuio/src/uip/icmpv6.h | 302 +++ + iscsiuio/src/uip/ipv6.c | 1297 ++++++++++++ + iscsiuio/src/uip/ipv6.h | 332 +++ + iscsiuio/src/uip/ipv6_ndpc.c | 427 ++++ + iscsiuio/src/uip/ipv6_ndpc.h | 98 + + iscsiuio/src/uip/ipv6_pkt.h | 50 + + iscsiuio/src/uip/lc-addrlabels.h | 80 + + iscsiuio/src/uip/lc-switch.h | 73 + + iscsiuio/src/uip/lc.h | 130 ++ + iscsiuio/src/uip/psock.c | 339 +++ + iscsiuio/src/uip/psock.h | 383 ++++ + iscsiuio/src/uip/pt.h | 322 +++ + iscsiuio/src/uip/timer.c | 127 ++ + iscsiuio/src/uip/timer.h | 84 + + iscsiuio/src/uip/uip-neighbor.c | 219 ++ + iscsiuio/src/uip/uip-neighbor.h | 105 + + iscsiuio/src/uip/uip.c | 2405 ++++++++++++++++++++++ + iscsiuio/src/uip/uip.h | 1569 ++++++++++++++ + iscsiuio/src/uip/uip_arch.h | 137 ++ + iscsiuio/src/uip/uip_arp.c | 479 +++++ + iscsiuio/src/uip/uip_arp.h | 197 ++ + iscsiuio/src/uip/uip_eth.c | 50 + + iscsiuio/src/uip/uip_eth.h | 43 + + iscsiuio/src/uip/uipopt.h | 536 +++++ + iscsiuio/src/unix/.gitignore | 2 + + iscsiuio/src/unix/Makefile.am | 39 + + iscsiuio/src/unix/clock-arch.c | 54 + + iscsiuio/src/unix/clock-arch.h | 39 + + iscsiuio/src/unix/iscsid_ipc.c | 1075 ++++++++++ + iscsiuio/src/unix/iscsid_ipc.h | 52 + + iscsiuio/src/unix/libs/Makefile.am | 13 + + iscsiuio/src/unix/libs/bnx2.c | 1165 +++++++++++ + iscsiuio/src/unix/libs/bnx2.h | 304 +++ + iscsiuio/src/unix/libs/bnx2x.c | 1634 +++++++++++++++ + iscsiuio/src/unix/libs/bnx2x.h | 712 +++++++ + iscsiuio/src/unix/libs/cnic.c | 662 ++++++ + iscsiuio/src/unix/libs/cnic.h | 55 + + iscsiuio/src/unix/logger.c | 181 ++ + iscsiuio/src/unix/logger.h | 129 ++ + iscsiuio/src/unix/main.c | 399 ++++ + iscsiuio/src/unix/nic.c | 1533 ++++++++++++++ + iscsiuio/src/unix/nic.h | 384 ++++ + iscsiuio/src/unix/nic_id.c | 362 ++++ + iscsiuio/src/unix/nic_id.h | 47 + + iscsiuio/src/unix/nic_nl.c | 678 ++++++ + iscsiuio/src/unix/nic_nl.h | 54 + + iscsiuio/src/unix/nic_utils.c | 1640 +++++++++++++++ + iscsiuio/src/unix/nic_utils.h | 102 + + iscsiuio/src/unix/nic_vlan.c | 337 +++ + iscsiuio/src/unix/nic_vlan.h | 89 + + iscsiuio/src/unix/options.h | 117 ++ + iscsiuio/src/unix/packet.c | 143 ++ + iscsiuio/src/unix/packet.h | 76 + + iscsiuio/src/unix/uip-conf.h | 160 ++ + sysfs-documentation | 514 +++++ + usr/Makefile | 13 +- + usr/actor.c | 325 ++- + usr/actor.h | 14 +- + usr/auth.c | 22 +- + usr/be2iscsi.c | 5 - + usr/config.h | 53 +- + usr/discovery.c | 56 +- + usr/discoveryd.c | 10 +- + usr/event_poll.c | 60 +- + usr/flashnode.c | 615 ++++++ + usr/flashnode.h | 129 ++ + usr/host.c | 112 +- + usr/host.h | 4 + + usr/idbm.c | 505 ++++- + usr/idbm.h | 8 + + usr/idbm_fields.h | 112 + + usr/iface.c | 1275 +++++++++--- + usr/initiator.c | 582 +++++- + usr/initiator.h | 6 + + usr/initiator_common.c | 208 +- + usr/io.c | 10 +- + usr/iscsi_err.c | 2 + + usr/iscsi_ipc.h | 19 + + usr/iscsi_net_util.c | 14 +- + usr/iscsi_sysfs.c | 590 +++++- + usr/iscsi_sysfs.h | 20 +- + usr/iscsi_util.c | 23 +- + usr/iscsi_util.h | 3 + + usr/iscsiadm.c | 1077 +++++++++- + usr/iscsid.c | 47 +- + usr/iscsid.h | 1 + + usr/iscsid_req.c | 98 +- + usr/iscsid_req.h | 2 + + usr/iscsistart.c | 13 +- + usr/login.c | 12 +- + usr/md5.c | 2 +- + usr/mgmt_ipc.c | 40 +- + usr/mgmt_ipc.h | 1 + + usr/netlink.c | 275 ++- + usr/session_info.c | 28 +- + usr/session_mgmt.c | 11 +- + usr/strings.c | 2 +- + usr/sysfs.c | 106 +- + usr/sysfs.h | 4 + + usr/transport.c | 31 +- + usr/transport.h | 11 + + usr/types.h | 1 + + usr/uip_mgmt_ipc.c | 41 + + usr/uip_mgmt_ipc.h | 73 + + utils/Makefile | 5 +- + utils/fwparam_ibft/Makefile | 4 +- + utils/fwparam_ibft/fw_entry.c | 17 +- + utils/fwparam_ibft/fwparam_ibft_sysfs.c | 2 + + utils/fwparam_ibft/fwparam_sysfs.c | 37 +- + utils/iscsi-gen-initiatorname | 73 + + utils/iscsi_offload | 378 ++++ + utils/md5.c | 2 +- + utils/open-isns/bitvector.c | 15 +- + utils/open-isns/dd.c | 3 +- + utils/open-isns/doc/isnsadm.8 | 16 + + utils/open-isns/isnsadm.c | 2 + + utils/sysdeps/Makefile | 3 +- + 170 files changed, 34076 insertions(+), 1466 deletions(-) + delete mode 100644 debian/README.Debian + delete mode 100644 debian/changelog + delete mode 100644 debian/compat + delete mode 100644 debian/control + delete mode 100644 debian/control.modules.in + delete mode 100644 debian/copyright + delete mode 100644 debian/dirs + delete mode 100644 debian/docs + delete mode 100644 debian/postinst.modules.in + delete mode 100644 debian/rules + delete mode 100644 debian/rules.modules + create mode 100644 etc/systemd/iscsid.service + create mode 100644 etc/systemd/iscsid.socket + create mode 100644 iscsiuio/.gitignore + create mode 100644 iscsiuio/AUTHORS + create mode 100644 iscsiuio/ChangeLog + create mode 100644 iscsiuio/INSTALL + create mode 100644 iscsiuio/Makefile.am + create mode 100644 iscsiuio/NEWS + create mode 100644 iscsiuio/README + create mode 100644 iscsiuio/RELEASE.TXT + create mode 100644 iscsiuio/configure.ac + create mode 100644 iscsiuio/docs/iscsiuio.8 + create mode 100644 iscsiuio/iscsiuiolog + create mode 100644 iscsiuio/src/Makefile.am + create mode 100644 iscsiuio/src/README + create mode 100644 iscsiuio/src/apps/Makefile.am + create mode 100644 iscsiuio/src/apps/README + create mode 100644 iscsiuio/src/apps/brcm-iscsi/Makefile.am + create mode 100644 iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi + create mode 100644 iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c + create mode 100644 iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h + create mode 100644 iscsiuio/src/apps/dhcpc/Makefile.am + create mode 100644 iscsiuio/src/apps/dhcpc/Makefile.dhcpc + create mode 100644 iscsiuio/src/apps/dhcpc/dhcpc.c + create mode 100644 iscsiuio/src/apps/dhcpc/dhcpc.h + create mode 100644 iscsiuio/src/apps/dhcpc/dhcpv6.c + create mode 100644 iscsiuio/src/apps/dhcpc/dhcpv6.h + create mode 100644 iscsiuio/src/uip-1.0-changelog.txt + create mode 100644 iscsiuio/src/uip/Makefile.am + create mode 100644 iscsiuio/src/uip/Makefile.include + create mode 100644 iscsiuio/src/uip/clock.h + create mode 100644 iscsiuio/src/uip/debug.h + create mode 100644 iscsiuio/src/uip/icmpv6.h + create mode 100644 iscsiuio/src/uip/ipv6.c + create mode 100644 iscsiuio/src/uip/ipv6.h + create mode 100644 iscsiuio/src/uip/ipv6_ndpc.c + create mode 100644 iscsiuio/src/uip/ipv6_ndpc.h + create mode 100644 iscsiuio/src/uip/ipv6_pkt.h + create mode 100644 iscsiuio/src/uip/lc-addrlabels.h + create mode 100644 iscsiuio/src/uip/lc-switch.h + create mode 100644 iscsiuio/src/uip/lc.h + create mode 100644 iscsiuio/src/uip/psock.c + create mode 100644 iscsiuio/src/uip/psock.h + create mode 100644 iscsiuio/src/uip/pt.h + create mode 100644 iscsiuio/src/uip/timer.c + create mode 100644 iscsiuio/src/uip/timer.h + create mode 100644 iscsiuio/src/uip/uip-neighbor.c + create mode 100644 iscsiuio/src/uip/uip-neighbor.h + create mode 100644 iscsiuio/src/uip/uip.c + create mode 100644 iscsiuio/src/uip/uip.h + create mode 100644 iscsiuio/src/uip/uip_arch.h + create mode 100644 iscsiuio/src/uip/uip_arp.c + create mode 100644 iscsiuio/src/uip/uip_arp.h + create mode 100644 iscsiuio/src/uip/uip_eth.c + create mode 100644 iscsiuio/src/uip/uip_eth.h + create mode 100644 iscsiuio/src/uip/uipopt.h + create mode 100644 iscsiuio/src/unix/.gitignore + create mode 100644 iscsiuio/src/unix/Makefile.am + create mode 100644 iscsiuio/src/unix/clock-arch.c + create mode 100644 iscsiuio/src/unix/clock-arch.h + create mode 100644 iscsiuio/src/unix/iscsid_ipc.c + create mode 100644 iscsiuio/src/unix/iscsid_ipc.h + create mode 100644 iscsiuio/src/unix/libs/Makefile.am + create mode 100644 iscsiuio/src/unix/libs/bnx2.c + create mode 100644 iscsiuio/src/unix/libs/bnx2.h + create mode 100644 iscsiuio/src/unix/libs/bnx2x.c + create mode 100644 iscsiuio/src/unix/libs/bnx2x.h + create mode 100644 iscsiuio/src/unix/libs/cnic.c + create mode 100644 iscsiuio/src/unix/libs/cnic.h + create mode 100644 iscsiuio/src/unix/logger.c + create mode 100644 iscsiuio/src/unix/logger.h + create mode 100644 iscsiuio/src/unix/main.c + create mode 100644 iscsiuio/src/unix/nic.c + create mode 100644 iscsiuio/src/unix/nic.h + create mode 100644 iscsiuio/src/unix/nic_id.c + create mode 100644 iscsiuio/src/unix/nic_id.h + create mode 100644 iscsiuio/src/unix/nic_nl.c + create mode 100644 iscsiuio/src/unix/nic_nl.h + create mode 100644 iscsiuio/src/unix/nic_utils.c + create mode 100644 iscsiuio/src/unix/nic_utils.h + create mode 100644 iscsiuio/src/unix/nic_vlan.c + create mode 100644 iscsiuio/src/unix/nic_vlan.h + create mode 100644 iscsiuio/src/unix/options.h + create mode 100644 iscsiuio/src/unix/packet.c + create mode 100644 iscsiuio/src/unix/packet.h + create mode 100644 iscsiuio/src/unix/uip-conf.h + create mode 100644 sysfs-documentation + create mode 100644 usr/flashnode.c + create mode 100644 usr/flashnode.h + create mode 100644 usr/uip_mgmt_ipc.c + create mode 100644 usr/uip_mgmt_ipc.h + create mode 100755 utils/iscsi-gen-initiatorname + create mode 100755 utils/iscsi_offload + +diff --git a/Makefile b/Makefile +index c5d9700..1ef9273 100644 +--- a/Makefile ++++ b/Makefile +@@ -14,35 +14,54 @@ mandir = $(prefix)/share/man + etcdir = /etc + initddir = $(etcdir)/init.d + +-MANPAGES = doc/iscsid.8 doc/iscsiadm.8 doc/iscsi_discovery.8 +-PROGRAMS = usr/iscsid usr/iscsiadm utils/iscsi_discovery utils/iscsi-iname ++MANPAGES = doc/iscsid.8 doc/iscsiadm.8 doc/iscsi_discovery.8 iscsiuio/docs/iscsiuio.8 ++PROGRAMS = usr/iscsid usr/iscsiadm utils/iscsi_discovery utils/iscsi-iname iscsiuio/src/unix/iscsiuio + INSTALL = install + ETCFILES = etc/iscsid.conf + IFACEFILES = etc/iface.example + ++# Compatibility: parse old OPTFLAGS argument ++ifdef OPTFLAGS ++CFLAGS = $(OPTFLAGS) ++endif ++ ++# Export it so configure of iscsiuio & open-isns will ++# pick it up. ++ifneq (,$(CFLAGS)) ++export CFLAGS ++endif ++ + # Random comments: + # using '$(MAKE)' instead of just 'make' allows make to run in parallel + # over multiple makefile. + + all: user + +-user: utils/open-isns/Makefile ++user: utils/open-isns/Makefile iscsiuio/Makefile + $(MAKE) -C utils/open-isns + $(MAKE) -C utils/sysdeps + $(MAKE) -C utils/fwparam_ibft + $(MAKE) -C usr + $(MAKE) -C utils ++ $(MAKE) -C iscsiuio + @echo + @echo "Compilation complete Output file" + @echo "----------------------------------- ----------------" + @echo "Built iSCSI daemon: usr/iscsid" + @echo "Built management application: usr/iscsiadm" + @echo "Built boot tool: usr/iscsistart" ++ @echo "Built iscsiuio daemon: iscsiuio/src/unix/iscsiuio" + @echo + @echo "Read README file for detailed information." + + utils/open-isns/Makefile: utils/open-isns/configure utils/open-isns/Makefile.in +- cd utils/open-isns; ./configure CFLAGS="$(OPTFLAGS)" --with-security=no ++ cd utils/open-isns; ./configure --with-security=no ++ ++iscsiuio/Makefile: iscsiuio/configure iscsiuio/Makefile.in ++ cd iscsiuio; ./configure ++ ++iscsiuio/configure iscsiuio/Makefile.in: iscsiuio/configure.ac iscsiuio/Makefile.am ++ cd iscsiuio; autoreconf --install + + kernel: force + $(MAKE) -C kernel +@@ -61,8 +80,10 @@ clean: + $(MAKE) -C utils clean + $(MAKE) -C usr clean + $(MAKE) -C kernel clean +- $(MAKE) -C utils/open-isns clean +- $(MAKE) -C utils/open-isns distclean ++ [ ! -f iscsiuio/Makefile ] || $(MAKE) -C iscsiuio clean ++ [ ! -f iscsiuio/Makefile ] || $(MAKE) -C iscsiuio distclean ++ [ ! -f utils/open-isns/Makefile ] || $(MAKE) -C utils/open-isns clean ++ [ ! -f utils/open-isns/Makefile ] || $(MAKE) -C utils/open-isns distclean + + # this is for safety + # now -jXXX will still be safe +@@ -115,7 +136,7 @@ install_iface: $(IFACEFILES) + $(INSTALL) -m 644 $^ $(DESTDIR)$(etcdir)/iscsi/ifaces + + install_etc: $(ETCFILES) +- if [ ! -f /etc/iscsi/iscsid.conf ]; then \ ++ if [ ! -f $(DESTDIR)/etc/iscsi/iscsid.conf ]; then \ + $(INSTALL) -d $(DESTDIR)$(etcdir)/iscsi ; \ + $(INSTALL) -m 644 $^ $(DESTDIR)$(etcdir)/iscsi ; \ + fi +@@ -128,11 +149,11 @@ install_kernel: + $(MAKE) -C kernel install_kernel + + install_iname: +- if [ ! -f /etc/iscsi/initiatorname.iscsi ]; then \ ++ if [ ! -f $(DESTDIR)/etc/iscsi/initiatorname.iscsi ]; then \ + echo "InitiatorName=`$(DESTDIR)/sbin/iscsi-iname`" > $(DESTDIR)/etc/iscsi/initiatorname.iscsi ; \ + echo "***************************************************" ; \ + echo "Setting InitiatorName to `cat $(DESTDIR)/etc/iscsi/initiatorname.iscsi`" ; \ +- echo "To override edit /etc/iscsi/initiatorname.iscsi" ; \ ++ echo "To override edit $(DESTDIR)/etc/iscsi/initiatorname.iscsi" ; \ + echo "***************************************************" ; \ + fi + +diff --git a/README b/README +index 7364b2d..06d1b6f 100644 +--- a/README ++++ b/README +@@ -159,15 +159,20 @@ Usage: iscsid [OPTION] + 5. Open-iSCSI Configuration Utility + =================================== + +-Open-iSCSI persistent configuration is implemented as a DBM database +-available on all Linux installations. ++Open-iSCSI persistent configuration is stored in a number of ++directories under a configuration root directory, using a flat-file ++format. This configuration root directory is /etc/iscsi by default, ++but may also commonly be in /var/lib/iscsi. + +-The database contains two tables: ++Configuration is contained in directories for: + +-- Discovery table (/etc/iscsi/send_targets); +-- Node table (/etc/iscsi/nodes). +- +-The regular place for iSCSI database files: /etc/iscsi/nodes ++- nodes ++- slp ++- isns ++- static ++- fw ++- send_targets ++- ifaces + + The iscsiadm utility is a command-line tool to manage (update, delete, + insert, query) the persistent database. +@@ -388,7 +393,7 @@ Usage: iscsiadm [OPTION] + See below for examples. + -m iface --interface=iscsi_ifacename -C ping --ip=[ipaddr] --packetsize=[size] + --count=[count] --interval=[interval] +- -m host --host=hostno|MAC --print=level -C chap --op=[op] --value=[chap_tbl_idx] ++ -m host --host=hostno|MAC --print=level -C chap --op=[SHOW] + Display information for a specific host. The host + can be passed in by host number or by MAC address. + If a host is not passed in then info +@@ -401,6 +406,37 @@ Usage: iscsiadm [OPTION] + is connected to. + 3 = Print iscsi params used. + 4 = Print SCSI info like LUNs, device state. ++ -m host --host=hostno|MAC -C chap --op=[DELETE] --index=[chap_tbl_idx] ++ Delete chap entry at the given index from chap table. ++ -m host --host=hostno|MAC -C chap --op=[NEW | UPDATE] --index=[chap_tbl_idx] \ ++ --name=[name] --value=[value] ++ Add new or update existing chap entry at the given ++ index with given username and password pair. If index ++ is not passed then entry is added at the first free ++ index in chap table. ++ -m host --host=hostno|MAC -C flashnode ++ Display list of all the targets in adapter's ++ flash (flash node), for the specified host, ++ with ip, port, tpgt and iqn. ++ -m host --host=hostno|MAC -C flashnode --op=[NEW] --portal_type=[ipv4|ipv6] ++ Create new flash node entry for the given host of the ++ specified portal_type. This returns the index of the ++ newly created entry on success. ++ -m host --host=hostno|MAC -C flashnode --index=[flashnode index] \ ++ --op=[UPDATE] --name=[name] --value=[value] ++ Update the params of the speficied flash node. ++ The [name] and [value] pairs must be provided for the ++ params that need to be updated. Multiple params can ++ be updated using a single command. ++ -m host --host=hostno|MAC -C flashnode --index=[flashnode index] \ ++ --op=[SHOW | DELETE | LOGIN | LOGOUT] ++ op=DELETE|LOGIN|LOGOUT will perform deletion/login/ ++ logout operation on the specified flash node. ++ ++ op=SHOW will list all params with the values for the ++ specified flash node. This is the default operation. ++ ++ See the iscsiadm example section for more info. + -d, --debug debuglevel print debugging information + -V, --version display version and exit + -h, --help display this help and exit +@@ -955,6 +991,96 @@ To now log into targets it is the same as with sofware iscsi. See section + + ./iscsiadm -m session -P 1 + ++ ++ Host mode with flashnode submode: ++ ++ - Display list of flash nodes for a host ++ ++ ./iscsiadm -m host -H 6 -C flashnode ++ ++ This will print list of all the flash node entries for the given host 6 ++ along with their ip, port, tpgt and iqn values. ++ ++ - Display all parameters of a flash node entry for a host ++ ++ ./iscsiadm -m host -H 6 -C flashnode -x 0 ++ ++ This will list all the parameter name,value pairs for flash node entry at ++ index 0 of host 6. ++ ++ - Add a new flash node entry for a host ++ ++ ./iscsiadm -m host -H 6 -C flashnode -o new -A ipv4 ++ or ++ ./iscsiadm -m host -H 6 -C flashnode -o new -A ipv6 ++ ++ This will add new flash node entry for the given host 6 with portal ++ type of either ipv4 or ipv6. The new operation returns the index of ++ the newly created flash node entry. ++ ++ - Update a flashnode entry ++ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o update \ ++ -n flashnode.conn[0].ipaddress -v 192.168.1.12 \ ++ -n flashnode.session.targetname \ ++ -v iqn.2002-03.com.compellent:5000d310004b0716 ++ ++ This will update the values of ipaddress and targetname params of ++ flash node entry at index 1 of host 6. ++ ++ - Login to a flash node entry ++ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o login ++ ++ - Logout from a flash node entry ++ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o logout ++ or ++ ./iscsiadm -m session -r $sid -u ++ ++ Logout can be performed either using the flash node index or using the ++ corresponding session index. ++ ++ - Delete a flash node entry ++ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o delete ++ ++ Host mode with chap submode: ++ ++ - Display list of chap entries for a host ++ ++ ./iscsiadm -m host -H 6 -C chap -o show ++ ++ This will list all the chap entries for the given host. ++ ++ - Delete a chap entry for a host ++ ++ ./iscsiadm -m host -H 6 -C chap -o delete -x 5 ++ ++ This will delete any chap entry present at given index 5. ++ ++ - Add/Update a local chap entry for a host ++ ++ ./iscsiadm -m host -H 6 -C chap -o update -x 4 -n username \ ++ -v value -n password -v value ++ ++ This will update the local chap entry present at index 4. If index 4 ++ is free then entry of type local chap will be created at that index ++ with given username and password values. ++ ++ - Add/Update a bidi chap entry for a host ++ ++ ./iscsiadm -m host -H 6 -C chap -o update -x 5 -n username_in \ ++ -v value -n password_in -v value ++ ++ This will update the bidi chap entry present at index 5. If index 5 ++ is free then entry of type bidi chap will be created at that index ++ with given username_in and password_in values. ++ ++ Host mode with stats submode: ++ ++ - Display host statistics: ++ ./iscsiadm -m host -H 6 -C stats ++ ++ This will print the aggregate statistics on the host adapter port. ++ This includes MAC, TCP/IP, ECC & iSCSI statistics. ++ + 6. Configuration + ================ + +diff --git a/debian/README.Debian b/debian/README.Debian +deleted file mode 100644 +index 98ebd23..0000000 +--- a/debian/README.Debian ++++ /dev/null +@@ -1,44 +0,0 @@ +-linux-iscsi for Debian +------------------------------------ +- +-The linux-iscsi package contains the userspace portion the Linux iSCSI project. +-It has a dependency on the linux-iscsi-modules package, which needs to be built from the linux-iscsi-modules-source against the specific kernel version running +-on your system. +- +-Building +--------- +-Modules cannot be built against the kernel-headers alone. You will need +-to extract and configure your kernel tree, then use the make-kpkg command +-(from the kernel-package package) to build a new kernel and modules. +-See the make-kpkg man page, particularly the modules-image section. The +-following example shows how to build the linux-iscsi-modules package; just +-substitute the appropriate version strings. Follow these instructions +-(as root) in order to build the linux-iscsi-modules package for your kernel: +- +-dpkg -i linux-iscsi-modules-source_5.0.0.0.3rc6-363_all.deb +-cd /usr/src +-rm -rf modules/linux-iscsi +-tar jxpvf linux-iscsi-modules-source.tar.bz2 +-cd linux-2.6.11.11 (or your appropriate version) +-make-kpkg --added-modules linux-iscsi modules-image +- +-By default, make-kpkg will assume /usr/src/linux-iscsi-modules-source.tar.bz2 +-has been extracted under /usr/src. However, that also requires building as +-root. If you want to do the build as a non-root user, you need to use the +-MODULE_LOC environment variable. For example: +- +-cd ~/builds +-export MODULES_LOC=$PWD/modules +-tar jxpvf /usr/src/linux-iscsi-modules-source.tar.bz2 +-cd ~/builds/linux-2.6.11.11 (or your appropriate version) +-make-kpkg --added-modules linux-iscsi modules-image +- +-Installing +----------- +- +-Once you have built the linux-iscsi-modules package, you can install the +-binaries: +- +-dpkg -i linux-iscsi_5.0.0.0.3rc6-363_i386.deb linux-iscsi-modules-2.6.11.11_5.0.0.0.3rc6-363+10.00.Custom_i386.deb +- +- -- Chad Tindel , Mon, 30 May 2005 15:17:53 -0600 +diff --git a/debian/changelog b/debian/changelog +deleted file mode 100644 +index f71577e..0000000 +--- a/debian/changelog ++++ /dev/null +@@ -1,6 +0,0 @@ +-linux-iscsi (5.0.0.0.3rc6-363) unstable; urgency=low +- +- * Initial Release. +- +- -- Chad Tindel Mon, 30 May 2005 15:17:53 -0600 +- +diff --git a/debian/compat b/debian/compat +deleted file mode 100644 +index b8626c4..0000000 +--- a/debian/compat ++++ /dev/null +@@ -1 +0,0 @@ +-4 +diff --git a/debian/control b/debian/control +deleted file mode 100644 +index d333569..0000000 +--- a/debian/control ++++ /dev/null +@@ -1,27 +0,0 @@ +-Source: linux-iscsi +-Section: net +-Priority: optional +-Maintainer: Chad Tindel +-Build-Depends: debhelper (>= 4.0.0), libdb4.3, libdb4.3-dev +-Standards-Version: 3.6.1 +- +-Package: linux-iscsi +-Architecture: any +-Depends: ${shlibs:Depends}, ${misc:Depends}, linux-iscsi-modules +-Description: high performance, transport independent implementation of RFC3720. +- linux-iscsi is a high performance, transport independent, implementation of +- RFC3720. +- +-#Package: linux-iscsi +-#Architecture: all +-#Description: Documentation for linux-iscsi +-#linux-iscsi is a high performance, transport independent, implementation of +-#RFC3720. +- +-Package: linux-iscsi-modules-source +-Architecture: all +-Depends: ${shlibs:Depends}, ${misc:Depends}, module-assistant, debhelper (>= 4.0.0), bzip2 +-Description: Source Code for the Linux iSCSI Kernel Modules +- Along with make-kpkg, this package maybe used to build a linux-iscsi-modules +- package for a kernel-image package. +- +diff --git a/debian/control.modules.in b/debian/control.modules.in +deleted file mode 100644 +index 9371b34..0000000 +--- a/debian/control.modules.in ++++ /dev/null +@@ -1,20 +0,0 @@ +-Source: linux-iscsi-modules +-Section: net +-Priority: optional +-Maintainer: Chad Tindel +-Build-Depends: debhelper (>> 4.1.0), bzip2 +-Standards-Version: 3.6.1 +- +-Package: linux-iscsi-modules-_KVERS_ +-Architecture: any +-Depends: modutils, linux-iscsi +-Provides: linux-iscsi-modules +-Description: Linux Kernel Driver Modules for Linux iSCSI (kernel _KVERS_) +- This is a Linux driver for iSCSI initiator functionality. +- . +- This package contains the compiled kernel modules for _KVERS_ +- . +- If you have compiled your own kernel, you will most likely need to build +- your own linux-iscsi-modules. The linux-iscsi-source package has been +- provided for use with the Debian kernel-package utility to produce a version +- of linux-iscsi-module for your kernel. +diff --git a/debian/copyright b/debian/copyright +deleted file mode 100644 +index 11c0945..0000000 +--- a/debian/copyright ++++ /dev/null +@@ -1,12 +0,0 @@ +-This package was debianized by Chad Tindel on +-Mon, 30 May 2005 15:17:53 -0600. +- +-It was downloaded from http://sourceforge.net/projects/linux-iscsi +- +-Copyright Holder: Dmitry Yusupov +- +-License: +- +-You are free to distribute this software under the terms of the GNU General +-Public License. On Debian systems, the complete text of the GNU General Public +-License can be found in the file `/usr/share/common-licenses/GPL'. +diff --git a/debian/dirs b/debian/dirs +deleted file mode 100644 +index c386116..0000000 +--- a/debian/dirs ++++ /dev/null +@@ -1,3 +0,0 @@ +-usr/bin +-usr/sbin +-etc/init.d +diff --git a/debian/docs b/debian/docs +deleted file mode 100644 +index 9b70221..0000000 +--- a/debian/docs ++++ /dev/null +@@ -1,4 +0,0 @@ +-README +-COPYING +-THANKS +-TODO +diff --git a/debian/postinst.modules.in b/debian/postinst.modules.in +deleted file mode 100644 +index 70dc20d..0000000 +--- a/debian/postinst.modules.in ++++ /dev/null +@@ -1,11 +0,0 @@ +-#!/bin/sh +- +-set -e +- +-if [ "`uname -r`" = "_KVERS_" ]; then +- /sbin/depmod -a & +-fi +- +-#DEBHELPER# +- +-exit 0 +diff --git a/debian/rules b/debian/rules +deleted file mode 100644 +index f4695c6..0000000 +--- a/debian/rules ++++ /dev/null +@@ -1,152 +0,0 @@ +-#!/usr/bin/make -f +-# -*- makefile -*- +-# Sample debian/rules that uses debhelper. +-# +-# This file was originally written by Joey Hess and Craig Small. +-# As a special exception, when this file is copied by dh-make into a +-# dh-make output file, you may use that output file without restriction. +-# This special exception was added by Craig Small in version 0.37 of dh-make. +-# +-# Modified to make a template file for a multi-binary package with separated +-# build-arch and build-indep targets by Bill Allombert 2001 +- +-# Uncomment this to turn on verbose mode. +-#export DH_VERBOSE=1 +- +-# This has to be exported to make some magic below work. +-export DH_OPTIONS +- +- +- +-CFLAGS = -Wall -g +- +-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) +- CFLAGS += -O0 +-else +- CFLAGS += -O2 +-endif +- +-configure: configure-stamp +-configure-stamp: +- dh_testdir +- # Add here commands to configure the package. +- +- touch configure-stamp +- +- +-#Architecture +-build: build-arch build-indep +- +-build-arch: build-arch-stamp +-build-arch-stamp: configure-stamp +- +- # Add here commands to compile the arch part of the package. +- $(MAKE) -C usr +- +- touch build-arch-stamp +- +-build-indep: build-indep-stamp +-build-indep-stamp: configure-stamp +- +- # Add here commands to compile the indep part of the package. +- #$(MAKE) doc +- touch build-indep-stamp +- +-clean: +- dh_testdir +- dh_testroot +- rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP# +- +- # Add here commands to clean up after the build process. +- $(MAKE) -C usr clean +- rm -rf modules +- +- dh_clean +- +-install: install-indep install-arch +-install-indep: +- dh_testdir +- dh_testroot +- dh_clean -k -i +- dh_installdirs -i +- +- # create needed directories +- dh_installdirs -i usr/src/modules/linux-iscsi +- +- mkdir -p modules/linux-iscsi/debian +- +- # copy the driver source +- tar --exclude=debian -c * | (cd modules/linux-iscsi && tar xv) +- +- # copy all relevant debian/ files +- cp debian/{compat,copyright} modules/linux-iscsi/debian +- cat debian/changelog | sed -e 's/linux-iscsi/linux-iscsi-modules/' > modules/linux-iscsi/debian/changelog +- cp debian/*.modules.in modules/linux-iscsi/debian +- install -m755 debian/rules.modules modules/linux-iscsi/debian/rules +- +- # entar the source +- tar jcf debian/linux-iscsi-modules-source/usr/src/linux-iscsi-modules-source.tar.bz2 modules +- +- # Add here commands to install the indep part of the package into +- # debian/-doc. +- #INSTALLDOC# +- +- dh_install -i +- +-install-arch: +- dh_testdir +- dh_testroot +- dh_clean -k -s +- dh_installdirs -s +- +- # Add here commands to install the arch part of the package into +- # debian/linux-iscsi. +- install -m 755 usr/iscsiadm $(CURDIR)/debian/linux-iscsi/usr/bin +- install -m 755 usr/iscsid $(CURDIR)/debian/linux-iscsi/usr/sbin +- install -m 644 etc/iscsid.conf $(CURDIR)/debian/linux-iscsi/etc/iscsid.conf.example +- install -m 755 etc/initd/initd.debian $(CURDIR)/debian/linux-iscsi/etc/init.d/iscsid +- make clean +- +- dh_install -s +- +-# Must not depend on anything. This is to be called by +-# binary-arch/binary-indep +-# in another 'make' thread. +-binary-common: +- dh_testdir +- dh_testroot +- dh_installchangelogs +- dh_installdocs +- dh_installexamples +-# dh_installmenu +-# dh_installdebconf +-# dh_installlogrotate +-# dh_installemacsen +-# dh_installpam +-# dh_installmime +-# dh_installinit +-# dh_installcron +-# dh_installinfo +- dh_installman +- dh_link +- dh_strip +- dh_compress +- dh_fixperms +-# dh_perl +-# dh_python +- dh_makeshlibs +- dh_installdeb +- dh_shlibdeps +- dh_gencontrol +- dh_md5sums +- dh_builddeb +-# Build architecture independant packages using the common target. +-binary-indep: build-indep install-indep +- $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common +- +-# Build architecture dependant packages using the common target. +-binary-arch: build-arch install-arch +- $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common +- +-binary: binary-arch binary-indep +-.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure +diff --git a/debian/rules.modules b/debian/rules.modules +deleted file mode 100644 +index 1c4dabd..0000000 +--- a/debian/rules.modules ++++ /dev/null +@@ -1,39 +0,0 @@ +-#!/usr/bin/make -f +- +-# module-assistant stuff +-PACKAGE = linux-iscsi-modules +-MA_DIR ?= /usr/share/modass +--include $(MA_DIR)/include/generic.make +--include $(MA_DIR)/include/common-rules.make +- +-kdist_clean: prep-deb-files +- dh_clean +- #$(MAKE) clean KERNEL_PATH=$(KSRC) +- make clean +- +-kdist_config: prep-deb-files +- +-TARGET = $(CURDIR)/debian/linux-iscsi-modules-$(KVERS) +-MODULES_TARGET = $(TARGET)/lib/modules/$(KVERS)/kernel/net/iscsi +- +-binary-modules: kdist_config +- dh_testdir +- dh_testroot +- dh_clean -k +- dh_installdirs lib/modules/$(KVERS) +- +- # build and install the module +- patch -d kernel < kernel/backward-compile-2.6.11.patch +- make -C kernel KSRC=$(KSRC) +- mkdir -p $(MODULES_TARGET) +- install -m 755 kernel/iscsi_tcp.ko $(MODULES_TARGET) +- install -m 755 kernel/scsi_transport_iscsi.ko $(MODULES_TARGET) +- +- dh_installdocs +- dh_installchangelogs +- dh_compress +- dh_fixperms +- dh_installdeb +- dh_gencontrol -- -v$(VERSION) +- dh_md5sums +- dh_builddeb --destdir=$(DEB_DESTDIR) +diff --git a/doc/iscsi_discovery.8 b/doc/iscsi_discovery.8 +index a4affc6..e28065c 100644 +--- a/doc/iscsi_discovery.8 ++++ b/doc/iscsi_discovery.8 +@@ -8,7 +8,17 @@ + .SH NAME + iscsi_discovery \- discover iSCSI targets + .SH SYNOPSIS +-.B iscsi_discovery [-p ] [-d] [-t [-f]] [-m] [-l] ++.B iscsi_discovery ++.I ++.RB [ -p ++.IR ] ++.RB [ -d ] ++.RB [\ -t ++.IR ++.RB [ -f ] ++.R ] ++.RB [ -m ] ++.RB [ -l ] + + .SH DESCRIPTION + Perform send-targets discovery to the specified IP. If a discovery record +diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 +index 7c209f6..f046236 100644 +--- a/doc/iscsiadm.8 ++++ b/doc/iscsiadm.8 +@@ -2,23 +2,161 @@ + .SH NAME + iscsiadm \- open-iscsi administration utility + .SH SYNOPSIS +-\fBiscsiadm\fR \-m discoverydb [ \-hV ] [ \-d debug_level ] [ \-P printlevel ] [ \-I iface \-t type \-p ip:port [ \-lD ] ] | [ [ -p ip:port -t type ] \ +-[ \-o operation ] [ \-n name ] [ \-v value ] [ \-lD ] ] ++.B iscsiadm ++.B \-m discoverydb ++.RB [ \-hV ] ++.RB [ \-d ++.IR debug_level ] ++.RB [ \-P ++.IR printlevel ] ++.R [\ ++.BI \-I\ iface\ \-t\ type\ \-p\ ip:port ++.RB [ \-lD ] ++.R ] | [ ++.RB [ \-p ++.I ip:port ++.B \-t ++.IR type ] ++.RB [ \-o ++.IR operation ] ++.RB [ \-n ++.IR name ] ++.RB [ \-v ++.IR value ] ++.RB [ \-lD ] ++.R ] + +-\fBiscsiadm\fR \-m discovery [ \-hV ] [ \-d debug_level ] [ \-P printlevel ] [ \-I iface \-t type \-p ip:port [ \-l ] ] | [ [ -p ip:port ] [ \-l | \-D ] ] ++.B iscsiadm ++.B \-m discovery ++.RB [ \-hV ] ++.RB [ \-d ++.IR debug_level ] ++.RB [ \-P ++.IR printlevel ] ++.R [\ ++.BI \-I\ iface\ \-t\ type\ \-p\ ip:port ++.RB [ \-l ] ++.R ] | [ ++.RB [ \-p ++.IR ip:port ] ++.RB [ \-l | \-D ] ++.R ] + +-\fBiscsiadm\fR \-m node [ \-hV ] [ \-d debug_level ] [ \-P printlevel ] [ \-L all,manual,automatic ] [ \-U all,manual,automatic ] [ \-S ] [ [ \-T targetname \-p ip:port \-I iface ] [ \-l | \-u | \-R | \-s] ] +-[ [ \-o operation ] [ \-n name ] [ \-v value ] [ \-p ip:port ] ] ++.B iscsiadm ++.B \-m node ++.RB [ \-hV ] ++.RB [ \-d ++.IR debug_level ] ++.RB [ \-P ++.IR printlevel ] ++.RB [ \-L ++.IR all,manual,automatic ] ++.RB [ \-U ++.IR all,manual,automatic ] ++.RB [ \-S ] ++.R [ ++.RB [ \-T ++.IB targetname\ \-p\ ip:port\ \-I\ iface ++.R ] ++.RB [ \-l | \-u | \-R | \-s ] ++.R ] ++.R [ ++.RB [ \-o ++.IR operation ] ++.RB [ \-n ++.IR name ] ++.RB [ \-v ++.IR value ] ++.RB [ \-p ++.IR ip:port ] ++.R ] + +-\fBiscsiadm\fR \-m session [ \-hV ] [ \-d debug_level ] [ \-P printlevel ] [ \-r sessionid | sysfsdir [ \-R ] [ \-u | \-s | \-o new ] ] ++.B iscsiadm ++.B \-m session ++.RB[ \-hV ] ++.RB [ \-d ++.IR debug_level ] ++.RB [ \-P ++.IR printlevel ] ++.R [ ++.B \-r ++.IR sessionid | sysfsdir ++.RB [ \-R ] ++.RB [ \-u | \-s | \-o ++.IR new ] ++.R ] + +-\fBiscsiadm\fR \-m iface [ \-hV ] [ \-d debug_level ] [ \-P printlevel ] [ \-I ifacename | \-H hostno|MAC ] [ [ \-o operation ] [ \-n name ] [ \-v value ] ] [ \-C ping [ \-a ip ] [ \-b packetsize ] [ \-c count ] [ \-i interval ] ] ++.B iscsiadm ++.B \-m iface ++.RB [ \-hV ] ++.RB [ \-d ++.IR debug_level ] ++.RB [ \-P ++.IR printlevel ] ++.R [ ++.BI \-I\ ifacename ++.R | ++.BI \-H\ hostno|MAC ++.R ] ++.R [ ++.RB [ \-o ++.IR operation ] ++.RB [ \-n ++.IR name ] ++.RB [ \-v ++.IR value ] ++.R ] ++.R [ ++.BI \-C\ ping ++.RB [ \-a ++.IR ip ] ++.RB [ \-b ++.IR packetsize ] ++.RB [ \-c ++.IR count ] ++.RB [ \-i ++.IR interval ] ++.R ] + +-\fBiscsiadm\fR \-m fw [\-l] ++.B iscsiadm ++.B \-m fw ++.RB [ \-d ++.IR debug_level ] ++.RB [ \-l ] + +-\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] ++.B iscsiadm ++.B \-m host ++.RB [ \-P ++.IR printlevel ] ++.RB [ \-H ++.IR hostno|MAC ] ++.R [ ++.RB [\ \-C ++.IR chap ++.RB [ \-x ++.IR chap_tbl_idx ] ++.R ] | ++.RB [\ \-C ++.IR flashnode ++.RB [ \-A ++.IR portal_type ] ++.RB [ \-x ++.IR flashnode_idx ] ++.R ] | ++.RB [\ \-C ++.IR stats \ ] ++.R ] ++.R [ ++.RB [ \-o ++.IR operation ] ++.RB [ \-n ++.IR name ] ++.RB [ \-v ++.IR value ] ++.R ] + +-\fBiscsiadm\fR \-k priority ++.B iscsiadm ++.B \-k priority + + .SH "DESCRIPTION" + The iscsiadm utility is a command-line tool allowing discovery and login +@@ -47,6 +185,12 @@ daemon (iscsid) be running. + This option is only valid for ping submode. + + .TP ++\fB\-A\fR, \fB\-\-portal_type=\fI[ipv4|ipv6]\fR ++Specify the portal type for the new flash node entry to be created. ++.IP ++This option is only valid for flashnode submode of host mode and only with \fInew\fR operation. ++ ++.TP + \fB\-b\fR, \fB\-\-packetsize=\fIpacketsize\fP + Specify the ping \fIpacketsize\fR. + +@@ -64,7 +208,15 @@ Specify the submode for mode. op must be name of submode. + + Currently iscsiadm support ping as submode for iface. For example, + +-iscsiadm -m iface -I ifacename -C ping -a ipaddr -b packetsize -c count -i interval ++iscsiadm \-m iface \-I ifacename \-C ping \-a ipaddr \-b packetsize \-c count \-i interval ++ ++For host, it supports chap , flashnode and stats as submodes. For example, ++ ++iscsiadm \-m host \-H hostno \-C chap \-x chap_tbl_idx \-o operation ++ ++iscsiadm \-m host \-H hostno \-C flashnode \-x flashnode_idx \-o operation ++ ++iscsiadm \-m host \-H hostno \-C stats + + .TP + \fB\-d\fR, \fB\-\-debug=\fIdebug_level\fP +@@ -113,7 +265,7 @@ are experimental and the use is not supported as a stable interface yet. + In discovery mode multiple interfaces can be specified by passing in multiple + \-I/\-\-interface instances. For example, + +-"iscsiadm \-m discoverydb \-t st \-p ip:port \-I iface0 \-I iface2 --discover" ++"iscsiadm \-m discoverydb \-t st \-p ip:port \-I iface0 \-I iface2 \-\-discover" + + Will direct iscsiadm to setup the node db to create records which will create + sessions though the two intefaces passed in. +@@ -160,18 +312,19 @@ for session mode). + .TP + \fB\-m, \-\-mode \fIop\fR + specify the mode. \fIop\fR +-must be one of \fIdiscoverydb\fR, \fInode\fR, \fIfw\fR, \fIhost\fR \fIiface\fR or \fIsession\fR. ++must be one of \fIdiscovery\fR, \fIdiscoverydb\fR, \fInode\fR, \fIfw\fR, \fIhost\fR \fIiface\fR or \fIsession\fR. + .IP +-If no other options are specified: for \fIdiscoverydb\fR and \fInode\fR, all +-of their respective records are displayed; for \fIsession\fR, all active +-sessions and connections are displayed; for \fIfw\fR, all boot firmware +-values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; and +-for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. ++If no other options are specified: for \fIdiscovery\fR, \fIdiscoverydb\fR and ++\fInode\fR, all of their respective records are displayed; for \fIsession\fR, ++all active sessions and connections are displayed; for \fIfw\fR, all boot ++firmware values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; ++and for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. + + .TP + \fB\-n\fR, \fB\-\-name=\fIname\fR +-Specify a field \fIname\fR in a record. For use with the \fIupdate\fR +-operator. ++In node mode, specify a field \fIname\fR in a record. In flashnode submode of host mode, specify name of the flash node parameter. ++ ++For use with the \fIupdate\fR operator. + .IP + + .TP +@@ -181,6 +334,8 @@ Specifies a database operator \fIop\fR. \fIop\fR must be one of + .IP + For iface mode, \fIapply\fR and \fIapplyall\fR are also applicable. + .IP ++For flashnode submode of host mode, \fIlogin\fR and \fIlogout\fR are also applicable. ++.IP + This option is valid for all modes except fw. Delete should not be used on a running session. If it is iscsiadm will stop the session and then delete the + record. + .IP +@@ -210,6 +365,12 @@ sid is passed in. + .IP + \fIapplyall\fR will cause the network settings to take effect on all the ifaces whose MAC address or host number matches that of the specific host. + ++.IP ++\fIlogin\fR will log into the specified flash node entry. ++ ++.IP ++\fIlogout\fR does the logout from the given flash node entry. ++ + .TP + \fB\-p\fR, \fB\-\-portal=\fIip[:port]\fR + Use target portal with ip-address \fIip\fR and \fIport\fR. If port is not passed +@@ -258,6 +419,7 @@ tuple passed in. + .TP + \fB\-s\fR, \fB\-\-stats\fR + Display session statistics. ++This option when used with host mode, displays host statistics. + + .TP + \fB\-S\fR, \fB\-\-show\fR +@@ -292,12 +454,18 @@ for session mode). + \fB\-v\fR, \fB\-\-value=\fIvalue\fR + Specify a \fIvalue\fR for use with the \fIupdate\fR operator. + .IP +-This option is only valid for node mode. ++This option is only valid for node mode and flashnode submode of host mode. + + .TP + \fB\-V\fR, \fB\-\-version\fR + display version and exit + ++.TP ++\fB\-x\fR, \fB\-\-index=\fIindex\fR ++Specify the \fIindex\fR of the entity to operate on. ++.IP ++This option is only valid for chap and flashnode submodes of host mode. ++ + .SH DISCOVERY TYPES + iSCSI defines 3 discovery types: SendTargets, SLP, and iSNS. + +diff --git a/etc/iscsid.conf b/etc/iscsid.conf +index ef76dc0..c30a7dc 100644 +--- a/etc/iscsid.conf ++++ b/etc/iscsid.conf +@@ -22,6 +22,9 @@ + # Default for upstream open-iscsi scripts (uncomment to activate). + iscsid.startup = /sbin/iscsid + ++# Check for active mounts on devices reachable through a session ++# and refuse to logout if there are any. Defaults to "No". ++# iscsid.safe_logout = Yes + + ############################# + # NIC/HBA and driver settings +@@ -80,7 +83,7 @@ node.leading_login = No + # Timeouts + # ******** + # +-# See the iSCSI REAME's Advanced Configuration section for tips ++# See the iSCSI README's Advanced Configuration section for tips + # on setting timeouts when using multipath or doing root over iSCSI. + # + # To specify the length of time to wait for session re-establishment +diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service +new file mode 100644 +index 0000000..028e0b3 +--- /dev/null ++++ b/etc/systemd/iscsid.service +@@ -0,0 +1,13 @@ ++[Unit] ++Description=Open-iSCSI ++Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) ++After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service ++ ++[Service] ++Type=forking ++PIDFile=/var/run/iscsid.pid ++ExecStart=/usr/sbin/iscsid ++ExecStop=/sbin/iscsiadm -k 0 2 ++ ++[Install] ++WantedBy=multi-user.target +diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket +new file mode 100644 +index 0000000..832451d +--- /dev/null ++++ b/etc/systemd/iscsid.socket +@@ -0,0 +1,9 @@ ++[Unit] ++Description=Open-iSCSI iscsid Socket ++Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) ++ ++[Socket] ++ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE ++ ++[Install] ++WantedBy=sockets.target +diff --git a/include/fw_context.h b/include/fw_context.h +index 1640859..44053d8 100644 +--- a/include/fw_context.h ++++ b/include/fw_context.h +@@ -28,10 +28,23 @@ + #include "list.h" + #include "auth.h" + ++enum ibft_ip_prefix_origin { ++ IBFT_IP_PREFIX_ORIGIN_OTHER = 0, ++ IBFT_IP_PREFIX_ORIGIN_MANUAL, ++ IBFT_IP_PREFIX_ORIGIN_WELL_KNOWN, ++ IBFT_IP_PREFIX_ORIGIN_DHCP, ++ IBFT_IP_PREFIX_ORIGIN_ROUTER_ADVERTISEMENT, ++ IBFT_IP_PREFIX_ORIGIN_UNCHANGED = 16 ++}; ++ + struct boot_context { + struct list_head list; ++ char boot_root[BOOT_NAME_MAXLEN]; ++ char boot_nic[BOOT_NAME_MAXLEN]; ++ char boot_target[BOOT_NAME_MAXLEN]; + + /* target settings */ ++ int target_flags; + int target_port; + char targetname[TARGET_NAME_MAXLEN + 1]; + char target_ipaddr[NI_MAXHOST]; +@@ -45,6 +58,8 @@ struct boot_context { + char initiatorname[TARGET_NAME_MAXLEN + 1]; + + /* network settings */ ++ int nic_flags; ++ enum ibft_ip_prefix_origin origin; + char dhcp[NI_MAXHOST]; + char iface[IF_NAMESIZE]; + char mac[18]; +diff --git a/include/iscsi_err.h b/include/iscsi_err.h +index aabea4e..125f443 100644 +--- a/include/iscsi_err.h ++++ b/include/iscsi_err.h +@@ -62,6 +62,10 @@ enum { + ISCSI_ERR_OP_NOT_SUPP = 27, + /* device or resource in use */ + ISCSI_ERR_BUSY = 28, ++ /* Operation failed, but retrying layer may succeed */ ++ ISCSI_ERR_AGAIN = 29, ++ /* unknown discovery type */ ++ ISCSI_ERR_UNKNOWN_DISCOVERY_TYPE = 30, + + /* Always last. Indicates end of error code space */ + ISCSI_MAX_ERR_VAL, +diff --git a/include/iscsi_if.h b/include/iscsi_if.h +index dad9fd8..9d15811 100644 +--- a/include/iscsi_if.h ++++ b/include/iscsi_if.h +@@ -68,8 +68,15 @@ enum iscsi_uevent_e { + ISCSI_UEVENT_PING = UEVENT_BASE + 22, + ISCSI_UEVENT_GET_CHAP = UEVENT_BASE + 23, + ISCSI_UEVENT_DELETE_CHAP = UEVENT_BASE + 24, +- +- ISCSI_UEVENT_MAX = ISCSI_UEVENT_DELETE_CHAP, ++ ISCSI_UEVENT_SET_FLASHNODE_PARAMS = UEVENT_BASE + 25, ++ ISCSI_UEVENT_NEW_FLASHNODE = UEVENT_BASE + 26, ++ ISCSI_UEVENT_DEL_FLASHNODE = UEVENT_BASE + 27, ++ ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28, ++ ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, ++ ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, ++ ISCSI_UEVENT_SET_CHAP = UEVENT_BASE + 31, ++ ISCSI_UEVENT_GET_HOST_STATS = UEVENT_BASE + 32, ++ ISCSI_UEVENT_MAX = ISCSI_UEVENT_GET_HOST_STATS, + + /* up events */ + ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, +@@ -219,6 +226,35 @@ struct iscsi_uevent { + uint32_t host_no; + uint16_t chap_tbl_idx; + } delete_chap; ++ struct msg_set_flashnode_param { ++ uint32_t host_no; ++ uint32_t flashnode_idx; ++ uint32_t count; ++ } set_flashnode; ++ struct msg_new_flashnode { ++ uint32_t host_no; ++ uint32_t len; ++ } new_flashnode; ++ struct msg_del_flashnode { ++ uint32_t host_no; ++ uint32_t flashnode_idx; ++ } del_flashnode; ++ struct msg_login_flashnode { ++ uint32_t host_no; ++ uint32_t flashnode_idx; ++ } login_flashnode; ++ struct msg_logout_flashnode { ++ uint32_t host_no; ++ uint32_t flashnode_idx; ++ } logout_flashnode; ++ struct msg_logout_flashnode_sid { ++ uint32_t host_no; ++ uint32_t sid; ++ } logout_flashnode_sid; ++ struct msg_get_host_stats { ++ uint32_t host_no; ++ } get_host_stats; ++ + } u; + union { + /* messages k -> u */ +@@ -276,6 +312,9 @@ struct iscsi_uevent { + with each ping request */ + uint32_t data_size; + } ping_comp; ++ struct msg_new_flashnode_ret { ++ uint32_t flashnode_idx; ++ } new_flashnode_ret; + } r; + } __attribute__ ((aligned (sizeof(uint64_t)))); + +@@ -283,8 +322,18 @@ enum iscsi_param_type { + ISCSI_PARAM, /* iscsi_param (session, conn, target, LU) */ + ISCSI_HOST_PARAM, /* iscsi_host_param */ + ISCSI_NET_PARAM, /* iscsi_net_param */ ++ ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ ++ ISCSI_CHAP_PARAM, /* iscsi_chap_param */ ++ ISCSI_IFACE_PARAM, /* iscsi_iface_param */ + }; + ++/* structure for minimalist usecase */ ++struct iscsi_param_info { ++ uint32_t len; /* Actual length of the param value */ ++ uint16_t param; /* iscsi param */ ++ uint8_t value[0]; /* length sized value follows */ ++} __attribute__((__packed__)); ++ + struct iscsi_iface_param_info { + uint32_t iface_num; /* iface number, 0 - n */ + uint32_t len; /* Actual length of the param */ +@@ -348,28 +397,106 @@ struct iscsi_path { + #define ISCSI_VLAN_DISABLE 0x01 + #define ISCSI_VLAN_ENABLE 0x02 + ++/* iscsi generic enable/disabled setting for various features */ ++#define ISCSI_NET_PARAM_DISABLE 0x01 ++#define ISCSI_NET_PARAM_ENABLE 0x02 ++ + /* iSCSI network params */ + enum iscsi_net_param { + ISCSI_NET_PARAM_IPV4_ADDR = 1, +- ISCSI_NET_PARAM_IPV4_SUBNET = 2, +- ISCSI_NET_PARAM_IPV4_GW = 3, +- ISCSI_NET_PARAM_IPV4_BOOTPROTO = 4, +- ISCSI_NET_PARAM_MAC = 5, +- ISCSI_NET_PARAM_IPV6_LINKLOCAL = 6, +- ISCSI_NET_PARAM_IPV6_ADDR = 7, +- ISCSI_NET_PARAM_IPV6_ROUTER = 8, +- ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG = 9, +- ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG = 10, +- ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG = 11, +- ISCSI_NET_PARAM_IFACE_ENABLE = 12, +- ISCSI_NET_PARAM_VLAN_ID = 13, +- ISCSI_NET_PARAM_VLAN_PRIORITY = 14, +- ISCSI_NET_PARAM_VLAN_ENABLED = 15, +- ISCSI_NET_PARAM_VLAN_TAG = 16, +- ISCSI_NET_PARAM_IFACE_TYPE = 17, +- ISCSI_NET_PARAM_IFACE_NAME = 18, +- ISCSI_NET_PARAM_MTU = 19, +- ISCSI_NET_PARAM_PORT = 20, ++ ISCSI_NET_PARAM_IPV4_SUBNET, ++ ISCSI_NET_PARAM_IPV4_GW, ++ ISCSI_NET_PARAM_IPV4_BOOTPROTO, ++ ISCSI_NET_PARAM_MAC, ++ ISCSI_NET_PARAM_IPV6_LINKLOCAL, ++ ISCSI_NET_PARAM_IPV6_ADDR, ++ ISCSI_NET_PARAM_IPV6_ROUTER, ++ ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG, ++ ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG, ++ ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG, ++ ISCSI_NET_PARAM_IFACE_ENABLE, ++ ISCSI_NET_PARAM_VLAN_ID, ++ ISCSI_NET_PARAM_VLAN_PRIORITY, ++ ISCSI_NET_PARAM_VLAN_ENABLED, ++ ISCSI_NET_PARAM_VLAN_TAG, ++ ISCSI_NET_PARAM_IFACE_TYPE, ++ ISCSI_NET_PARAM_IFACE_NAME, ++ ISCSI_NET_PARAM_MTU, ++ ISCSI_NET_PARAM_PORT, ++ ISCSI_NET_PARAM_IPADDR_STATE, ++ ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE, ++ ISCSI_NET_PARAM_IPV6_ROUTER_STATE, ++ ISCSI_NET_PARAM_DELAYED_ACK_EN, ++ ISCSI_NET_PARAM_TCP_NAGLE_DISABLE, ++ ISCSI_NET_PARAM_TCP_WSF_DISABLE, ++ ISCSI_NET_PARAM_TCP_WSF, ++ ISCSI_NET_PARAM_TCP_TIMER_SCALE, ++ ISCSI_NET_PARAM_TCP_TIMESTAMP_EN, ++ ISCSI_NET_PARAM_CACHE_ID, ++ ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN, ++ ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN, ++ ISCSI_NET_PARAM_IPV4_TOS_EN, ++ ISCSI_NET_PARAM_IPV4_TOS, ++ ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN, ++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN, ++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID, ++ ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN, ++ ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN, ++ ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID, ++ ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN, ++ ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE, ++ ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN, ++ ISCSI_NET_PARAM_IPV4_TTL, ++ ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN, ++ ISCSI_NET_PARAM_IPV6_MLD_EN, ++ ISCSI_NET_PARAM_IPV6_FLOW_LABEL, ++ ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS, ++ ISCSI_NET_PARAM_IPV6_HOP_LIMIT, ++ ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO, ++ ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME, ++ ISCSI_NET_PARAM_IPV6_ND_STALE_TMO, ++ ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT, ++ ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU, ++ ISCSI_NET_PARAM_REDIRECT_EN, ++}; ++ ++enum iscsi_ipaddress_state { ++ ISCSI_IPDDRESS_STATE_UNCONFIGURED, ++ ISCSI_IPDDRESS_STATE_ACQUIRING, ++ ISCSI_IPDDRESS_STATE_TENTATIVE, ++ ISCSI_IPDDRESS_STATE_VALID, ++ ISCSI_IPDDRESS_STATE_DISABLING, ++ ISCSI_IPDDRESS_STATE_INVALID, ++ ISCSI_IPDDRESS_STATE_DEPRECATED, ++}; ++ ++enum iscsi_router_state { ++ ISCSI_ROUTER_STATE_UNKNOWN, ++ ISCSI_ROUTER_STATE_ADVERTISED, ++ ISCSI_ROUTER_STATE_MANUAL, ++ ISCSI_ROUTER_STATE_STALE, ++}; ++ ++/* iSCSI specific settings params for iface */ ++enum iscsi_iface_param { ++ ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO, ++ ISCSI_IFACE_PARAM_HDRDGST_EN, ++ ISCSI_IFACE_PARAM_DATADGST_EN, ++ ISCSI_IFACE_PARAM_IMM_DATA_EN, ++ ISCSI_IFACE_PARAM_INITIAL_R2T_EN, ++ ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN, ++ ISCSI_IFACE_PARAM_PDU_INORDER_EN, ++ ISCSI_IFACE_PARAM_ERL, ++ ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH, ++ ISCSI_IFACE_PARAM_FIRST_BURST, ++ ISCSI_IFACE_PARAM_MAX_R2T, ++ ISCSI_IFACE_PARAM_MAX_BURST, ++ ISCSI_IFACE_PARAM_CHAP_AUTH_EN, ++ ISCSI_IFACE_PARAM_BIDI_CHAP_EN, ++ ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL, ++ ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN, ++ ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN, ++ ISCSI_IFACE_PARAM_INITIATOR_NAME, + }; + + enum iscsi_conn_state { +@@ -460,61 +587,157 @@ enum iscsi_param { + + ISCSI_PARAM_TGT_RESET_TMO, + ISCSI_PARAM_TARGET_ALIAS, ++ ++ ISCSI_PARAM_CHAP_IN_IDX, ++ ISCSI_PARAM_CHAP_OUT_IDX, ++ ++ ISCSI_PARAM_BOOT_ROOT, ++ ISCSI_PARAM_BOOT_NIC, ++ ISCSI_PARAM_BOOT_TARGET, ++ ++ ISCSI_PARAM_AUTO_SND_TGT_DISABLE, ++ ISCSI_PARAM_DISCOVERY_SESS, ++ ISCSI_PARAM_PORTAL_TYPE, ++ ISCSI_PARAM_CHAP_AUTH_EN, ++ ISCSI_PARAM_DISCOVERY_LOGOUT_EN, ++ ISCSI_PARAM_BIDI_CHAP_EN, ++ ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL, ++ ++ ISCSI_PARAM_DEF_TIME2WAIT, ++ ISCSI_PARAM_DEF_TIME2RETAIN, ++ ISCSI_PARAM_MAX_SEGMENT_SIZE, ++ ISCSI_PARAM_STATSN, ++ ISCSI_PARAM_KEEPALIVE_TMO, ++ ISCSI_PARAM_LOCAL_PORT, ++ ISCSI_PARAM_TSID, ++ ISCSI_PARAM_DEF_TASKMGMT_TMO, ++ ++ ISCSI_PARAM_TCP_TIMESTAMP_STAT, ++ ISCSI_PARAM_TCP_WSF_DISABLE, ++ ISCSI_PARAM_TCP_NAGLE_DISABLE, ++ ISCSI_PARAM_TCP_TIMER_SCALE, ++ ISCSI_PARAM_TCP_TIMESTAMP_EN, ++ ISCSI_PARAM_TCP_XMIT_WSF, ++ ISCSI_PARAM_TCP_RECV_WSF, ++ ISCSI_PARAM_IP_FRAGMENT_DISABLE, ++ ISCSI_PARAM_IPV4_TOS, ++ ISCSI_PARAM_IPV6_TC, ++ ISCSI_PARAM_IPV6_FLOW_LABEL, ++ ISCSI_PARAM_IS_FW_ASSIGNED_IPV6, ++ ++ ISCSI_PARAM_DISCOVERY_PARENT_IDX, ++ ISCSI_PARAM_DISCOVERY_PARENT_TYPE, + /* must always be last */ + ISCSI_PARAM_MAX, + }; + +-#define ISCSI_MAX_RECV_DLENGTH (1ULL << ISCSI_PARAM_MAX_RECV_DLENGTH) +-#define ISCSI_MAX_XMIT_DLENGTH (1ULL << ISCSI_PARAM_MAX_XMIT_DLENGTH) +-#define ISCSI_HDRDGST_EN (1ULL << ISCSI_PARAM_HDRDGST_EN) +-#define ISCSI_DATADGST_EN (1ULL << ISCSI_PARAM_DATADGST_EN) +-#define ISCSI_INITIAL_R2T_EN (1ULL << ISCSI_PARAM_INITIAL_R2T_EN) +-#define ISCSI_MAX_R2T (1ULL << ISCSI_PARAM_MAX_R2T) +-#define ISCSI_IMM_DATA_EN (1ULL << ISCSI_PARAM_IMM_DATA_EN) +-#define ISCSI_FIRST_BURST (1ULL << ISCSI_PARAM_FIRST_BURST) +-#define ISCSI_MAX_BURST (1ULL << ISCSI_PARAM_MAX_BURST) +-#define ISCSI_PDU_INORDER_EN (1ULL << ISCSI_PARAM_PDU_INORDER_EN) +-#define ISCSI_DATASEQ_INORDER_EN (1ULL << ISCSI_PARAM_DATASEQ_INORDER_EN) +-#define ISCSI_ERL (1ULL << ISCSI_PARAM_ERL) +-#define ISCSI_IFMARKER_EN (1ULL << ISCSI_PARAM_IFMARKER_EN) +-#define ISCSI_OFMARKER_EN (1ULL << ISCSI_PARAM_OFMARKER_EN) +-#define ISCSI_EXP_STATSN (1ULL << ISCSI_PARAM_EXP_STATSN) +-#define ISCSI_TARGET_NAME (1ULL << ISCSI_PARAM_TARGET_NAME) +-#define ISCSI_TPGT (1ULL << ISCSI_PARAM_TPGT) +-#define ISCSI_PERSISTENT_ADDRESS (1ULL << ISCSI_PARAM_PERSISTENT_ADDRESS) +-#define ISCSI_PERSISTENT_PORT (1ULL << ISCSI_PARAM_PERSISTENT_PORT) +-#define ISCSI_SESS_RECOVERY_TMO (1ULL << ISCSI_PARAM_SESS_RECOVERY_TMO) +-#define ISCSI_CONN_PORT (1ULL << ISCSI_PARAM_CONN_PORT) +-#define ISCSI_CONN_ADDRESS (1ULL << ISCSI_PARAM_CONN_ADDRESS) +-#define ISCSI_USERNAME (1ULL << ISCSI_PARAM_USERNAME) +-#define ISCSI_USERNAME_IN (1ULL << ISCSI_PARAM_USERNAME_IN) +-#define ISCSI_PASSWORD (1ULL << ISCSI_PARAM_PASSWORD) +-#define ISCSI_PASSWORD_IN (1ULL << ISCSI_PARAM_PASSWORD_IN) +-#define ISCSI_FAST_ABORT (1ULL << ISCSI_PARAM_FAST_ABORT) +-#define ISCSI_ABORT_TMO (1ULL << ISCSI_PARAM_ABORT_TMO) +-#define ISCSI_LU_RESET_TMO (1ULL << ISCSI_PARAM_LU_RESET_TMO) +-#define ISCSI_HOST_RESET_TMO (1ULL << ISCSI_PARAM_HOST_RESET_TMO) +-#define ISCSI_PING_TMO (1ULL << ISCSI_PARAM_PING_TMO) +-#define ISCSI_RECV_TMO (1ULL << ISCSI_PARAM_RECV_TMO) +-#define ISCSI_IFACE_NAME (1ULL << ISCSI_PARAM_IFACE_NAME) +-#define ISCSI_ISID (1ULL << ISCSI_PARAM_ISID) +-#define ISCSI_INITIATOR_NAME (1ULL << ISCSI_PARAM_INITIATOR_NAME) +-#define ISCSI_TGT_RESET_TMO (1ULL << ISCSI_PARAM_TGT_RESET_TMO) +-#define ISCSI_TARGET_ALIAS (1ULL << ISCSI_PARAM_TARGET_ALIAS) +- + /* iSCSI HBA params */ + enum iscsi_host_param { + ISCSI_HOST_PARAM_HWADDRESS, + ISCSI_HOST_PARAM_INITIATOR_NAME, + ISCSI_HOST_PARAM_NETDEV_NAME, + ISCSI_HOST_PARAM_IPADDRESS, ++ ISCSI_HOST_PARAM_PORT_STATE, ++ ISCSI_HOST_PARAM_PORT_SPEED, + ISCSI_HOST_PARAM_MAX, + }; + +-#define ISCSI_HOST_HWADDRESS (1ULL << ISCSI_HOST_PARAM_HWADDRESS) +-#define ISCSI_HOST_INITIATOR_NAME (1ULL << ISCSI_HOST_PARAM_INITIATOR_NAME) +-#define ISCSI_HOST_NETDEV_NAME (1ULL << ISCSI_HOST_PARAM_NETDEV_NAME) +-#define ISCSI_HOST_IPADDRESS (1ULL << ISCSI_HOST_PARAM_IPADDRESS) ++/* portal type */ ++#define PORTAL_TYPE_IPV4 "ipv4" ++#define PORTAL_TYPE_IPV6 "ipv6" ++ ++/* iSCSI Flash Target params */ ++enum iscsi_flashnode_param { ++ ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6, ++ ISCSI_FLASHNODE_PORTAL_TYPE, ++ ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE, ++ ISCSI_FLASHNODE_DISCOVERY_SESS, ++ ISCSI_FLASHNODE_ENTRY_EN, ++ ISCSI_FLASHNODE_HDR_DGST_EN, ++ ISCSI_FLASHNODE_DATA_DGST_EN, ++ ISCSI_FLASHNODE_IMM_DATA_EN, ++ ISCSI_FLASHNODE_INITIAL_R2T_EN, ++ ISCSI_FLASHNODE_DATASEQ_INORDER, ++ ISCSI_FLASHNODE_PDU_INORDER, ++ ISCSI_FLASHNODE_CHAP_AUTH_EN, ++ ISCSI_FLASHNODE_SNACK_REQ_EN, ++ ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN, ++ ISCSI_FLASHNODE_BIDI_CHAP_EN, ++ /* make authentication for discovery sessions optional */ ++ ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL, ++ ISCSI_FLASHNODE_ERL, ++ ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT, ++ ISCSI_FLASHNODE_TCP_NAGLE_DISABLE, ++ ISCSI_FLASHNODE_TCP_WSF_DISABLE, ++ ISCSI_FLASHNODE_TCP_TIMER_SCALE, ++ ISCSI_FLASHNODE_TCP_TIMESTAMP_EN, ++ ISCSI_FLASHNODE_IP_FRAG_DISABLE, ++ ISCSI_FLASHNODE_MAX_RECV_DLENGTH, ++ ISCSI_FLASHNODE_MAX_XMIT_DLENGTH, ++ ISCSI_FLASHNODE_FIRST_BURST, ++ ISCSI_FLASHNODE_DEF_TIME2WAIT, ++ ISCSI_FLASHNODE_DEF_TIME2RETAIN, ++ ISCSI_FLASHNODE_MAX_R2T, ++ ISCSI_FLASHNODE_KEEPALIVE_TMO, ++ ISCSI_FLASHNODE_ISID, ++ ISCSI_FLASHNODE_TSID, ++ ISCSI_FLASHNODE_PORT, ++ ISCSI_FLASHNODE_MAX_BURST, ++ ISCSI_FLASHNODE_DEF_TASKMGMT_TMO, ++ ISCSI_FLASHNODE_IPADDR, ++ ISCSI_FLASHNODE_ALIAS, ++ ISCSI_FLASHNODE_REDIRECT_IPADDR, ++ ISCSI_FLASHNODE_MAX_SEGMENT_SIZE, ++ ISCSI_FLASHNODE_LOCAL_PORT, ++ ISCSI_FLASHNODE_IPV4_TOS, ++ ISCSI_FLASHNODE_IPV6_TC, ++ ISCSI_FLASHNODE_IPV6_FLOW_LABEL, ++ ISCSI_FLASHNODE_NAME, ++ ISCSI_FLASHNODE_TPGT, ++ ISCSI_FLASHNODE_LINK_LOCAL_IPV6, ++ ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX, ++ ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE, ++ ISCSI_FLASHNODE_TCP_XMIT_WSF, ++ ISCSI_FLASHNODE_TCP_RECV_WSF, ++ ISCSI_FLASHNODE_CHAP_IN_IDX, ++ ISCSI_FLASHNODE_CHAP_OUT_IDX, ++ ISCSI_FLASHNODE_USERNAME, ++ ISCSI_FLASHNODE_USERNAME_IN, ++ ISCSI_FLASHNODE_PASSWORD, ++ ISCSI_FLASHNODE_PASSWORD_IN, ++ ISCSI_FLASHNODE_STATSN, ++ ISCSI_FLASHNODE_EXP_STATSN, ++ ISCSI_FLASHNODE_IS_BOOT_TGT, ++ ++ ISCSI_FLASHNODE_MAX, ++}; ++ ++struct iscsi_flashnode_param_info { ++ uint32_t len; /* Actual length of the param */ ++ uint16_t param; /* iscsi param value */ ++ uint8_t value[0]; /* length sized value follows */ ++} __attribute__((__packed__)); ++ ++enum iscsi_discovery_parent_type { ++ ISCSI_DISC_PARENT_UNKNOWN = 0x1, ++ ISCSI_DISC_PARENT_SENDTGT = 0x2, ++ ISCSI_DISC_PARENT_ISNS = 0x3, ++}; ++ ++/* iSCSI port Speed */ ++enum iscsi_port_speed { ++ ISCSI_PORT_SPEED_UNKNOWN = 0x1, ++ ISCSI_PORT_SPEED_10MBPS = 0x2, ++ ISCSI_PORT_SPEED_100MBPS = 0x4, ++ ISCSI_PORT_SPEED_1GBPS = 0x8, ++ ISCSI_PORT_SPEED_10GBPS = 0x10, ++}; ++ ++/* iSCSI port state */ ++enum iscsi_port_state { ++ ISCSI_PORT_STATE_DOWN = 0x1, ++ ISCSI_PORT_STATE_UP = 0x2, ++}; + + /* iSCSI PING status/error code */ + enum iscsi_ping_status_code { +@@ -551,7 +774,7 @@ enum iscsi_ping_status_code { + #define CAP_DIGEST_OFFLOAD 0x1000 /* offload hdr and data digests */ + #define CAP_PADDING_OFFLOAD 0x2000 /* offload padding insertion, removal, + and verification */ +-#define CAP_LOGIN_OFFLOAD 0x4000 /* offload normal session login */ ++#define CAP_LOGIN_OFFLOAD 0x4000 /* offload session login */ + + /* + * These flags describes reason of stop_conn() call +@@ -617,9 +840,16 @@ enum chap_type_e { + CHAP_TYPE_IN, + }; + ++enum iscsi_chap_param { ++ ISCSI_CHAP_PARAM_INDEX, ++ ISCSI_CHAP_PARAM_CHAP_TYPE, ++ ISCSI_CHAP_PARAM_USERNAME, ++ ISCSI_CHAP_PARAM_PASSWORD, ++ ISCSI_CHAP_PARAM_PASSWORD_LEN ++}; ++ + #define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256 + #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256 +- + struct iscsi_chap_rec { + uint16_t chap_tbl_idx; + enum chap_type_e chap_type; +@@ -628,4 +858,112 @@ struct iscsi_chap_rec { + uint8_t password_length; + }; + ++#define ISCSI_HOST_STATS_CUSTOM_MAX 32 ++#define ISCSI_HOST_STATS_CUSTOM_DESC_MAX 64 ++struct iscsi_host_stats_custom { ++ char desc[ISCSI_HOST_STATS_CUSTOM_DESC_MAX]; ++ uint64_t value; ++}; ++ ++/* struct iscsi_offload_host_stats: Host statistics, ++ * Include statistics for MAC, IP, TCP & iSCSI. ++ */ ++struct iscsi_offload_host_stats { ++ /* MAC */ ++ uint64_t mactx_frames; ++ uint64_t mactx_bytes; ++ uint64_t mactx_multicast_frames; ++ uint64_t mactx_broadcast_frames; ++ uint64_t mactx_pause_frames; ++ uint64_t mactx_control_frames; ++ uint64_t mactx_deferral; ++ uint64_t mactx_excess_deferral; ++ uint64_t mactx_late_collision; ++ uint64_t mactx_abort; ++ uint64_t mactx_single_collision; ++ uint64_t mactx_multiple_collision; ++ uint64_t mactx_collision; ++ uint64_t mactx_frames_dropped; ++ uint64_t mactx_jumbo_frames; ++ uint64_t macrx_frames; ++ uint64_t macrx_bytes; ++ uint64_t macrx_unknown_control_frames; ++ uint64_t macrx_pause_frames; ++ uint64_t macrx_control_frames; ++ uint64_t macrx_dribble; ++ uint64_t macrx_frame_length_error; ++ uint64_t macrx_jabber; ++ uint64_t macrx_carrier_sense_error; ++ uint64_t macrx_frame_discarded; ++ uint64_t macrx_frames_dropped; ++ uint64_t mac_crc_error; ++ uint64_t mac_encoding_error; ++ uint64_t macrx_length_error_large; ++ uint64_t macrx_length_error_small; ++ uint64_t macrx_multicast_frames; ++ uint64_t macrx_broadcast_frames; ++ /* IP */ ++ uint64_t iptx_packets; ++ uint64_t iptx_bytes; ++ uint64_t iptx_fragments; ++ uint64_t iprx_packets; ++ uint64_t iprx_bytes; ++ uint64_t iprx_fragments; ++ uint64_t ip_datagram_reassembly; ++ uint64_t ip_invalid_address_error; ++ uint64_t ip_error_packets; ++ uint64_t ip_fragrx_overlap; ++ uint64_t ip_fragrx_outoforder; ++ uint64_t ip_datagram_reassembly_timeout; ++ uint64_t ipv6tx_packets; ++ uint64_t ipv6tx_bytes; ++ uint64_t ipv6tx_fragments; ++ uint64_t ipv6rx_packets; ++ uint64_t ipv6rx_bytes; ++ uint64_t ipv6rx_fragments; ++ uint64_t ipv6_datagram_reassembly; ++ uint64_t ipv6_invalid_address_error; ++ uint64_t ipv6_error_packets; ++ uint64_t ipv6_fragrx_overlap; ++ uint64_t ipv6_fragrx_outoforder; ++ uint64_t ipv6_datagram_reassembly_timeout; ++ /* TCP */ ++ uint64_t tcptx_segments; ++ uint64_t tcptx_bytes; ++ uint64_t tcprx_segments; ++ uint64_t tcprx_byte; ++ uint64_t tcp_duplicate_ack_retx; ++ uint64_t tcp_retx_timer_expired; ++ uint64_t tcprx_duplicate_ack; ++ uint64_t tcprx_pure_ackr; ++ uint64_t tcptx_delayed_ack; ++ uint64_t tcptx_pure_ack; ++ uint64_t tcprx_segment_error; ++ uint64_t tcprx_segment_outoforder; ++ uint64_t tcprx_window_probe; ++ uint64_t tcprx_window_update; ++ uint64_t tcptx_window_probe_persist; ++ /* ECC */ ++ uint64_t ecc_error_correction; ++ /* iSCSI */ ++ uint64_t iscsi_pdu_tx; ++ uint64_t iscsi_data_bytes_tx; ++ uint64_t iscsi_pdu_rx; ++ uint64_t iscsi_data_bytes_rx; ++ uint64_t iscsi_io_completed; ++ uint64_t iscsi_unexpected_io_rx; ++ uint64_t iscsi_format_error; ++ uint64_t iscsi_hdr_digest_error; ++ uint64_t iscsi_data_digest_error; ++ uint64_t iscsi_sequence_error; ++ /* ++ * iSCSI Custom Host Statistics support, i.e. Transport could ++ * extend existing host statistics with its own specific statistics ++ * up to ISCSI_HOST_STATS_CUSTOM_MAX ++ */ ++ uint32_t custom_length; ++ struct iscsi_host_stats_custom custom[0] ++ __attribute__ ((aligned (sizeof(uint64_t)))); ++}; ++ + #endif +diff --git a/include/iscsi_proto.h b/include/iscsi_proto.h +index 1c69feb..56f757b 100644 +--- a/include/iscsi_proto.h ++++ b/include/iscsi_proto.h +@@ -619,6 +619,7 @@ struct iscsi_reject { + #define KEY_MAXLEN 64 + #define VALUE_MAXLEN 255 + #define TARGET_NAME_MAXLEN VALUE_MAXLEN ++#define BOOT_NAME_MAXLEN 256 + + #define ISCSI_DEF_MAX_RECV_SEG_LEN 8192 + #define ISCSI_MIN_MAX_RECV_SEG_LEN 512 +diff --git a/include/list.h b/include/list.h +index cccc3c3..94ad99b 100644 +--- a/include/list.h ++++ b/include/list.h +@@ -38,6 +38,12 @@ static inline int list_empty(const struct list_head *head) + #define list_entry(ptr, type, member) \ + list_container_of(ptr, type, member) + ++#define list_first_entry(ptr, type, member) \ ++ list_entry((ptr)->next, type, member) ++ ++#define list_first_entry_or_null(ptr, type, member) \ ++ (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) ++ + #define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +diff --git a/iscsiuio/.gitignore b/iscsiuio/.gitignore +new file mode 100644 +index 0000000..a27452a +--- /dev/null ++++ b/iscsiuio/.gitignore +@@ -0,0 +1,25 @@ ++# Autogenerated files ++stamp-h1 ++Makefile.in ++Makefile ++configure ++config.h.in ++config.h ++config.guess ++config.log ++config.status ++config.sub ++COPYING ++ ++.deps ++autom4te.cache ++ ++# autotools ++aclocal.m4 ++compile ++depcomp ++install-sh ++libtool ++ltmain.sh ++missing ++ +diff --git a/iscsiuio/AUTHORS b/iscsiuio/AUTHORS +new file mode 100644 +index 0000000..e69de29 +diff --git a/iscsiuio/ChangeLog b/iscsiuio/ChangeLog +new file mode 100644 +index 0000000..a91b4d5 +--- /dev/null ++++ b/iscsiuio/ChangeLog +@@ -0,0 +1,7 @@ ++Version 0.4.1 (July 20, 2009) ++ * Fix from Mike Christie to determine page size from getpagesize() ++ rather then the constant PAGE_SIZE. PAGE_SIZE is not defined om ++ ia64 and ppc. ++ * Update documentation to indicate IPv6 is not supported ++ * Fix code to catch the message from the CNIC that the network ++ interface is going down. +diff --git a/iscsiuio/INSTALL b/iscsiuio/INSTALL +new file mode 100644 +index 0000000..c9fd2c0 +--- /dev/null ++++ b/iscsiuio/INSTALL +@@ -0,0 +1,290 @@ ++Installation Instructions ++************************* ++ ++Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, ++2006, 2007, 2008 Free Software Foundation, Inc. ++ ++ This file is free documentation; the Free Software Foundation gives ++unlimited permission to copy, distribute and modify it. ++ ++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. ++ ++ 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. ++ ++ 4. Type `make install' to install the programs and any data files and ++ documentation. ++ ++ 5. 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. ++ ++ 6. Often, you can also type `make uninstall' to remove the installed ++ files again. ++ ++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 `..'. ++ ++ 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'. ++ ++ 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. ++ ++ 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'. ++ ++Optional Features ++================= ++ ++ 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. ++ ++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" ++ ++and if that doesn't work, install pre-built binaries of GCC for HP-UX. ++ ++ 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" ++ ++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 bug. Until the bug is fixed you can use this workaround: ++ ++ CONFIG_SHELL=/bin/bash /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. +diff --git a/iscsiuio/Makefile.am b/iscsiuio/Makefile.am +new file mode 100644 +index 0000000..28dd776 +--- /dev/null ++++ b/iscsiuio/Makefile.am +@@ -0,0 +1,25 @@ ++SUBDIRS= src ++ ++EXTRA_DIST = build_date ++ ++build_date: ++ echo 'char *build_date = "'`date`'";' > build_date.c ++ echo 'char *build_date;'> build_date.h ++ ++manprefix = /usr/share ++mandir = ${manprefix}/man ++logdir = /etc/logrotate.d ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install-man install-log install-brcm ++ ++install-man: ++ cat docs/iscsiuio.8 | GZIP=$(GZIP_ENV) gzip -c > iscsiuio.8.gz ++ $(INSTALL_PROGRAM) iscsiuio.8.gz $(mandir)/man8 ++ ++install-log: ++ $(INSTALL_PROGRAM) iscsiuiolog $(logdir) ++ ++install-brcm: ++ -rm -f $(sbindir)/brcm_iscsiuio ++ -ln -s $(sbindir)/iscsiuio $(sbindir)/brcm_iscsiuio +diff --git a/iscsiuio/NEWS b/iscsiuio/NEWS +new file mode 100644 +index 0000000..e69de29 +diff --git a/iscsiuio/README b/iscsiuio/README +new file mode 100644 +index 0000000..9ae1411 +--- /dev/null ++++ b/iscsiuio/README +@@ -0,0 +1,224 @@ ++Iscsiuio Userspace Tool ++Version 0.7.8.2 ++Dec 10, 2013 ++------------------------------------------------------ ++ ++This tool is to be used in conjunction with the QLogic NetXtreme II Linux ++driver (Kernel module name: 'bnx2' and 'bnx2x'), QLogic CNIC driver, ++and the QLogic iSCSI driver (Kernel module name: 'bnx2i'). ++This user space tool is used in conjunction with the following ++QLogic Network Controllers: ++ bnx2: BCM5706, BCM5708, BCM5709 devices ++ bnx2x: BCM57710, BCM57711, BCM57711E, BCM57712, BCM57712E, ++ BCM57800, BCM57810, BCM57840 devices ++ ++This utility will provide the ARP and DHCP functionality for the iSCSI offload. ++The communication to the driver is done via Userspace I/O (Kernel module name ++'uio'). ++ ++There is one component to this application: ++ ++1. 'iscsiuio' - This is the daemon which aids in creating iSCSI offloaded ++ connections. ++ ++Dependencies: ++======================================= ++ ++Linux Kernel Dependencies: ++1. QLogic CNIC driver (cnic) ++1. QLogic iSCSI offload driver (bnx2i) ++2. Userspace I/O driver (uio) ++ ++Directory Structure of this Package: ++======================================= ++ ++ ++ | ++ +-doc (documentation directory: man pages) ++ | ++ +-src ++ | ++ +- uip - the uIP stack ++ | ++ +- unix - iscsiuio source ++ ++ ++ ++Compiling / Installing ++======================================= ++ ++1. Please untar the tarball. ++2. Run the configure script. This will create the Makefiles and proper ++ header files needed for the build. ++3. Run 'make'. This will create the binary, 'iscsiuio' ++4. Run 'make install' to place the binaries in their installed location. ++ (The default location is '/sbin') ++ ++iscsid IFACE Configuration File: ++======================================= ++The network interface configuration files are driven by the iscsid iface ++files. The configuration data is parsed by iscsid and passed to the uIP ++stack when the connection is established. ++ ++One can use the following iscsiadm commands to create/set the configuration ++using the iface files: ++ ++1. Create the iface file: ++ ++ iscsiadm -m iface -I --op=new ++ ++2. Discover the targets associated with the new iface ++ ++ iscsiadm -m discovery -t st -p -I ++ ++3. Update the iface file: ++ ++ To use a static IPv4 address: ++ iscsiadm -m iface -I --op=update --name=iface.ipaddress --value= ++ ++ To use a DHCP address: ++ iscsiadm -m iface -I --op=update --name=iface.ipaddress --value=0.0.0.0 ++ ++ The following values are required. ++ ++ To specify the bnx2i as the transport: ++ iscsiadm -m iface -I --op=update --name=iface.transport_name --value=bnx2i ++ ++ To specify the network interface to offload with: ++ ++ a. Specify the physical network interface name ++ iscsiadm -m iface -I --op=update --name=iface.net_ifacename --value= ++ ++ b. Specify the iSCSI MAC address of the iSCSI HBA ++ iscsiadm -m iface -I --op=update --name=iface.hwaddress --value= ++ ++4. Now all the settings should be set so that one could connect to their ++ desired iSCSI target. ++ ++ iscsiadm -m node -p -T -I --login ++ ++bnx2 Limitations: ++======================================= ++* RX iSCSI ring: ++ * default ring size is 3 entries ++ * default buffer size is 0x400 bytes ++* TX iSCSI ring: ++ * default ring size of 1 entry ++ * default buffer size is 0x400 bytes ++ ++bnx2x Limitations: ++======================================= ++* RX iSCSI ring: ++ * default ring size is 15 entries ++ * default buffer size is 0x400 bytes ++* TX iSCSI ring: ++ * default ring size of 1 entry ++ * default buffer size is 0x400 bytes ++ ++Other Limiations: ++ ++Any packets larger then the buffer size will not be sent/received by the ++hardware and will be dropped. ++ ++IPv6 support: ++ ++IPv6 NDP (neighbor discovery protocol), DHCPv6 and Static IPv6 are now ++supported. The IPv6 address used for the connection will be matched against ++the DHCPv6/static IPv6 address, the RA (router advertise) address, and the ++assigned link local address. ++ ++VLAN support: ++ ++VLAN support is only supported when using static IP addresses. ++Also, currently only 1 VLAN is supported per physical network interface. ++Either non-VLAN offloaded traffic is allowed or VLAN offloaded traffic ++is allowed. The current implementation does not support both at the ++same time. ++ ++Currently there is no explicit VLAN attributes in the iface file. ++To configure the VLAN offload, the iface.hwaddress attribute or ++physical net_ifacename (without the VLAN identifier) must be used ++to specify the HBA device. For the proper CNIC routing, the ++corresponding L2 interface which has the associated VLAN interface must ++have an IP address on the same subnet. ++ ++The following attributes need to be filled when offloading via the ++VLAN interface: ++ ++ iface.iscsi_ifacename = ++ iface.hwaddress = XX:XX:XX:XX:XX:XX ++ iface.ipaddress = XX.XX.XX.XX ++ iface.transport_name = bnx2i ++ ++Setting IP address: ++ ++On RHEL5.4, RHEL5.5+, RHEL6.0+, and SLES11SP1 distributions, ++discovery login is done over the Linux TCP/IP stack and L2 network ++interface. The ethx interface corresponding to the HBA must ++therefore be in the same IP subnet in order to reach the iSCSI ++target during discovery. However, the HBA's IP address should not ++be the same as the L2 ethx's IP address. ++ ++Starting with RHEL6.1 and all other newer distributions, discovery ++using SendTargets is done over the HBA interface, so there is no ++need for the HBA and L2 network to be on the same subnet. However, ++if VLAN is used on the HBA, they still have to be on the same subnet ++as described above. ++ ++ ++Setting Netmask and Gateway addresses: ++ ++With the current limitations of the iface file, there are no entries ++to allow the user to enter a netmask or gateway IP address. ++ ++The only way to explicitly configure these options is to use DHCP ++addressing. Then the netmask/gateway are set on the DHCP server. ++These settings are then sent to uIP via the DHCPOFFERs. ++ ++If the netmask is not defined then the netmask are automatically ++generated depending on the destination IP address. ++ ++Debugging: ++======================================= ++ ++By default, the iscsiuio daemon does not output any messages to the log file, ++'/var/log/iscsiuio.log'. Message logging is only enabled when the daemon is ++run under debug mode. ++ ++To run the daemon in debug mode please pass the parameter '-d ' ++ ++where the following debug levels are defined: ++ ++DEBUG 4 - Print all messages ++INFO 3 - Print messages needed to follow the uIP code (default) ++WARN 2 - Print warning messages ++ERROR 1 - Only print critical errors ++ ++A sample banner message: ++ ++INFO [Mon Jun 20 11:23:14 2011]Started iSCSI uio stack: Ver 0.7.0.6 ++INFO [Mon Jun 20 11:23:14 2011]Build date: Mon Jun 20 11:22:05 PDT 2011 ++INFO [Mon Jun 20 11:23:14 2011]Debug mode enabled ++ ++These messages can be used to help debug any issues. ++ ++When debugging issues like the iscsid, the iscsiuio daemon can be run ++in the foreground and the maximum debugging level should be used. ++ ++To place the daemon in foreground mode please pass the parameter '-f' ++ ++Note: The messages to the log file are not flushed unless debugging is enabled. ++ ++Note: If the daemon iscsiuio is running, one will not be able to ++ trample over the existing binary. One might see the following message: ++ ++ 'cannot create regular file `/sbin/iscsiuio': Text file busy' ++ ++ The solve this, please stop the iscsid service and then install. ++ ++Warning: If full debug is enabled, this may quickly fill the partition ++containing the iscsiuio logs. This is because full debugging will log ++packet activity which on a busy network will quickly fill the logs. ++ ++Note: If the bnx2i and cnic drivers are unloaded, then iscsiuio will also ++need to be restarted so that it can determine the iscsid version. +diff --git a/iscsiuio/RELEASE.TXT b/iscsiuio/RELEASE.TXT +new file mode 100644 +index 0000000..44d67f9 +--- /dev/null ++++ b/iscsiuio/RELEASE.TXT +@@ -0,0 +1,2032 @@ ++ Release Notes ++ QLogic uIP Linux Driver ++ Version 0.7.8.2 ++ 12/10/2013 ++ ++ QLogic Corporation ++ 26650 Aliso Viejo Pkwy, ++ Aliso Viejo, CA 92656 ++ ++ Copyright (c) 2004 - 2013 Broadcom Corporation ++ Copyright (c) 2014, QLogic Corporation ++ All rights reserved ++ ++uIP v0.7.10.2 (Feb 12, 2014) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00072504 - ifconfig shows allocation failure after ++ up/down few hours with iSCSI + L2 traffic ++ Cause: A memory leak was discovered in the ongoing pthread creation ++ destruction code during the connection recovery process ++ Change: Fixed the pthread creation code ++ Impact: All ++ ++ ++uIP v0.7.8.2 (Dec 10, 2013) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00072053 - Some hardware iSCSI paths fail during test ++ Cause: The test exercised a corner case where the ARP cache flush ++ mechanism didn't work properly ++ Change: Fixed the ARP cache flush mechanism ++ Impact: All ++ ++ Enhancements ++ ------------ ++ 1. Change: Added a new tx doorbell field in the uio path to work with ++ the new bnx2x/cnic drivers that supports VF_RSS ++ Impact: 10G only ++ ++ 2. Change: Fixed the iface.subnet_mask decoding for IPv6 ++ Impact: IPv6 ++ ++ ++uIP v0.7.8.1b (May 01, 2013) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Performance optimization by caching the page size ++ Impact: All ++ ++ 2. Change: Fixed a bug in the tx completion interrupt handler ++ Impact: 10G only ++ ++ ++uIP v0.7.6.1g (Jan 14, 2013) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00067316 - IPv6 address prefix length < 32 ++ bits fails to connect ++ Cause: CIDR notation has an order bug in the IPv6 section ++ whenever the prefix length specified is < 32 ++ Change: Fixed the network order bug ++ Impact: IPv6 only ++ ++ ++uIP v0.7.6.1f (Nov 14, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00065768 - RHEL5.X iscsiuio segfault possible ++ if there is a specific 1024 byte size broadcast ++ packet ++ Cause: This is another corner case where the packet size ++ is also exactly 1024 bytes + padding that exceeded ++ the DMA rx buffer. The previous fix was not ++ sufficient ++ Change: Ensure that the packet size + padding do not ++ exceed this limit. ++ Impact: 10G only. 1G already has the guard against it. ++ ++ ++uIP v0.7.6.1e (Nov 07, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00066397 - Unable to connect to iSCSI target ++ with NPAR enabled on 57840 ++ Cause: The PCI device ID for 57840_MF has been changed from ++ 0x16ab to 0x16a4 ++ Change: Updated the PCI id table to match exactly what the ++ bnx2x 1.76 indicates ++ Impact: 57840 MF ++ ++ ++uIP v0.7.6.1d (Oct 31, 2012) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Added support for open-iscsi-2.0.873 ++ Impact: All ++ ++ ++uIP v0.7.6.1c (Oct 15, 2012) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Added support for 10G 57840 4x10 and 2x20 ++ Impact: 10G 57840 ++ ++ ++uIP v0.7.6.1b (Oct 09, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00065690 - Vconfig method of connecting over ++ tagged vlan with IPv6 failed ++ Cause: The new net param support changes has prevented ++ the old vconfig method from execising the IPv6 ++ acquisition engine properly ++ Change: Ensure that this old vconfig method to run the IPv6 ++ acquisition engine properly and to its entirety ++ Impact: IPv6 + VLAN using the network VLAN configuration ++ method ++ ++ 2. Problem: Cont00065768 - RHEL5.X iscsiuio segfault possible ++ if there is a specific 1024 byte size broadcast ++ packet ++ Cause: This is a corner case where the packet size is ++ exactly 1024 bytes + padding that exceeded the ++ DMA rx buffer. This has been there since day 1. ++ Change: Ensure that the packet size + padding do not ++ exceed this limit. ++ Impact: 10G only. 1G already has the guard against it. ++ ++ ++ Enhancements ++ ------------ ++ 1. Change: Source optimization - backported source code fixes ++ as reported from the upstream submission patch ++ Impact: ALL ++ ++ ++uIP v0.7.4.2k (Aug 10, 2012) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Enable HP SD mode ++ Impact: 577XX/578XX ++ ++ ++uIP v0.7.4.2j (Jul 18, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00064665 - Linux iSCSI connects via gateway address ++ on the wrong subnet ++ Cause: The gateway address used was not checked against the ++ subnet mask specified before the ARP requests. Since ++ this behavior deters from how L2 operates, therefore, ++ a change was made to correct this. ++ Change: Added check of the gateway specified against the subnet ++ specified. ++ Impact: Static IPv4 operation ++ ++ 2. Problem: Cont00064722 - Linux iSCSI unable to force IPv6 LL ++ override (advanced iface parameters) ++ Cause: The override LL address was not being populated to the ++ IPv6 address database correctly ++ Change: Added this correctly to the IPv6 initialization ++ Impact: Static/DHCP IPv6 LL address override only ++ ++ ++uIP v0.7.4.2i (Jul 11, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00064604 - Fails to connect to routed IPv6 target ++ via RA ++ Cause: The default router IPv6 address was not being retrieved ++ correctly. ++ Change: Fixed the default router IPv6 address read ++ Impact: All ++ ++ ++uIP v0.7.4.2h (Jun 15, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00063863 - can't boot into offload image ++ when VLAN is enabled ++ Cause: During the iSCSI login exchange, certain iSCSI targets ++ will send an ARP request even though the TCP connection ++ has been made. The bug was in this ARP reply where ++ the local MAC was corrupted when VLAN is enabled. ++ Change: Fixed the ARP reply packet ++ Impact: All ++ ++ ++uIP v0.7.4.2g (Jun 08, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00063816 - The initiator is not able to connect ++ to the iSCSI targets over VLAN ++ Cause: The process packet routine did not consider the PCP ++ of the VLAN tag to be non-zero. This created a ++ mismatch when this VLAN tag was compared against the ++ nic_iface->vlan_id which doesn't include the PCP. ++ Change: Added the consideration of non-zero PCP ++ Impact: All ++ ++ ++uIP v0.7.4.2f (Jun 04, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00063626 - Static IPv6 does not connect when ++ the prefix len is not set explicitly ++ Cause: The IPv6 prefix length was not set correctly ++ for Static IPv6 operation when CIDR notation is ++ not specified ++ Change: Fixed the default prefix length ++ Impact: Static IPv6 ++ ++ 2. Problem: Cont00063651 - Cannot connect to iSCSI targets ++ HP PTM/SF ++ Cause: Switch-Dependent mode + invalid Outer VLAN was ++ not supported ++ Change: Allow SD+invalid OV to fallback to SF operation mode ++ Impact: 5771X/578XX ++ ++ ++uIP v0.7.4.2e (May 30, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00063443 - Compilation error on SLES11sp1 ++ Cause: The iface_num field was not defined ++ Change: Fixed all references to iface_num ++ Impact: SLES11sp1 ++ ++ 2. Problem: Cont00063518 - HBA fails to connect across router ++ using iface.gateway address ++ Cause: The gateway override code did not populate the ++ address into the lower level engine ++ Change: Fixed the gateway override code ++ Impact: IPv4 Static IP operation ++ ++ 3. Problem: Cont00063567 - IPv6 LL and RA override does not work ++ Cause: The IPv6 LL/RA override addresses were overwritten ++ by the NDP engine ++ Change: Fixed the LL/RA override code ++ Impact: IPv6 operation ++ ++ Enhancements ++ ------------ ++ 1. Added support for jumbo MTU (independent from the L2 MTU) ++ ++ ++uIP v0.7.4.2d (May 21, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00063421 - Static IPv6 cannot connect via RA/LL ++ Cause: The router advertise and the linklocal address ++ were corrupted due to the override capabilities ++ added for the newer open-iscsi util ++ Change: Fixed the address override code ++ Impact: Static IPv6 ++ ++ Enhancements ++ ------------ ++ 1. Allow VLAN tag = 1 (router management) to connect offload ++ ++ ++uIP v0.7.4.2c (May 09, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: RHEL BZ 734010/804580 - issues found by the Coverity ++ scan ++ Cause: 10 code issues were flagged for revision ++ Change: Fixed all area of concern ++ Impact: All ++ ++ 2. Problem: Cont00063177 - IPv4 DHCP with VLAN specification in ++ iface file gets wrong address ++ Cause: The DHCPv4 handler was not discriminating the VLAN tag ++ associated with the DHCP offers from multiple DHCP ++ servers ++ Change: Changed the DHCPv4 handler to drop DHCP offer packets ++ that doesn't match the VLAN tag of the intended DHCP ++ discovery packet ++ Impact: DHCPv4 operation ++ ++ ++uIP v0.7.4.2b (May 01, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00062993 - IPv6 DHCP with VLAN specification in ++ iface file gets wrong address ++ Cause: The DHCPv6 request was using the same DUID as always ++ so the non-VLAN DHCP server responded to our broadcast ++ instead ++ Change: Changed the DHCPv6 request DUID to link address + time ++ instead of link address alone ++ Impact: DHCPv6 operation ++ ++ ++uIP v0.7.4.1j (Apr 24, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00062805 - Cannot login to iSCSI targets on RHEL6.3 ++ Cause: The problem was caused by a change made to the iface_rec ++ structure in the RHEL6.3 inbox open-iscsi util ++ Change: The new changes is now incorporated ++ Impact: All ++ ++ ++uIP v0.7.4.1i (Apr 16, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00062660 - Unable to login with VLAN iscsiuio ++ on RHEL6.2 ++ Cause: The open-iscsi util in RHEL6.2 has a bug which ++ does not pass the correct iface_num to iscsiuio ++ Change: Added workaround to fall back to do the legacy ++ VLAN support if iface_num and vlan_id = 0 ++ Impact: RHEL6.2 ++ ++ ++uIP v0.7.4.1h (Apr 13, 2012) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Added support for the new iface_num field in the iscsi_uevent ++ path ++ ++ 2. Fixed bug in the nic_iface search engine based on iface_num ++ ++ ++uIP v0.7.4.1g (Mar 22, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00061869 - Unable to setup an offload iSCSI ++ connection with FLR/NPAR under ESX5.0:PDA ++ Cause: The physical function ID was previously extracted ++ from the sysfs of the VM which might not be consistent ++ to the actual physical setup due to the function ++ remapping in the hypervisor ++ Change: Read the physical function ID directly from the BAR0 ++ ME register ++ Impact: All ++ ++ 2. Problem: Cont00062170 - IPv6 login/logout stress fails ++ Cause: The packet interrupt was lost after running the test ++ for a much longer period of time. A bug in the ++ packet processing routine was found to exit prematurely ++ Change: Fixed the packet processing routine to process all ++ packets before exiting ++ Impact: All ++ ++ ++uIP v0.7.4.1f (Mar 19, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00062170 - IPv6 login/logout stress fails ++ Cause: The packet buffer routine for IPv6 did not take ++ network order <-> host order into consideration ++ Change: Added a htons call to compensate for the ntohs pair ++ Impact: All ++ ++ ++uIP v0.7.4.1e (Mar 08, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00061978 - Load/unload stress test fails ++ Cause: The bnx2x open request was failing due to the module ++ request procedure. However, the open failure was ++ not being handled correctly. ++ Change: Fixed the device open error handling ++ Impact: 5771X/578XX ++ ++ ++uIP v0.7.4.1d (Mar 02, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00061708 - Unable to log into target after running ++ driver load/unload ++ Cause: A bug was introduced in the previous bug fix (CQ61459) ++ where a pthread_cond_broadcast call was erroneously ++ enabled ++ Change: Restored this back ++ Impact: All ++ ++ ++uIP v0.7.4.1c (Feb 16, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00061529 - Unable to connect to target after an ++ initial failed login attempt until iscsi service is ++ restarted ++ Cause: Upon a failed DHCPv4 acquisition due to the wrong VLAN ++ tag in the initial iface setup, any iscsid connect request ++ from the same NIC will get dropped due to a bug. ++ Change: Fixed the bug which prevented new iscsid connect requests ++ from getting honored ++ Impact: All ++ ++ Enhancements ++ ------------ ++ 1. Updated README ++ ++ ++uIP v0.7.4.1b (Feb 08, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00061513 - Unable to connect to target over VLAN ++ interface ++ Cause: The VLAN id was not properly passed back to the CNIC ++ driver for the offload request ++ Change: Fixed the VLAN id being passed back to the CNIC driver ++ Impact: All ++ ++ ++uIP v0.7.4.1a (Feb 01, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00049383 - No mechanism in iface file to support ++ gateway/routing ++ Change: Added support for the additional network parameters ++ as passed from the newer iscsi-util. ++ These parameters include: ++ IPv4: subnet_mask, gateway ++ IPv6: ipv6_linklocal, ipv6_router, ++ ipv6_autocfg, linklocal_autocfg, router_autocfg ++ VLAN: vlan_id, vlan_priority, vlan_state ++ Other: mtu, port ++ Impact: All ++ ++ 2. Problem: Cont00060806 - Unable to connect target using DHCP over ++ tagged VLAN ++ Change: DHCP+VLAN is a new feature enhancement that was added ++ alongside all other new iface parameters. ++ Impact: All ++ ++ ++ Enhancements ++ ------------ ++ 1. Lock iscsid's connect request with path_req so connect requests ++ with DHCP/Static will no longer override each other ++ ++ 2. Fixed the if_down handler from global to nic specific ++ ++ 3. Fixed various synchronization issues ++ ++ ++uIP v0.7.2.1e (Jan 05, 2012) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00060734 - ifupdown-mtu change stress with active ++ session causes iscsiuio to fail ++ Change: Fixed a race condition between the nic enable thread ++ and when DHCP fails ++ Impact: All ++ ++ ++uIP v0.7.2.1d (Dec 28, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00060368 - segfault observed after failing both ++ mpio paths ++ Change: Various memory leaks were identified and resolved in ++ the nic cleanup path ++ Impact: All ++ ++ ++uIP v0.7.2.1c (Dec 16, 2011) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Disable HP SD mode ++ ++ ++uIP v0.7.2.1b (Dec 14, 2011) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Default iscsiuio logging to off. Use the '-d' ++ option to enable ++ ++ ++uIP v0.7.0.14g (Oct 25, 2011) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Fixed the compilation under RHEL6.2 ++ 2. Change: Added oom_adjust call to prevent OOM Killer from killing ++ iscsiuio when memory is low ++ 3. Change: Added mlockall setting to prevent page swap ++ ++ ++uIP v0.7.0.14f (Oct 20, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00058994 - DOS vulnerability in uip during UDP flood ++ Cause: The warning messages from the UDP handler was logging ++ at a rate faster than the log file logrotate rate ++ Therefore, the system's OOM eventually got kicked in to ++ start terminating running processes which includes iscsiuio ++ Change: Moved several UDP warning messages from the default log ++ level to the debug log level ++ Impact: All (minor) ++ ++ 2. Problem: Cont00059288 - Show segfault w/ SLES11 SP1 Xen kernel ++ Cause: The bnx2x chip_id was not read correctly from the PCIe BAR1 ++ under the Xen kernel. The error was in the mmap area. ++ Change: Corrected the mmapping of the PCI MMIO space. ++ Impact: Xen kernels ++ ++ Enhancements ++ ------------ ++ 1. Change: Changed the log file open error to a warning and let ++ the daemon progress. This was only observed under iSCSI boot ++ ++ ++uIP v0.7.0.14e (Sep 19, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00058678 - Can not iboot target from ipv6 path ++ using VLAN ++ Cause: A bug was found in the path request path where the vlan ++ iface's protocol family was not used correctly in the ++ iface search ++ Change: This has been corrected ++ ++ ++uIP v0.7.0.14d (Sep 16, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00058602 - Can't iboot using IPv6 offload path ++ Cause: The bug was exposed by a fix in 0.7.0.14c where the ++ IPv6 router solicitation timeout exceeded the nic ++ enable thread timeout. ++ Change: The IPv6 router solicitation timeout has been adjusted ++ ++ ++uIP v0.7.0.14c (Sep 01, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00058256 - Sessions fail after loginstress to via ++ simultaneous ipv4 and ipv6 dhcp ++ Cause: Switching between DHCPv4/v6 coupled with VLAN exposed ++ a drawback in our nic_iface architecture design where ++ VLAN is not specified by iscsid. ++ Change: The code was optimized and improved the performance when ++ switching between DHCPv4/v6+VLAN. However, the ultimate ++ fix is to make use of the net config parameters introduced ++ in the newer open-iscsi util which will identify the ++ specific VLAN nic_iface to use. ++ ++ Enhancements ++ ------------ ++ 1. Change: Added support for bnx2x-1.71.00 ++ ++ ++uIP v0.7.0.14b (Aug 23, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00057840 - RHEL6.2 inbox: Unable to connect to ++ targets with 5709 ++ Cause: For cases when the bnx2/bnx2x driver gets removed, the ++ uio database that was built by cnic would have the device ++ ->net reference removed. This has caused an unnecessary ++ timeout of 5s for each stale uio entry in the database. ++ Change: Adjusted the routine which seeks the device->net entry ++ to include more logic instead of hard waiting for 5s. ++ ++ Enhancements ++ ------------ ++ 1. Change: Added support for RHEL6.2 for out-of-box release ++ 2. Change: Updated the man page with -h and -p info ++ 3. Change: Updated the -h info ++ ++ ++uIP v0.7.0.13 (Aug 10, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00057768 - iscsiuio logrotate causes daemon failure ++ Cause: The logrotate script will send a SIGUSR1 signal to notify ++ the iscsiuio daemon of such action. However, the daemon ++ wasn't programmed to catch this signal. ++ Change: Restored the catching of this signal ++ ++ ++uIP v0.7.0.12 (Aug 04, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00050634 - brcm_iscsiuio Tainted: running IoZone, ++ Iometer and receiving a UDP flood on 3260 ++ Cause: Upon iscsiuio termination, because of the UDP flood, ++ the nic thread will be busy servicing those UDP packets ++ while the signal handling thread will free up all nic ++ resources. The two threads were not in sync. ++ Change: Added a nic_remove_all routine to destroy all nic threads ++ before the nic resources get freed. ++ ++ Enhancements ++ ------------ ++ 1. Change: Fixed all warnings as reported by RHELS' Coverity testing. ++ ++ ++uIP v0.7.0.11 (Aug 02, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Erroneous VLAN tag was being passed by iscsid for connect ++ request ++ Cause: The iscsid's iface_rec_t ipc message does not contain this ++ vlan field. This field was added in uIP for future vlan ++ support. Since the buffer allocated to receive such message ++ in uIP didn't get initialized, therefore, garbled up VLAN ++ tag was getting used. ++ Change: Added the initialization of this buffer. ++ ++ ++uIP v0.7.0.10 (Jul 26, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Can't offload when switching from Static to DHCP then back to ++ Static IPv4 when connecting through a VLAN interface ++ Cause: The VLAN processing code did not reinstall the IP address ++ from the default nic_iface to the associated VLAN nic_iface. ++ This was only done on the very first time when the VLAN ++ interface was created and not on subsequent instances. ++ Change: Added code to mirror the default nic_iface IP/netmask/ip_config ++ on the VLAN nic_iface on every new connection request. ++ ++ ++uIP v0.7.0.9 (Jul 19, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Can't offload to 57810 NPAR NIC ++ Cause: The MF/VF variant of the PCI IDs were not supported previously ++ Change: Added support for the MF/VF variants for 57800/57810/57840 ++ ++ ++uIP v0.7.0.8 (Jun 30, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00056522 - Unable to connect to iSCSI target using ++ netxtreme2 package 7.0.9 ++ Cause: The iSCSI L2 ring's CID has changed from 17 to 49 ++ Change: The code now gets L2 iSCSI ring CID from the l2_buf directly. ++ This will work with any version of the cnic driver because ++ the location is a zero before this change. ++ ++ ++uIP v0.7.0.7 (Jun 23, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00056460 - iSCSI Offload boot RHEL5u5 x64 dropped tagged ++ packets with iSCSI Offload Boot with untagged ++ Cause: The ICMP echo replies to the target was corrupted in both ++ 1g and 10g mode ++ Change: The code will now handle both VLAN stripped and no VLAN stripped ++ incoming packets correctly. Also modified the transmit routine ++ to strip out any inline VLAN tag before setting up the hw to ++ insert VLAN tag. ++ ++ ++uIP v0.7.0.6 (Jun 21, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00056231 - DHCPv4 not working with iSCSI HBA w/ ++ linux-nx2 v7.0.7 ++ Cause: The 10g L2 FW HSI has been modified for PCIe performance ++ enhancement in the 7.0.7 package (FW 1.70.20) which uIP ++ has not adapted to. ++ Change: The eth_rx_cqe size has been increased from 32B to 64B. ++ ++ Enhancements ++ ------------ ++ 1. Change: The utility name has changed from brcm_iscsiuio to iscsiuio ++ as preparation for upstream submission. ++ 2. Change: Updated README ++ ++ ++uIP v0.7.0.5 (Jun 02, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00055915 - iSCSI does not connect on 57800 in 4-port mode ++ Cause: The 4-port mode was not being determined correctly ++ Change: Fixed the PORT4MODE register offset and the QZONE_ID macros ++ ++ ++uIP v0.7.0.4 (May 24, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00055832 - linux iscsiboot can not login to target using ++ offload path (57800) ++ Cause: The device ID comparison routine did not take care of the case ++ when one device ID is bitwise superset of another. ++ Change: Fixed the device ID comparison routine. ++ ++ ++uIP v0.7.0.3 (May. 19, 2011) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Updated all fixes to match the released uIP 0.6.4.17 ++ ++ 2. Change: Modified source and Copyright info as preparation for upstream ++ submission ++ ++ ++uIP v0.7.0.2 (May. 03, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00048972 - brcm-iscsi.log has no max size and would grow ++ to consume all free space on hard disk ++ Cause: There was no mechanism to rotate the log ++ Change: Added logrotate entry and SIGUSR1 signal handling for log rotate ++ action ++ ++ 2. Problem: Cont00054996 - Multi-session, multi-protocol mtu stress ++ does not recover all sessions ++ Cause: A segfault was observed during the load/unload module. The ++ problem was caused by an illegal dereference of a pointer ++ when IPv6 couldn't find the longest match address from ++ the ARP (Neighbor) table. ++ Change: Fixed the dereferencing error ++ ++ 3. Problem: Cont00054900 - Linux uIP - Please add ability to connect ++ to routed target with static iface IPv6 ++ Cause: Static IPv6 never runs the IPv6 NDP router sol/adv engine. ++ Change: IPv6 NDP router sol/adv has now been added to static IPv6 ++ operation. ++ ++ 4. Problem: Cont00054996 - Multi-session, multi-protocol mtu stress ++ does not recover all sessions ++ Cause: Segfaults were observed caused by the accessing of the IPv6 ++ NDP structure while the nic is undergoing a reset either ++ due to a DHCPv4 request from iscsid or the handling of ++ if_down due to the NL handler from CNIC. ++ Change: The fix involves the following: ++ - Fixed the handling of staggered IPv4/v6 DHCP/static requests ++ - Fixed memory leak due to reallocation of IPv4 and IPv6 ++ DHCP structs ++ - Fixed the pthread join stuck problem in the handling ++ of the if_down NL message ++ ++ 5. Problem: Cont00054810 - Linux NMI - bnx2x_init_hw_common:PXP2 CFG ++ failed running iSCSI MTU stress test ++ Cause: This only happens in DHCPv4 mode. The problem was caused ++ by contention between the elongated window of performing ++ DHCP in the enable_nic thread while receiving the asynchronous ++ if_down NL message (from the MTU change event) from the ++ CNIC NL thread. The problem occurs when the enable_nic ++ thread tries to call bnx2x_open while the other thread ++ calls the bnx2x_close routine. ++ Change: Fixed mutex lock bugs for the enable_nic thread. Also ++ extended the nic_disable timeout to 10s to compensate for ++ the DHCP operation. ++ ++ 6. Problem: Cont00054818 - RH6.0 - Unable to logout of iSCSI session ++ after running PQA baseline scripts ++ Cause: This was caused by the call to cancel the enable_nic ++ thread when disabling the nic but failed to unlock the ++ nic mutex that the enable_nic thread held. ++ Change: Wake up the enable_nic thread and wait for it to complete ++ instead of canceling it in the nic_disable path. ++ ++ 7. Problem: Cont00054725 - Previous static HBA IP will be used after ++ a new static HBA IP has been created ++ Cause: There was an assumption in the code where if the same ++ nic_iface structure was found based on the nic/vlan pair, ++ the specified IP address would not be used. Instead, it ++ will continue to use the previous defined IP address. ++ Change: The previous IP address will now be compared against the ++ the specified IP address before finishing the parce ++ iface request from iscsid. If different, the current ++ nic will be disabled and then re-enabled with the newly ++ specified IP address. ++ ++ 8. Problem: Cont00054571 - Unable to connect to routed ipv6 target ++ with RA address and iface DHCPv6 ++ Cause: The default router address was not being employed for ++ the IPv6 neighbor negotiation. Additionally, the return ++ address of our neighbor advertisement was incorrect as ++ it should use the best matched src address instead. ++ Change: Fixed both the IPv6 neighbor solicitation and advertisement ++ transmission and handling. ++ ++ 9. Problem: Cont00054510 - fails to login to 32 session with blanket ++ login IPv6 ++ Cause: A bug was introduced in uIP 0.6.4.6 where the NIC_RUNNING ++ flag might not be set when entering the main loop under ++ certain situations depending on the nic bring up. ++ Change: A new NIC_STARTED_RUNNING flag is now defined to fix CQ53511. ++ ++ 10. Problem: Cont00053807 - RA and link local are unable to connect if DHCPv6 ++ fails ++ Cause: The host link local address was not being searched as one of ++ the host address to be replied to CNIC for the connect request. ++ Change: The path reply now includes the search of host link local ++ address as well. ++ ++ 11. Problem: Cont00054236 - iSCSI service must be restarted before an IPv6 ++ connection can be made to the Equalogic target ++ Cause: The problem was intermittent as it depends on which IPv6 address ++ the target was redirecting to. Since uIP was only extracting ++ the target's IPv6 address + MAC from the target's neighbor ++ advertisement packet itself and not from the ICMPv6 option, so ++ the wrong or no MAC address will get send down to CNIC for the ++ connection establishment; hence the no connect. ++ Change: Added the updating of the neighbor discovery table to also use ++ the Target IPv6 address + MAC specified in the incoming neighbor ++ advertisement's ICMPv6 option field. ++ ++ 12. Problem: Cont00053255 - bnx2x panic dump logging into multiple ++ discovered IPv6 nodes (Equalogic IPv6 target) ++ Cause: The bnx2x panic was fixed in the 10g fw 6.4.29. ++ A IPv6 connectivity issue was then found and led to different ++ kernel/uIP crashes. This was caused by the same IPv6 ++ connectivity problem mentioned above. ++ Change: Same as above ++ ++ 13. Problem: Cont00053728 - Sessions never recover after doing initiator-side ++ cable pull test with IPv6 traffic against Equalogic targets ++ Cause: It was discovered that the Equalogic would send out periodic ++ neighbor solicitation to maintain the connection to the ++ initiator. Since uIP was responding with the assigned IPv6 ++ link local address in the neighbor advertisement ++ unconditionally, the target was observed to stop transmitting on ++ the connection specified. ++ Change: The neighbor advertisement generated will now use the dst IPv6 ++ address from the input neighbor solicitation packet instead of ++ the assigned IPv6 link local address for both the packet and the ++ ICMPv6 source IPv6 address. ++ ++ 14. Problem: Compile error under 32-bit OS ++ Cause: A bug was introduced in the previous release 0.6.4.6 which ++ caused a compilation error in 32-bit OS (64-bit compiles ++ fine) ++ Change: Fixed the bug ++ ++ 15. Problem: Cont00053807 - RA and Link local are unable to connect if dhcpv6 ++ fails ++ Cause: There was a bug in the nl reply where the RA address will never ++ be sent back to CNIC for the connection request ++ Change: The best matched address to the dst will now be sent back to ++ CNIC in the path rsp. ++ ++ Enhancements ++ ------------ ++ 1. Change: Updated README to remove the 57713/E references ++ ++ 2. Change: Allow the ICMP option field in the IPv6 Neighbor Advertisement ++ response to be included without discrimination. This fixes ++ an issue connecting against the EQL via RA for DHCPv6. ++ ++ 3. Change: Updated README for the IPv6 operation, VLAN, and discovery. ++ ++ ++uIP v0.7.0.1 (Mar. 29, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00053511 - bnx2x panic dump during ifup/down stress with ++ iSCSI traffic ++ Cause: The panic dump was resolved by the driver's rq dbell size fix. ++ After that, uIP crashed due to the asynchronous if_down event ++ that took the chip resources away while the nic thread is still ++ continuing to try to send DHCP request. ++ Change: Added synchronization between the two threads so proper clean up ++ of the threads can occur. ++ ++ Enhancements ++ ------------ ++ 1. Change: Added support for E3 (57800, 57810, and 57840) ++ ++ ++uIP v0.6.4.5 (Mar. 23, 2011) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Optimized the double VLAN fix of CQ53870 to match ++ what will be submitted for RHELS5.7 and RHELS6.1 inbox ++ ++ ++uIP v0.6.4.4 (Mar. 17, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00053870 - Unable to login to iSCSI target via offload ++ through a Nexus 5020 switch with DCBx enabled ++ Cause: Double VLAN tagging was observed due to DCBx enabled. ++ The chip actually adds a VLAN tag if the txbd does not have ++ VLAN tag enabled under the DCBx environment for PRI setting. ++ Since uIP does not make use of hw assisted VLAN tagging, ++ 2 VLAN tag was observed in the data stream. ++ Change: Enabled hw assisted VLAN tagging in uIP for both 1g and 10g. ++ ++ 2. Problem: Cont00053792 - maxconnections intermittently fail and ++ recover using iface DHCPv4 ++ Cause: The DHCPv4 engine erroneously keeps on requesting for a ++ new lease which tremendously hamper normal path_req ++ operation. The problem is that the lease time parameter ++ has overflowed when converted to ticks count. ++ Change: Expanded the lease timer ticks count parameter from 16 to ++ 32 bits. ++ ++ 3. Problem: Cont00053807 - RA and link local are unable to connect if ++ DHCPv6 fails ++ Cause: The DHCPv6 engine does not have the failover to use RA ++ mechanism ++ Change: Expanded to use best match address instead regardless of ++ DHCPv6 success or not, or using static v6. ++ ++ Enhancements ++ ------------ ++ 1. Change: Cont00051823 - Added man page for brcm_iscsiuio ++ ++ ++uIP v0.6.4.3 (Mar. 15, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00053719 - intermittent logging into targets that ++ are not in the same subnet as defined in the iface ++ Cause: The default route was used erroneously due to a miscompare ++ Change: Fixed this comparison so if the requested dst is not in ++ in the same subnet, uIP would not even ARP out. ++ ++ 2. Problem: Cont00053580 - Unable to do iSCSI boot into Linux OS using ++ 57710 adapters ++ Cause: The E1 iro USTORM_RX_PROD_OFFSET doesn't match the t6.4 fw ++ Change: This is now fixed ++ ++ ++uIP v0.6.4.2 (Feb. 24, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00050343 - HBA does not follow RFC2131 spec for IPv4 ++ DHCP lease expiration ++ Cause: The dhcp engine did not have this feature implemented ++ Change: Added lease time tracking and renewal ++ ++ 2. Problem: Cont00050801 - Unable to connect to target after switching ++ between DHCPv4 to static v4 ++ Cause: The configuration flags got corrupted when switching between ++ dhcp and static or vice versa. ++ Change: Fixed the flag handling. Also needed to zero out the static ++ ip address in the host memory when switching to dhcp. ++ Otherwise, the static ip address will get used mistakenly. ++ ++ Enhancements ++ ------------ ++ 1. Change: Cont00051936 - Added IPv6 NDP and DHCPv6 support. ++ ++ ++uIP v0.6.4.1 (Jan. 27, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00049766 - segfault seen while stopping iscsi service ++ Cause: The logger output routine was accessing the log resource ++ while another thread calls fini_logger to free the same ++ resources ++ Change: Added pthread mutex lock to the logger routine to exclude ++ the initializer, user, and finisher ++ ++ Enhancements ++ ------------ ++ 1. Change: Added new t6.4 HSI and 57713 support. ++ ++ ++uIP v0.6.2.13 (Jan. 04, 2011) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00049665 - iscsiboot:linux failed to boot into iscsi ++ boot image in offload path after 5 iterations ++ Cause: The hw consumer index for the uIP ring got out of sync ++ with the producer index. This has led to the xmit mutex ++ lock be held forever so subsequent ARP requests will not ++ get transmitted to the wire ++ Change: Added this out of sync detection and rescue the xmit mutex ++ lock ++ ++uIP v0.6.2.12 (Dec. 21, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Cont00051820 - Session fails to reconnect after gateway ++ fallback ++ Cause: Under the HSRP test scenario, it was found that an ARP ++ request from the SUT is required in order for the HSRP ++ router to begin sending packets downstream to the SUT. ++ The default ARP age was originally set to 20 minutes ++ before a new ARP request will get sent, ++ Change: Changed the ARP age default to Linux default at 5 minutes ++ ++uIP v0.6.2.11 (Dec. 17, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: For IPv4, the gateway route was not being utilized ++ when the subnet mask given or calculated does not ++ match. This resulted in many unwanted connection ++ attempts. ++ Cause: A bug was found in the default gateway calculation ++ logic which prevented the gateway address from being ++ used. ++ Change: Fixed the default gateway logic ++ ++ 2. Problem: For IPv6, there are scenarios where it won't connect ++ Cause: The IPv6 subnet mask as extracted from the CIDR ++ format might contain garbage data. This garbage data ++ was then used as part of the subnet mask which would ++ prevent the correct address mask. ++ Change: Fixed the subnet mask ++ ++uIP v0.6.2.10 (Dec. 15, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: IPv6 does not connect for non-CIDR iface.ipaddress ++ specification ++ Cause: A bug where all ones was used as the IPv6 netmask ++ instead of all zeroes. This prevented all IPv6 ++ path requests from being honored ++ Change: Fixed the subnet mask used ++ ++uIP v0.6.2.9 (Dec. 14, 2010) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Added IP address CIDR notation support for the ++ iface.ipaddress field in the iface file. ++ This will allow subnet mask to be defined and used. ++ ++uIP v0.6.2.8 (Dec. 9, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: ipv6 + ifup/down fails to reconnect ++ ++ Cause: There were 2 problems found: ++ - the xmit_mutex lock was being held indefinitely ++ - the nl_process_if_down flag for 10g doorbell ringing ++ did not get reinitialized ++ ++ Change: Fixed the xmit_mutex deadlock via trylock ++ Added nl_process_if_down initialization in the IF_DOWN ++ process ++ ++ 2. Problem: Added fix for the NPAR disabled for 57712 ++ ++ Cause: The mac address was not handled correctly ++ ++ Change: Fixed the mac address handling. Also requires corresponding ++ kernel component for the complete fix ++ ++uIP v0.6.2.7 (Dec. 7, 2010) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Use the gateway address from the DHCP server the ++ destination IP address is not in the current subnet. ++ ++uIP v0.6.2.6 (Nov. 16, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Warning message seen in the kernel logs, ++ "uio uio2: uevent: unsupported action string" ++ ++ Cause: The improper string was echo'ed into the UIO trigger ++ field. With an improper string, this message would ++ appear in the kernel logs. ++ ++ Change: uIP will now write the string "online" to the UIO ++ trigger field. This is the string expected by the ++ Linux kernel base driver. ++ ++ 2. Problem: uIP would segfault during a heavily login/logout ++ iSCSI subsystem reset senario ++ ++ Cause: A double free occurred in the logging portion of the ++ uIP code, but this was root cause to a double free when ++ manipulating the NetLink buffers. ++ ++ Change: Properly look at the return code from the routine which ++ will read NetLink messages. Also only free buffers ++ if they are allocated. ++ ++ Enhancements ++ ------------ ++ 1. Change: Add ability to print kernel version and machine ++ architecture to further help debug problems. ++ ++ 2. Change: Apply the netmask from DHCP if provided. ++ ++uIP v0.6.2.5 (Nov. 10, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: iscsid would try to conenct with unintended iSCSI ++ targets ++ ++ Cause: uIP would blindly return the iSCSI target MAC address ++ regardless if the iSCSI target is reachable via the ++ given port. ++ ++ Change: uIP will try to filter the requests coming from CNIC ++ by automatically generating a network mask based off ++ the configured IP addressed. Then this netmask is ++ masked with the destination IP address. If there is ++ a match, then the path_req is allowed through. ++ ++ 2. Problem: Problems reconnecting back to the target when running ++ MTU stress tests. ++ ++ Cause: cnic/bnx2i and uIP could possibly get out of sync when ++ an if_down message is sent. ++ ++ Change: uIP will now immediately react to the if_down message, ++ and flush all the path req's and then to process to ++ if_close. ++ ++ Enhancements ++ ------------ ++ 1. Change: Fix compile warnings for src/unix/nic_nl.c, ++ and src/unix/main.c ++ ++uIP v0.6.2.4 (Nov. 4, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: iSCSI HBA: brcm_iscsiuio segfault during ifdown ++ with many active sessions ++ ++ Cause: uIP will segfault when traversing the error path when ++ an iSCSI connection is starting but the sysfs entries ++ have not been created yet. ++ ++ Change: Use the errno value rather then the one from the file ++ descriptor because the file descriptor will be NULL and ++ the NULL dereference will cause a segfault. ++ ++ Enhancements ++ ------------ ++ 1. Change: Added initial changes for iSCSI multi-function support for ++ 10G NIC's. ++ 2. Change: Add more detailed messages for error pathes in nic_utils ++ ++uIP v0.6.2.3 (October 28, 2010) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Add support for bnx2x-1.62.x drivers ++ ++uIP v0.6.2.2 (October 18, 2010) ++======================================================= ++ Enhancements ++ ------------ ++ 1. Change: Only allow iSCSI connections with known bnx2x HSI's. ++ ++uIP v0.6.2.1 (October 7, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: After multiple MTU changes, the ethtool IOCTL used to ++ determine the bnx2x driver version fails and eventually ++ iSCSI connections would not reconnect. ++ ++ Cause: The socket file descriptor used during the ethtool IOCTL ++ call was never closed and leaked. ++ ++ Change: On the error path when calling the ethtool IOCTL, the ++ file descriptor is now properly closed. ++ ++uIP v0.5.39 (September 15, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Could not offload IPv4 VLAN connection when the target tries ++ to ARP the iSCSI initiator ++ ++ Cause: In the ARP reply, the ether field was incorrect. ++ ++ Change: Properly set the ether field to 802.1Q type (0x8100) ++ ++uIP v0.5.38 (September 14, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: uIP would cause a panic dump when the NIC was going down ++ ++ Cause: uIP and CNIC where not synchonized on NIC state ++ ++ Change: Check if the RX BD's which are zero'ed by CNIC when the ++ NIC is going down. If the BD addresses are zero, then ++ uIP will drop the TX packets. ++ ++uIP v0.5.37 (August 21, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: uIP would segfault on ifup/ifdown stress test when using ++ DHCP to determine local IP address. ++ ++ Cause: The uIP would use a NULL buffer during data transmission. ++ ++ Change: Drop packets when there are no buffer avaliable. ++ ++uIP v0.5.36 (August 21, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: iSCSI boot would not completely login after the pivot ++ root operation. ++ ++ Cause: The uIP would not properly start the NIC interface. ++ ++ Change: uIP should only check the NIC state to determine whether ++ to start the NIC thread or not. ++ ++ 2. Problem: uIP would segfault during if'up if'down testing. ++ ++ Cause: The uIP would improperly start 2 NIC threads for the ++ same NIC interface. ++ ++ Change: uIP should properly lock the NIC list when disabling/removing ++ the NIC threads. ++ ++ ++uIP v0.5.35 (August 20, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Sessions would hang with ethtool self-test ++ ++ Cause: The uIP would hang because the socket layer was stuck ++ because there is much contention for that socket. This ++ would hang the CNIC thread. ++ ++ Change: Remove any IOCTL calls in uIP which may colide with ++ the ethtool self test. The driver version is only ++ capture during uIP initialization. ++ ++ 2. Problem: There were session recovery issue when using DHCP ++ if up/down tests. ++ ++ Cause: The uIP would hang because the DHCP requests would ++ timeout if the network interface is downed which would ++ hang all the other uIP threads. ++ ++ Change: Ensure that the DHCP state machine had exit points ++ if the network interface was down'ed. ++ ++ ++uIP v0.5.34 (August 18, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Sessions would not recover with ethtool self-test ++ ++ Cause: The uIP would hang because either the NetLink buffer is ++ full or that any socket operations used to manipulate ++ multicast addresses would block. ++ ++ Change: Ensure that the socket used for multicast addressing is ++ set to nonblocking. Drain the NetLink buffer without ++ using the eventing, but with a more aggressive poll routine. ++ ++ 2. Problem: Sessions would not recover with L2 driver load/unload on ++ RHEL 6.0 SS9 ++ ++ Cause: The uIP would close the NIC thread too early and would ++ deadlock on cloing the NIC thread. ++ ++ Change: Ensure that the NIC thread is canceled/closed only in one ++ location, in the NIC remove routine. ++ ++ ++uIP v0.5.33 (August 17, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Error message seen from the uIP stack for valid packets. ++ ++ Cause: The uIP was incorrectly marking logging messages for valid ++ packets as errors because it didn't know how to parase them. ++ ++ Change: Changed the following from error to debug message ++ ipv6: invalid version ++ ipv4: invalid version or header length. ++ icmpv6: unknown ICMP message. ++ ip: neither tcp nor icmp ++ Changed the following from error to warn message ++ udp: bad checksum ++ tcp: bad checksum ++ tcp: got reset, aborting connection. ++ ++ 2. Problem: After multiple iterations the loading and unloading of ++ the Broadcom Linux drivers with active connections ++ would not cause the sessions to recover on RHEL 6.0 ++ snapshot 9. ++ ++ Cause: There was a deadlock in the nic mutex ++ ++ Change: Lock ordering for the nic mutex and nic list mutex must ++ be inforced. ++ ++ 3. Problem: After multiple iterations of running the ethtool selftest ++ the Broadcom Linux drivers with active connections ++ would not cause the sessions to recover on RHEL 5.5. ++ ++ Cause: The Netlink buffer between uIP and CNIC would get full. ++ ++ Change: Poll more regularly for packets in the Netlink buffer ++ from 4 times a second to 100 times a 1 second. ++ Drain packets during the PATH_REQ packet pull. ++ ++ ++uIP v0.5.32 (August 14, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Error message 'nic eth0: Didn't find type 0xaa bb' seen. ++ ++ Cause: Valid non-DIX Ethernet packets as being passed to the ++ uIP. uIP will drop these packets but should be logged ++ correctly. ++ ++ Change: These packets are valid, and should only be logged for ++ debugging purposes. ++ ++ 2. Problem: Error message 'Dropped previous transmitted packet' seen. ++ ++ Cause: The TX ring is full, and here uIP is trying to transmit a ++ packet which will be dropped. This is a valid state but ++ the log message is marked incorrectly ++ ++ Change: These messages are not warnings and should be logging when ++ debugging is enabled. ++ ++ 3. Problem: Error message: "iscsi_ipc eth0 Transport name is not ++ equal expected: got: bnx2i" seen. ++ ++ Cause: The iface_rec structure is different between iscsid version. ++ For RHEL 5.5, iscsid is versioned 871, for RHEL 6.0 is ++ versioned 872. ++ ++ Change: Allow uIP to compile against a different version of iscsid. ++ ++ ++uIP v0.5.31 (August 12, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Softlock would occur showing that the NetLink table ++ lock was taken but never released. ++ ++ Cause: NetLink socket buffer would fill with constant PATH_REQ ++ messages preventing PATH_REQ response from libiscsi ++ ++ Change: Now uIP will drain the NetLink buffer while looking for ++ a response. ++ ++ Enhancements ++ ------------ ++ 1. Change: Add documentation for VLAN configuration and restrictions. ++ ++ ++uIP v0.5.30 (August 6, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: iscsid thread will stall if closing the uio files nodes ++ is stuck ++ ++ Cause: uIP would indefinitely block waiting for the mutex shared ++ by the close routine. ++ ++ Change: Now uIP will try and poll a bit for the mutex. If it can't ++ get this mutex in the iscsid thread then an error is return ++ rather then hold the thread. ++ ++ 2. Problem: IPv6 Unicast Neighbor Adveriserments would have the ++ ICMPv6 option header specifying a MAC. ++ ++ Cause: uIP should use the source IPv6 address to detmine whether ++ to strip the option header or not and not the target address ++ in the ICMPv6 field. ++ ++ Change: The uIP stack return a unicast IPv6 Neighbor Advertisement ++ without the ICMPv6 option as a response to unicast ++ IPv6 Neighbor Solicitations. ++ ++ 3. Problem: There would be TCP SYN packets with improper MAC address. ++ ++ Cause: A zero'ed MAC address was not passed to CNIC to indicate an ++ error or if the IP address didn't resolve. ++ ++ Change: The uIP stack will now return a zero'ed MAC address if it ++ can't find any entries. ++ ++ ++uIP v0.5.29 (August 6, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: "uip udp: no matching connection found: lport: 35072" ++ seen numerous times in the brcm_iscsiuio log file ++ ++ Cause: This message was incorrectly marked as an error ++ ++ Change: These messages are valid log entries especially if the ++ packet was a broadcast UDP packet not destined for the SUT ++ I will change the code to mark these logs entries as debug. ++ ++ ++uIP v0.5.28 (August 5, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Can't login into a redirected Equilogic Target ++ ++ Cause: The Equilogic Target uses a unicast IPv6 Neighbor ++ Solicitation to test if the host is up. The uIP stack ++ would return a Neighbor Advertisement with an unneeded ++ ICMPv6 option. ++ ++ Change: Only have the uIP stack return a unicast IPv6 Neighbor ++ Advertisement without the ICMPv6 option. ++ ++ 2. Problem: With older bnx2/bnx2x/cnic/bnx2i driver combinations ++ uIP would segfault when these drivers were unloaded. ++ ++ Cause: When the older drivers were removed, the underlying uio ++ instance was removed causing uIP to have a stale file handle. ++ When uIP finally closes using this stale file handle, either ++ uIP would segfault, or there would be an error in the ++ uio_release() path. ++ ++ Change: Only have the uIP close if the UIO file node exists. ++ ++ ++uIP v0.5.27 (July 31, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: iSCSI HBA: Unable to use DHCP address for iSCSI interface ++ if a connection was previously made with a static address ++ on bnx2 devices. ++ ++ Cause: Because the device is closed and reopen'ed the TX consumer ++ indexes were not persisted ++ ++ Change: Only discard the TX consumer indexes only when the devices ++ will be discarded or closed ++ ++ Enhancements ++ ------------ ++ 1. Change: Change CNIC references to bnx2 in the bnx2 user space ++ driver. ++ ++ ++uIP v0.5.26 (July 30, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: iSCSI HBA: Unable to use DHCP address for iSCSI interface ++ if a connection was previously made with a static address on ++ bnx2x devices. ++ ++ Cause: Because the device is closed and reopen'ed the TX consumer ++ indexes were not persisted ++ ++ Change: Only discard the TX consumer indexes only when the devices ++ will be discarded ++ ++ 2. Problem: IPv6 using VLAN's didn't login ++ ++ Cause: The uIP code used to determine if the packet was an IPv6 ++ or not was not working. This VLAN packets for IPv6 were ++ being mis-interpreted. ++ ++ Change: Make the function is_ipv6() VLAN aware ++ ++ 3. Problem: Persistant targets was not loggin in during boot ++ ++ Cause: If udev was slow and the /dev/uio* were creatly slowly ++ uIP would fail. ++ ++ Change: Poll uIP waiting for /dev/uio* file nodes. ++ ++uIP v0.5.25 (July 27, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: When using IPv4 DHCP, there are no initial DHCP Discover ++ packets were not seen on the wire. ++ ++ Cause: Packets generated from the app handler from the uIP stack ++ were not placed on the wire. ++ ++ Change: Packets originating from the uIP stack are now always placed ++ on the wire. ++ ++uIP v0.5.24 (July 25, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: One would see invalid packet packets flow through the ++ uIP stack, where the logs would indicate there is a packet ++ with an invalid length ++ ++ Cause: The BD and CQE consumer indexes were not properly incremented ++ and masked. ++ ++ Change: The BD index is now properly masked. The CQE index is not ++ incremented using the CQE index rather the mistaken BD index. ++ ++ Impact: 10G only ++ ++ 2. Problem: uIP would segfault during the booting of the machine. ++ ++ Cause: uIP was using a NULL data pointer because there was an ++ incorrect packet passed to the stack. ++ ++ Change: Only allow uIP to process data if the packet exists. ++ ++ 3. Problem: uIP would stop processing packets ++ ++ Cause: The uIP code would not properly drain the CQE ring causing ++ it to eventually be full ++ ++ Change: Consume all the CQE elements even if they are ethernet types ++ or not. ++ ++ Impact: 10G only ++ ++ 4. Problem: uIP would stop after if/down of the network interface. ++ ++ Cause: uIP was not kick starting the NIC loop thread properly. ++ ++ Change: Ensure that the NIC loop thread is started by when iscsid ++ request that the interface start the offload. Mark the NIC ++ only if the thread is truly canceled. ++ ++ ++uIP v0.5.23 (July 20, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Segfault during brcm_iscsiuio initialization ++ ++ Cause: uIP was using a NULL data pointer, because a different ++ thread re-initialized the uIP stack ++ ++ Change: Properly synchronize the initialization of the stack ++ ++ 2. Problem: Deadlock during the printing of heavy debug messages ++ ++ Cause: The variable macro structures would point to invalid ++ data ++ ++ Change: With each invocation of va_copy() a corresponding ++ invocation of va_end() in the same function for the proper ++ cleanup ++ ++ 3. Problem: uIP would hang when the interface could go up/down ++ ++ Cause: uIP would get out of sync with the state of the network ++ interface ++ ++ Change: Instead of detriving state from the UIO file nodes, uIP ++ will take direction from iscsid on when interfaces will be ++ started. ++ ++uIP v0.5.22 (July 15, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Unable to reconnect via iSCSI offload after ++ ifup/ifdown ++ ++ Cause: uIP was stuck on the thread when closing the NIC main ++ loop ++ ++ Change: Properly synchronize the NetLink CNIC and uevent threads ++ ++ 2. Problem: uIP would crash during boot up. ++ ++ Cause: uIP would overwrite a memory location which was already ++ freed during nic_remove(). ++ ++ Change: Since the NIC is freed there is no need to write to ++ update the NIC flags ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Added IPv6 Link Local support ++ ++ ++uIP v0.5.21 (July 5, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Unable to connect via iSCSI offload after ++ changing L2 address ++ ++ Cause: uIP didn't notice the network inferface going down ++ ++ Change: Allow uIP to persist the stack's IP address after ++ a reset ++ ++ 2. Problem: Unable to connect via IPv4 and IPv6 concurrently ++ ++ Cause: uIP didn't notice the network inferface going down ++ ++ Change: Allow uIP to persist the stack's IP address after ++ a reset and properly bring up the interface ++ ++ 3. Problem: Unable to connect via VLAN ++ ++ Cause: IP address was no persisted after a device reset ++ ++ Change: When CNIC requests a path request, uIP will use the ++ VLAN passed by the CNIC. ++ ++ ++uIP v0.5.20 (June 24, 2010) ++ ++ ++uIP v0.5.20 (June 24, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Certain IPv6 addresses are not repsonded to by ++ the target. ++ ++ Cause: The MAC was generated from the target's IPv6 ++ address not the deterived multicast IPv6 address. ++ ++ Change: The destination MAC address should be deterived ++ from the packet's destination IPv6 address and ++ not the target. ++ ++ 2. Problem: brcm_iscsiuio would segfault when L2 interface is ++ bought up and down after being logged into ++ ++ Cause: The NIC thread was not stopped properly ++ ++ Change: When the UIO device is remove and when the ++ cooresponding NIC tracked by brcm_iscsiuio, the ++ daemon would properly wait for the NIC thread to ++ stop. ++ ++ ++uIP v0.5.19 (June 22, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Can't login after boot ++ ++ Cause: If NIC interfaces are brough up and down quickly ++ uIP wait on an invalid NIC thread ++ ++ Change: Only wait for the NIC thread if the NIC thread ++ exists. ++ ++uIP v0.5.18 (June 21, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Does not compile on SLES 11 SP1 ++ ++ Cause: Automake cached files were included as part of the ++ uIP-0.5.17 package ++ ++ Change: Remove automake cached files, and allow these files ++ to be generated each time the source is compiled ++ ++ 2. Problem: Does not always receive multicast packets ++ ++ Cause: Multicast bit was not set in SORT USER 2 register ++ ++ Change: brcm_iscsiuio will now set the SORT USER 2 registers ++ with both the broadcast and multicast bits. ++ ++ 3. Problem: Existing iSCSI connections do not reconnect after ++ operations which require equivalent driver ++ load/unload operations ++ ++ Cause: Multiple path requests would trample NIC configurations ++ ++ Change: Allow only one path request at a time ++ ++uIP v0.5.17 (June 16, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: IPv6 neighbor solicitations from brcm_iscsiuio could ++ not be responded to ++ ++ Cause: The IPv6 neighbor solicitation packet had an invalid ++ multicast MAC address ++ ++ Change: Properly set the MAC address multicast bit and OR ++ with the IPv6 destination address ++ ++ 2. Problem: NIC state was not properly synchronized and noticed ++ by Shyam Iyer ++ ++ Change: Properly lock the NIC device when changing state ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Listen for iscsid before daemonizing to close a timing ++ gap which might allow iscsid to start before uIP is ++ completely initialized. ++ ++uIP v0.5.16 (June 2, 2010) ++======================================================= ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Formally add IPv6 support. Only a static IPv6 address ++ is supported. ++ ++uIP v0.5.15 (May 20, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: brcm_iscsiuio would echo packets off the wire ++ ++ Cause: Stale packets from the uIP stack could potentially ++ make it onto the wire causing a network flood ++ ++ Change: Only place on the wire packets uIP intended to place ++ on the wire. Drop all other packets. ++ ++uIP v0.5.14 (May 18, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: brcm_iscsiuio would crash when offloading using a ++ bnx2x device /dev/mem could not be ++ opened, (ie. SE Linux enabled) ++ ++ Cause: /dev/mem could not be opened, (ie. SE Linux enabled) ++ and then the NIC would be improperly initialized. ++ ++ Change: If /dev/mem is not able to be opened, then the device ++ is closed ++ ++ 2. Problem: brcm_iscsiuio would crash when brcm_iscsiuio is ++ being shutdown ++ ++ Cause: The NIC mutex was deferenced imporperly when the NIC ++ is being closed ++ ++ Change: Take the NIC mutex lock only when the NIC is closed. ++ ++uIP v0.5.13 (May 16, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: brcm_iscsiuio would crash with heavy traffic directed ++ at the iSCSI traffic ++ ++ Cause: Packets which are sized between 1006-1024 bytes would ++ crash brcm_iscsiuio because brcm_iscsiuio is not sized ++ to handle such large packets ++ ++ Change: Drop large packets, properly hold the NIC mutex lock ++ for the duration when NIC fields are being used. ++ ++ ++uIP v0.5.12 (May 13, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: brcm_iscsiuio could crash on when L2 interface is ++ ifdown'ed ++ ++ Cause: The local NIC pointer was not initialized properly ++ in the routine parse_iface() ++ ++ Change: Properly initialize the NIC pointer ++ ++ 2. Problem: Documentation referred to older admin_client which ++ doesn't exist any more because brcm_iscsiuio uses ++ the iscsid iface file ++ ++ Change: Remove the stale references ++ ++ ++uIP v0.5.11 (May 11, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: brcm_iscsiuio could crash on invalid packet sizes ++ ++ Cause: The hardware BD could be a large value because of a ++ hardware error ++ ++ Change: Limit the size of the packet dumped to the MTU size ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: During the running of the configure script now ++ the script will check for ar and ranlib binaries ++ ++ ++uIP v0.5.10 (May 03, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: BCM57712 not recognized ++ ++ Cause: The PCI ID's in the bnx2x file were missing. ++ ++ Change: Added proper BCM57712, BCM57712E, BCM57713, BCM57713E ++ PCI ID's ++ ++ 2. Problem: (CQ 47481) brcm_iscsiuio not installed in correct location ++ ++ Cause: Default install path for autoconf is /usr/local ++ ++ Change: Change the default prefix to '/' so the brcm_iscsiuio ++ binary is installed to /sbin/ ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Remove dependency on Yacc and Lex ++ ++ ++uIP v0.5.9 (April 28, 2010) ++======================================================= ++ ++ Fixes ++ ----- ++ 1. Problem: bnx2x T6.0 driver would not login ++ ++ Cause: The bnx2x code was not using the T6.0 HSI offsets ++ ++ Change: Determine to bnx2x driver version eariler to properly use the ++ T4.8 or T6.0 HSI ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Collapse all the various locks to use the NIC lock to shrink ++ memory footprint ++ ++ 2. Change: Consolidate upper layer checksumming code ++ ++ ++uIP v0.5.5 (March 02, 2010) ++======================================================= ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Add support for T6.0 bnx2x HSI and 57712. ++ ++ 2. Change: Initial support for IPv6 ++ ++uIP v0.5.8 (April 22, 2010) ++======================================================= ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Add support for T6.0 bnx2x HSI and 57712. ++ ++ 2. Change: Initial support for IPv6 ++ ++uIP v0.5.7 (March 17, 2010) ++======================================================= ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Add to documentation on discovering on a particular ++ iface before logging in ++ ++uIP v0.5.6 (Mar 05, 2009) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: bnx2x panic dump would be seen when sending ++ traffic to uIP ++ ++ Cause: The TX producer index was not properly ++ incrementing when the wrapping occured ++ ++ Change: Do not skip the last TX producer index like the ++ TX BD's ++ ++ Impact: None. ++ ++uIP v0.5.5 (March 02, 2010) ++======================================================= ++ Initial release ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Add to documentation on debugging/logging for uIP ++ ++ ++uIP v0.5.4 (Feb 22, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Compile error where 'ETHERTYPE_VLAN' define ++ is missing ++ ++ Cause: Certain distributions do not define 'ETHERTYPE_VLAN' ++ in the header file "net/ethernet.h". ++ ++ Change: Added proper defines for ETHERTYPE_VLAN when necessary ++ ++ Impact: None. ++ ++ ++uIP v0.5.3 (Feb 18, 2010) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Using VLAN's on offloaded iSCSI connections ++ ++ Cause: (CQ45983) VLAN tags were not being properly inserted ++ when sending the ARP request packets ++ ++ Change: Added VLAN tags when sending ARP request packets ++ ++ Impact: None. ++ ++ ++uIP v0.5.2 (Dec 10, 2009) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: Switching between 10G and 1G iSCSI offloaded ++ devices caused login connectivity problems ++ ++ Cause: The NIC devices within uIP were not cleanup ++ properly. ++ ++ Change: The NIC structure is not re-initialized and the ++ NIC thread is destroyed when the host network ++ interface is brought down. ++ ++ Impact: None. ++ ++ ++uIP v0.5.1 (Dec 9, 2009) ++======================================================= ++ Fixes ++ ----- ++ 1. Problem: 10G devices behind PCI bridges would not collect ++ ++ Cause: PCI bus:slot.func string was parsed incorrectly ++ because the bridge string was used ++ ++ Change: Parse the proper PCI bus:slot.func string. ++ ++ Impact: None. ++ ++ ++uIP v0.5.0b (Nov 24, 2009) ++======================================================= ++ Initial release ++ ++ Enhancements ++ ------------ ++ ++ 1. Change: Add Broadcom 10G iSCSI offload support ++ ++ Impact: Linux ++ +diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac +new file mode 100644 +index 0000000..6c0013b +--- /dev/null ++++ b/iscsiuio/configure.ac +@@ -0,0 +1,78 @@ ++dnl iscsiuio uIP user space stack configure.ac file ++dnl ++dnl Copyright (c) 2004-2013 Broadcom Corporation ++dnl Copyright (c) 2014, QLogic Corporation ++dnl ++dnl This program is free software; you can redistribute it and/or modify ++dnl it under the terms of the GNU General Public License as published by ++dnl the Free Software Foundation. ++dnl ++dnl Written by: Eddie Wai (eddie.wai@broadcom.com) ++dnl Benjamin Li (benli@broadcom.com) ++dnl ++ ++PACKAGE=iscsiuio ++VERSION=0.7.8.2 ++ ++AC_INIT([iscsiuio], [0.7.8.2], [QLogic-Storage-Upstream@qlogic.com]) ++ ++AM_INIT_AUTOMAKE ++AC_CONFIG_HEADER(config.h) ++AC_PATH_PROGS(BASH, bash) ++ ++AC_PROG_CC ++AM_PROG_CC_C_O ++ ++AC_PROG_RANLIB ++ ++AC_GNU_SOURCE ++AC_PROG_INSTALL ++AC_PROG_GCC_TRADITIONAL ++ ++# Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++AC_C_INLINE ++AC_TYPE_OFF_T ++AC_TYPE_SIZE_T ++AC_CHECK_TYPES(int8_t) ++AC_CHECK_TYPES(uint8_t) ++AC_CHECK_TYPES(int16_t) ++AC_CHECK_TYPES(uint16_t) ++AC_CHECK_TYPES(int32_t) ++AC_CHECK_TYPES(uint32_t) ++AC_CHECK_TYPES(int64_t) ++AC_CHECK_TYPES(uint64_t) ++AC_CHECK_SIZEOF(short, 2) ++AC_CHECK_SIZEOF(int, 4) ++AC_CHECK_SIZEOF(long, 4) ++ ++AC_C_BIGENDIAN(AC_SUBST([ENDIAN],[BIG]),AC_SUBST([ENDIAN],[LITTLE])) ++ ++AC_LIBTOOL_DLOPEN ++ ++# libtool stuff ++AC_PROG_LIBTOOL ++ ++: ${CFLAGS:="-O2"} ++CFLAGS="${CFLAGS} -Wall" ++## check for --enable-debug first before checking CFLAGS before ++## so that we don't mix -O and -g ++AC_ARG_ENABLE(debug, ++[ --enable-debug Turn on compiler debugging information (default=no)], ++ [if eval "test x$enable_debug = xyes"; then ++ CFLAGS="${CFLAGS} -g -O0" ++ fi]) ++AM_CONDITIONAL([DEBUG], [test x$debug = xtrue]) ++ ++AC_CONFIG_COMMANDS([default],[[ echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h]],[[]]) ++ ++AC_PREFIX_DEFAULT() ++ ++AC_OUTPUT([Makefile ++src/Makefile ++src/apps/Makefile ++src/apps/dhcpc/Makefile ++src/apps/brcm-iscsi/Makefile ++src/uip/Makefile ++src/unix/Makefile ++src/unix/libs/Makefile]) +diff --git a/iscsiuio/docs/iscsiuio.8 b/iscsiuio/docs/iscsiuio.8 +new file mode 100644 +index 0000000..b329979 +--- /dev/null ++++ b/iscsiuio/docs/iscsiuio.8 +@@ -0,0 +1,89 @@ ++.\" Copyright (c) 2010-2013 Broadcom Corporation ++.\" Copyright (c) 2014, QLogic Corporation ++.\" This is free documentation; you can redistribute it and/or ++.\" modify it under the terms of the GNU General Public License as ++.\" published by the Free Software Foundation. ++.\" ++.\" bnx2.4,v 0.7.8.1b ++.\" ++.TH iscsiuio 8 "12/10/2013" "QLogic Corporation" ++.\" ++.\" NAME part ++.\" ++.SH NAME ++iscsiuio \- iSCSI UserSpace I/O driver ++.\" ++.\" SYNOPSIS part ++.\" ++.SH SYNOPSIS ++.B iscsiuio ++.RB [ -d -f -v ] ++.PP ++.\" ++.\" DESCRIPTION part ++.\" ++.SH DESCRIPTION ++iscsiuio is the UserSpace I/O driver for the QLogic NetXtreme II ++BCM5706/5708/5709 series PCI/PCI-X Gigabit Ethernet Network Interface Card ++(NIC) and for the QLogic NetXtreme II BCM57710/57711/57712/57800/57810/57840 ++series PCI-E 10 Gigabit Ethernet Network Interface Card. ++The driver has been tested on 2.6.28 kernels and above. ++.PP ++Refer to the README.TXT from the driver package on how to ++compile and install the driver. ++.PP ++Refer to various Linux documentations ++on how to configure network protocol and address. ++.\" ++.\" DRIVER DEPENDENCIES part ++.\" ++.SH DRIVER DEPENDENCIES ++ ++.\" ++.\" PARAMETER part ++.\" ++.SH PARAMETERS ++There are very few parameters when running this application. ++.TP ++.BI -d ++This is to enable debug mode where debug messages will be sent to stdout ++The following debug modes are supported ++.P ++.RS ++DEBUG 4 - Print all messages ++.P ++INFO 3 - Print messages needed to follow the uIP code (default) ++.P ++WARN 2 - Print warning messages ++.P ++ERROR 1 - Only print critical errors ++.RE ++.PP ++.TP ++.TP ++.BI -f ++This is to enable forground mode so that this application doesn't get sent ++into the background. ++.PP ++.TP ++.BI -v ++This is to print the version. ++.PP ++.TP ++.BI -p ++Use pidfile (default /var/run/iscsiuio.pid ) ++.PP ++.TP ++.BI -h ++Display this help and exit. ++ ++ ++.\" ++.\" AUTHOR part ++.\" ++.SH AUTHOR ++Benjamin Li \- benli@broadcom.com ++.P ++Eddie Wai \- eddie.wai@broadcom.com ++.SH Maintained by ++QLogic-Storage-Upstream@qlogic.com +diff --git a/iscsiuio/iscsiuiolog b/iscsiuio/iscsiuiolog +new file mode 100644 +index 0000000..360947c +--- /dev/null ++++ b/iscsiuio/iscsiuiolog +@@ -0,0 +1,10 @@ ++/var/log/iscsiuio.log { ++ weekly ++ missingok ++ notifempty ++ rotate 4 ++ sharedscripts ++ postrotate ++ pkill -USR1 iscsiuio 2> /dev/null || true ++ endscript ++} +diff --git a/iscsiuio/src/Makefile.am b/iscsiuio/src/Makefile.am +new file mode 100644 +index 0000000..44b0085 +--- /dev/null ++++ b/iscsiuio/src/Makefile.am +@@ -0,0 +1 @@ ++SUBDIRS = apps uip unix +diff --git a/iscsiuio/src/README b/iscsiuio/src/README +new file mode 100644 +index 0000000..9fca6fb +--- /dev/null ++++ b/iscsiuio/src/README +@@ -0,0 +1,13 @@ ++uIP is a very small implementation of the TCP/IP stack that is written ++by Adam Dunkels . More information can be obtained ++at the uIP homepage at http://www.sics.se/~adam/uip/. ++ ++This is version $Name: uip-1-0 $. ++ ++The directory structure look as follows: ++ ++apps/ - Example applications ++doc/ - Documentation ++lib/ - Library code used by some applications ++uip/ - uIP TCP/IP stack code ++unix/ - uIP as a user space process under FreeBSD or Linux +diff --git a/iscsiuio/src/apps/Makefile.am b/iscsiuio/src/apps/Makefile.am +new file mode 100644 +index 0000000..08ed18d +--- /dev/null ++++ b/iscsiuio/src/apps/Makefile.am +@@ -0,0 +1 @@ ++SUBDIRS = dhcpc brcm-iscsi +diff --git a/iscsiuio/src/apps/README b/iscsiuio/src/apps/README +new file mode 100644 +index 0000000..0096c4e +--- /dev/null ++++ b/iscsiuio/src/apps/README +@@ -0,0 +1,2 @@ ++This directory contains a few example applications. They are not all ++heavily tested, however. +diff --git a/iscsiuio/src/apps/brcm-iscsi/Makefile.am b/iscsiuio/src/apps/brcm-iscsi/Makefile.am +new file mode 100644 +index 0000000..00cbd8e +--- /dev/null ++++ b/iscsiuio/src/apps/brcm-iscsi/Makefile.am +@@ -0,0 +1,13 @@ ++AM_CFLAGS = -I${top_srcdir}/src/unix \ ++ -I${top_srcdir}/src/uip \ ++ -I${top_srcdir}/src/apps/dhcpc \ ++ -I${top_srcdir}/src/apps/brcm-iscsi \ ++ -I${top_srcdir}/../include \ ++ -I${top_srcdir}/../usr ++ ++noinst_LIBRARIES = lib_apps_brcm_iscsi.a ++ ++lib_apps_brcm_iscsi_a_SOURCES = brcm_iscsi.c ++ ++lib_apps_brcm_iscsi_a_CFLAGS = $(AM_CFLAGS) \ ++ -DBYTE_ORDER=@ENDIAN@ +diff --git a/iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi b/iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi +new file mode 100644 +index 0000000..732275f +--- /dev/null ++++ b/iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi +@@ -0,0 +1 @@ ++APP_SOURCES += brcm-iscsi.c +diff --git a/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c +new file mode 100644 +index 0000000..4223ca4 +--- /dev/null ++++ b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c +@@ -0,0 +1,89 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li ++ * Based on code example from Adam Dunkels ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ */ ++/** ++ * \addtogroup brcm-iscsi ++ * @{ ++ */ ++ ++/** ++ * \file ++ * An example of how to write uIP applications ++ * with protosockets ++ * \author ++ * Benjamin Li ++ */ ++ ++/* ++ * This is a short example of how to write uIP applications using ++ * protosockets. ++ */ ++ ++/* ++ * We define the application state (struct hello_world_state) in the ++ * hello-world.h file, so we need to include it here. We also include ++ * uip.h (since this cannot be included in hello-world.h) and ++ * , since we use the memcpy() function in the code. ++ */ ++#include "brcm_iscsi.h" ++#include "uip.h" ++#include ++#include ++ ++#include "uip_arp.h" ++ ++/*---------------------------------------------------------------------------*/ ++/* ++ * The initialization function. We must explicitly call this function ++ * from the system initialization code, some time after uip_init() is ++ * called. ++ */ ++void brcm_iscsi_init(void) ++{ ++} ++ ++/*---------------------------------------------------------------------------*/ ++/* ++ * In hello-world.h we have defined the UIP_APPCALL macro to ++ * hello_world_appcall so that this funcion is uIP's application ++ * function. This function is called whenever an uIP event occurs ++ * (e.g. when a new connection is established, new data arrives, sent ++ * data is acknowledged, data needs to be retransmitted, etc.). ++ */ ++void brcm_iscsi_appcall(struct uip_stack *ustack) ++{ ++} +diff --git a/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h +new file mode 100644 +index 0000000..10bfc95 +--- /dev/null ++++ b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h +@@ -0,0 +1,91 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li ++ * Based on code example from Adam Dunkels ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ */ ++/** ++ * \addtogroup apps ++ * @{ ++ */ ++ ++/** ++ * \defgroup helloworld Hello, world ++ * @{ ++ * ++ * A small example showing how to write applications with ++ * \ref psock "protosockets". ++ */ ++ ++/** ++ * \file ++ * Header file for an example of how to write uIP applications ++ * with protosockets. ++ * \author ++ * Benjamin Li ++ */ ++ ++#ifndef __BRCM_ISCSI_H__ ++#define __BRCM_ISCSI_H__ ++ ++/* Since this file will be included by uip.h, we cannot include uip.h ++ here. But we might need to include uipopt.h if we need the u8_t and ++ u16_t datatypes. */ ++#include "uipopt.h" ++#include "uip.h" ++#include "psock.h" ++ ++/* Next, we define the hello_world_state structure. This is the state ++ of our application, and the memory required for this state is ++ allocated together with each TCP connection. One application state ++ for each TCP connection. */ ++struct hello_world_state { ++ struct psock p; ++ u8_t inputbuffer[32]; ++ u8_t name[40]; ++ ++ struct uip_udp_conn *conn; ++}; ++ ++/* Finally we define the application function to be called by uIP. */ ++void brcm_iscsi_appcall(struct uip_stack *ustack); ++#ifndef UIP_APPCALL ++#define UIP_APPCALL brcm_iscsi_appcall ++#endif /* UIP_APPCALL */ ++ ++void brcm_iscsi_init(void); ++ ++#endif /* __BRCM_ISCSI_H__ */ ++/** @} */ ++/** @} */ +diff --git a/iscsiuio/src/apps/dhcpc/Makefile.am b/iscsiuio/src/apps/dhcpc/Makefile.am +new file mode 100644 +index 0000000..1c97993 +--- /dev/null ++++ b/iscsiuio/src/apps/dhcpc/Makefile.am +@@ -0,0 +1,13 @@ ++AM_CFLAGS = -I${top_srcdir}/src/unix \ ++ -I${top_srcdir}/src/uip \ ++ -I${top_srcdir}/src/apps/dhcpc \ ++ -I${top_srcdir}/src/apps/brcm-iscsi \ ++ -I${top_srcdir}/../include \ ++ -I${top_srcdir}/../usr ++ ++noinst_LIBRARIES = lib_apps_dhcpc.a ++ ++lib_apps_dhcpc_a_SOURCES = dhcpc.c dhcpv6.c ++ ++lib_apps_dhcpc_a_CFLAGS = $(AM_CFLAGS) \ ++ -DBYTE_ORDER=@ENDIAN@ +diff --git a/iscsiuio/src/apps/dhcpc/Makefile.dhcpc b/iscsiuio/src/apps/dhcpc/Makefile.dhcpc +new file mode 100644 +index 0000000..f84c84f +--- /dev/null ++++ b/iscsiuio/src/apps/dhcpc/Makefile.dhcpc +@@ -0,0 +1 @@ ++APP_SOURCES += dhcpc.c timer.c +diff --git a/iscsiuio/src/apps/dhcpc/dhcpc.c b/iscsiuio/src/apps/dhcpc/dhcpc.c +new file mode 100644 +index 0000000..f4a9994 +--- /dev/null ++++ b/iscsiuio/src/apps/dhcpc/dhcpc.c +@@ -0,0 +1,417 @@ ++/* ++ * Copyright (c) 2005, Swedish Institute of Computer Science ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "uip.h" ++#include "dhcpc.h" ++#include "timer.h" ++#include "pt.h" ++ ++#include "debug.h" ++#include "logger.h" ++#include "nic.h" ++#include "nic_utils.h" ++ ++struct __attribute__ ((__packed__)) dhcp_msg { ++ u8_t op, htype, hlen, hops; ++ u8_t xid[4]; ++ u16_t secs, flags; ++ u8_t ciaddr[4]; ++ u8_t yiaddr[4]; ++ u8_t siaddr[4]; ++ u8_t giaddr[4]; ++ u8_t chaddr[16]; ++#ifndef UIP_CONF_DHCP_LIGHT ++ u8_t sname[64]; ++ u8_t file[128]; ++#endif ++ u8_t options[312]; ++}; ++ ++#define BOOTP_BROADCAST 0x8000 ++ ++#define DHCP_REQUEST 1 ++#define DHCP_REPLY 2 ++#define DHCP_HTYPE_ETHERNET 1 ++#define DHCP_HLEN_ETHERNET 6 ++#define DHCP_MSG_LEN 236 ++ ++#define DHCPC_SERVER_PORT 67 ++#define DHCPC_CLIENT_PORT 68 ++ ++#define DHCPDISCOVER 1 ++#define DHCPOFFER 2 ++#define DHCPREQUEST 3 ++#define DHCPDECLINE 4 ++#define DHCPACK 5 ++#define DHCPNAK 6 ++#define DHCPRELEASE 7 ++ ++#define DHCP_OPTION_SUBNET_MASK 1 ++#define DHCP_OPTION_ROUTER 3 ++#define DHCP_OPTION_DNS_SERVER 6 ++#define DHCP_OPTION_REQ_IPADDR 50 ++#define DHCP_OPTION_LEASE_TIME 51 ++#define DHCP_OPTION_MSG_TYPE 53 ++#define DHCP_OPTION_SERVER_ID 54 ++#define DHCP_OPTION_REQ_LIST 55 ++#define DHCP_OPTION_END 255 ++ ++static u8_t xid[4] = { 0xad, 0xde, 0x12, 0x23 }; ++static const u8_t magic_cookie[4] = { 99, 130, 83, 99 }; ++ ++struct dhcpc_options dhcpc_opt = { ++ .enable_random_xid = 1, ++}; ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t *add_msg_type(u8_t *optptr, u8_t type) ++{ ++ *optptr++ = DHCP_OPTION_MSG_TYPE; ++ *optptr++ = 1; ++ *optptr++ = type; ++ return optptr; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t *add_server_id(struct dhcpc_state *s, u8_t *optptr) ++{ ++ *optptr++ = DHCP_OPTION_SERVER_ID; ++ *optptr++ = 4; ++ memcpy(optptr, s->serverid, 4); ++ return optptr + 4; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t *add_req_ipaddr(struct dhcpc_state *s, u8_t *optptr) ++{ ++ *optptr++ = DHCP_OPTION_REQ_IPADDR; ++ *optptr++ = 4; ++ memcpy(optptr, s->ipaddr, 4); ++ return optptr + 4; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t *add_req_options(u8_t *optptr) ++{ ++ *optptr++ = DHCP_OPTION_REQ_LIST; ++ *optptr++ = 3; ++ *optptr++ = DHCP_OPTION_SUBNET_MASK; ++ *optptr++ = DHCP_OPTION_ROUTER; ++ *optptr++ = DHCP_OPTION_DNS_SERVER; ++ return optptr; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t *add_end(u8_t *optptr) ++{ ++ *optptr++ = DHCP_OPTION_END; ++ return optptr; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static void create_msg(struct dhcpc_state *s, struct dhcp_msg *m) ++{ ++ m->op = DHCP_REQUEST; ++ m->htype = DHCP_HTYPE_ETHERNET; ++ m->hlen = s->mac_len; ++ m->hops = 0; ++ memcpy(m->xid, xid, sizeof(m->xid)); ++ m->secs = 0; ++ m->flags = const_htons(BOOTP_BROADCAST); /* Broadcast bit. */ ++ /* uip_ipaddr_copy(m->ciaddr, uip_hostaddr); */ ++ memcpy(m->ciaddr, s->ustack->hostaddr, sizeof(m->ciaddr)); ++ memset(m->yiaddr, 0, sizeof(m->yiaddr)); ++ memset(m->siaddr, 0, sizeof(m->siaddr)); ++ memset(m->giaddr, 0, sizeof(m->giaddr)); ++ memcpy(m->chaddr, s->mac_addr, s->mac_len); ++ memset(&m->chaddr[s->mac_len], 0, sizeof(m->chaddr) - s->mac_len); ++#ifndef UIP_CONF_DHCP_LIGHT ++ memset(m->sname, 0, sizeof(m->sname)); ++ memset(m->file, 0, sizeof(m->file)); ++#endif ++ ++ memcpy(m->options, magic_cookie, sizeof(magic_cookie)); ++} ++ ++/*---------------------------------------------------------------------------*/ ++static void send_discover(struct dhcpc_state *s) ++{ ++ u8_t *end; ++ struct dhcp_msg *m = (struct dhcp_msg *)s->ustack->uip_appdata; ++ ++ create_msg(s, m); ++ ++ end = add_msg_type(&m->options[4], DHCPDISCOVER); ++ end = add_req_options(end); ++ end = add_end(end); ++ ++ uip_appsend(s->ustack, s->ustack->uip_appdata, ++ end - (u8_t *) s->ustack->uip_appdata); ++} ++ ++/*---------------------------------------------------------------------------*/ ++static void send_request(struct dhcpc_state *s) ++{ ++ u8_t *end; ++ struct dhcp_msg *m = (struct dhcp_msg *)s->ustack->uip_appdata; ++ ++ create_msg(s, m); ++ ++ end = add_msg_type(&m->options[4], DHCPREQUEST); ++ end = add_server_id(s, end); ++ end = add_req_ipaddr(s, end); ++ end = add_end(end); ++ ++ uip_appsend(s->ustack, s->ustack->uip_appdata, ++ end - (u8_t *) s->ustack->uip_appdata); ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t parse_options(struct dhcpc_state *s, u8_t *optptr, int len) ++{ ++ u8_t *end = optptr + len; ++ u8_t type = 0; ++ ++ while (optptr < end) { ++ switch (*optptr) { ++ case DHCP_OPTION_SUBNET_MASK: ++ memcpy(s->netmask, optptr + 2, 4); ++ break; ++ case DHCP_OPTION_ROUTER: ++ memcpy(s->default_router, optptr + 2, 4); ++ break; ++ case DHCP_OPTION_DNS_SERVER: ++ memcpy(s->dnsaddr, optptr + 2, 4); ++ break; ++ case DHCP_OPTION_MSG_TYPE: ++ type = *(optptr + 2); ++ break; ++ case DHCP_OPTION_SERVER_ID: ++ memcpy(s->serverid, optptr + 2, 4); ++ break; ++ case DHCP_OPTION_LEASE_TIME: ++ memcpy(s->lease_time, optptr + 2, 4); ++ break; ++ case DHCP_OPTION_END: ++ return type; ++ } ++ ++ optptr += optptr[1] + 2; ++ } ++ return type; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t parse_msg(struct dhcpc_state *s) ++{ ++ struct dhcp_msg *m = (struct dhcp_msg *)s->ustack->uip_appdata; ++ ++ if (m->op == DHCP_REPLY && ++ memcmp(m->xid, xid, sizeof(xid)) == 0 && ++ memcmp(m->chaddr, s->mac_addr, s->mac_len) == 0) { ++ memcpy(s->ipaddr, m->yiaddr, 4); ++ return parse_options(s, &m->options[4], uip_datalen(s->ustack)); ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static PT_THREAD(handle_dhcp(struct uip_stack *ustack)) ++{ ++ struct dhcpc_state *s; ++ s = ustack->dhcpc; ++ ++ if (s == NULL) { ++ LOG_WARN("Could not find dhcpc state"); ++ return PT_ENDED; ++ } ++ ++ PT_BEGIN(&s->pt); ++ ++ /* try_again: */ ++ s->state = STATE_SENDING; ++ s->ticks = CLOCK_SECOND; ++ ++ do { ++ send_discover(s); ++ timer_set(&s->timer, s->ticks); ++ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) ++ || timer_expired(&s->timer)); ++ ++ if (uip_newdata(s->ustack) && parse_msg(s) == DHCPOFFER) { ++ s->state = STATE_OFFER_RECEIVED; ++ break; ++ } ++ ++ if (s->ticks < CLOCK_SECOND * 60) ++ s->ticks += CLOCK_SECOND; ++ else ++ PT_RESTART(&s->pt); ++ } while (s->state != STATE_OFFER_RECEIVED); ++ ++ s->ticks = CLOCK_SECOND; ++ ++ do { ++ send_request(s); ++ timer_set(&s->timer, s->ticks); ++ s->ustack->uip_flags &= ~UIP_NEWDATA; ++ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) ++ || timer_expired(&s->timer)); ++ ++ if (uip_newdata(s->ustack) && parse_msg(s) == DHCPACK) { ++ s->state = STATE_CONFIG_RECEIVED; ++ break; ++ } ++ ++ if (s->ticks <= CLOCK_SECOND * 10) ++ s->ticks += CLOCK_SECOND; ++ else ++ PT_RESTART(&s->pt); ++ } while (s->state != STATE_CONFIG_RECEIVED); ++ ++ LOG_INFO("Got IP address %d.%d.%d.%d", ++ uip_ipaddr1(s->ipaddr), uip_ipaddr2(s->ipaddr), ++ uip_ipaddr3(s->ipaddr), uip_ipaddr4(s->ipaddr)); ++ LOG_INFO("Got netmask %d.%d.%d.%d", ++ uip_ipaddr1(s->netmask), uip_ipaddr2(s->netmask), ++ uip_ipaddr3(s->netmask), uip_ipaddr4(s->netmask)); ++ LOG_INFO("Got DNS server %d.%d.%d.%d", ++ uip_ipaddr1(s->dnsaddr), uip_ipaddr2(s->dnsaddr), ++ uip_ipaddr3(s->dnsaddr), uip_ipaddr4(s->dnsaddr)); ++ LOG_INFO("Got default router %d.%d.%d.%d", ++ uip_ipaddr1(s->default_router), uip_ipaddr2(s->default_router), ++ uip_ipaddr3(s->default_router), ++ uip_ipaddr4(s->default_router)); ++ s->lease_time_nl32 = ++ ntohs(s->lease_time[0]) * 65536ul + ntohs(s->lease_time[1]); ++ LOG_INFO("Lease expires in %ld seconds", s->lease_time_nl32); ++ ++ s->last_update = time(NULL); ++ ++ set_uip_stack(s->ustack, ++ (uip_ip4addr_t *) s->ipaddr, ++ (uip_ip4addr_t *) s->netmask, ++ (uip_ip4addr_t *) s->default_router, ++ (uint8_t *) s->mac_addr); ++ ++ /* Put the stack thread back into a long sleep */ ++ s->nic->flags |= NIC_LONG_SLEEP; ++ ++ /* timer_stop(&s.timer); */ ++ ++ /* Handle DHCP lease expiration */ ++ s->ticks = CLOCK_SECOND * s->lease_time_nl32; ++ timer_set(&s->timer, s->ticks); ++ PT_WAIT_UNTIL(&s->pt, timer_expired(&s->timer)); ++ LOG_INFO("Lease expired, re-acquire IP address"); ++ s->nic->flags &= ~NIC_LONG_SLEEP; ++ PT_RESTART(&s->pt); ++ ++ /* ++ * PT_END restarts the thread so we do this instead. Eventually we ++ * should reacquire expired leases here. ++ */ ++ ++ while (1) ++ PT_YIELD(&s->pt); ++ ++ PT_END(&(s->pt)); ++} ++ ++/*---------------------------------------------------------------------------*/ ++int dhcpc_init(nic_t *nic, struct uip_stack *ustack, ++ const void *mac_addr, int mac_len) ++{ ++ uip_ip4addr_t addr; ++ struct dhcpc_state *s = ustack->dhcpc; ++ ++ if (s) { ++ LOG_DEBUG("DHCP: DHCP context already allocated"); ++ return -EALREADY; ++ } ++ s = malloc(sizeof(*s)); ++ if (s == NULL) { ++ LOG_ERR("Couldn't allocate size for dhcpc info"); ++ return -ENOMEM; ++ } ++ ++ memset(s, 0, sizeof(*s)); ++ s->nic = nic; ++ s->ustack = ustack; ++ s->mac_addr = mac_addr; ++ s->mac_len = mac_len; ++ s->state = STATE_INITIAL; ++ ++ /* Initialize XID to randomly */ ++ if (dhcpc_opt.enable_random_xid == 1) { ++ u32_t gen_xid; ++ gen_xid = random(); ++ memcpy(xid, &gen_xid, sizeof(gen_xid)); ++ } ++ uip_ipaddr(addr, 255, 255, 255, 255); ++ s->conn = uip_udp_new(ustack, &addr, const_htons(DHCPC_SERVER_PORT)); ++ if (s->conn != NULL) ++ uip_udp_bind(s->conn, const_htons(DHCPC_CLIENT_PORT)); ++ ++ ustack->dhcpc = s; ++ ++ /* Let the RX poll value take over */ ++ nic->flags &= ~NIC_LONG_SLEEP; ++ ++ PT_INIT(&s->pt); ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------------------*/ ++void dhcpc_appcall(struct uip_stack *ustack) ++{ ++ handle_dhcp(ustack); ++} ++ ++/*---------------------------------------------------------------------------*/ ++void dhcpc_request(struct uip_stack *ustack) ++{ ++ struct dhcpc_state *s = ustack->dhcpc; ++ ++ if (s != NULL && s->state == STATE_INITIAL) ++ handle_dhcp(ustack); ++} ++ ++/*---------------------------------------------------------------------------*/ +diff --git a/iscsiuio/src/apps/dhcpc/dhcpc.h b/iscsiuio/src/apps/dhcpc/dhcpc.h +new file mode 100644 +index 0000000..89cf086 +--- /dev/null ++++ b/iscsiuio/src/apps/dhcpc/dhcpc.h +@@ -0,0 +1,86 @@ ++/* ++ * Copyright (c) 2005, Swedish Institute of Computer Science ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++#ifndef __DHCPC_H__ ++#define __DHCPC_H__ ++ ++#include ++ ++#include "nic.h" ++#include "timer.h" ++#include "pt.h" ++#include "uip.h" ++ ++#define STATE_INITIAL 0 ++#define STATE_SENDING 1 ++#define STATE_OFFER_RECEIVED 2 ++#define STATE_CONFIG_RECEIVED 3 ++ ++struct dhcpc_state { ++ struct pt pt; ++ ++ nic_t *nic; ++ struct uip_stack *ustack; ++ char state; ++ struct uip_udp_conn *conn; ++ struct timer timer; ++ u32_t ticks; ++ const void *mac_addr; ++ int mac_len; ++ ++ u8_t serverid[4]; ++ ++ u16_t lease_time[2]; ++ u32_t lease_time_nl32; ++ u16_t ipaddr[2]; ++ u16_t netmask[2]; ++ u16_t dnsaddr[2]; ++ u16_t default_router[2]; ++ ++ time_t last_update; ++}; ++ ++struct dhcpc_options { ++ u8_t enable_random_xid; ++ u8_t xid[4]; ++}; ++ ++int dhcpc_init(nic_t *nic, struct uip_stack *ustack, ++ const void *mac_addr, int mac_len); ++void dhcpc_request(struct uip_stack *ustack); ++ ++void dhcpc_appcall(struct uip_stack *ustack); ++ ++void dhcpc_configured(const struct dhcpc_state *s); ++ ++#define UIP_UDP_APPCALL dhcpc_appcall ++ ++#endif /* __DHCPC_H__ */ +diff --git a/iscsiuio/src/apps/dhcpc/dhcpv6.c b/iscsiuio/src/apps/dhcpc/dhcpv6.c +new file mode 100644 +index 0000000..a4e25f0 +--- /dev/null ++++ b/iscsiuio/src/apps/dhcpc/dhcpv6.c +@@ -0,0 +1,512 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai ++ * Based on code from Kevin Tran's iSCSI boot code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * dhcpv6.c - DHCPv6 engine ++ * ++ */ ++#include ++#include ++ ++#include "ipv6.h" ++#include "ipv6_pkt.h" ++#include "dhcpv6.h" ++#include "logger.h" ++ ++/* Local function prototypes */ ++static int dhcpv6_send_solicit_packet(struct dhcpv6_context *context); ++static int dhcpv6_send_request_packet(struct dhcpv6_context *context); ++static u16_t dhcpv6_init_packet(struct dhcpv6_context *context, u8_t type); ++static void dhcpv6_init_dhcpv6_server_addr(struct ipv6_addr *addr); ++static void dhcpv6_handle_advertise(struct dhcpv6_context *context, ++ u16_t dhcpv6_len); ++static void dhcpv6_handle_reply(struct dhcpv6_context *context, ++ u16_t dhcpv6_len); ++static int dhcpv6_process_opt_ia_na(struct dhcpv6_context *context, ++ struct dhcpv6_opt_hdr *opt_hdr); ++static void dhcpv6_process_opt_dns_servers(struct dhcpv6_context *context, ++ struct dhcpv6_opt_hdr *opt_hdr); ++static void dhcpv6_parse_vendor_option(struct dhcpv6_context *context, ++ u8_t *option, int len); ++ ++void dhcpv6_init(struct dhcpv6_context *context) ++{ ++ context->seconds = 0; ++ context->our_mac_addr = ++ ipv6_get_link_addr(context->ipv6_context); ++ ++ /* Use the last four bytes of MAC address as base of the transaction ++ ID */ ++ context->dhcpv6_transaction_id = context->our_mac_addr->last_4_bytes; ++ ++ context->dhcpv6_done = FALSE; ++ strcpy(context->dhcp_vendor_id, "BRCM ISAN"); ++} ++ ++int dhcpv6_do_discovery(struct dhcpv6_context *context) ++{ ++ int retc = ISCSI_FAILURE; ++ ++ context->eth = ++ (struct eth_hdr *)context->ipv6_context->ustack->data_link_layer; ++ context->ipv6 = ++ (struct ipv6_hdr *)context->ipv6_context->ustack->network_layer; ++ context->udp = ++ (struct udp_hdr *)((u8_t *)context->ipv6 + sizeof(struct ipv6_hdr)); ++ ++ /* Send out DHCPv6 Solicit packet. */ ++ dhcpv6_send_solicit_packet(context); ++ ++ return retc; ++} ++ ++static int dhcpv6_send_solicit_packet(struct dhcpv6_context *context) ++{ ++ u16_t packet_len; ++ ++ LOG_DEBUG("DHCPV6: Send solicit"); ++ packet_len = dhcpv6_init_packet(context, DHCPV6_SOLICIT); ++ context->dhcpv6_state = DHCPV6_STATE_SOLICIT_SENT; ++ ipv6_send_udp_packet(context->ipv6_context, packet_len); ++ ++ return 0; ++} ++ ++static int dhcpv6_send_request_packet(struct dhcpv6_context *context) ++{ ++ u16_t packet_len; ++ ++ LOG_DEBUG("DHCPV6: Send request"); ++ packet_len = dhcpv6_init_packet(context, DHCPV6_REQUEST); ++ ++ context->dhcpv6_state = DHCPV6_STATE_REQ_SENT; ++ ipv6_send_udp_packet(context->ipv6_context, packet_len); ++ ++ return 0; ++} ++ ++static u16_t dhcpv6_init_packet(struct dhcpv6_context *context, u8_t type) ++{ ++ u16_t pkt_len; ++ struct udp_hdr *udp = context->udp; ++ union dhcpv6_hdr *dhcpv6; ++ struct dhcpv6_option *opt; ++ u16_t len; ++ ++ /* Initialize dest IP with well-known DHCP server address */ ++ dhcpv6_init_dhcpv6_server_addr(&context->ipv6->ipv6_dst); ++ /* Initialize dest MAC based on MC dest IP */ ++ ipv6_mc_init_dest_mac(context->eth, context->ipv6); ++ ++ /* Initialize UDP header */ ++ udp->src_port = HOST_TO_NET16(DHCPV6_CLIENT_PORT); ++ udp->dest_port = HOST_TO_NET16(DHCPV6_SERVER_PORT); ++ ++ /* ++ * DHCPv6 section has the following format per RFC 3315 ++ * ++ * 0 1 2 3 ++ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | msg-type | transaction-id | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | | ++ * . options . ++ * . (variable) . ++ * | | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ */ ++ dhcpv6 = (union dhcpv6_hdr *)((u8_t *)udp + sizeof(struct udp_hdr)); ++ ++ if (dhcpv6->dhcpv6_type != type) ++ context->dhcpv6_transaction_id++; ++ ++ dhcpv6->dhcpv6_trans_id = context->dhcpv6_transaction_id; ++ dhcpv6->dhcpv6_type = type; ++ ++ /* Keep track of length of all DHCP options. */ ++ pkt_len = sizeof(union dhcpv6_hdr); ++ ++ if (dhcpv6->dhcpv6_type == DHCPV6_REQUEST) { ++ /* We will send back whatever DHCPv6 sent us */ ++ return ((u8_t *)udp - (u8_t *)context->eth + ++ NET_TO_HOST16(udp->length)); ++ } ++ ++ opt = (struct dhcpv6_option *)((u8_t *)dhcpv6 + ++ sizeof(union dhcpv6_hdr)); ++ /* Add client ID option */ ++ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_CLIENTID); ++ opt->hdr.length = HOST_TO_NET16(sizeof(struct dhcpv6_opt_client_id)); ++ opt->type.client_id.duid_type = ++ HOST_TO_NET16(DHCPV6_DUID_TYPE_LINK_LAYER_AND_TIME); ++ opt->type.client_id.hw_type = HOST_TO_NET16(DHCPV6_HW_TYPE_ETHERNET); ++ opt->type.client_id.time = HOST_TO_NET32(clock_time()/1000 - ++ 0x3A4FC880); ++ memcpy((char *)&opt->type.client_id.link_layer_addr, ++ (char *)context->our_mac_addr, sizeof(struct mac_address)); ++ pkt_len += sizeof(struct dhcpv6_opt_client_id) + ++ sizeof(struct dhcpv6_opt_hdr); ++ opt = (struct dhcpv6_option *)((u8_t *)opt + ++ sizeof(struct dhcpv6_opt_client_id) + ++ sizeof(struct dhcpv6_opt_hdr)); ++ ++ /* Add Vendor Class option if it's configured */ ++ len = strlen(context->dhcp_vendor_id); ++ if (len > 0) { ++ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_VENDOR_CLASS); ++ opt->hdr.length = ++ HOST_TO_NET16(sizeof(struct dhcpv6_vendor_class) ++ + len - 1); ++ opt->type.vendor_class.enterprise_number = ++ HOST_TO_NET32(IANA_ENTERPRISE_NUM_BROADCOM); ++ opt->type.vendor_class.vendor_class_length = HOST_TO_NET16(len); ++ memcpy((char *)&opt->type.vendor_class. ++ vendor_class_data[0], ++ (char *)context->dhcp_vendor_id, len); ++ pkt_len += ++ sizeof(struct dhcpv6_vendor_class) - 1 + len + ++ sizeof(struct dhcpv6_opt_hdr); ++ opt = ++ (struct dhcpv6_option *)((u8_t *)opt + ++ sizeof(struct dhcpv6_vendor_class) - 1 + len + ++ sizeof(struct dhcpv6_opt_hdr)); ++ } ++ ++ /* Add IA_NA option */ ++ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_IA_NA); ++ opt->hdr.length = HOST_TO_NET16(sizeof(struct dhcpv6_opt_id_assoc_na)); ++ opt->type.ida_na.iaid = htonl(context->our_mac_addr->last_4_bytes); ++ opt->type.ida_na.t1 = 0; ++ opt->type.ida_na.t2 = 0; ++ pkt_len += sizeof(struct dhcpv6_opt_id_assoc_na) + ++ sizeof(struct dhcpv6_opt_hdr); ++ opt = (struct dhcpv6_option *)((u8_t *)opt + ++ sizeof(struct dhcpv6_opt_id_assoc_na) + ++ sizeof(struct dhcpv6_opt_hdr)); ++ /* Add Elapsed Time option */ ++ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_ELAPSED_TIME); ++ opt->hdr.length = HOST_TO_NET16(sizeof(struct dhcpv6_opt_elapse_time)); ++ opt->type.elapsed_time.time = HOST_TO_NET16(context->seconds); ++ pkt_len += sizeof(struct dhcpv6_opt_elapse_time) + ++ sizeof(struct dhcpv6_opt_hdr); ++ ++ /* Add Option Request List */ ++ opt = (struct dhcpv6_option *)((u8_t *)opt + ++ sizeof(struct dhcpv6_opt_elapse_time) + ++ sizeof(struct dhcpv6_opt_hdr)); ++ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_ORO); ++ opt->hdr.length = HOST_TO_NET16(3 * ++ sizeof(struct dhcpv6_opt_request_list)); ++ opt->type.list.request_code[0] = HOST_TO_NET16(DHCPV6_OPT_VENDOR_CLASS); ++ opt->type.list.request_code[1] = HOST_TO_NET16(DHCPV6_OPT_VENDOR_OPTS); ++ opt->type.list.request_code[2] = HOST_TO_NET16(DHCPV6_OPT_DNS_SERVERS); ++ pkt_len += 3 * sizeof(struct dhcpv6_opt_request_list) + ++ sizeof(struct dhcpv6_opt_hdr); ++ ++ udp->length = HOST_TO_NET16(sizeof(struct udp_hdr) + pkt_len); ++ ++ pkt_len += ++ ((u8_t *)udp - (u8_t *)context->eth) + sizeof(struct udp_hdr); ++ ++ return pkt_len; ++} ++ ++static void dhcpv6_init_dhcpv6_server_addr(struct ipv6_addr *addr) ++{ ++ /* Well-known DHCPv6 server address is ff02::1:2 */ ++ memset((char *)addr, 0, sizeof(struct ipv6_addr)); ++ addr->addr8[0] = 0xff; ++ addr->addr8[1] = 0x02; ++ addr->addr8[13] = 0x01; ++ addr->addr8[15] = 0x02; ++} ++ ++void ipv6_udp_handle_dhcp(struct dhcpv6_context *context) ++{ ++ union dhcpv6_hdr *dhcpv6; ++ u16_t dhcpv6_len; ++ ++ if (context->dhcpv6_done == TRUE) ++ return; ++ ++ dhcpv6 = (union dhcpv6_hdr *)((u8_t *)context->udp + ++ sizeof(struct udp_hdr)); ++ ++ if (dhcpv6->dhcpv6_trans_id != context->dhcpv6_transaction_id) ++ return; ++ ++ dhcpv6_len = ++ NET_TO_HOST16(context->udp->length) - sizeof(struct udp_hdr); ++ ++ switch (dhcpv6->dhcpv6_type) { ++ case DHCPV6_ADVERTISE: ++ dhcpv6_handle_advertise(context, dhcpv6_len); ++ break; ++ ++ case DHCPV6_REPLY: ++ dhcpv6_handle_reply(context, dhcpv6_len); ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++static void dhcpv6_handle_advertise(struct dhcpv6_context *context, ++ u16_t dhcpv6_len) ++{ ++ union dhcpv6_hdr *dhcpv6 = ++ (union dhcpv6_hdr *)((u8_t *)context->udp + ++ sizeof(struct udp_hdr)); ++ struct dhcpv6_opt_hdr *opt; ++ u16_t type; ++ int i; ++ int opt_len; ++ u8_t *vendor_id = NULL; ++ u16_t vendor_id_len = 0; ++ u8_t *vendor_opt_data = NULL; ++ int vendor_opt_len = 0; ++ int addr_cnt = 0; ++ ++ /* We only handle DHCPv6 advertise if we recently sent DHCPv6 solicit */ ++ if (context->dhcpv6_state != DHCPV6_STATE_SOLICIT_SENT) ++ return; ++ ++ LOG_DEBUG("DHCPV6: handle advertise"); ++ context->dhcpv6_state = DHCPV6_STATE_ADV_RCVD; ++ ++ i = 0; ++ while (i < (dhcpv6_len - sizeof(union dhcpv6_hdr))) { ++ opt = (struct dhcpv6_opt_hdr *)((u8_t *)dhcpv6 + ++ sizeof(union dhcpv6_hdr) + i); ++ opt_len = NET_TO_HOST16(opt->length); ++ ++ type = NET_TO_HOST16(opt->type); ++ ++ /* We only care about some of the options */ ++ switch (type) { ++ case DHCPV6_OPT_IA_NA: ++ if (context-> ++ dhcpv6_task & DHCPV6_TASK_GET_IP_ADDRESS) { ++ addr_cnt += ++ dhcpv6_process_opt_ia_na(context, opt); ++ } ++ break; ++ ++ case DHCPV6_OPT_VENDOR_CLASS: ++ vendor_id_len = ++ NET_TO_HOST16(((struct dhcpv6_option *)opt)->type. ++ vendor_class.vendor_class_length); ++ vendor_id = ++ &((struct dhcpv6_option *)opt)->type.vendor_class. ++ vendor_class_data[0]; ++ break; ++ ++ case DHCPV6_OPT_VENDOR_OPTS: ++ vendor_opt_len = opt_len - 4; ++ vendor_opt_data = ++ &((struct dhcpv6_option *)opt)->type.vendor_opts. ++ vendor_opt_data[0]; ++ break; ++ ++ case DHCPV6_OPT_DNS_SERVERS: ++ if (context->dhcpv6_task & DHCPV6_TASK_GET_OTHER_PARAMS) ++ dhcpv6_process_opt_dns_servers(context, opt); ++ break; ++ ++ default: ++ break; ++ } ++ ++ i += NET_TO_HOST16(opt->length) + sizeof(struct dhcpv6_opt_hdr); ++ } ++ ++ if (context->dhcpv6_task & DHCPV6_TASK_GET_OTHER_PARAMS) { ++ if ((vendor_id_len > 0) && ++ (strncmp((char *)vendor_id, ++ (char *)context->dhcp_vendor_id, ++ vendor_id_len) == 0)) { ++ dhcpv6_parse_vendor_option(context, ++ vendor_opt_data, ++ vendor_opt_len); ++ context->dhcpv6_done = TRUE; ++ } ++ } ++ ++ if (context->dhcpv6_task & DHCPV6_TASK_GET_IP_ADDRESS) { ++ if (addr_cnt > 0) { ++ /* ++ * If we need to acquire IP address from the server, ++ * we need to send Request to server to confirm. ++ */ ++ dhcpv6_send_request_packet(context); ++ context->dhcpv6_done = TRUE; ++ } ++ } ++ ++ if (context->dhcpv6_done) { ++ /* Keep track of IPv6 address of DHCHv6 server */ ++ memcpy((char *)&context->dhcp_server, ++ (char *)&context->ipv6->ipv6_src, ++ sizeof(struct ipv6_addr)); ++ } ++} ++ ++static int dhcpv6_process_opt_ia_na(struct dhcpv6_context *context, ++ struct dhcpv6_opt_hdr *opt_hdr) ++{ ++ int i; ++ int opt_len; ++ struct dhcpv6_option *opt; ++ int len; ++ int addr_cnt; ++ opt_len = NET_TO_HOST16(opt_hdr->length) - ++ sizeof(struct dhcpv6_opt_id_assoc_na); ++ ++ i = 0; ++ addr_cnt = 0; ++ while (i < opt_len) { ++ opt = ++ (struct dhcpv6_option *)((u8_t *)opt_hdr + ++ sizeof(struct dhcpv6_opt_hdr) + ++ sizeof(struct dhcpv6_opt_id_assoc_na) + i); ++ ++ len = NET_TO_HOST16(opt->hdr.length); ++ switch (NET_TO_HOST16(opt->hdr.type)) { ++ case DHCPV6_OPT_IAADDR: ++ if (len > ++ (sizeof(struct dhcpv6_opt_hdr) + ++ sizeof(struct dhcpv6_opt_iaa_addr))) { ++ struct dhcpv6_option *in_opt; ++ ++ in_opt = (struct dhcpv6_option *)((u8_t *)opt + ++ sizeof(struct dhcpv6_opt_hdr) + ++ sizeof(struct dhcpv6_opt_iaa_addr)); ++ if (in_opt->hdr.type == ++ HOST_TO_NET16(DHCPV6_OPT_STATUS_CODE)) { ++ /* This entry has error! */ ++ if (in_opt->type.sts.status != 0) ++ break; ++ } ++ } ++ LOG_INFO("DHCPv6: Got IP Addr"); ++ /* Status is OK, let's add this addr to our address ++ list */ ++ ipv6_add_prefix_entry(context->ipv6_context, ++ &opt->type.iaa_addr.addr, 64); ++ ++ /* Add multicast address for this address */ ++ ipv6_add_solit_node_address(context-> ++ ipv6_context, ++ &opt->type.iaa_addr.addr); ++ addr_cnt++; ++ break; ++ ++ default: ++ break; ++ } ++ ++ i += len + sizeof(struct dhcpv6_opt_hdr); ++ } ++ ++ return addr_cnt; ++} ++ ++static void dhcpv6_process_opt_dns_servers(struct dhcpv6_context *context, ++ struct dhcpv6_opt_hdr *opt_hdr) ++{ ++ int opt_len; ++ ++ opt_len = NET_TO_HOST16(opt_hdr->length); ++ ++ if (opt_len >= sizeof(struct ipv6_addr)) ++ memcpy((char *)&context->primary_dns_server, ++ (char *)&((struct dhcpv6_option *)opt_hdr)->type.dns. ++ primary_addr, sizeof(struct ipv6_addr)); ++ ++ if (opt_len >= 2 * sizeof(struct ipv6_addr)) ++ memcpy((char *)&context->secondary_dns_server, ++ (char *)&((struct dhcpv6_option *)opt_hdr)->type.dns. ++ secondary_addr, sizeof(struct ipv6_addr)); ++} ++ ++static void dhcpv6_handle_reply(struct dhcpv6_context *context, ++ u16_t dhcpv6_len) ++{ ++ if (context->dhcpv6_state != DHCPV6_STATE_REQ_SENT) ++ return; ++ ++ context->dhcpv6_done = TRUE; ++} ++ ++static void dhcpv6_parse_vendor_option(struct dhcpv6_context *context, ++ u8_t *option, int len) ++{ ++ struct dhcpv6_option *opt; ++ u16_t type; ++ int opt_len; ++ int data_len; ++ int i; ++ u8_t *data; ++ ++ for (i = 0; i < len; i += opt_len + sizeof(struct dhcpv6_opt_hdr)) { ++ opt = (struct dhcpv6_option *)((u8_t *)option + i); ++ type = HOST_TO_NET16(opt->hdr.type); ++ opt_len = HOST_TO_NET16(opt->hdr.length); ++ data = &opt->type.data[0]; ++ data_len = strlen((char *)data); ++ ++ switch (type) { ++ case 201: ++ /* iSCSI target 1 */ ++ break; ++ ++ case 202: ++ /* iSCSI target 2 */ ++ break; ++ ++ case 203: ++ if (data_len > ISCSI_MAX_ISCSI_NAME_LENGTH) ++ data_len = ISCSI_MAX_ISCSI_NAME_LENGTH; ++ data[data_len] = '\0'; ++ strcpy(context->initiatorName, (char *)data); ++ break; ++ ++ default: ++ break; ++ } ++ } ++} +diff --git a/iscsiuio/src/apps/dhcpc/dhcpv6.h b/iscsiuio/src/apps/dhcpc/dhcpv6.h +new file mode 100644 +index 0000000..d4ec4b9 +--- /dev/null ++++ b/iscsiuio/src/apps/dhcpc/dhcpv6.h +@@ -0,0 +1,253 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai ++ * Based on code from Kevin Tran's iSCSI boot code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * dhcpv6.h - DHCPv6 engine header ++ * ++ */ ++#ifndef __IDHCPV6_H__ ++#define __IDHCPV6_H__ ++ ++#include "ipv6_ndpc.h" ++#include "ipv6.h" ++ ++#define ISCSI_MAX_ISCSI_NAME_LENGTH 128 ++/* DHCPv6 Message types. */ ++#define DHCPV6_SOLICIT 1 ++#define DHCPV6_ADVERTISE 2 ++#define DHCPV6_REQUEST 3 ++#define DHCPV6_CONFIRM 4 ++#define DHCPV6_RENEW 5 ++#define DHCPV6_REBIND 6 ++#define DHCPV6_REPLY 7 ++#define DHCPV6_RELEASE 8 ++#define DHCPV6_DECLINE 9 ++#define DHCPV6_RECONFIGURE 10 ++#define DHCPV6_INFO_REQUEST 11 ++#define DHCPV6_RELAY_FORW 12 ++#define DHCPV6_RELAY_REPL 13 ++ ++/* Option codes. */ ++#define DHCPV6_OPT_CLIENTID 1 /* Client ID option - built by stack */ ++#define DHCPV6_OPT_SERVERID 2 /* Server ID option - built by stack */ ++#define DHCPV6_OPT_IA_NA 3 /* IA_NA option - built by user */ ++#define DHCPV6_OPT_IA_TA 4 /* IA_TA option - not supported */ ++#define DHCPV6_OPT_IAADDR 5 /* IA_ADDR option - built by user */ ++#define DHCPV6_OPT_ORO 6 /* Option Request Option - built by ++ stack */ ++#define DHCPV6_OPT_PREFERENCE 7 /* Preference option - built by server ++ */ ++#define DHCPV6_OPT_ELAPSED_TIME 8 /* Elapsed Time option - built by stack ++ */ ++#define DHCPV6_OPT_RELAY_MSG 9 /* Relay Message option - not supported ++ */ ++#define DHCPV6_OPT_AUTH 11 /* Authentication option - built by ++ stack */ ++#define DHCPV6_OPT_UNICAST 12 /* Server Unicast option - built by ++ server */ ++#define DHCPV6_OPT_STATUS_CODE 13 /* Status Code option - built by stack ++ */ ++#define DHCPV6_OPT_RAPID_COMMIT 14 /* Rapid Commit option - built by user ++ */ ++#define DHCPV6_OPT_USER_CLASS 15 /* User Class option - built by user */ ++#define DHCPV6_OPT_VENDOR_CLASS 16 /* Vendor Class option - built by user ++ */ ++#define DHCPV6_OPT_VENDOR_OPTS 17 /* Vendor-Specific Information option - ++ build by user */ ++#define DHCPV6_OPT_INTERFACE_ID 18 /* Interface ID option - not supported ++ */ ++#define DHCPV6_OPT_RECONF_MSG 19 /* Reconfigure Message option - built ++ by server */ ++#define DHCPV6_OPT_RECONF_ACCEPT 20 /* Reconfigure Accept option - built by ++ user */ ++#define DHCPV6_OPT_SIP_SERVER_D 21 /* NOT SUPPORTED - included for ++ completeness only */ ++#define DHCPV6_OPT_SIP_SERVER_A 22 /* NOT SUPPORTED - included for ++ completeness only */ ++#define DHCPV6_OPT_DNS_SERVERS 23 /* DNS Recursive Name Server option - ++ built by server */ ++#define DHCPV6_OPT_DOMAIN_LIST 24 /* Domain Search List option - not ++ supported */ ++#define DHCPV6_MAX_OPT_CODES 25 /* This will be the count + 1 since ++ the parsing array starts ++ at [1] instead of [0] */ ++ ++/* Authentication protocol types. */ ++#define DHCPV6_DELAYED_AUTH_PROT 2 /* Delayed Authentication protocol. */ ++#define DHCPV6_RECON_KEY_AUTH_PROT 3 /* Reconfigure Key Authentication ++ protocol. */ ++ ++struct dhcpv6_context { ++#define DHCP_VENDOR_ID_LEN 128 ++ char dhcp_vendor_id[DHCP_VENDOR_ID_LEN]; ++ struct mac_address *our_mac_addr; ++ u32_t dhcpv6_transaction_id; ++ u16_t seconds; ++ int timeout; ++ int dhcpv6_done; ++ ++#define DHCPV6_STATE_UNKNOWN 0 ++#define DHCPV6_STATE_SOLICIT_SENT 1 ++#define DHCPV6_STATE_ADV_RCVD 2 ++#define DHCPV6_STATE_REQ_SENT 3 ++#define DHCPV6_STATE_CONFIRM_SENT 4 ++ int dhcpv6_state; ++ u16_t dhcpv6_task; ++ struct ipv6_context *ipv6_context; ++ struct eth_hdr *eth; ++ struct ipv6_hdr *ipv6; ++ struct udp_hdr *udp; ++ ++ char initiatorName[ISCSI_MAX_ISCSI_NAME_LENGTH]; ++ struct ipv6_addr dhcp_server; ++ struct ipv6_addr primary_dns_server; ++ struct ipv6_addr secondary_dns_server; ++ ++}; ++ ++union dhcpv6_hdr { ++ struct { ++ u32_t type:8; ++ u32_t trans_id:24; ++ } field; ++ ++ u32_t type_transaction; ++}; ++ ++#define dhcpv6_type field.type ++#define dhcpv6_trans_id field.trans_id ++ ++struct dhcpv6_opt_hdr { ++ u16_t type; ++ u16_t length; ++}; ++ ++struct dhcpv6_opt_client_id { ++ u16_t duid_type; ++#define DHCPV6_DUID_TYPE_LINK_LAYER_AND_TIME 1 ++#define DHCPV6_DUID_TYPE_VENDOR_BASED 2 ++#define DHCPV6_DUID_TYPE_LINK_LAYER 3 ++ u16_t hw_type; ++#define DHCPV6_HW_TYPE_ETHERNET 1 ++ u32_t time; ++ struct mac_address link_layer_addr; ++}; ++ ++struct dhcpv6_opt_id_assoc_na { ++ u32_t iaid; ++#define DHCPV6_OPT_IA_NA_IAID 0x306373L ++ u32_t t1; ++ u32_t t2; ++}; ++ ++struct dhcpv6_opt_elapse_time { ++ u16_t time; ++}; ++ ++struct dhcpv6_opt_iaa_addr { ++ struct ipv6_addr addr; ++ u32_t preferred_lifetime; ++ u32_t valid_lifetime; ++}; ++ ++struct dhcpv6_opt_status { ++ u16_t status; ++}; ++ ++struct dhcpv6_opt_request_list { ++ u16_t request_code[1]; ++}; ++ ++struct dhcpv6_opt_dns { ++ struct ipv6_addr primary_addr; ++ struct ipv6_addr secondary_addr; ++}; ++ ++struct dhcpv6_vendor_class { ++ u32_t enterprise_number; ++ u16_t vendor_class_length; ++ u8_t vendor_class_data[1]; ++}; ++ ++struct dhcpv6_vendor_opts { ++ u32_t enterprise_number; ++ u8_t vendor_opt_data[1]; ++}; ++ ++struct dhcpv6_option { ++ struct dhcpv6_opt_hdr hdr; ++ union { ++ struct dhcpv6_vendor_opts vendor_opts; ++ struct dhcpv6_vendor_class vendor_class; ++ struct dhcpv6_opt_client_id client_id; ++ struct dhcpv6_opt_id_assoc_na ida_na; ++ struct dhcpv6_opt_elapse_time elapsed_time; ++ struct dhcpv6_opt_iaa_addr iaa_addr; ++ struct dhcpv6_opt_status sts; ++ struct dhcpv6_opt_request_list list; ++ struct dhcpv6_opt_dns dns; ++ u8_t data[1]; ++ } type; ++}; ++ ++#define DHCPV6_NUM_OF_RETRY 4 ++ ++#define DHCPV6_ACK_TIMEOUT 2 ++ ++#define IANA_ENTERPRISE_NUM_BROADCOM 0x113d ++ ++/* QLogic Extended DHCP options used in iSCSI boot */ ++#define DHCPV6_TAG_FIRST_ISCSI_TARGET_NAME 201 ++#define DHCPV6_TAG_SECOND_ISCSI_TARGET_NAME 202 ++#define DHCPV6_TAG_ISCSI_INITIATOR_NAME 203 ++ ++#define MAX_DHCP_RX_OFFERS 4 ++#define MAX_DHCP_OPTION43_LENGTH 1024 ++ ++#define DHCPV6_TASK_GET_IP_ADDRESS 0x1 ++#define DHCPV6_TASK_GET_OTHER_PARAMS 0x2 ++ ++enum { ++ ISCSI_FAILURE, ++ ISCSI_USER_ABORT, ++ ISCSI_SUCCESS ++}; ++ ++/* Function prototypes */ ++int dhcpv6_do_discovery(struct dhcpv6_context *context); ++void ipv6_udp_handle_dhcp(struct dhcpv6_context *context); ++void dhcpv6_init(struct dhcpv6_context *context); ++ ++#endif /* __IDHCPV6_H__ */ +diff --git a/iscsiuio/src/uip-1.0-changelog.txt b/iscsiuio/src/uip-1.0-changelog.txt +new file mode 100644 +index 0000000..800e444 +--- /dev/null ++++ b/iscsiuio/src/uip-1.0-changelog.txt +@@ -0,0 +1,98 @@ ++* A new API: protosockets that are similar to BSD sockets but does not ++ require any underlying multithreading system. ++ ++* Very rudimentary IPv6 support ++ ++* New application: DHCP client. Web server rewritten with protosockets. ++ ++* Removed uIP zero-copy functionality in order to simplify uIP device ++ driver coding: outbound packets are now *always* stored in full in ++ the uip_buf buffer. ++ ++* Checksum computation is now part of uip.c, but it still is possible ++ to implement them in assembly code by specifying a configuration ++ option. Checksum code now runs on architectures with 2-byte alignment. ++ ++* Added TCP persistent timer. ++ ++* Made all IP address representations use the new uip_ipaddr_ip ++ datatype for clarity. ++ ++* Updated window behavior so that sending to a host with a small open ++ window works better now. ++ ++* UDP API change: uip_udp_new() now takes port numbers in network byte ++ order like TCP functions. ++ ++* Allow reception of packets when no IP address is configured to make ++ DHCP work. ++ ++* Moved Ethernet address into main uIP module from ARP module. ++ ++* Made constants explicit #defines and moved them out of the code ++ (header sizes, TCP options, TCP header length field). ++ ++* If uip_len is less than that reported by the IP header, the packet ++ is discarded. If uip_len is greater than the length reported by the ++ IP header, uip_len is adjusted. ++ ++* Moved header size definitions into header file. ++ ++* Added uIP call for polling an application without triggering any ++ timer events. Removed redundant assignments of uip_len and uip_slen. ++ ++* Removed compiler warning about icmp_input label being defined when ++ UIP_PINGADDRCONF was not used. ++ ++* Added UIP_APPDATA_SIZE macro that holds the available buffer size ++ for user data. ++ ++* Added uip_udp_bind() call. ++ ++* Moved checksum code into main uIP module. ++ ++* Switched the TCP, UDP and IP header structures to be structs rather ++ than typedefs. ++ ++* Prefixed TCP state names with UIP_ to avoid name space ++ contamination. ++ ++* Changed declarations of uip_appdatap and friends to void * to avoid ++ explicit typecasts. ++ ++* Bugfixes ++ ++ o TCP: Fixed bug with high byte of peer window size. ++ ++ o TCP: Fixed bug that in some cases prevented concurrent reception and ++ transmission of TCP data. ++ ++ o TCP: uip_connect() didn't correctly calculate age of TIME_WAIT ++ connections. ++ ++ o TCP: Array index for uip_conns[] array was out of bounds in ++ comparison. Comparison changed to make index within bounds. ++ ++ o TCP: if the remote host crashes and tries to reestablish an old ++ connection, uIP should respond with an ACK with the correct ++ sequence and acknowledgment numbers, to which the remote host ++ should respond with an ACK. uIP did not respond with the correct ++ ACK. ++ ++ o TCP: Fixed check for SYNACK segment: now checks only relevant TCP ++ control flags and discards flags reserved for future expansion. ++ ++ o TCP: Fixed bug where uIP did not inform application that a connection ++ had been aborted during an active open. ++ ++ o TCP: FIN segment was accepted even though application had stopped ++ incoming data with uip_stop(). ++ ++ o TCP: A FINACK segment would not always correctly acknowledge data. ++ ++ o UDP: checksums are now calculated after all fields have been ++ filled in. ++ ++ o UDP: network byte order on lastport in uip_udp_new(). ++ ++ o IP: memset() bugs in IP fragment reassembly code fixed. +diff --git a/iscsiuio/src/uip/Makefile.am b/iscsiuio/src/uip/Makefile.am +new file mode 100644 +index 0000000..16170d7 +--- /dev/null ++++ b/iscsiuio/src/uip/Makefile.am +@@ -0,0 +1,18 @@ ++AM_CFLAGS = -I${top_srcdir}/src/unix \ ++ -I${top_srcdir}/src/apps/dhcpc \ ++ -I${top_srcdir}/src/apps/brcm-iscsi \ ++ -I${top_srcdir}/../include \ ++ -I${top_srcdir}/../usr ++ ++noinst_LIBRARIES = lib_iscsi_uip.a ++ ++lib_iscsi_uip_a_SOURCES = uip.c \ ++ uip_arp.c \ ++ psock.c \ ++ timer.c \ ++ uip-neighbor.c \ ++ uip_eth.c \ ++ ipv6_ndpc.c \ ++ ipv6.c ++ ++lib_iscsi_uip_a_CFLAGS = -DBYTE_ORDER=@ENDIAN@ $(AM_CFLAGS) +diff --git a/iscsiuio/src/uip/Makefile.include b/iscsiuio/src/uip/Makefile.include +new file mode 100644 +index 0000000..aa3ac63 +--- /dev/null ++++ b/iscsiuio/src/uip/Makefile.include +@@ -0,0 +1,47 @@ ++ ++ ++ifdef APPS ++ APPDIRS = $(foreach APP, $(APPS), ../apps/$(APP)) ++ -include $(foreach APP, $(APPS), ../apps/$(APP)/Makefile.$(APP)) ++ CFLAGS += $(addprefix -I../apps/,$(APPS)) ++endif ++ ++ifndef CCDEP ++ CCDEP = $(CC) ++endif ++ifndef CCDEPCFLAGS ++ CCDEPCFLAGS = $(CFLAGS) ++endif ++ifndef OBJECTDIR ++ OBJECTDIR = obj ++endif ++ ++ifeq (${wildcard $(OBJECTDIR)},) ++ DUMMY := ${shell mkdir $(OBJECTDIR)} ++endif ++ ++ ++vpath %.c . ../uip ../lib $(APPDIRS) ++ ++$(OBJECTDIR)/%.o: %.c ++ $(CC) $(CFLAGS) -c $< -o $@ ++ ++$(OBJECTDIR)/%.d: %.c ++ @set -e; rm -f $@; \ ++ $(CCDEP) -MM $(CCDEPCFLAGS) $< > $@.$$$$; \ ++ sed 's,\($*\)\.o[ :]*,$(OBJECTDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ ++ rm -f $@.$$$$ ++ ++UIP_SOURCES=uip.c uip_arp.c uiplib.c psock.c timer.c uip-neighbor.c uip_eth.c ipv6_ndp.c ipv6.c ++ ++ ++ifneq ($(MAKECMDGOALS),clean) ++-include $(addprefix $(OBJECTDIR)/,$(UIP_SOURCES:.c=.d) \ ++ $(APP_SOURCES:.c=.d)) ++endif ++ ++libuip.a: ${addprefix $(OBJECTDIR)/, $(UIP_SOURCES:.c=.o)} ++ $(AR) rc $@ $^ ++ ++libapps.a: ${addprefix $(OBJECTDIR)/, $(APP_SOURCES:.c=.o)} ++ $(AR) rc $@ $^ +diff --git a/iscsiuio/src/uip/clock.h b/iscsiuio/src/uip/clock.h +new file mode 100644 +index 0000000..d79326b +--- /dev/null ++++ b/iscsiuio/src/uip/clock.h +@@ -0,0 +1,87 @@ ++/** ++ * \defgroup clock Clock interface ++ * ++ * The clock interface is the interface between the \ref timer "timer library" ++ * and the platform specific clock functionality. The clock ++ * interface must be implemented for each platform that uses the \ref ++ * timer "timer library". ++ * ++ * The clock interface does only one this: it measures time. The clock ++ * interface provides a macro, CLOCK_SECOND, which corresponds to one ++ * second of system time. ++ * ++ * \sa \ref timer "Timer library" ++ * ++ * @{ ++ */ ++ ++/* ++ * Copyright (c) 2004, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++#ifndef __CLOCK_H__ ++#define __CLOCK_H__ ++ ++#include "clock-arch.h" ++ ++/** ++ * Initialize the clock library. ++ * ++ * This function initializes the clock library and should be called ++ * from the main() function of the system. ++ * ++ */ ++void clock_init(void); ++ ++/** ++ * Get the current clock time. ++ * ++ * This function returns the current system clock time. ++ * ++ * \return The current clock time, measured in system ticks. ++ */ ++clock_time_t clock_time(void); ++ ++/** ++ * A second, measured in system clock time. ++ * ++ * \hideinitializer ++ */ ++#ifdef CLOCK_CONF_SECOND ++#define CLOCK_SECOND CLOCK_CONF_SECOND ++#else ++#define CLOCK_SECOND (clock_time_t)32 ++#endif ++ ++#endif /* __CLOCK_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/debug.h b/iscsiuio/src/uip/debug.h +new file mode 100644 +index 0000000..a58fa7a +--- /dev/null ++++ b/iscsiuio/src/uip/debug.h +@@ -0,0 +1,13 @@ ++#ifndef __DEBUG_H__ ++#define __DEBUG_H__ ++ ++#ifdef DEBUG ++#define UIP_DEBUG(args...) \ ++ do { \ ++ fprintf(stdout, args); \ ++ fflush(stdout); \ ++ } while (0); ++#else ++#endif ++ ++#endif +diff --git a/iscsiuio/src/uip/icmpv6.h b/iscsiuio/src/uip/icmpv6.h +new file mode 100644 +index 0000000..cbf9aa8 +--- /dev/null ++++ b/iscsiuio/src/uip/icmpv6.h +@@ -0,0 +1,302 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai (eddie.wai@broadcom.com) ++ * Based on Kevin Tran's iSCSI boot code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * icmpv6.h - This file contains macro definitions pertaining to ICMPv6 ++ * ++ * RFC 2463 : ICMPv6 Specification ++ * RFC 2461 : Neighbor Discovery for IPv6 ++ * ++ */ ++#ifndef __ICMPV6_H__ ++#define __ICMPV6_H__ ++ ++/* Base ICMP Header sizes */ ++#define IPV6_RTR_SOL_HDR_SIZE 8 ++#define IPV6_RTR_ADV_HDR_SIZE 16 ++#define IPV6_NEIGH_SOL_HDR_SIZE 24 ++#define IPV6_NEIGH_ADV_HDR_SIZE 24 ++#define IPV6_LINK_LAYER_OPT_SIZE 2 ++#define IPV6_LINK_LAYER_OPT_LENGTH 8 ++#define IPV6_MTU_OPT_SIZE 8 ++#define IPV6_PREFIX_OPT_SIZE 32 ++#define IPV6_ECHO_REQUEST_HDR_SIZE 8 ++#define IPV6_ECHO_REPLY_HDR_SIZE 8 ++#define IPV6_REDIRECT_SIZE 40 ++#define IPV6_DHAAD_REQ_HDR_SIZE 8 ++#define IPV6_DHAAD_REPLY_HDR_SIZE 8 ++#define IPV6_PRFXSOL_HDR_SIZE 8 ++#define IPV6_PRFXADV_HDR_SIZE 8 ++#define IPV6_RTR_ADV_INT_OPT_SIZE 8 ++ ++/* ICMP Message Types */ ++/* Error messages are always less than 128 */ ++#define ICMPV6_DST_UNREACH 1 /* Destination Unreachable */ ++#define ICMPV6_PACKET_TOO_BIG 2 /* Packet Too Big */ ++#define ICMPV6_TIME_EXCEEDED 3 /* Time Exceeded */ ++#define ICMPV6_PARAM_PROB 4 /* Parameter Problem */ ++ ++#define ICMPV6_RTR_SOL 133 /* Router Solicitation */ ++#define ICMPV6_RTR_ADV 134 /* Router Advertisement */ ++#define ICMPV6_NEIGH_SOL 135 /* Neighbor Solicitation */ ++#define ICMPV6_NEIGH_ADV 136 /* Neighbor Advertisement */ ++#define ICMPV6_REDIRECT 137 /* Redirect */ ++#define ICMPV6_ECHO_REQUEST 128 /* Echo Request */ ++#define ICMPV6_ECHO_REPLY 129 /* Echo Reply */ ++#define ICMPV6_WRUREQUEST 139 /* Who Are You Request */ ++#define ICMPV6_WRUREPLY 140 /* Who Are You Reply */ ++#define ICMPV6_ROUTER_RENUMBERING 138 /* Router Renumbering */ ++#define ICMPV6_HA_ADDR_DISC_REQ 144 /* Dynamic Home Agent Address ++ Discovery Request */ ++#define ICMPV6_HA_ADDR_DISC_REPLY 145 /* Dynamic Home Agent Address ++ Discovery Reply */ ++#define ICMPV6_MP_SOLICIT 146 /* Mobile Prefix Solicitation */ ++#define ICMPV6_MP_ADV 147 /* Mobile Prefix Reply */ ++ ++/* Destination Unreachable Codes */ ++#define ICMPV6_DST_UNREACH_NOROUTE 0 ++#define ICMPV6_DST_UNREACH_ADMIN 1 ++#define ICMPV6_DST_UNREACH_ADDRESS 3 ++#define ICMPV6_DST_UNREACH_PORT 4 ++ ++/* Time Exceeded Codes */ ++#define ICMPV6_TIME_EXCD_HPLMT 0 /* Hop Limit exceeded in transit */ ++#define ICMPV6_TIME_EXCD_REASM 1 /* Fragment reassembly time exceeded */ ++ ++/* Parameter Problem Codes */ ++#define ICMPV6_PARM_PROB_HEADER 0 ++#define ICMPV6_PARM_PROB_NEXT_HDR 1 ++#define ICMPV6_PARM_PROB_OPTION 2 ++ ++/* ICMP Option Types */ ++#define IPV6_ICMP_OPTION_SRC_ADDR 1 /* Source Link-Layer Address */ ++#define IPV6_ICMP_OPTION_TAR_ADDR 2 /* Target Link-Layer Address */ ++#define IPV6_ICMP_OPTION_PREFIX 3 /* Prefix */ ++#define IPV6_ICMP_OPTION_RED_HDR 4 /* Redirect Header */ ++#define IPV6_ICMP_OPTION_MTU 5 /* Link MTU */ ++#define IPV6_ICMP_OPTION_RTR_ADV_INT 7 /* Rtr Advertisement Interval */ ++ ++/* ICMP Offsets */ ++#define IPV6_ICMP_TYPE_OFFSET 0 ++#define IPV6_ICMP_CODE_OFFSET 1 ++#define IPV6_ICMP_CKSUM_OFFSET 2 ++#define IPV6_ICMP_RESERVED_OFFSET 4 ++#define IPV6_ICMP_DATA_OFFSET 8 ++ ++/* ICMP Router Solicitation Offsets */ ++#define IPV6_ICMP_RTR_SOL_RES_OFFSET 4 ++#define IPV6_ICMP_RTR_SOL_OPTIONS_OFFSET 8 ++ ++/* ICMP Router Advertisement Offsets */ ++#define IPV6_ICMP_RTR_ADV_CURHOPLMT_OFFSET 4 ++#define IPV6_ICMP_RTR_ADV_MGDANDCFG_BIT_OFFSET 5 ++#define IPV6_ICMP_RTR_ADV_RTR_LIFETIME_OFFSET 6 ++#define IPV6_ICMP_RTR_ADV_RCHBL_TIME_OFFSET 8 ++#define IPV6_ICMP_RTR_ADV_RTRNS_TMR_OFFSET 12 ++#define IPV6_ICMP_RTR_ADV_OPTIONS_OFFSET 16 ++ ++/* ICMP Neighbor Solicitation Offsets */ ++#define IPV6_ICMP_NEIGH_SOL_RES_OFFSET 4 ++#define IPV6_ICMP_NEIGH_SOL_TRGT_ADDRS_OFFSET 8 ++#define IPV6_ICMP_NEIGH_SOL_OPTIONS_OFFSET 24 ++ ++/* ICMP Neighbor Advertisement Offsets */ ++#define IPV6_ICMP_NEIGH_ADV_FLAG_OFFSET 4 ++#define IPV6_ICMP_NEIGH_ADV_TRGT_ADDRS_OFFSET 8 ++#define IPV6_ICMP_NEIGH_ADV_OPTIONS_OFFSET 24 ++ ++/* ICMP Redirect Offsets */ ++#define IPV6_ICMP_REDIRECT_TRGT_ADDRS_OFFSET 8 ++#define IPV6_ICMP_REDIRECT_DEST_ADDRS_OFFSET 24 ++#define IPV6_ICMP_REDIRECT_OPTIONS_OFFSET 40 ++ ++/* ICMP Option Offsets */ ++#define IPV6_ICMP_OPTION_TYPE_OFFSET 0 ++#define IPV6_ICMP_OPTION_LENGTH_OFFSET 1 ++ ++/* ICMP Link-Layer Address Option Offsets */ ++#define IPV6_ICMP_LL_OPTION_ADDRESS_OFFSET 2 ++ ++/* ICMP Prefix Option Offsets */ ++#define IPV6_ICMP_PREFIX_PRE_LENGTH_OFFSET 2 ++#define IPV6_ICMP_PREFIX_FLAG_OFFSET 3 ++#define IPV6_ICMP_PREFIX_VALID_LIFETIME_OFFSET 4 ++#define IPV6_ICMP_PREFIX_PREF_LIFETIME_OFFSET 8 ++#define IPV6_ICMP_PREFIX_RES2_OFFSET 12 ++#define IPV6_ICMP_PREFIX_PREFIX_OFFSET 16 ++ ++/* ICMP Redirected Header Option Offsets */ ++#define IPV6_ICMP_RED_OPTION_TYPE_OFFSET 0 ++#define IPV6_ICMP_RED_OPTION_LEN_OFFSET 1 ++#define IPV6_ICMP_RED_OPTION_RES1_OFFSET 2 ++#define IPV6_ICMP_RED_OPTION_RES2_OFFSET 4 ++#define IPV6_ICMP_RED_OPTION_DATA_OFFSET 8 ++ ++/* ICMP MTU Option Offsets */ ++#define IPV6_ICMP_MTU_RESERVED_OFFSET 2 ++#define IPV6_ICMP_MTU_OFFSET 4 ++ ++/* ICMP Echo Request Offsets */ ++#define IPV6_ICMP_ECHO_ID 4 ++#define IPV6_ICMP_ECHO_SEQ 6 ++#define IPV6_ICMP_ECHO_DATA 8 ++ ++/* ICMP Destination Unreachable Offsets */ ++#define IPV6_DST_UNREACH_UNUSED 4 ++#define IPV6_DST_UNREACH_DATA 8 ++ ++/* ICMP Parameter Problem Offsets */ ++#define IPV6_PARAM_PROB_PTR 4 ++#define IPV6_PARAM_PROT_DATA 8 ++ ++/* ICMP Time Exceeded Offsets */ ++#define IPV6_TIME_EXCEEDED_DATA 8 ++ ++/* ICMP Packet Too Big Offsets */ ++#define IPV6_PKT_TOO_BIG_MTU 4 ++#define IPV6_PKT_TOO_BIG_DATA 8 ++ ++/* Home Agent Address Discovery Request Header Offsets */ ++#define ICMPV6_HA_ADDR_DISC_REQ_ID_OFFSET 4 ++#define ICMPV6_HA_ADDR_DISC_REQ_RSVD_OFFSET 6 ++ ++/* Home Agent Address Discovery Reply Header Offsets */ ++#define ICMPV6_HA_ADDR_DISC_REPLY_ID_OFFSET 4 ++#define ICMPV6_HA_ADDR_DISC_REPLY_RSVD_OFFSET 6 ++#define ICMPV6_HA_ADDR_DISC_REPLY_HA_ADDR_OFFSET 8 ++ ++/* Mobile Prefix Solicitation Header Offsets */ ++#define ICMPV6_MP_SOLICIT_ID_OFFSET 4 ++#define ICMPV6_MP_SOLICIT_RSVD_OFFSET 6 ++ ++/* Mobile Prefix Advertisement Header Offsets */ ++#define ICMPV6_MP_ADV_ID_OFFSET 4 ++#define ICMPV6_MP_ADV_MGDANDCFG_BIT_OFFSET 6 ++#define ICMPV6_MP_ADV_OPT_OFFSET 8 ++ ++/* Advertisement Interval Option Header Offsets */ ++#define ICMPV6_ADV_INT_TYPE_OFFSET 0 ++#define ICMPV6_ADV_INT_LEN_OFFSET 1 ++#define ICMPV6_ADV_INT_RSVD_OFFSET 2 ++#define ICMPV6_ADV_INT_ADV_INT_OFFSET 4 ++ ++#define ICMPV6_HEADER_LEN 4 ++ ++#define IPV6_PREFIX_FLAG_ONLINK 0x80 ++#define IPV6_PREFIX_FLAG_AUTO 0x40 ++#define IPV6_PREFIX_FLAG_ROUTER 0x20 ++ ++#define IPV6_NA_FLAG_ROUTER 0x80 ++#define IPV6_NA_FLAG_SOLICITED 0x40 ++#define IPV6_NA_FLAG_OVERRIDE 0x20 ++ ++/* Router Advertisement Flags */ ++#define IPV6_RA_MANAGED_FLAG 0x80 ++#define IPV6_RA_CONFIG_FLAG 0x40 ++ ++/* Mobile Prefix Advertisement Flags */ ++#define IPV6_PA_MANAGED_FLAG 0x80 ++#define IPV6_PA_CONFIG_FLAG 0x40 ++ ++/* Validation Values */ ++#define ICMPV6_VALID_HOP_LIMIT 255 /* Valid Hop Limit */ ++#define ICMPV6_VALID_CODE 0 /* Valid Code */ ++#define ICMPV6_RTRSOL_MIN_LENGTH 8 /* Minimum valid length for ++ Router Solicitation */ ++#define ICMPV6_RTRADV_MIN_LENGTH 16 /* Minimum valid length for ++ Router Advertisement */ ++#define ICMPV6_NEIGHSOL_MIN_LENGTH 24 /* Minimum valid length for ++ Neighbor Solicitation */ ++#define ICMPV6_NEIGHADV_MIN_LENGTH 24 /* Minimum valid length for ++ Neighbor Advertisement */ ++#define ICMPV6_REDIRECT_MIN_LENGTH 40 /* Minimum valid length for ++ Neighbor Advertisement */ ++ ++/* ICMPV6 Header */ ++struct icmpv6_hdr { ++ u8_t icmpv6_type; /* type field */ ++ u8_t icmpv6_code; /* code field */ ++ u16_t icmpv6_cksum; /* checksum field */ ++ union { ++ u32_t icmpv6_un_data32[1]; /* type-specific field */ ++ u16_t icmpv6_un_data16[2]; /* type-specific field */ ++ u8_t icmpv6_un_data8[4]; /* type-specific field */ ++ } data; ++}; ++ ++#define icmpv6_data data.icmpv6_un_data32[0] ++ ++struct icmpv6_opt_hdr { ++ u8_t type; ++ u8_t len; ++}; ++ ++struct icmpv6_opt_link_addr { ++ struct icmpv6_opt_hdr hdr; ++ u8_t link_addr[6]; ++}; ++ ++struct icmpv6_opt_prefix { ++ struct icmpv6_opt_hdr hdr; ++ u8_t prefix_len; ++ u8_t flags; ++#define ICMPV6_OPT_PREFIX_FLAG_ON_LINK (1 << 7) ++#define ICMPV6_OPT_PREFIX_FLAG_BIT_A (1 << 6) ++ u32_t valid_lifetime; ++ u32_t preferred_lifetime; ++ u32_t reserved; ++ struct ipv6_addr prefix; ++}; ++ ++/* Neighbor Solicitation */ ++struct icmpv6_nd_solicit { ++ struct icmpv6_hdr nd_ns_hdr; ++}; ++ ++/* Router Advertisement */ ++struct icmpv6_router_advert { ++ struct icmpv6_hdr header; ++ u32_t reachable_time; ++ u32_t retransmit_timer; ++}; ++ ++#define nd_ra_type header.icmpv6_type ++#define nd_ra_code header.icmpv6_code ++#define nd_ra_cksum header.icmpv6_cksum ++#define nd_ra_curhoplimit header.data.icmpv6_un_data8[0] ++#define nd_ra_flags_reserved header.data.icmpv6_un_data8[1] ++#define nd_ra_router_lifetime header.data.icmpv6_un_data16[1] ++ ++#endif /* __ICMPV6_H__ */ +diff --git a/iscsiuio/src/uip/ipv6.c b/iscsiuio/src/uip/ipv6.c +new file mode 100644 +index 0000000..5c627ac +--- /dev/null ++++ b/iscsiuio/src/uip/ipv6.c +@@ -0,0 +1,1297 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai (eddie.wai@broadcom.com) ++ * Based on Kevin Tran's iSCSI boot code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * ipv6.c - This file contains simplifed IPv6 processing code. ++ * ++ */ ++#include ++#include ++#include ++#include "logger.h" ++#include "uip.h" ++#include "ipv6.h" ++#include "ipv6_pkt.h" ++#include "icmpv6.h" ++#include "uipopt.h" ++#include "dhcpv6.h" ++ ++inline int best_match_bufcmp(u8_t *a, u8_t *b, int len) ++{ ++ int i; ++ ++ for (i = 0; i < len; i++) { ++ if (a[i] != b[i]) ++ break; ++ } ++ return i; ++} ++ ++/* Local function prototypes */ ++static int ipv6_is_it_our_address(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr); ++static void ipv6_insert_protocol_chksum(struct ipv6_hdr *ipv6); ++static void ipv6_update_arp_table(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr, ++ struct mac_address *mac_addr); ++static void ipv6_icmp_init_link_option(struct ipv6_context *context, ++ struct icmpv6_opt_link_addr *link_opt, ++ u8_t type); ++static void ipv6_icmp_rx(struct ipv6_context *context); ++static void ipv6_icmp_handle_nd_adv(struct ipv6_context *context); ++static void ipv6_icmp_handle_nd_sol(struct ipv6_context *context); ++static void ipv6_icmp_handle_echo_request(struct ipv6_context *context); ++static void ipv6_icmp_handle_router_adv(struct ipv6_context *context); ++static void ipv6_icmp_process_prefix(struct ipv6_context *context, ++ struct icmpv6_opt_prefix *icmp_prefix); ++static void ipv6_udp_rx(struct ipv6_context *context); ++ ++int iscsiL2Send(struct ipv6_context *context, int pkt_len) ++{ ++ LOG_DEBUG("IPv6: iscsiL2Send"); ++ uip_send(context->ustack, ++ (void *)context->ustack->data_link_layer, pkt_len); ++ ++ return pkt_len; ++} ++ ++int iscsiL2AddMcAddr(struct ipv6_context *context, ++ struct mac_address *new_mc_addr) ++{ ++ int i; ++ struct mac_address *mc_addr; ++ const struct mac_address all_zeroes_mc = { { { 0, 0, 0, 0, 0, 0 } } }; ++ ++ mc_addr = context->mc_addr; ++ for (i = 0; i < MAX_MCADDR_TABLE; i++, mc_addr++) ++ if (!memcmp((char *)mc_addr, ++ (char *)new_mc_addr, sizeof(struct mac_address))) ++ return TRUE; /* Already in the mc table */ ++ ++ mc_addr = context->mc_addr; ++ for (i = 0; i < MAX_MCADDR_TABLE; i++, mc_addr++) { ++ if (!memcmp((char *)mc_addr, ++ (char *)&all_zeroes_mc, sizeof(struct mac_address))) { ++ memcpy((char *)mc_addr, ++ (char *)new_mc_addr, sizeof(struct mac_address)); ++ LOG_DEBUG("IPv6: mc_addr added " ++ "%02x:%02x:%02x:%02x:%02x:%02x", ++ *(u8_t *)new_mc_addr, ++ *((u8_t *)new_mc_addr + 1), ++ *((u8_t *)new_mc_addr + 2), ++ *((u8_t *)new_mc_addr + 3), ++ *((u8_t *)new_mc_addr + 4), ++ *((u8_t *)new_mc_addr + 5)); ++ return TRUE; ++ } ++ } ++ return FALSE; ++} ++ ++int iscsiL2IsOurMcAddr(struct ipv6_context *context, ++ struct mac_address *dest_mac) ++{ ++ int i; ++ struct mac_address *mc_addr; ++ ++ mc_addr = context->mc_addr; ++ for (i = 0; i < MAX_MCADDR_TABLE; i++, mc_addr++) ++ if (!memcmp((char *)mc_addr, ++ (char *)dest_mac->addr, sizeof(struct mac_address))) ++ return TRUE; ++ return FALSE; ++} ++ ++void ipv6_init(struct ndpc_state *ndp, int cfg) ++{ ++ int i; ++ struct ipv6_context *context = (struct ipv6_context *)ndp->ipv6_context; ++ struct mac_address *mac_addr = (struct mac_address *)ndp->mac_addr; ++ struct ipv6_arp_entry *ipv6_arp_table; ++ struct ipv6_prefix_entry *ipv6_prefix_table; ++ struct mac_address mc_addr; ++ ++ if (context == NULL) { ++ LOG_ERR("IPV6: INIT ipv6_context is NULL"); ++ return; ++ } ++ ++ memset((char *)context, 0, sizeof(struct ipv6_context)); ++ ++ /* Associate the nic_iface's ustack to this ipv6_context */ ++ context->ustack = ndp->ustack; ++ ++ ipv6_arp_table = &context->ipv6_arp_table[0]; ++ ipv6_prefix_table = &context->ipv6_prefix_table[0]; ++ ++ memset((char *)ipv6_arp_table, 0, sizeof(*ipv6_arp_table)); ++ memset((char *)ipv6_prefix_table, 0, sizeof(*ipv6_prefix_table)); ++ memcpy((char *)&context->mac_addr, ++ (char *)mac_addr, sizeof(struct mac_address)); ++ /* ++ * Per RFC 2373. ++ * There are two types of local-use unicast addresses defined. These ++ * are Link-Local and Site-Local. The Link-Local is for use on a single ++ * link and the Site-Local is for use in a single site. Link-Local ++ * addresses have the following format: ++ * ++ * | 10 | ++ * | bits | 54 bits | 64 bits | ++ * +----------+-------------------------+----------------------------+ ++ * |1111111010| 0 | interface ID | ++ * +----------+-------------------------+----------------------------+ ++ */ ++ if (context->ustack->linklocal_autocfg != IPV6_LL_AUTOCFG_OFF) { ++ context->link_local_addr.addr8[0] = 0xfe; ++ context->link_local_addr.addr8[1] = 0x80; ++ /* Bit 1 is 1 to indicate universal scope. */ ++ context->link_local_addr.addr8[8] = mac_addr->addr[0] | 0x2; ++ context->link_local_addr.addr8[9] = mac_addr->addr[1]; ++ context->link_local_addr.addr8[10] = mac_addr->addr[2]; ++ context->link_local_addr.addr8[11] = 0xff; ++ context->link_local_addr.addr8[12] = 0xfe; ++ context->link_local_addr.addr8[13] = mac_addr->addr[3]; ++ context->link_local_addr.addr8[14] = mac_addr->addr[4]; ++ context->link_local_addr.addr8[15] = mac_addr->addr[5]; ++ ++ context->link_local_multi.addr8[0] = 0xff; ++ context->link_local_multi.addr8[1] = 0x02; ++ context->link_local_multi.addr8[11] = 0x01; ++ context->link_local_multi.addr8[12] = 0xff; ++ context->link_local_multi.addr8[13] |= ++ context->link_local_addr.addr8[13]; ++ context->link_local_multi.addr16[7] = ++ context->link_local_addr.addr16[7]; ++ ++ /* Default Prefix length is 64 */ ++ /* Add Link local address to the head of the ipv6 address ++ list */ ++ ipv6_add_prefix_entry(context, ++ &context->link_local_addr, 64); ++ } ++ /* ++ * Convert Multicast IP address to Multicast MAC adress per ++ * RFC 2464: Transmission of IPv6 Packets over Ethernet Networks ++ * ++ * An IPv6 packet with a multicast destination address DST, consisting ++ * of the sixteen octets DST[1] through DST[16], is transmitted to the ++ * Ethernet multicast address whose first two octets are the value 3333 ++ * hexadecimal and whose last four octets are the last four octets of ++ * DST. ++ * ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * |0 0 1 1 0 0 1 1|0 0 1 1 0 0 1 1| ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | DST[13] | DST[14] | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | DST[15] | DST[16] | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * ++ * IPv6 requires the following Multicast IP addresses setup per node. ++ */ ++ for (i = 0; i < 3; i++) { ++ mc_addr.addr[0] = 0x33; ++ mc_addr.addr[1] = 0x33; ++ mc_addr.addr[2] = 0x0; ++ mc_addr.addr[3] = 0x0; ++ mc_addr.addr[4] = 0x0; ++ ++ switch (i) { ++ case 0: ++ /* All Nodes Multicast IPv6 address : ff02::1 */ ++ mc_addr.addr[5] = 0x1; ++ break; ++ ++ case 1: ++ /* All Host Multicast IPv6 address : ff02::3 */ ++ mc_addr.addr[5] = 0x3; ++ break; ++ ++ case 2: ++ /* Solicited Node Multicast Address: ff02::01:ffxx:yyzz ++ */ ++ mc_addr.addr[2] = 0xff; ++ mc_addr.addr[3] = mac_addr->addr[3]; ++ mc_addr.addr[4] = mac_addr->addr[4]; ++ mc_addr.addr[5] = mac_addr->addr[5]; ++ break; ++ ++ default: ++ break; ++ } ++ iscsiL2AddMcAddr(context, &mc_addr); ++ } ++ ++ /* Default HOP number */ ++ context->hop_limit = IPV6_HOP_LIMIT; ++} ++ ++int ipv6_add_prefix_entry(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr, u8_t prefix_len) ++{ ++ int i; ++ struct ipv6_prefix_entry *prefix_entry; ++ struct ipv6_prefix_entry *ipv6_prefix_table = ++ context->ipv6_prefix_table; ++ char addr_str[INET6_ADDRSTRLEN]; ++ ++ /* Check if there is an valid entry already. */ ++ for (i = 0; i < IPV6_NUM_OF_ADDRESS_ENTRY; i++) { ++ prefix_entry = &ipv6_prefix_table[i]; ++ ++ if (prefix_entry->prefix_len != 0) { ++ if (memcmp((char *)&prefix_entry->ip_addr, ++ (char *)ip_addr, ++ sizeof(struct ipv6_addr)) == 0) { ++ /* We already initialize on this interface. ++ There is nothing to do */ ++ return 0; ++ } ++ } ++ } ++ ++ /* Find an unused entry */ ++ for (i = 0; i < IPV6_NUM_OF_ADDRESS_ENTRY; i++) { ++ prefix_entry = &ipv6_prefix_table[i]; ++ ++ if (prefix_entry->prefix_len == 0) ++ break; ++ } ++ ++ if (prefix_entry->prefix_len != 0) ++ return -1; ++ ++ prefix_entry->prefix_len = prefix_len / 8; ++ ++ memcpy((char *)&prefix_entry->ip_addr, ++ (char *)ip_addr, sizeof(struct ipv6_addr)); ++ ++ inet_ntop(AF_INET6, &prefix_entry->ip_addr.addr8, addr_str, ++ sizeof(addr_str)); ++ ++ LOG_DEBUG("IPv6: add prefix IP addr %s", addr_str); ++ ++ /* Put it on the list on head of the list. */ ++ if (context->addr_list != NULL) ++ prefix_entry->next = context->addr_list; ++ else ++ prefix_entry->next = NULL; ++ ++ context->addr_list = prefix_entry; ++ ++ return 0; ++} ++ ++void ipv6_rx_packet(struct ipv6_context *context, u16_t len) ++{ ++ struct ipv6_hdr *ipv6; ++ u16_t protocol; ++ ++ if (!context->ustack) { ++ LOG_WARN("ipv6 rx pkt ipv6_context = %p ustack = %p", context, ++ context->ustack); ++ return; ++ } ++ ipv6 = (struct ipv6_hdr *)context->ustack->network_layer; ++ /* Make sure it's an IPv6 packet */ ++ if ((ipv6->ipv6_version_fc & 0xf0) != IPV6_VERSION) { ++ /* It's not an IPv6 packet. Drop it. */ ++ LOG_WARN("IPv6 version 0x%x not IPv6", ipv6->ipv6_version_fc); ++ return; ++ } ++ protocol = ipv6_process_rx(ipv6); ++ ++ switch (protocol) { ++ case IPPROTO_ICMPV6: ++ ipv6_icmp_rx(context); ++ break; ++ ++ case IPPROTO_UDP: ++ /* Indicate to UDP processing code */ ++ ipv6_udp_rx(context); ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++void ipv6_mc_init_dest_mac(struct eth_hdr *eth, struct ipv6_hdr *ipv6) ++{ ++ int i; ++ /* ++ * Initialize address mapping of IPV6 Multicast to multicast MAC ++ * address per RFC 2464. ++ * ++ * An IPv6 packet with a multicast destination address DST, consisting ++ * of the sixteen octets DST[1] through DST[16], is transmitted to the ++ * Ethernet multicast address whose first two octets are the value 3333 ++ * hexadecimal and whose last four octets are the last four octets of ++ * DST. ++ * ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * |0 0 1 1 0 0 1 1|0 0 1 1 0 0 1 1| ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | DST[13] | DST[14] | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | DST[15] | DST[16] | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ */ ++ eth->dest_mac.addr[0] = 0x33; ++ eth->dest_mac.addr[1] = 0x33; ++ for (i = 0; i < 4; i++) ++ eth->dest_mac.addr[2 + i] = ipv6->ipv6_dst.addr8[12 + i]; ++} ++ ++int ipv6_autoconfig(struct ipv6_context *context) ++{ ++ return ipv6_discover_address(context); ++} ++ ++int ipv6_discover_address(struct ipv6_context *context) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ int rc = 0; ++ ++ /* Retrieve tx buffer */ ++ if (eth == NULL || ipv6 == NULL) ++ return -EAGAIN; ++ ++ /* Setup IPv6 All Routers Multicast address : ff02::2 */ ++ memset((char *)&ipv6->ipv6_dst, 0, sizeof(struct ipv6_addr)); ++ ipv6->ipv6_dst.addr8[0] = 0xff; ++ ipv6->ipv6_dst.addr8[1] = 0x02; ++ ipv6->ipv6_dst.addr8[15] = 0x02; ++ ipv6->ipv6_hop_limit = 255; ++ ++ /* Initialize MAC header based on destination MAC address */ ++ ipv6_mc_init_dest_mac(eth, ipv6); ++ ipv6->ipv6_nxt_hdr = IPPROTO_ICMPV6; ++ ++ icmp->icmpv6_type = ICMPV6_RTR_SOL; ++ icmp->icmpv6_code = 0; ++ icmp->icmpv6_data = 0; ++ icmp->icmpv6_cksum = 0; ++ ipv6_icmp_init_link_option(context, ++ (struct icmpv6_opt_link_addr *)((u8_t *)icmp ++ + sizeof(struct icmpv6_hdr)), ++ IPV6_ICMP_OPTION_SRC_ADDR); ++ ipv6->ipv6_plen = HOST_TO_NET16((sizeof(struct icmpv6_hdr) + ++ sizeof(struct icmpv6_opt_link_addr))); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&context->link_local_addr, ++ sizeof(struct ipv6_addr)); ++ ++ icmp->icmpv6_cksum = 0; ++ LOG_DEBUG("IPv6: Send rtr sol"); ++ ipv6_send(context, (u8_t *) icmp - (u8_t *) eth + ++ sizeof(struct icmpv6_hdr) + ++ sizeof(struct icmpv6_opt_link_addr)); ++ return rc; ++} ++ ++u16_t ipv6_process_rx(struct ipv6_hdr *ipv6) ++{ ++ return ipv6->ipv6_nxt_hdr; ++} ++ ++int ipv6_send(struct ipv6_context *context, u16_t packet_len) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ ++ ipv6_setup_hdrs(context, eth, ipv6, packet_len); ++ ++ return iscsiL2Send(context, packet_len); ++} ++ ++void ipv6_send_udp_packet(struct ipv6_context *context, u16_t packet_len) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct udp_hdr *udp = (struct udp_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ ++ ipv6->ipv6_nxt_hdr = IPPROTO_UDP; ++ ipv6->ipv6_plen = ++ HOST_TO_NET16(packet_len - ((u8_t *)udp - (u8_t *)eth)); ++ ++ udp->chksum = 0; ++ ++ /* ++ * We only use UDP packet for DHCPv6. The source address is always ++ * link-local address. ++ */ ++ ipv6->ipv6_src.addr[0] = 0; ++ ++ /* Hop limit is always 1 for DHCPv6 packet. */ ++ ipv6->ipv6_hop_limit = 1; ++ ++ ipv6_send(context, packet_len); ++} ++ ++void ipv6_setup_hdrs(struct ipv6_context *context, struct eth_hdr *eth, ++ struct ipv6_hdr *ipv6, u16_t packet_len) ++{ ++ struct ipv6_addr *our_address; ++ ++ /* VLAN will be taken cared of in the nic layer */ ++ eth->len_type = HOST_TO_NET16(LAYER2_TYPE_IPV6); ++ memcpy((char *)ð->src_mac, ++ (char *)&context->mac_addr, sizeof(struct mac_address)); ++ ++ /* Put the traffic class into the packet. */ ++ memset(&ipv6->ipv6_version_fc, 0, sizeof(u32_t)); ++ ipv6->ipv6_version_fc = IPV6_VERSION; ++ if (ipv6->ipv6_hop_limit == 0) ++ ipv6->ipv6_hop_limit = context->hop_limit; ++ ++ if (ipv6->ipv6_src.addr[0] == 0) { ++ /* Need to initialize source IP address. */ ++ our_address = ipv6_our_address(context); ++ if (our_address != NULL) { ++ /* Assume that caller has filled in the destination ++ IP address */ ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)our_address, sizeof(struct ipv6_addr)); ++ } ++ } ++ ++ ipv6_insert_protocol_chksum(ipv6); ++} ++ ++static void ipv6_insert_protocol_chksum(struct ipv6_hdr *ipv6) ++{ ++ u32_t sum; ++ u16_t *ptr; ++ u16_t *protocol_data_ptr; ++ int i; ++ u16_t protocol_data_len; ++ u16_t checksum; ++ ++ /* ++ * This routine assumes that there is no extension header. This driver ++ * doesn't user extension header to keep driver small and simple. ++ * ++ * Pseudo check consists of the following: ++ * SRC IP, DST IP, Protocol Data Length, and Next Header. ++ */ ++ sum = 0; ++ ptr = (u16_t *)&ipv6->ipv6_src; ++ ++ for (i = 0; i < sizeof(struct ipv6_addr); i++) { ++ sum += HOST_TO_NET16(*ptr); ++ ptr++; ++ } ++ ++ /* Keep track where the layer header is */ ++ protocol_data_ptr = ptr; ++ ++ protocol_data_len = HOST_TO_NET16(ipv6->ipv6_plen); ++ sum += protocol_data_len; ++ sum += ipv6->ipv6_nxt_hdr; ++ /* Sum now contains sum of IPv6 pseudo header. Let's add the data ++ streams. */ ++ if (protocol_data_len & 1) { ++ /* Length of data is odd */ ++ *((u8_t *) ptr + protocol_data_len) = 0; ++ protocol_data_len++; ++ } ++ ++ for (i = 0; i < protocol_data_len / 2; i++) { ++ sum += HOST_TO_NET16(*ptr); ++ ptr++; ++ } ++ ++ sum = (sum >> 16) + (sum & 0xffff); ++ sum += (sum >> 16); ++ sum &= 0xffff; ++ checksum = (u16_t) (~sum); ++ checksum = HOST_TO_NET16(checksum); ++ ++ switch (ipv6->ipv6_nxt_hdr) { ++ case IPPROTO_ICMPV6: ++ /* Insert correct ICMPv6 checksum */ ++ ((struct icmpv6_hdr *)(protocol_data_ptr))->icmpv6_cksum = ++ checksum; ++ break; ++ case IPPROTO_UDP: ++ /* Insert correct UDP checksum */ ++ ((struct udp_hdr *)protocol_data_ptr)->chksum = checksum; ++ break; ++ default: ++ break; ++ } ++} ++ ++int ipv6_is_it_our_link_local_address(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr) ++{ ++ u8_t *test_addr = (u8_t *) ip_addr->addr8; ++ u8_t test_remainder; ++ ++ if (test_addr[0] != context->link_local_addr.addr8[0]) ++ return FALSE; ++ ++ test_remainder = (test_addr[1] & 0xC0) >> 6; ++ if (test_remainder != 2) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++static int ipv6_is_it_our_address(struct ipv6_context *context, ++ struct ipv6_addr *ipv6_addr) ++{ ++ struct ipv6_prefix_entry *ipv6_prefix; ++ ++ for (ipv6_prefix = context->addr_list; ipv6_prefix != NULL; ++ ipv6_prefix = ipv6_prefix->next) { ++ if (IPV6_ARE_ADDR_EQUAL(&ipv6_prefix->ip_addr, ipv6_addr)) ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++struct ipv6_addr *ipv6_our_address(struct ipv6_context *context) ++{ ++ return &context->link_local_addr; ++} ++ ++int ipv6_ip_in_arp_table(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr, ++ struct mac_address *mac_addr) ++{ ++ struct ipv6_arp_entry *arp_entry; ++ int i; ++ ++ for (i = 0; i < UIP_ARPTAB_SIZE; i++) { ++ arp_entry = &context->ipv6_arp_table[i]; ++ ++ if (IPV6_ARE_ADDR_EQUAL(&arp_entry->ip_addr, ip_addr)) { ++ memcpy((char *)mac_addr, &arp_entry->mac_addr, ++ sizeof(struct mac_address)); ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++struct ipv6_addr *ipv6_find_longest_match(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr) ++{ ++ struct ipv6_prefix_entry *ipv6_prefix; ++ struct ipv6_prefix_entry *best_match = NULL; ++ int longest_len = -1; ++ int len; ++ ++ for (ipv6_prefix = context->addr_list; ipv6_prefix != NULL; ++ ipv6_prefix = ipv6_prefix->next) { ++ if (!IPV6_IS_ADDR_LINKLOCAL(&ipv6_prefix->ip_addr)) { ++ len = best_match_bufcmp((u8_t *)&ipv6_prefix->ip_addr, ++ (u8_t *)ip_addr, ++ sizeof(struct ipv6_addr)); ++ if (len > longest_len) { ++ best_match = ipv6_prefix; ++ longest_len = len; ++ } ++ } ++ } ++ ++ if (best_match) ++ return &best_match->ip_addr; ++ ++ return NULL; ++} ++ ++void ipv6_arp_out(struct ipv6_context *context, int *uip_len) ++{ ++ /* Empty routine */ ++} ++ ++ ++static void ipv6_update_arp_table(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr, ++ struct mac_address *mac_addr) ++{ ++ struct ipv6_arp_entry *arp_entry; ++ int i; ++ struct ipv6_arp_entry *ipv6_arp_table = context->ipv6_arp_table; ++ ++ LOG_DEBUG("IPv6: Neighbor update"); ++ /* ++ * Walk through the ARP mapping table and try to find an entry to ++ * update. If none is found, the IP -> MAC address mapping is ++ * inserted in the ARP table. ++ */ ++ for (i = 0; i < UIP_ARPTAB_SIZE; i++) { ++ arp_entry = &ipv6_arp_table[i]; ++ ++ /* Only check those entries that are actually in use. */ ++ if (arp_entry->ip_addr.addr[0] != 0) { ++ /* ++ * Check if the source IP address of the incoming ++ * packet matches the IP address in this ARP table ++ * entry. ++ */ ++ if (IPV6_ARE_ADDR_EQUAL(&arp_entry->ip_addr, ip_addr)) { ++ /* An old entry found, update this and return */ ++ memcpy((char *)&arp_entry->mac_addr, ++ (char *)mac_addr, ++ sizeof(struct mac_address)); ++ arp_entry->time = context->arptime; ++ return; ++ } ++ } ++ } ++ ++ /* ++ * If we get here, no existing ARP table entry was found, so we ++ * create one. ++ * ++ * First, we try to find an unused entry in the ARP table. ++ */ ++ for (i = 0; i < UIP_ARPTAB_SIZE; i++) { ++ arp_entry = &ipv6_arp_table[i]; ++ ++ if (arp_entry->ip_addr.addr[0] == 0) ++ break; ++ } ++ ++ if (i == UIP_ARPTAB_SIZE) ++ return; ++ ++ /* Index j is the entry that is least used */ ++ arp_entry = &ipv6_arp_table[i]; ++ memcpy((char *)&arp_entry->ip_addr, (char *)ip_addr, ++ sizeof(struct ipv6_addr)); ++ memcpy((char *)&arp_entry->mac_addr, ++ (char *)mac_addr, sizeof(struct mac_address)); ++ ++ arp_entry->time = context->arptime; ++} ++ ++/* DestIP is intact */ ++int ipv6_send_nd_solicited_packet(struct ipv6_context *context, ++ struct eth_hdr *eth, struct ipv6_hdr *ipv6) ++{ ++ struct icmpv6_hdr *icmp; ++ int pkt_len = 0; ++ struct ipv6_addr *longest_match_addr; ++ char addr_str[INET6_ADDRSTRLEN]; ++ ++ ipv6->ipv6_nxt_hdr = IPPROTO_ICMPV6; ++ ++ /* Depending on the IPv6 address of the target, we'll need to determine ++ whether we use the assigned IPv6 address/RA or the link local address ++ */ ++ /* Use Link-local as source address */ ++ if (ipv6_is_it_our_link_local_address(context, &ipv6->ipv6_dst) == ++ TRUE) { ++ LOG_DEBUG("IPv6: NS using link local"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&context->link_local_addr, ++ sizeof(struct ipv6_addr)); ++ } else { ++ longest_match_addr = ++ ipv6_find_longest_match(context, &ipv6->ipv6_dst); ++ if (longest_match_addr) { ++ LOG_DEBUG("IPv6: NS using longest match addr"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)longest_match_addr, ++ sizeof(struct ipv6_addr)); ++ } else { ++ LOG_DEBUG("IPv6: NS using link local instead"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&context->link_local_addr, ++ sizeof(struct ipv6_addr)); ++ } ++ } ++ icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + sizeof(struct ipv6_hdr)); ++ ++ inet_ntop(AF_INET6, &ipv6->ipv6_src.addr8, addr_str, sizeof(addr_str)); ++ LOG_DEBUG("IPv6: NS host IP addr: %s", addr_str); ++ /* ++ * Destination IP address to be resolved is after the ICMPv6 ++ * header. ++ */ ++ memcpy((char *)((u8_t *)icmp + sizeof(struct icmpv6_hdr)), ++ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)); ++ ++ /* ++ * Destination IP in the IPv6 header contains solicited-node multicast ++ * address corresponding to the target address. ++ * ++ * ff02::01:ffxx:yyzz. Where xyz are least ++ * significant of 24-bit MAC address. ++ */ ++ memset((char *)&ipv6->ipv6_dst, 0, sizeof(struct ipv6_addr) - 3); ++ ipv6->ipv6_dst.addr8[0] = 0xff; ++ ipv6->ipv6_dst.addr8[1] = 0x02; ++ ipv6->ipv6_dst.addr8[11] = 0x01; ++ ipv6->ipv6_dst.addr8[12] = 0xff; ++ ipv6_mc_init_dest_mac(eth, ipv6); ++ ipv6->ipv6_hop_limit = 255; ++ ++ icmp->icmpv6_type = ICMPV6_NEIGH_SOL; ++ icmp->icmpv6_code = 0; ++ icmp->icmpv6_data = 0; ++ icmp->icmpv6_cksum = 0; ++ ipv6_icmp_init_link_option(context, ++ (struct icmpv6_opt_link_addr *)((u8_t *)icmp ++ + sizeof(struct icmpv6_hdr) ++ + sizeof(struct ipv6_addr)), ++ IPV6_ICMP_OPTION_SRC_ADDR); ++ ipv6->ipv6_plen = HOST_TO_NET16((sizeof(struct icmpv6_hdr) + ++ sizeof(struct icmpv6_opt_link_addr) + ++ sizeof(struct ipv6_addr))); ++ /* Total packet size */ ++ pkt_len = (u8_t *) icmp - (u8_t *) eth + ++ sizeof(struct icmpv6_hdr) + ++ sizeof(struct icmpv6_opt_link_addr) + sizeof(struct ipv6_addr); ++ ipv6_setup_hdrs(context, eth, ipv6, pkt_len); ++ return pkt_len; ++} ++ ++static void ipv6_icmp_init_link_option(struct ipv6_context *context, ++ struct icmpv6_opt_link_addr *link_opt, ++ u8_t type) ++{ ++ link_opt->hdr.type = type; ++ link_opt->hdr.len = sizeof(struct icmpv6_opt_link_addr) / 8; ++ memcpy((char *)&link_opt->link_addr, ++ (char *)&context->mac_addr, sizeof(struct mac_address)); ++} ++ ++static void ipv6_icmp_rx(struct ipv6_context *context) ++{ ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ ++ switch (icmp->icmpv6_type) { ++ case ICMPV6_RTR_ADV: ++ ipv6_icmp_handle_router_adv(context); ++ break; ++ ++ case ICMPV6_NEIGH_SOL: ++ ipv6_icmp_handle_nd_sol(context); ++ break; ++ ++ case ICMPV6_NEIGH_ADV: ++ ipv6_icmp_handle_nd_adv(context); ++ break; ++ ++ case ICMPV6_ECHO_REQUEST: ++ /* Response with ICMP reply */ ++ ipv6_icmp_handle_echo_request(context); ++ break; ++ ++ default: ++ break; ++ } ++} ++ ++static void ipv6_icmp_handle_router_adv(struct ipv6_context *context) ++{ ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct icmpv6_router_advert *icmp = ++ (struct icmpv6_router_advert *)((u8_t *)ipv6 + sizeof(struct ipv6_hdr)); ++ struct icmpv6_opt_hdr *icmp_opt; ++ u16_t opt_len; ++ u16_t len; ++ char addr_str[INET6_ADDRSTRLEN]; ++ ++ if (context->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED) ++ return; ++ ++ opt_len = HOST_TO_NET16(ipv6->ipv6_plen) - ++ sizeof(struct icmpv6_router_advert); ++ ++ icmp_opt = (struct icmpv6_opt_hdr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_router_advert)); ++ len = 0; ++ while (len < opt_len) { ++ icmp_opt = (struct icmpv6_opt_hdr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_router_advert) + ++ len); ++ ++ switch (icmp_opt->type) { ++ case IPV6_ICMP_OPTION_PREFIX: ++ ipv6_icmp_process_prefix(context, ++ (struct icmpv6_opt_prefix *)icmp_opt); ++ context->flags |= IPV6_FLAGS_ROUTER_ADV_RECEIVED; ++ break; ++ ++ default: ++ break; ++ } ++ ++ len += icmp_opt->len * 8; ++ } ++ ++ if (context->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED) { ++ LOG_DEBUG("IPv6: RTR ADV nd_ra_flags = 0x%x", ++ icmp->nd_ra_flags_reserved); ++ if (icmp->nd_ra_curhoplimit > 0) ++ context->hop_limit = icmp->nd_ra_curhoplimit; ++ ++ if (icmp->nd_ra_flags_reserved & IPV6_RA_MANAGED_FLAG) ++ context->flags |= IPV6_FLAGS_MANAGED_ADDR_CONFIG; ++ ++ if (icmp->nd_ra_flags_reserved & IPV6_RA_CONFIG_FLAG) ++ context->flags |= IPV6_FLAGS_OTHER_STATEFUL_CONFIG; ++ ++ if (icmp->nd_ra_router_lifetime != 0) { ++ /* There is a default router. */ ++ if (context->ustack->router_autocfg != ++ IPV6_RTR_AUTOCFG_OFF) ++ memcpy( ++ (char *)&context->default_router, ++ (char *)&ipv6->ipv6_src, ++ sizeof(struct ipv6_addr)); ++ inet_ntop(AF_INET6, &context->default_router, ++ addr_str, sizeof(addr_str)); ++ LOG_DEBUG("IPv6: Got default router IP addr: %s", ++ addr_str); ++ } ++ } ++} ++ ++static void ipv6_icmp_process_prefix(struct ipv6_context *context, ++ struct icmpv6_opt_prefix *icmp_prefix) ++{ ++ struct ipv6_addr addr; ++ char addr_str[INET6_ADDRSTRLEN]; ++ ++ /* we only process on-link address info */ ++ if (!(icmp_prefix->flags & ICMPV6_OPT_PREFIX_FLAG_ON_LINK)) ++ return; ++ ++ /* ++ * We only process prefix length of 64 since our Identifier is 64-bit ++ */ ++ if (icmp_prefix->prefix_len == 64) { ++ /* Copy 64-bit from the local-link address to create ++ IPv6 address */ ++ memcpy((char *)&addr, ++ (char *)&icmp_prefix->prefix, 8); ++ memcpy((char *)&addr.addr8[8], ++ &context->link_local_addr.addr8[8], 8); ++ inet_ntop(AF_INET6, &addr, addr_str, sizeof(addr_str)); ++ LOG_DEBUG("IPv6: Got RA ICMP option IP addr: %s", addr_str); ++ ipv6_add_prefix_entry(context, &addr, 64); ++ } ++} ++ ++static void ipv6_icmp_handle_nd_adv(struct ipv6_context *context) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ struct icmpv6_opt_link_addr *link_opt = ++ (struct icmpv6_opt_link_addr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_hdr) + sizeof(struct ipv6_addr)); ++ struct ipv6_addr *tar_addr6; ++ char addr_str[INET6_ADDRSTRLEN]; ++ ++ /* Added the multicast check for ARP table update */ ++ /* Should we qualify for only our host's multicast and our ++ link_local_multicast?? */ ++ LOG_DEBUG("IPv6: Handle nd adv"); ++ if ((ipv6_is_it_our_address(context, &ipv6->ipv6_dst) == TRUE) || ++ (memcmp((char *)&context->link_local_multi, ++ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)) == 0) || ++ (memcmp((char *)&context->multi, ++ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)) == 0)) { ++ /* ++ * This is an ARP reply for our addresses. Let's update the ++ * ARP table. ++ */ ++ ipv6_update_arp_table(context, &ipv6->ipv6_src, ++ ð->src_mac); ++ ++ /* Now check for the target address option and update that as ++ well */ ++ if (link_opt->hdr.type == IPV6_ICMP_OPTION_TAR_ADDR) { ++ tar_addr6 = (struct ipv6_addr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_hdr)); ++ LOG_DEBUG("IPV6: Target MAC " ++ "%02x:%02x:%02x:%02x:%02x:%02x", ++ link_opt->link_addr[0], link_opt->link_addr[1], ++ link_opt->link_addr[2], link_opt->link_addr[3], ++ link_opt->link_addr[4], link_opt->link_addr[5]); ++ inet_ntop(AF_INET6, &tar_addr6->addr8, addr_str, ++ sizeof(addr_str)); ++ LOG_DEBUG("IPv6: Target IP addr %s", addr_str); ++ ipv6_update_arp_table(context, tar_addr6, ++ (struct mac_address *)link_opt->link_addr); ++ } ++ ++ } ++} ++ ++static void ipv6_icmp_handle_nd_sol(struct ipv6_context *context) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ struct icmpv6_opt_link_addr *link_opt = ++ (struct icmpv6_opt_link_addr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_hdr) + sizeof(struct ipv6_addr)); ++ int icmpv6_opt_len = 0; ++ struct ipv6_addr tmp; ++ struct ipv6_addr *longest_match_addr, *tar_addr6; ++ ++ LOG_DEBUG("IPv6: Handle nd sol"); ++ ++ if ((memcmp((char *)&context->mac_addr, ++ (char *)ð->dest_mac, sizeof(struct mac_address)) != 0) && ++ (iscsiL2IsOurMcAddr(context, (struct mac_address *)ð->dest_mac) ++ == FALSE)) { ++ /* This packet is not for us to handle */ ++ LOG_DEBUG("IPv6: MAC not addressed to us " ++ "%02x:%02x:%02x:%02x:%02x:%02x", ++ eth->dest_mac.addr[0], eth->dest_mac.addr[1], ++ eth->dest_mac.addr[2], eth->dest_mac.addr[3], ++ eth->dest_mac.addr[4], eth->dest_mac.addr[5]); ++ return; ++ } ++ ++ /* Also check for the icmpv6_data before generating the reply */ ++ if (ipv6_is_it_our_address(context, ++ (struct ipv6_addr *) ((u8_t *) icmp + ++ sizeof(struct icmpv6_hdr))) ++ == FALSE) { ++ /* This packet is not for us to handle */ ++ LOG_DEBUG("IPv6: IP not addressed to us"); ++ return; ++ } ++ ++ /* Copy source MAC to Destination MAC */ ++ memcpy((char *)ð->dest_mac, ++ (char *)ð->src_mac, sizeof(struct mac_address)); ++ ++ /* Dest IP contains source IP */ ++ memcpy((char *)&tmp, ++ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)); ++ memcpy((char *)&ipv6->ipv6_dst, ++ (char *)&ipv6->ipv6_src, sizeof(struct ipv6_addr)); ++ ++ /* Examine the Neighbor Solicitation ICMPv6 target address field. ++ If target address exist, use that to find best match src address ++ for the reply */ ++ if (link_opt->hdr.type == IPV6_ICMP_OPTION_SRC_ADDR) { ++ tar_addr6 = (struct ipv6_addr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_hdr)); ++ if (ipv6_is_it_our_link_local_address(context, tar_addr6) ++ == TRUE) { ++ LOG_DEBUG("IPv6: NA using link local"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&context->link_local_addr, ++ sizeof(struct ipv6_addr)); ++ } else { ++ longest_match_addr = ++ ipv6_find_longest_match(context, tar_addr6); ++ if (longest_match_addr) { ++ LOG_DEBUG("IPv6: NA using longest match addr"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)longest_match_addr, ++ sizeof(struct ipv6_addr)); ++ } else { ++ LOG_DEBUG("IPv6: NA using link local instead"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&context->link_local_addr, ++ sizeof(struct ipv6_addr)); ++ } ++ } ++ } else { ++ /* No target link address, just use whatever it sent to us */ ++ LOG_DEBUG("IPv6: NA use dst addr"); ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&tmp, ++ sizeof(struct ipv6_addr)); ++ } ++ ipv6->ipv6_hop_limit = 255; ++ icmp->icmpv6_type = ICMPV6_NEIGH_ADV; ++ icmp->icmpv6_code = 0; ++ icmp->icmpv6_data = 0; ++ icmp->icmpv6_cksum = 0; ++ icmp->data.icmpv6_un_data8[0] = ++ IPV6_NA_FLAG_SOLICITED | IPV6_NA_FLAG_OVERRIDE; ++ memcpy((char *)((u8_t *)icmp + sizeof(struct icmpv6_hdr)), ++ (char *)&ipv6->ipv6_src, ++ sizeof(struct ipv6_addr)); ++ ++ /* Add the target link address option only for all solicitation */ ++ ipv6_icmp_init_link_option(context, ++ (struct icmpv6_opt_link_addr *)((u8_t *)icmp + ++ sizeof(struct icmpv6_hdr) + ++ sizeof(struct ipv6_addr)), ++ IPV6_ICMP_OPTION_TAR_ADDR); ++ icmpv6_opt_len = sizeof(struct icmpv6_opt_link_addr); ++ ipv6->ipv6_plen = HOST_TO_NET16((sizeof(struct icmpv6_hdr) + ++ icmpv6_opt_len + sizeof(struct ipv6_addr))); ++ LOG_DEBUG("IPv6: Send nd adv"); ++ ipv6_send(context, ++ (u8_t *) icmp - (u8_t *) eth + ++ sizeof(struct icmpv6_hdr) + ++ sizeof(struct icmpv6_opt_link_addr) + ++ sizeof(struct ipv6_addr)); ++ return; ++} ++ ++static void ipv6_icmp_handle_echo_request(struct ipv6_context *context) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ struct ipv6_addr temp; ++ ++ /* Copy source MAC to Destination MAC */ ++ memcpy((char *)ð->dest_mac, ++ (char *)ð->src_mac, sizeof(struct mac_address)); ++ ++ memcpy((char *)&temp, ++ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)); ++ ++ /* Dest IP contains source IP */ ++ memcpy((char *)&ipv6->ipv6_dst, ++ (char *)&ipv6->ipv6_src, sizeof(struct ipv6_addr)); ++ /* Use Link-local as source address */ ++ memcpy((char *)&ipv6->ipv6_src, ++ (char *)&temp, sizeof(struct ipv6_addr)); ++ ++ ipv6->ipv6_hop_limit = context->hop_limit; ++ icmp->icmpv6_type = ICMPV6_ECHO_REPLY; ++ icmp->icmpv6_code = 0; ++ icmp->icmpv6_cksum = 0; ++ LOG_DEBUG("IPv6: Send echo reply"); ++ ipv6_send(context, (u8_t *) icmp - (u8_t *) eth + ++ sizeof(struct ipv6_hdr) + HOST_TO_NET16(ipv6->ipv6_plen)); ++ return; ++} ++ ++void ipv6_set_ip_params(struct ipv6_context *context, ++ struct ipv6_addr *src_ip, u8_t prefix_len, ++ struct ipv6_addr *default_gateway, ++ struct ipv6_addr *linklocal) ++{ ++ if (!(IPV6_IS_ADDR_UNSPECIFIED(src_ip))) { ++ ipv6_add_prefix_entry(context, src_ip, prefix_len); ++ /* Create the multi_dest address */ ++ memset(&context->multi_dest, 0, sizeof(struct ipv6_addr)); ++ context->multi_dest.addr8[0] = 0xff; ++ context->multi_dest.addr8[1] = 0x02; ++ context->multi_dest.addr8[11] = 0x01; ++ context->multi_dest.addr8[12] = 0xff; ++ context->multi_dest.addr8[13] = src_ip->addr8[13]; ++ context->multi_dest.addr16[7] = src_ip->addr16[7]; ++ /* Create the multi address */ ++ memset(&context->multi, 0, sizeof(struct ipv6_addr)); ++ context->multi.addr8[0] = 0xfc; ++ context->multi.addr8[2] = 0x02; ++ context->multi.addr16[7] = src_ip->addr16[7]; ++ } ++ ++ if (!(IPV6_IS_ADDR_UNSPECIFIED(default_gateway))) { ++ /* Override the default gateway addr */ ++ memcpy((char *)&context->default_router, ++ (char *)default_gateway, sizeof(struct ipv6_addr)); ++ ipv6_add_prefix_entry(context, default_gateway, ++ prefix_len); ++ } ++ if (!(IPV6_IS_ADDR_UNSPECIFIED(linklocal))) { ++ /* Override the linklocal addr */ ++ memcpy((char *)&context->link_local_addr, ++ (char *)linklocal, sizeof(struct ipv6_addr)); ++ context->link_local_multi.addr8[0] = 0xff; ++ context->link_local_multi.addr8[1] = 0x02; ++ context->link_local_multi.addr8[11] = 0x01; ++ context->link_local_multi.addr8[12] = 0xff; ++ context->link_local_multi.addr8[13] |= ++ context->link_local_addr.addr8[13]; ++ context->link_local_multi.addr16[7] = ++ context->link_local_addr.addr16[7]; ++ ++ /* Default Prefix length is 64 */ ++ /* Add Link local address to the head of the ipv6 address ++ list */ ++ ipv6_add_prefix_entry(context, ++ &context->link_local_addr, 64); ++ } ++} ++ ++int ipv6_get_source_ip_addrs(struct ipv6_context *context, ++ struct ipv6_addr_entry *addr_list) ++{ ++ struct ipv6_prefix_entry *ipv6_prefix; ++ int i; ++ ++ for (i = 0, ipv6_prefix = context->addr_list; ipv6_prefix != NULL; ++ ipv6_prefix = ipv6_prefix->next) { ++ memcpy((char *)&addr_list->ip_addr, ++ (char *)&ipv6_prefix->ip_addr, ++ sizeof(struct ipv6_addr)); ++ addr_list->prefix_len = ipv6_prefix->prefix_len * 8; ++ ++ i++; ++ addr_list++; ++ } ++ ++ return i; ++} ++ ++int ipv6_get_default_router_ip_addrs(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr) ++{ ++ /* This is a default router. */ ++ memcpy((char *)ip_addr, ++ (char *)&context->default_router, ++ sizeof(struct ipv6_addr)); ++ ++ return 1; ++} ++ ++static void ipv6_udp_rx(struct ipv6_context *context) ++{ ++ struct eth_hdr *eth = ++ (struct eth_hdr *)context->ustack->data_link_layer; ++ struct ipv6_hdr *ipv6 = ++ (struct ipv6_hdr *)context->ustack->network_layer; ++ struct udp_hdr *udp = (struct udp_hdr *)((u8_t *)ipv6 + ++ sizeof(struct ipv6_hdr)); ++ struct dhcpv6_context *dhcpv6c; ++ ++ /* ++ * We only care about DHCPv6 packets from the DHCPv6 server. We drop ++ * all others. ++ */ ++ if (!(context->flags & IPV6_FLAGS_DISABLE_DHCPV6)) { ++ if ((udp->src_port == HOST_TO_NET16(DHCPV6_SERVER_PORT)) && ++ (udp->dest_port == HOST_TO_NET16(DHCPV6_CLIENT_PORT))) { ++ dhcpv6c = context->dhcpv6_context; ++ dhcpv6c->eth = eth; ++ dhcpv6c->ipv6 = ipv6; ++ dhcpv6c->udp = udp; ++ ipv6_udp_handle_dhcp(dhcpv6c); ++ } ++ } ++} ++ ++struct mac_address *ipv6_get_link_addr(struct ipv6_context *context) ++{ ++ return &context->mac_addr; ++} ++ ++u16_t ipv6_do_stateful_dhcpv6(struct ipv6_context *context, u32_t flags) ++{ ++ u16_t task = 0; ++ u16_t ra_flags; ++ ++ ra_flags = context->flags & ++ (IPV6_FLAGS_MANAGED_ADDR_CONFIG | IPV6_FLAGS_OTHER_STATEFUL_CONFIG); ++ ++ if (!(context->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED)) { ++ LOG_DEBUG("IPv6: There is no IPv6 router on the network"); ++ ra_flags |= ++ (IPV6_FLAGS_MANAGED_ADDR_CONFIG | ++ IPV6_FLAGS_OTHER_STATEFUL_CONFIG); ++ } ++ ++ if ((flags & ISCSI_FLAGS_DHCP_TCPIP_CONFIG) && ++ (ra_flags & IPV6_FLAGS_MANAGED_ADDR_CONFIG)) ++ task |= DHCPV6_TASK_GET_IP_ADDRESS; ++ ++ if ((flags & ISCSI_FLAGS_DHCP_ISCSI_CONFIG) && ++ (ra_flags & IPV6_FLAGS_OTHER_STATEFUL_CONFIG)) ++ task |= DHCPV6_TASK_GET_OTHER_PARAMS; ++ ++ LOG_DEBUG("IPv6: Stateful flags = 0x%x, ra_flags = 0x%x, task = 0x%x", ++ flags, ra_flags, task); ++ ++ return task; ++} ++ ++void ipv6_add_solit_node_address(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr) ++{ ++ struct mac_address mac_addr; ++ ++ /* ++ * Add Solicited Node Multicast Address for statically configured IPv6 ++ * address. ++ */ ++ mac_addr.addr[0] = 0x33; ++ mac_addr.addr[1] = 0x33; ++ mac_addr.addr[2] = 0xff; ++ mac_addr.addr[3] = ip_addr->addr8[13]; ++ mac_addr.addr[4] = ip_addr->addr8[14]; ++ mac_addr.addr[5] = ip_addr->addr8[15]; ++ iscsiL2AddMcAddr(context, (struct mac_address *)&mac_addr); ++} ++ ++void ipv6_cfg_link_local_addr(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr) ++{ ++ memcpy((char *)&context->link_local_addr, ++ (char *)ip_addr, sizeof(struct ipv6_addr)); ++} ++ ++void ipv6_disable_dhcpv6(struct ipv6_context *context) ++{ ++ context->flags |= IPV6_FLAGS_DISABLE_DHCPV6; ++} +diff --git a/iscsiuio/src/uip/ipv6.h b/iscsiuio/src/uip/ipv6.h +new file mode 100644 +index 0000000..bc63762 +--- /dev/null ++++ b/iscsiuio/src/uip/ipv6.h +@@ -0,0 +1,332 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai (eddie.wai@broadcom.com) ++ * Based on Kevin Tran's iSCSI boot code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * ipv6.h - This file contains macro definitions pertaining to IPv6. ++ * ++ * RFC 2460 : IPv6 Specification. ++ * RFC 2373 : IPv6 Addressing Architecture. ++ * RFC 2462 : IPv6 Stateless Address Autoconfiguration. ++ * RFC 2464 : Transmission of IPv6 Packets over Ethernet Networks. ++ * ++ */ ++#ifndef __IPV6_H__ ++#define __IPV6_H__ ++ ++#include "ipv6_ndpc.h" ++ ++#define FALSE 0 ++#define TRUE 1 ++ ++#define LINK_LOCAL_PREFIX_LENGTH 2 ++#define LAYER2_HEADER_LENGTH 14 ++#define LAYER2_VLAN_HEADER_LENGTH 16 ++#define LAYER2_TYPE_IPV6 0x86dd ++ ++struct ipv6_addr { ++ union { ++ u8_t addr8[16]; ++ u16_t addr16[8]; ++ u32_t addr[4]; ++ }; ++}; ++ ++struct udp_hdr { ++ u16_t src_port; ++ u16_t dest_port; ++ u16_t length; ++ u16_t chksum; ++}; ++ ++struct mac_address { ++ union { ++ u8_t addr[6]; ++ struct { ++ u16_t first_2_bytes; ++ u32_t last_4_bytes; ++ } __attribute__ ((packed)); ++ }; ++}; ++ ++#define HOST_TO_NET16(a) htons(a) ++#define HOST_TO_NET32(a) htonl(a) ++#define NET_TO_HOST16(a) ntohs(a) ++/* ++ * Local definition for masks ++ */ ++#define IPV6_MASK0 { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } ++#define IPV6_MASK32 { { { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } } ++#define IPV6_MASK64 { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } } ++#define IPV6_MASK96 { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ ++ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } } } ++#define IPV6_MASK128 { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } } } ++ ++#ifdef BIG_ENDIAN ++#define IPV6_ADDR_INT32_ONE 1 ++#define IPV6_ADDR_INT32_TWO 2 ++#define IPV6_ADDR_INT32_MNL 0xff010000 ++#define IPV6_ADDR_INT32_MLL 0xff020000 ++#define IPV6_ADDR_INT32_SMP 0x0000ffff ++#define IPV6_ADDR_INT16_ULL 0xfe80 ++#define IPV6_ADDR_INT16_USL 0xfec0 ++#define IPV6_ADDR_INT16_MLL 0xff02 ++#else /* LITTE ENDIAN */ ++#define IPV6_ADDR_INT32_ONE 0x01000000 ++#define IPV6_ADDR_INT32_TWO 0x02000000 ++#define IPV6_ADDR_INT32_MNL 0x000001ff ++#define IPV6_ADDR_INT32_MLL 0x000002ff ++#define IPV6_ADDR_INT32_SMP 0xffff0000 ++#define IPV6_ADDR_INT16_ULL 0x80fe ++#define IPV6_ADDR_INT16_USL 0xc0fe ++#define IPV6_ADDR_INT16_MLL 0x02ff ++#endif ++ ++/* ++ * Definition of some useful macros to handle IP6 addresses ++ */ ++#define IPV6_ADDR_ANY_INIT \ ++ { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } } ++#define IPV6_ADDR_LOOPBACK_INIT \ ++ { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } ++#define IPV6_ADDR_NODELOCAL_ALLNODES_INIT \ ++ { { { 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } ++#define IPV6_ADDR_INTFACELOCAL_ALLNODES_INIT \ ++ { { { 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } ++#define IPV6_ADDR_LINKLOCAL_ALLNODES_INIT \ ++ { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } ++#define IPV6_ADDR_LINKLOCAL_ALLROUTERS_INIT \ ++ { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } } } ++ ++#define IPV6_ARE_ADDR_EQUAL(a, b) \ ++ (memcmp((char *)a, (char *)b, sizeof(struct ipv6_addr)) == 0) ++ ++/* Unspecified IPv6 address */ ++#define IPV6_IS_ADDR_UNSPECIFIED(a) \ ++ ((((a)->addr[0]) == 0) && \ ++ (((a)->addr[1]) == 0) && \ ++ (((a)->addr[2]) == 0) && \ ++ (((a)->addr[3]) == 0)) ++ ++/* IPv6 Scope Values */ ++#define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 /* Node-local scope */ ++#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 /* Link-local scope */ ++#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 /* Site-local scope */ ++#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* Organization-local scope */ ++#define IPV6_ADDR_SCOPE_GLOBAL 0x0e /* Global scope */ ++ ++/* Link-local Unicast : 10-bits much be 1111111010b --> 0xfe80. */ ++#define IPV6_IS_ADDR_LINKLOCAL(a) \ ++ (((a)->addr8[0] == 0xfe) && (((a)->addr8[1] & 0xc0) == 0x80)) ++ ++/* Site-local Unicast : 10-bits much be 1111111011b --> 0xfec0. */ ++#define IPV6_IS_ADDR_SITELOCAL(a) \ ++ (((a)->addr8[0] == 0xfe) && (((a)->addr8[1] & 0xc0) == 0xc0)) ++ ++/* Multicast : 10bits much be 11111111b. Next 4 bits is flags | 4-bit scope */ ++#define IPV6_IS_ADDR_MULTICAST(a) ((a)->addr8[0] == 0xff) ++ ++#define IPV6_ADDR_MC_SCOPE(a) ((a)->addr8[1] & 0x0f) ++ ++/* Multicast Scope */ ++ ++struct eth_hdr { ++ struct mac_address dest_mac; ++ struct mac_address src_mac; ++ u16_t len_type; ++}; ++ ++struct ipv6_hdr { ++ union { ++ struct { ++ u32_t ipv6_flow; /* Version (4-bit) | ++ Traffic Class (8-bit) | ++ Flow ID (20-bit) */ ++ u16_t ipv6_plen; /* Payload length */ ++ u8_t ipv6_nxt_hdr; /* Next Header */ ++ u8_t ipv6_hop_limit; /* hop limit */ ++ } ipv6_dw1; ++ ++ u8_t ipv6_version_fc; /* 4 bits version, top 4 bits class */ ++ } ipv6_ctrl; ++ ++ struct ipv6_addr ipv6_src; /* Source address */ ++ struct ipv6_addr ipv6_dst; /* Destination address */ ++}; ++ ++#define ipv6_version_fc ipv6_ctrl.ipv6_version_fc ++#define ipv6_flow ipv6_ctrl.ipv6_dw1.ipv6_flow ++#define ipv6_plen ipv6_ctrl.ipv6_dw1.ipv6_plen ++#define ipv6_nxt_hdr ipv6_ctrl.ipv6_dw1.ipv6_nxt_hdr ++#define ipv6_hop_limit ipv6_ctrl.ipv6_dw1.ipv6_hop_limit ++ ++#define IPV6_VERSION 0x60 ++#define IPV6_VERSION_MASK 0xf0 ++#define IPV6_HOP_LIMIT 64 ++ ++/* Length of the IP header with no next header */ ++#define IPV6_HEADER_LEN sizeof(struct ipv6_hdr) ++ ++#ifdef BIG_ENDIAN ++#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ ++#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ ++#else /* LITTLE_ENDIAN */ ++#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ ++#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ ++#endif ++ ++struct packet_ipv6 { ++ struct mac_address dest_mac; ++ struct mac_address src_mac; ++ u16_t len_type; ++ struct ipv6_hdr ipv6; ++ union { ++ struct udp_hdr udp; ++ } layer4_prot; ++}; ++ ++struct packet_ipv6_vlan { ++ struct mac_address dest_mac; ++ struct mac_address src_mac; ++ u16_t len_type; ++ u16_t vlan_id; ++ struct ipv6_hdr ipv6; ++ union { ++ struct udp_hdr udp; ++ } layer4_prot; ++}; ++ ++struct ipv6_arp_entry { ++ struct ipv6_addr ip_addr; ++ struct mac_address mac_addr; ++ u8_t time; ++}; ++ ++#define IPV6_NUM_OF_ADDRESS_ENTRY 4 ++ ++struct ipv6_prefix_entry { ++ struct ipv6_prefix_entry *next; ++ struct ipv6_addr ip_addr; ++ u8_t prefix_len; ++}; ++ ++struct ipv6_addr_entry { ++ struct ipv6_addr ip_addr; ++ u8_t prefix_len; ++}; ++ ++struct ipv6_context { ++ u16_t flags; ++#define IPV6_FLAGS_MANAGED_ADDR_CONFIG (1 << 0) ++#define IPV6_FLAGS_OTHER_STATEFUL_CONFIG (1 << 1) ++#define IPV6_FLAGS_ROUTER_ADV_RECEIVED (1 << 2) ++#define IPV6_FLAGS_DISABLE_DHCPV6 (1 << 3) ++ ++ struct mac_address mac_addr; ++ struct ipv6_addr link_local_addr; ++ struct ipv6_addr link_local_multi; ++ struct ipv6_addr multi; /* For Static IPv6 only */ ++ struct ipv6_addr multi_dest; /* For Static IPv6 only */ ++ struct ipv6_addr default_router; ++ struct ipv6_prefix_entry *addr_list; ++ u8_t hop_limit; ++#define UIP_ARPTAB_SIZE 8 ++ ++ struct uip_stack *ustack; ++#define MAX_MCADDR_TABLE 5 ++ struct mac_address mc_addr[MAX_MCADDR_TABLE]; ++ u8_t arptime; ++ struct ipv6_arp_entry ipv6_arp_table[UIP_ARPTAB_SIZE]; ++ struct ipv6_prefix_entry ipv6_prefix_table[IPV6_NUM_OF_ADDRESS_ENTRY]; ++ ++ /* VLAN support */ ++ ++ void *dhcpv6_context; ++}; ++ ++#define ISCSI_FLAGS_DHCP_TCPIP_CONFIG (1<<0) ++#define ISCSI_FLAGS_DHCP_ISCSI_CONFIG (1<<1) ++ ++#define IPV6_MAX_ROUTER_SOL_DELAY 4 ++#define IPV6_MAX_ROUTER_SOL_RETRY 3 ++ ++#define DHCPV6_CLIENT_PORT 546 ++#define DHCPV6_SERVER_PORT 547 ++ ++/* Function prototype */ ++void ipv6_init(struct ndpc_state *ndp, int cfg); ++int ipv6_autoconfig(struct ipv6_context *context); ++int ipv6_discover_address(struct ipv6_context *context); ++struct ipv6_addr *ipv6_our_address(struct ipv6_context *context); ++int ipv6_ip_in_arp_table(struct ipv6_context *context, ++ struct ipv6_addr *ipv6_addr, ++ struct mac_address *mac_addr); ++void ipv6_arp_timer(struct ipv6_context *context); ++void ipv6_arp_out(struct ipv6_context *context, int *uip_len); ++int ipv6_add_prefix_entry(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr, u8_t prefix_len); ++void ipv6_set_ip_params(struct ipv6_context *context, ++ struct ipv6_addr *src_ip, u8_t prefix_len, ++ struct ipv6_addr *default_gateway, ++ struct ipv6_addr *linklocal); ++void ipv6_set_host_addr(struct ipv6_context *context, struct ipv6_addr *src_ip); ++int ipv6_get_default_router_ip_addrs(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr); ++struct mac_address *ipv6_get_link_addr(struct ipv6_context *context); ++u16_t ipv6_do_stateful_dhcpv6(struct ipv6_context *context, u32_t flags); ++void ipv6_add_solit_node_address(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr); ++int ipv6_get_source_ip_addrs(struct ipv6_context *context, ++ struct ipv6_addr_entry *addr_list); ++void ipv6_cfg_link_local_addr(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr); ++void ipv6_disable_dhcpv6(struct ipv6_context *context); ++int ipv6_send_nd_solicited_packet(struct ipv6_context *context, ++ struct eth_hdr *eth, struct ipv6_hdr *ipv6); ++int ipv6_is_it_our_link_local_address(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr); ++void ipv6_mc_init_dest_mac(struct eth_hdr *eth, struct ipv6_hdr *ipv6); ++struct ipv6_addr *ipv6_find_longest_match(struct ipv6_context *context, ++ struct ipv6_addr *ip_addr); ++ ++#endif /* __IPV6_H__ */ +diff --git a/iscsiuio/src/uip/ipv6_ndpc.c b/iscsiuio/src/uip/ipv6_ndpc.c +new file mode 100644 +index 0000000..a396cb7 +--- /dev/null ++++ b/iscsiuio/src/uip/ipv6_ndpc.c +@@ -0,0 +1,427 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai (eddie.wai@broadcom.com) ++ * Based on the Swedish Institute of Computer Science's ++ * dhcpc.c code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * ipv6_ndpc.c - Top level IPv6 Network Discovery Protocol Engine (RFC4861) ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "uip.h" ++#include "ipv6_ndpc.h" ++#include "timer.h" ++#include "pt.h" ++ ++#include "debug.h" ++#include "logger.h" ++#include "nic.h" ++#include "nic_utils.h" ++#include "ipv6.h" ++#include "ipv6_pkt.h" ++#include "dhcpv6.h" ++ ++const int dhcpv6_retry_timeout[DHCPV6_NUM_OF_RETRY] = { 1, 2, 4, 8 }; ++ ++static PT_THREAD(handle_ndp(struct uip_stack *ustack, int force)) ++{ ++ struct ndpc_state *s; ++ struct ipv6_context *ipv6c; ++ struct dhcpv6_context *dhcpv6c = NULL; ++ u16_t task = 0; ++ char buf[INET6_ADDRSTRLEN]; ++ ++ s = ustack->ndpc; ++ if (s == NULL) { ++ LOG_DEBUG("NDP: Could not find ndpc state"); ++ return PT_ENDED; ++ } ++ ++ ipv6c = s->ipv6_context; ++ if (!ipv6c) ++ goto ndpc_state_null; ++ ++ dhcpv6c = s->dhcpv6_context; ++ ++ PT_BEGIN(&s->pt); ++ ++ if (s->state == NDPC_STATE_BACKGROUND_LOOP) ++ goto ipv6_loop; ++ ++ if (s->state == NDPC_STATE_RTR_ADV) ++ goto rtr_adv; ++ ++ /* For AUTOCFG == DHCPv6, do all ++ For == ND, skip DHCP only and do RTR ++ For == UNUSED/UNSPEC, do all as according to DHCP or not */ ++ s->state = NDPC_STATE_RTR_SOL; ++ /* try_again: */ ++ s->ticks = CLOCK_SECOND * IPV6_MAX_ROUTER_SOL_DELAY; ++ s->retry_count = 0; ++ do { ++ /* Perform router solicitation and wait for ++ router advertisement */ ++ LOG_DEBUG("%s: ndpc_handle send rtr sol", s->nic->log_name); ++ ipv6_autoconfig(s->ipv6_context); ++ ++ timer_set(&s->timer, s->ticks); ++wait_rtr: ++ s->ustack->uip_flags &= ~UIP_NEWDATA; ++ LOG_DEBUG("%s: ndpc_handle wait for rtr adv flags=0x%x", ++ s->nic->log_name, ipv6c->flags); ++ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) ++ || timer_expired(&s->timer) || force); ++ ++ if (uip_newdata(s->ustack)) { ++ /* Validate incoming packets ++ Note that the uip_len is init from nic loop */ ++ ipv6_rx_packet(ipv6c, (u16_t) uip_datalen(s->ustack)); ++ if (ipv6c->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED) { ++ LOG_INFO("%s: ROUTER_ADV_RECEIVED", ++ s->nic->log_name); ++ /* Success */ ++ break; ++ } else if (!timer_expired(&s->timer)) { ++ /* Yes new data, but not what we want, ++ check for timer expiration before bumping ++ tick */ ++ goto wait_rtr; ++ } ++ } ++ s->retry_count++; ++ if (s->retry_count >= IPV6_MAX_ROUTER_SOL_RETRY) ++ /* Max router solicitation retry reached. Move to ++ IPv6 loop (no DHCPv6) */ ++ goto no_rtr_adv; ++ ++ } while (!(ipv6c->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED)); ++ ++ LOG_DEBUG("%s: ndpc_handle got rtr adv", s->nic->log_name); ++ ++no_rtr_adv: ++ s->state = NDPC_STATE_RTR_ADV; ++ ++rtr_adv: ++ if (!(ustack->ip_config & IPV6_CONFIG_DHCP)) ++ goto staticv6; ++ ++ /* Only DHCPv6 comes here */ ++ task = ipv6_do_stateful_dhcpv6(ipv6c, ISCSI_FLAGS_DHCP_TCPIP_CONFIG); ++ if (task) { ++ /* Run the DHCPv6 engine */ ++ ++ if (!dhcpv6c) ++ goto ipv6_loop; ++ ++ dhcpv6c->dhcpv6_task = task; ++ s->retry_count = 0; ++ s->state = NDPC_STATE_DHCPV6_DIS; ++ do { ++ /* Do dhcpv6 */ ++ dhcpv6c->timeout = dhcpv6_retry_timeout[s->retry_count]; ++ s->ticks = CLOCK_SECOND * dhcpv6c->timeout; ++ LOG_DEBUG("%s: ndpc_handle send dhcpv6 sol retry " ++ "cnt=%d", s->nic->log_name, s->retry_count); ++ dhcpv6_do_discovery(dhcpv6c); ++ ++ timer_set(&s->timer, s->ticks); ++wait_dhcp: ++ s->ustack->uip_flags &= ~UIP_NEWDATA; ++ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) ++ || timer_expired(&s->timer) || force); ++ ++ if (uip_newdata(s->ustack)) { ++ /* Validate incoming packets ++ Note that the uip_len is init from nic ++ loop */ ++ ipv6_rx_packet(ipv6c, ++ (u16_t) uip_datalen(s->ustack)); ++ if (dhcpv6c->dhcpv6_done == TRUE) ++ break; ++ else if (!timer_expired(&s->timer)) { ++ /* Yes new data, but not what we want, ++ check for timer expiration before ++ bumping tick */ ++ goto wait_dhcp; ++ } ++ } ++ s->retry_count++; ++ if (s->retry_count < DHCPV6_NUM_OF_RETRY) { ++ dhcpv6c->seconds += dhcpv6c->timeout; ++ } else { ++ LOG_DEBUG("%s: ndpc_handle DHCP failed", ++ s->nic->log_name); ++ /* Allow to goto background loop */ ++ goto ipv6_loop; ++ } ++ } while (dhcpv6c->dhcpv6_done == FALSE); ++ s->state = NDPC_STATE_DHCPV6_DONE; ++ ++ LOG_DEBUG("%s: ndpc_handle got dhcpv6", s->nic->log_name); ++ ++ /* End of DHCPv6 engine */ ++ } else { ++ /* Static IPv6 */ ++ if (ustack->ip_config == IPV6_CONFIG_DHCP) { ++ LOG_DEBUG("%s: ndpc_handle DHCP failed", ++ s->nic->log_name); ++ PT_RESTART(&s->pt); ++ } ++staticv6: ++ ipv6_disable_dhcpv6(ipv6c); ++ } ++ /* Copy out the default_router_addr6 and ll */ ++ if (ustack->router_autocfg != IPV6_RTR_AUTOCFG_OFF) ++ memcpy(&ustack->default_route_addr6, ++ &ipv6c->default_router, sizeof(struct ipv6_addr)); ++ inet_ntop(AF_INET6, &ustack->default_route_addr6, ++ buf, sizeof(buf)); ++ LOG_INFO("%s: Default router IP: %s", s->nic->log_name, ++ buf); ++ ++ if (ustack->linklocal_autocfg != IPV6_LL_AUTOCFG_OFF) ++ memcpy(&ustack->linklocal6, &ipv6c->link_local_addr, ++ sizeof(struct ipv6_addr)); ++ inet_ntop(AF_INET6, &ustack->linklocal6, ++ buf, sizeof(buf)); ++ LOG_INFO("%s: Linklocal IP: %s", s->nic->log_name, ++ buf); ++ ++ipv6_loop: ++ s->state = NDPC_STATE_BACKGROUND_LOOP; ++ LOG_DEBUG("%s: Loop", s->nic->log_name); ++ /* Background IPv6 loop */ ++ while (1) { ++ /* Handle all neightbor solicitation/advertisement here */ ++ s->ustack->uip_flags &= ~UIP_NEWDATA; ++ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack)); ++ ++ /* Validate incoming packets */ ++ ipv6_rx_packet(ipv6c, (u16_t) uip_datalen(s->ustack)); ++ } ++ ++ndpc_state_null: ++ ++ while (1) ++ PT_YIELD(&s->pt); ++ ++ PT_END(&(s->pt)); ++} ++ ++/*---------------------------------------------------------------------------*/ ++int ndpc_init(nic_t *nic, struct uip_stack *ustack, ++ const void *mac_addr, int mac_len) ++{ ++ struct ipv6_context *ipv6c; ++ struct dhcpv6_context *dhcpv6c; ++ struct ndpc_state *s = ustack->ndpc; ++ struct ipv6_addr src, gw, ll; ++ char buf[INET6_ADDRSTRLEN]; ++ ++ if (s) { ++ LOG_DEBUG("NDP: NDP context already allocated"); ++ /* Already allocated, skip*/ ++ return -EALREADY; ++ } ++ s = malloc(sizeof(*s)); ++ if (s == NULL) { ++ LOG_ERR("%s: Couldn't allocate size for ndpc info", ++ nic->log_name); ++ goto error; ++ } ++ memset(s, 0, sizeof(*s)); ++ ++ if (s->ipv6_context) { ++ LOG_DEBUG("NDP: IPv6 context already allocated"); ++ ipv6c = s->ipv6_context; ++ goto init1; ++ } ++ ipv6c = malloc(sizeof(struct ipv6_context)); ++ if (ipv6c == NULL) { ++ LOG_ERR("%s: Couldn't allocate mem for IPv6 context info", ++ nic->log_name); ++ goto error1; ++ } ++init1: ++ if (s->dhcpv6_context) { ++ LOG_DEBUG("NDP: DHCPv6 context already allocated"); ++ dhcpv6c = s->dhcpv6_context; ++ goto init2; ++ } ++ dhcpv6c = malloc(sizeof(struct dhcpv6_context)); ++ if (dhcpv6c == NULL) { ++ LOG_ERR("%s: Couldn't allocate mem for DHCPv6 context info", ++ nic->log_name); ++ goto error2; ++ } ++init2: ++ memset(s, 0, sizeof(*s)); ++ memset(ipv6c, 0, sizeof(*ipv6c)); ++ memset(dhcpv6c, 0, sizeof(*dhcpv6c)); ++ ++ s->ipv6_context = ipv6c; ++ s->dhcpv6_context = dhcpv6c; ++ ++ s->nic = nic; ++ s->ustack = ustack; ++ s->mac_addr = (void *)mac_addr; ++ s->mac_len = mac_len; ++ s->state = NDPC_STATE_INIT; ++ ++ /* Init IPV6_CONTEXT */ ++ ipv6_init(s, ustack->ip_config); ++ ++ dhcpv6c->ipv6_context = ipv6c; ++ ipv6c->dhcpv6_context = dhcpv6c; ++ ++ /* Init DHCPV6_CONTEXT */ ++ dhcpv6_init(dhcpv6c); ++ ++ ustack->ndpc = s; ++ ++ PT_INIT(&s->pt); ++ ++ if (ustack->ip_config == IPV6_CONFIG_DHCP) { ++ /* DHCPv6 specific */ ++ memset(&src, 0, sizeof(src)); ++ } else { ++ /* Static v6 specific */ ++ memcpy(&src.addr8, &ustack->hostaddr6, ++ sizeof(struct ipv6_addr)); ++ ipv6_add_solit_node_address(ipv6c, &src); ++ ++ inet_ntop(AF_INET6, &src.addr8, buf, sizeof(buf)); ++ LOG_INFO("%s: Static hostaddr IP: %s", s->nic->log_name, ++ buf); ++ } ++ /* Copy out the default_router_addr6 and ll */ ++ if (ustack->router_autocfg == IPV6_RTR_AUTOCFG_OFF) ++ memcpy(&gw.addr8, &ustack->default_route_addr6, ++ sizeof(struct ipv6_addr)); ++ else ++ memset(&gw, 0, sizeof(gw)); ++ ++ if (ustack->linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) ++ memcpy(&ll.addr8, &ustack->linklocal6, ++ sizeof(struct ipv6_addr)); ++ else ++ memset(&ll, 0, sizeof(ll)); ++ ipv6_set_ip_params(ipv6c, &src, ++ ustack->prefix_len, &gw, &ll); ++ ++ return 0; ++error2: ++ free(ipv6c); ++ s->ipv6_context = NULL; ++error1: ++ free(s); ++ ustack->ndpc = NULL; ++error: ++ return -ENOMEM; ++} ++ ++/*---------------------------------------------------------------------------*/ ++void ndpc_call(struct uip_stack *ustack) ++{ ++ handle_ndp(ustack, 0); ++} ++ ++void ndpc_exit(struct ndpc_state *ndp) ++{ ++ LOG_DEBUG("NDP - Exit ndpc_state = %p", ndp); ++ if (!ndp) ++ return; ++ if (ndp->ipv6_context) ++ free(ndp->ipv6_context); ++ if (ndp->dhcpv6_context) ++ free(ndp->dhcpv6_context); ++ free(ndp); ++} ++ ++int ndpc_request(struct uip_stack *ustack, void *in, void *out, int request) ++{ ++ struct ndpc_state *s; ++ struct ipv6_context *ipv6c; ++ int ret = 0; ++ ++ if (!ustack) { ++ LOG_DEBUG("NDP: ustack == NULL"); ++ return -EINVAL; ++ } ++ s = ustack->ndpc; ++ if (s == NULL) { ++ LOG_DEBUG("NDP: Could not find ndpc state for request %d", ++ request); ++ return -EINVAL; ++ } ++ while (s->state != NDPC_STATE_BACKGROUND_LOOP) { ++ LOG_DEBUG("%s: ndpc state not in background loop, run handler " ++ "request = %d", s->nic->log_name, request); ++ handle_ndp(ustack, 1); ++ } ++ ++ ipv6c = s->ipv6_context; ++ switch (request) { ++ case NEIGHBOR_SOLICIT: ++ *(int *)out = ipv6_send_nd_solicited_packet(ipv6c, ++ (struct eth_hdr *)((struct ndpc_reqptr *)in)->eth, ++ (struct ipv6_hdr *)((struct ndpc_reqptr *)in)->ipv6); ++ break; ++ case CHECK_LINK_LOCAL_ADDR: ++ *(int *)out = ipv6_is_it_our_link_local_address(ipv6c, ++ (struct ipv6_addr *)in); ++ break; ++ case CHECK_ARP_TABLE: ++ *(int *)out = ipv6_ip_in_arp_table(ipv6c, ++ (struct ipv6_addr *)((struct ndpc_reqptr *)in)->ipv6, ++ (struct mac_address *)((struct ndpc_reqptr *)in)->eth); ++ break; ++ case GET_HOST_ADDR: ++ *(struct ipv6_addr **)out = ipv6_find_longest_match(ipv6c, ++ (struct ipv6_addr *)in); ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ return ret; ++} ++ ++/*---------------------------------------------------------------------------*/ +diff --git a/iscsiuio/src/uip/ipv6_ndpc.h b/iscsiuio/src/uip/ipv6_ndpc.h +new file mode 100644 +index 0000000..709a050 +--- /dev/null ++++ b/iscsiuio/src/uip/ipv6_ndpc.h +@@ -0,0 +1,98 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai (eddie.wai@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * ipv6_ndpc.h - Top level IPv6 Network Discovery Protocol Engine (RFC4861) ++ * ++ */ ++#ifndef __NDPC_H__ ++#define __NDPC_H__ ++ ++#include ++ ++#include "nic.h" ++#include "timer.h" ++#include "pt.h" ++ ++struct ndpc_reqptr { ++ void *eth; ++ void *ipv6; ++}; ++ ++struct ndpc_state { ++ struct pt pt; ++ ++ nic_t *nic; ++ struct uip_stack *ustack; ++ char state; ++ struct timer timer; ++ u16_t ticks; ++ void *mac_addr; ++ int mac_len; ++ int retry_count; ++ ++ time_t last_update; ++ ++ void *ipv6_context; ++ void *dhcpv6_context; ++}; ++ ++enum { ++ NDPC_STATE_INIT, ++ NDPC_STATE_RTR_SOL, ++ NDPC_STATE_RTR_ADV, ++ NDPC_STATE_DHCPV6_DIS, ++ NDPC_STATE_DHCPV6_DONE, ++ NDPC_STATE_BACKGROUND_LOOP ++}; ++ ++int ndpc_init(nic_t *nic, struct uip_stack *ustack, ++ const void *mac_addr, int mac_len); ++void ndpc_call(struct uip_stack *ustack); ++void ndpc_exit(struct ndpc_state *ndp); ++ ++enum { ++ NEIGHBOR_SOLICIT, ++ CHECK_LINK_LOCAL_ADDR, ++ GET_LINK_LOCAL_ADDR, ++ GET_DEFAULT_ROUTER_ADDR, ++ CHECK_ARP_TABLE, ++ GET_HOST_ADDR ++}; ++ ++int ndpc_request(struct uip_stack *ustack, void *in, void *out, int request); ++ ++#define UIP_NDP_CALL ndpc_call ++ ++#endif /* __NDPC_H__ */ +diff --git a/iscsiuio/src/uip/ipv6_pkt.h b/iscsiuio/src/uip/ipv6_pkt.h +new file mode 100644 +index 0000000..b42f1aa +--- /dev/null ++++ b/iscsiuio/src/uip/ipv6_pkt.h +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Eddie Wai (eddie.wai@broadcom.com) ++ * Based on Kevin Tran's iSCSI boot code ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * ipv6_packet.h - IPv6 routine include file ++ * ++ */ ++#ifndef __IPV6_PKT_H__ ++#define __IPV6_PKT_H__ ++ ++u16_t ipv6_process_rx(struct ipv6_hdr *ipv6); ++void ipv6_rx_packet(struct ipv6_context *context, u16_t len); ++void ipv6_setup_hdrs(struct ipv6_context *context, struct eth_hdr *eth, ++ struct ipv6_hdr *ipv6, u16_t packet_len); ++int ipv6_send(struct ipv6_context *context, u16_t packet_len); ++void ipv6_send_udp_packet(struct ipv6_context *context, u16_t packet_len); ++ ++#endif /* __IPV6_PKT_H__ */ +diff --git a/iscsiuio/src/uip/lc-addrlabels.h b/iscsiuio/src/uip/lc-addrlabels.h +new file mode 100644 +index 0000000..c394b22 +--- /dev/null ++++ b/iscsiuio/src/uip/lc-addrlabels.h +@@ -0,0 +1,80 @@ ++/* ++ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++/** ++ * \addtogroup lc ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Implementation of local continuations based on the "Labels as ++ * values" feature of gcc ++ * \author ++ * Adam Dunkels ++ * ++ * This implementation of local continuations is based on a special ++ * feature of the GCC C compiler called "labels as values". This ++ * feature allows assigning pointers with the address of the code ++ * corresponding to a particular C label. ++ * ++ * For more information, see the GCC documentation: ++ * http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html ++ * ++ * Thanks to dividuum for finding the nice local scope label ++ * implementation. ++ */ ++ ++#ifndef __LC_ADDRLABELS_H__ ++#define __LC_ADDRLABELS_H__ ++ ++/** \hideinitializer */ ++ ++#define LC_INIT(s) (s = NULL) ++ ++#define LC_RESUME(s) \ ++ do { \ ++ if (s != NULL) { \ ++ goto *s; \ ++ } \ ++ } while (0) ++ ++#define LC_SET(s) \ ++ do { ({ __label__ resume; resume: (s) = &&resume; }); } while (0) ++ ++#define LC_END(s) ++ ++#endif /* __LC_ADDRLABELS_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/lc-switch.h b/iscsiuio/src/uip/lc-switch.h +new file mode 100644 +index 0000000..1839b36 +--- /dev/null ++++ b/iscsiuio/src/uip/lc-switch.h +@@ -0,0 +1,73 @@ ++/* ++ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++/** ++ * \addtogroup lc ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Implementation of local continuations based on switch() statment ++ * \author Adam Dunkels ++ * ++ * This implementation of local continuations uses the C switch() ++ * statement to resume execution of a function somewhere inside the ++ * function's body. The implementation is based on the fact that ++ * switch() statements are able to jump directly into the bodies of ++ * control structures such as if() or while() statmenets. ++ * ++ * This implementation borrows heavily from Simon Tatham's coroutines ++ * implementation in C: ++ * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html ++ */ ++ ++#ifndef __LC_SWITCH_H__ ++#define __LC_SWTICH_H__ ++ ++/* WARNING! lc implementation using switch() does not work if an ++ LC_SET() is done within another switch() statement! */ ++ ++/** \hideinitializer */ ++#define LC_INIT(s) s = 0; ++ ++#define LC_RESUME(s) switch (s) { case 0: ++ ++#define LC_SET(s) s = __LINE__; case __LINE__: ++ ++#define LC_END(s) } ++ ++#endif /* __LC_SWITCH_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/lc.h b/iscsiuio/src/uip/lc.h +new file mode 100644 +index 0000000..2e4a7bb +--- /dev/null ++++ b/iscsiuio/src/uip/lc.h +@@ -0,0 +1,130 @@ ++/* ++ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++/** ++ * \addtogroup pt ++ * @{ ++ */ ++ ++/** ++ * \defgroup lc Local continuations ++ * @{ ++ * ++ * Local continuations form the basis for implementing protothreads. A ++ * local continuation can be set in a specific function to ++ * capture the state of the function. After a local continuation has ++ * been set can be resumed in order to restore the state of the ++ * function at the point where the local continuation was set. ++ * ++ * ++ */ ++ ++/** ++ * \file lc.h ++ * Local continuations ++ * \author ++ * Adam Dunkels ++ * ++ */ ++ ++#ifdef DOXYGEN ++/** ++ * Initialize a local continuation. ++ * ++ * This operation initializes the local continuation, thereby ++ * unsetting any previously set continuation state. ++ * ++ * \hideinitializer ++ */ ++#define LC_INIT(lc) ++ ++/** ++ * Set a local continuation. ++ * ++ * The set operation saves the state of the function at the point ++ * where the operation is executed. As far as the set operation is ++ * concerned, the state of the function does not include the ++ * call-stack or local (automatic) variables, but only the program ++ * counter and such CPU registers that needs to be saved. ++ * ++ * \hideinitializer ++ */ ++#define LC_SET(lc) ++ ++/** ++ * Resume a local continuation. ++ * ++ * The resume operation resumes a previously set local continuation, thus ++ * restoring the state in which the function was when the local ++ * continuation was set. If the local continuation has not been ++ * previously set, the resume operation does nothing. ++ * ++ * \hideinitializer ++ */ ++#define LC_RESUME(lc) ++ ++/** ++ * Mark the end of local continuation usage. ++ * ++ * The end operation signifies that local continuations should not be ++ * used any more in the function. This operation is not needed for ++ * most implementations of local continuation, but is required by a ++ * few implementations. ++ * ++ * \hideinitializer ++ */ ++#define LC_END(lc) ++ ++/** ++ * \var typedef lc_t; ++ * ++ * The local continuation type. ++ * ++ * \hideinitializer ++ */ ++#endif /* DOXYGEN */ ++ ++#ifndef __LC_H__ ++#define __LC_H__ ++ ++#ifdef LC_CONF_INCLUDE ++#include LC_CONF_INCLUDE ++#else ++#include "lc-switch.h" ++#endif /* LC_CONF_INCLUDE */ ++ ++#endif /* __LC_H__ */ ++ ++/** @} */ ++/** @} */ +diff --git a/iscsiuio/src/uip/psock.c b/iscsiuio/src/uip/psock.c +new file mode 100644 +index 0000000..fcffbe7 +--- /dev/null ++++ b/iscsiuio/src/uip/psock.c +@@ -0,0 +1,339 @@ ++/* ++ * Copyright (c) 2004, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++#include ++#include ++ ++#include "uipopt.h" ++#include "psock.h" ++#include "uip.h" ++ ++#define STATE_NONE 0 ++#define STATE_ACKED 1 ++#define STATE_READ 2 ++#define STATE_BLOCKED_NEWDATA 3 ++#define STATE_BLOCKED_CLOSE 4 ++#define STATE_BLOCKED_SEND 5 ++#define STATE_DATA_SENT 6 ++ ++/* ++ * Return value of the buffering functions that indicates that a ++ * buffer was not filled by incoming data. ++ * ++ */ ++#define BUF_NOT_FULL 0 ++#define BUF_NOT_FOUND 0 ++ ++/* ++ * Return value of the buffering functions that indicates that a ++ * buffer was completely filled by incoming data. ++ * ++ */ ++#define BUF_FULL 1 ++ ++/* ++ * Return value of the buffering functions that indicates that an ++ * end-marker byte was found. ++ * ++ */ ++#define BUF_FOUND 2 ++ ++/*---------------------------------------------------------------------------*/ ++static void buf_setup(struct psock_buf *buf, u8_t *bufptr, u16_t bufsize) ++{ ++ buf->ptr = bufptr; ++ buf->left = bufsize; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t ++buf_bufdata(struct psock_buf *buf, u16_t len, u8_t **dataptr, u16_t *datalen) ++{ ++ if (*datalen < buf->left) { ++ memcpy(buf->ptr, *dataptr, *datalen); ++ buf->ptr += *datalen; ++ buf->left -= *datalen; ++ *dataptr += *datalen; ++ *datalen = 0; ++ return BUF_NOT_FULL; ++ } else if (*datalen == buf->left) { ++ memcpy(buf->ptr, *dataptr, *datalen); ++ buf->ptr += *datalen; ++ buf->left = 0; ++ *dataptr += *datalen; ++ *datalen = 0; ++ return BUF_FULL; ++ } else { ++ memcpy(buf->ptr, *dataptr, buf->left); ++ buf->ptr += buf->left; ++ *datalen -= buf->left; ++ *dataptr += buf->left; ++ buf->left = 0; ++ return BUF_FULL; ++ } ++} ++ ++/*---------------------------------------------------------------------------*/ ++static u8_t ++buf_bufto(register struct psock_buf *buf, u8_t endmarker, ++ register u8_t **dataptr, register u16_t *datalen) ++{ ++ u8_t c; ++ while (buf->left > 0 && *datalen > 0) { ++ c = *buf->ptr = **dataptr; ++ ++*dataptr; ++ ++buf->ptr; ++ --*datalen; ++ --buf->left; ++ ++ if (c == endmarker) ++ return BUF_FOUND; ++ } ++ ++ if (*datalen == 0) ++ return BUF_NOT_FOUND; ++ ++ while (*datalen > 0) { ++ c = **dataptr; ++ --*datalen; ++ ++*dataptr; ++ ++ if (c == endmarker) ++ return BUF_FOUND | BUF_FULL; ++ } ++ ++ return BUF_FULL; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static char send_data(register struct psock *s) ++{ ++ if (s->state != STATE_DATA_SENT || uip_rexmit(s->ustack)) { ++ if (s->sendlen > uip_mss(s->ustack)) ++ uip_appsend(s->ustack, s->sendptr, uip_mss(s->ustack)); ++ else ++ uip_appsend(s->ustack, s->sendptr, s->sendlen); ++ s->state = STATE_DATA_SENT; ++ return 1; ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------------------*/ ++static char data_acked(struct psock *s) ++{ ++ if (s->state == STATE_DATA_SENT && uip_acked(s->ustack)) { ++ if (s->sendlen > uip_mss(s->ustack)) { ++ s->sendlen -= uip_mss(s->ustack); ++ s->sendptr += uip_mss(s->ustack); ++ } else { ++ s->sendptr += s->sendlen; ++ s->sendlen = 0; ++ } ++ s->state = STATE_ACKED; ++ return 1; ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------------------*/ ++PT_THREAD(psock_send(struct uip_stack *ustack, ++ register struct psock *s, const u8_t *buf, ++ unsigned int len)) ++{ ++ PT_BEGIN(&s->psockpt); ++ ++ /* If there is no data to send, we exit immediately. */ ++ if (len == 0) { ++ PT_EXIT(&s->psockpt); ++ } ++ ++ /* Save the length of and a pointer to the data that is to be ++ sent. */ ++ s->sendptr = buf; ++ s->sendlen = len; ++ ++ s->state = STATE_NONE; ++ ++ /* We loop here until all data is sent. The s->sendlen variable is ++ updated by the data_sent() function. */ ++ while (s->sendlen > 0) { ++ ++ /* ++ * The condition for this PT_WAIT_UNTIL is a little tricky: the ++ * protothread will wait here until all data has been acked ++ * (data_acked() returns true) and until all data has been sent ++ * (send_data() returns true). The two functions data_acked() ++ * and send_data() must be called in succession to ensure that ++ * all data is sent. Therefore the & operator is used instead of ++ * the && operator, which would cause only the data_acked() ++ * function to be called when it returns false. ++ */ ++ PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); ++ } ++ ++ s->state = STATE_NONE; ++ ++ PT_END(&s->psockpt); ++} ++ ++/*---------------------------------------------------------------------------*/ ++PT_THREAD(psock_generator_send(register struct psock *s, ++ unsigned short (*generate) (void *), void *arg)) ++{ ++ PT_BEGIN(&s->psockpt); ++ ++ /* Ensure that there is a generator function to call. */ ++ if (generate == NULL) { ++ PT_EXIT(&s->psockpt); ++ } ++ ++ /* Call the generator function to generate the data in the ++ uip_appdata buffer. */ ++ s->sendlen = generate(arg); ++ s->sendptr = s->ustack->uip_appdata; ++ ++ s->state = STATE_NONE; ++ do { ++ /* Call the generator function again if we are called to perform ++ a retransmission. */ ++ if (uip_rexmit(s->ustack)) ++ generate(arg); ++ /* Wait until all data is sent and acknowledged. */ ++ PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); ++ } while (s->sendlen > 0); ++ ++ s->state = STATE_NONE; ++ ++ PT_END(&s->psockpt); ++} ++ ++/*---------------------------------------------------------------------------*/ ++u16_t psock_datalen(struct psock *psock) ++{ ++ return psock->bufsize - psock->buf.left; ++} ++ ++/*---------------------------------------------------------------------------*/ ++char psock_newdata(struct psock *s) ++{ ++ if (s->readlen > 0) { ++ /* There is data in the uip_appdata buffer that has not yet been ++ read with the PSOCK_READ functions. */ ++ return 1; ++ } else if (s->state == STATE_READ) { ++ /* All data in uip_appdata buffer already consumed. */ ++ s->state = STATE_BLOCKED_NEWDATA; ++ return 0; ++ } else if (uip_newdata(s->ustack)) { ++ /* There is new data that has not been consumed. */ ++ return 1; ++ } else { ++ /* There is no new data. */ ++ return 0; ++ } ++} ++ ++/*---------------------------------------------------------------------------*/ ++PT_THREAD(psock_readto(register struct psock *psock, u8_t c)) ++{ ++ PT_BEGIN(&psock->psockpt); ++ ++ buf_setup(&psock->buf, psock->bufptr, psock->bufsize); ++ ++ /* XXX: Should add buf_checkmarker() before do{} loop, if ++ incoming data has been handled while waiting for a write. */ ++ ++ do { ++ if (psock->readlen == 0) { ++ PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); ++ psock->state = STATE_READ; ++ psock->readptr = (u8_t *) psock->ustack->uip_appdata; ++ psock->readlen = uip_datalen(psock->ustack); ++ } ++ } while ((buf_bufto(&psock->buf, c, ++ &psock->readptr, ++ &psock->readlen) & BUF_FOUND) == 0); ++ ++ if (psock_datalen(psock) == 0) { ++ psock->state = STATE_NONE; ++ PT_RESTART(&psock->psockpt); ++ } ++ PT_END(&psock->psockpt); ++} ++ ++/*---------------------------------------------------------------------------*/ ++PT_THREAD(psock_readbuf(register struct psock *psock)) ++{ ++ PT_BEGIN(&psock->psockpt); ++ ++ buf_setup(&psock->buf, psock->bufptr, psock->bufsize); ++ ++ /* XXX: Should add buf_checkmarker() before do{} loop, if ++ incoming data has been handled while waiting for a write. */ ++ ++ do { ++ if (psock->readlen == 0) { ++ PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); ++ printf("Waited for newdata\n"); ++ psock->state = STATE_READ; ++ psock->readptr = (u8_t *) psock->ustack->uip_appdata; ++ psock->readlen = uip_datalen(psock->ustack); ++ } ++ } while (buf_bufdata(&psock->buf, psock->bufsize, ++ &psock->readptr, &psock->readlen) != BUF_FULL); ++ ++ if (psock_datalen(psock) == 0) { ++ psock->state = STATE_NONE; ++ PT_RESTART(&psock->psockpt); ++ } ++ PT_END(&psock->psockpt); ++} ++ ++/*---------------------------------------------------------------------------*/ ++void ++psock_init(struct uip_stack *ustack, ++ register struct psock *psock, u8_t *buffer, unsigned int buffersize) ++{ ++ psock->state = STATE_NONE; ++ psock->readlen = 0; ++ psock->bufptr = buffer; ++ psock->bufsize = buffersize; ++ psock->ustack = ustack; ++ buf_setup(&psock->buf, buffer, buffersize); ++ PT_INIT(&psock->pt); ++ PT_INIT(&psock->psockpt); ++} ++ ++/*---------------------------------------------------------------------------*/ +diff --git a/iscsiuio/src/uip/psock.h b/iscsiuio/src/uip/psock.h +new file mode 100644 +index 0000000..ea86ef5 +--- /dev/null ++++ b/iscsiuio/src/uip/psock.h +@@ -0,0 +1,383 @@ ++/* ++ * Copyright (c) 2004, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++/** ++ * \defgroup psock Protosockets library ++ * @{ ++ * ++ * The protosocket library provides an interface to the uIP stack that is ++ * similar to the traditional BSD socket interface. Unlike programs ++ * written for the ordinary uIP event-driven interface, programs ++ * written with the protosocket library are executed in a sequential ++ * fashion and does not have to be implemented as explicit state ++ * machines. ++ * ++ * Protosockets only work with TCP connections. ++ * ++ * The protosocket library uses \ref pt protothreads to provide ++ * sequential control flow. This makes the protosockets lightweight in ++ * terms of memory, but also means that protosockets inherits the ++ * functional limitations of protothreads. Each protosocket lives only ++ * within a single function. Automatic variables (stack variables) are ++ * not retained across a protosocket library function call. ++ * ++ * \note Because the protosocket library uses protothreads, local ++ * variables will not always be saved across a call to a protosocket ++ * library function. It is therefore advised that local variables are ++ * used with extreme care. ++ * ++ * The protosocket library provides functions for sending data without ++ * having to deal with retransmissions and acknowledgements, as well ++ * as functions for reading data without having to deal with data ++ * being split across more than one TCP segment. ++ * ++ * Because each protosocket runs as a protothread, the protosocket has to be ++ * started with a call to PSOCK_BEGIN() at the start of the function ++ * in which the protosocket is used. Similarly, the protosocket protothread can ++ * be terminated by a call to PSOCK_EXIT(). ++ * ++ */ ++ ++/** ++ * \file ++ * Protosocket library header file ++ * \author ++ * Adam Dunkels ++ * ++ */ ++ ++#ifndef __PSOCK_H__ ++#define __PSOCK_H__ ++ ++#include "uip.h" ++#include "uipopt.h" ++#include "pt.h" ++ ++ /* ++ * The structure that holds the state of a buffer. ++ * ++ * This structure holds the state of a uIP buffer. The structure has ++ * no user-visible elements, but is used through the functions ++ * provided by the library. ++ * ++ */ ++struct psock_buf { ++ u8_t *ptr; ++ unsigned short left; ++}; ++ ++/** ++ * The representation of a protosocket. ++ * ++ * The protosocket structrure is an opaque structure with no user-visible ++ * elements. ++ */ ++struct psock { ++ struct pt pt, psockpt; /* Protothreads - one that's using the psock ++ functions, and one that runs inside the ++ psock functions. */ ++ const u8_t *sendptr; /* Pointer to the next data to be sent. */ ++ u8_t *readptr; /* Pointer to the next data to be read. */ ++ ++ u8_t *bufptr; /* Pointer to the buffer used for buffering ++ incoming data. */ ++ ++ u16_t sendlen; /* The number of bytes left to be sent. */ ++ u16_t readlen; /* The number of bytes left to be read. */ ++ ++ struct psock_buf buf; /* The structure holding the state of the ++ input buffer. */ ++ unsigned int bufsize; /* The size of the input buffer. */ ++ ++ unsigned char state; /* The state of the protosocket. */ ++ ++ struct uip_stack *ustack; ++}; ++ ++void psock_init(struct uip_stack *ustack, ++ struct psock *psock, u8_t *buffer, unsigned int buffersize); ++/** ++ * Initialize a protosocket. ++ * ++ * This macro initializes a protosocket and must be called before the ++ * protosocket is used. The initialization also specifies the input buffer ++ * for the protosocket. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket to be ++ * initialized ++ * ++ * \param buffer (char *) A pointer to the input buffer for the ++ * protosocket. ++ * ++ * \param buffersize (unsigned int) The size of the input buffer. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_INIT(psock, buffer, buffersize) \ ++ psock_init(psock, buffer, buffersize) ++ ++/** ++ * Start the protosocket protothread in a function. ++ * ++ * This macro starts the protothread associated with the protosocket and ++ * must come before other protosocket calls in the function it is used. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket to be ++ * started. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_BEGIN(psock) PT_BEGIN(&((psock)->pt)) ++ ++PT_THREAD(psock_send(struct uip_stack *ustack, ++ struct psock *psock, const u8_t *buf, unsigned int len)); ++/** ++ * Send data. ++ * ++ * This macro sends data over a protosocket. The protosocket protothread blocks ++ * until all data has been sent and is known to have been received by ++ * the remote end of the TCP connection. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket over which ++ * data is to be sent. ++ * ++ * \param data (char *) A pointer to the data that is to be sent. ++ * ++ * \param datalen (unsigned int) The length of the data that is to be ++ * sent. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_SEND(psock, data, datalen) \ ++ PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, data, datalen)) ++ ++/** ++ * \brief Send a null-terminated string. ++ * \param psock Pointer to the protosocket. ++ * \param str The string to be sent. ++ * ++ * This function sends a null-terminated string over the ++ * protosocket. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_SEND_STR(psock, str) \ ++ PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, str, strlen(str))) ++ ++PT_THREAD(psock_generator_send(struct psock *psock, ++ unsigned short (*f) (void *), void *arg)); ++ ++/** ++ * \brief Generate data with a function and send it ++ * \param psock Pointer to the protosocket. ++ * \param generator Pointer to the generator function ++ * \param arg Argument to the generator function ++ * ++ * This function generates data and sends it over the ++ * protosocket. This can be used to dynamically generate ++ * data for a transmission, instead of generating the data ++ * in a buffer beforehand. This function reduces the need for ++ * buffer memory. The generator function is implemented by ++ * the application, and a pointer to the function is given ++ * as an argument with the call to PSOCK_GENERATOR_SEND(). ++ * ++ * The generator function should place the generated data ++ * directly in the uip_appdata buffer, and return the ++ * length of the generated data. The generator function is ++ * called by the protosocket layer when the data first is ++ * sent, and once for every retransmission that is needed. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_GENERATOR_SEND(psock, generator, arg) \ ++ PT_WAIT_THREAD(&((psock)->pt), \ ++ psock_generator_send(psock, generator, arg)) ++ ++/** ++ * Close a protosocket. ++ * ++ * This macro closes a protosocket and can only be called from within the ++ * protothread in which the protosocket lives. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket that is to ++ * be closed. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_CLOSE(psock) uip_close() ++ ++PT_THREAD(psock_readbuf(struct psock *psock)); ++/** ++ * Read data until the buffer is full. ++ * ++ * This macro will block waiting for data and read the data into the ++ * input buffer specified with the call to PSOCK_INIT(). Data is read ++ * until the buffer is full.. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket from which ++ * data should be read. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_READBUF(psock) \ ++ PT_WAIT_THREAD(&((psock)->pt), psock_readbuf(psock)) ++ ++PT_THREAD(psock_readto(struct psock *psock, unsigned char c)); ++/** ++ * Read data up to a specified character. ++ * ++ * This macro will block waiting for data and read the data into the ++ * input buffer specified with the call to PSOCK_INIT(). Data is only ++ * read until the specifieed character appears in the data stream. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket from which ++ * data should be read. ++ * ++ * \param c (char) The character at which to stop reading. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_READTO(psock, c) \ ++ PT_WAIT_THREAD(&((psock)->pt), psock_readto(psock, c)) ++ ++/** ++ * The length of the data that was previously read. ++ * ++ * This macro returns the length of the data that was previously read ++ * using PSOCK_READTO() or PSOCK_READ(). ++ * ++ * \param psock (struct psock *) A pointer to the protosocket holding the data. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_DATALEN(psock) psock_datalen(psock) ++ ++u16_t psock_datalen(struct psock *psock); ++ ++/** ++ * Exit the protosocket's protothread. ++ * ++ * This macro terminates the protothread of the protosocket and should ++ * almost always be used in conjunction with PSOCK_CLOSE(). ++ * ++ * \sa PSOCK_CLOSE_EXIT() ++ * ++ * \param psock (struct psock *) A pointer to the protosocket. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_EXIT(psock) PT_EXIT(&((psock)->pt)) ++ ++/** ++ * Close a protosocket and exit the protosocket's protothread. ++ * ++ * This macro closes a protosocket and exits the protosocket's protothread. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_CLOSE_EXIT(psock) \ ++ do { \ ++ PSOCK_CLOSE(psock); \ ++ PSOCK_EXIT(psock); \ ++ } while (0) ++ ++/** ++ * Declare the end of a protosocket's protothread. ++ * ++ * This macro is used for declaring that the protosocket's protothread ++ * ends. It must always be used together with a matching PSOCK_BEGIN() ++ * macro. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_END(psock) PT_END(&((psock)->pt)) ++ ++char psock_newdata(struct psock *s); ++ ++/** ++ * Check if new data has arrived on a protosocket. ++ * ++ * This macro is used in conjunction with the PSOCK_WAIT_UNTIL() ++ * macro to check if data has arrived on a protosocket. ++ * ++ * \param psock (struct psock *) A pointer to the protosocket. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_NEWDATA(psock) psock_newdata(psock) ++ ++/** ++ * Wait until a condition is true. ++ * ++ * This macro blocks the protothread until the specified condition is ++ * true. The macro PSOCK_NEWDATA() can be used to check if new data ++ * arrives when the protosocket is waiting. ++ * ++ * Typically, this macro is used as follows: ++ * ++ \code ++ PT_THREAD(thread(struct psock *s, struct timer *t)) ++ { ++ PSOCK_BEGIN(s); ++ ++ PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t)); ++ ++ if(PSOCK_NEWDATA(s)) { ++ PSOCK_READTO(s, '\n'); ++ } else { ++ handle_timed_out(s); ++ } ++ ++ PSOCK_END(s); ++ } ++ \endcode ++ * ++ * \param psock (struct psock *) A pointer to the protosocket. ++ * \param condition The condition to wait for. ++ * ++ * \hideinitializer ++ */ ++#define PSOCK_WAIT_UNTIL(psock, condition) \ ++ PT_WAIT_UNTIL(&((psock)->pt), (condition)); ++ ++#define PSOCK_WAIT_THREAD(psock, condition) \ ++ PT_WAIT_THREAD(&((psock)->pt), (condition)) ++ ++#endif /* __PSOCK_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/pt.h b/iscsiuio/src/uip/pt.h +new file mode 100644 +index 0000000..ffb1d15 +--- /dev/null ++++ b/iscsiuio/src/uip/pt.h +@@ -0,0 +1,322 @@ ++/* ++ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++/** ++ * \addtogroup pt ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Protothreads implementation. ++ * \author ++ * Adam Dunkels ++ * ++ */ ++ ++#ifndef __PT_H__ ++#define __PT_H__ ++ ++#include "lc.h" ++ ++struct pt { ++ unsigned short lc; ++}; ++ ++#define PT_WAITING 0 ++#define PT_EXITED 1 ++#define PT_ENDED 2 ++#define PT_YIELDED 3 ++ ++/** ++ * \name Initialization ++ * @{ ++ */ ++ ++/** ++ * Initialize a protothread. ++ * ++ * Initializes a protothread. Initialization must be done prior to ++ * starting to execute the protothread. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * ++ * \sa PT_SPAWN() ++ * ++ * \hideinitializer ++ */ ++#define PT_INIT(pt) LC_INIT((pt)->lc) ++ ++/** @} */ ++ ++/** ++ * \name Declaration and definition ++ * @{ ++ */ ++ ++/** ++ * Declaration of a protothread. ++ * ++ * This macro is used to declare a protothread. All protothreads must ++ * be declared with this macro. ++ * ++ * \param name_args The name and arguments of the C function ++ * implementing the protothread. ++ * ++ * \hideinitializer ++ */ ++#define PT_THREAD(name_args) char name_args ++ ++/** ++ * Declare the start of a protothread inside the C function ++ * implementing the protothread. ++ * ++ * This macro is used to declare the starting point of a ++ * protothread. It should be placed at the start of the function in ++ * which the protothread runs. All C statements above the PT_BEGIN() ++ * invokation will be executed each time the protothread is scheduled. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * ++ * \hideinitializer ++ */ ++#define PT_BEGIN(pt) { char PT_YIELD_FLAG __attribute__((__unused__)) = 1; LC_RESUME((pt)->lc) ++ ++/** ++ * Declare the end of a protothread. ++ * ++ * This macro is used for declaring that a protothread ends. It must ++ * always be used together with a matching PT_BEGIN() macro. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * ++ * \hideinitializer ++ */ ++#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ ++ PT_INIT(pt); return PT_ENDED; } ++ ++/** @} */ ++ ++/** ++ * \name Blocked wait ++ * @{ ++ */ ++ ++/** ++ * Block and wait until condition is true. ++ * ++ * This macro blocks the protothread until the specified condition is ++ * true. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * \param condition The condition. ++ * ++ * \hideinitializer ++ */ ++#define PT_WAIT_UNTIL(pt, condition) \ ++ do { \ ++ LC_SET((pt)->lc); \ ++ if (!(condition)) { \ ++ return PT_WAITING; \ ++ } \ ++ } while (0) ++ ++/** ++ * Block and wait while condition is true. ++ * ++ * This function blocks and waits while condition is true. See ++ * PT_WAIT_UNTIL(). ++ * ++ * \param pt A pointer to the protothread control structure. ++ * \param cond The condition. ++ * ++ * \hideinitializer ++ */ ++#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) ++ ++/** @} */ ++ ++/** ++ * \name Hierarchical protothreads ++ * @{ ++ */ ++ ++/** ++ * Block and wait until a child protothread completes. ++ * ++ * This macro schedules a child protothread. The current protothread ++ * will block until the child protothread completes. ++ * ++ * \note The child protothread must be manually initialized with the ++ * PT_INIT() function before this function is used. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * \param thread The child protothread with arguments ++ * ++ * \sa PT_SPAWN() ++ * ++ * \hideinitializer ++ */ ++#define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) ++ ++/** ++ * Spawn a child protothread and wait until it exits. ++ * ++ * This macro spawns a child protothread and waits until it exits. The ++ * macro can only be used within a protothread. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * \param child A pointer to the child protothread's control structure. ++ * \param thread The child protothread with arguments ++ * ++ * \hideinitializer ++ */ ++#define PT_SPAWN(pt, child, thread) \ ++ do { \ ++ PT_INIT((child)); \ ++ PT_WAIT_THREAD((pt), (thread)); \ ++ } while (0) ++ ++/** @} */ ++ ++/** ++ * \name Exiting and restarting ++ * @{ ++ */ ++ ++/** ++ * Restart the protothread. ++ * ++ * This macro will block and cause the running protothread to restart ++ * its execution at the place of the PT_BEGIN() call. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * ++ * \hideinitializer ++ */ ++#define PT_RESTART(pt) \ ++ do { \ ++ PT_INIT(pt); \ ++ return PT_WAITING; \ ++ } while (0) ++ ++/** ++ * Exit the protothread. ++ * ++ * This macro causes the protothread to exit. If the protothread was ++ * spawned by another protothread, the parent protothread will become ++ * unblocked and can continue to run. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * ++ * \hideinitializer ++ */ ++#define PT_EXIT(pt) \ ++ do { \ ++ PT_INIT(pt); \ ++ return PT_EXITED; \ ++ } while (0) ++ ++/** @} */ ++ ++/** ++ * \name Calling a protothread ++ * @{ ++ */ ++ ++/** ++ * Schedule a protothread. ++ * ++ * This function shedules a protothread. The return value of the ++ * function is non-zero if the protothread is running or zero if the ++ * protothread has exited. ++ * ++ * \param f The call to the C function implementing the protothread to ++ * be scheduled ++ * ++ * \hideinitializer ++ */ ++#define PT_SCHEDULE(f) ((f) == PT_WAITING) ++ ++/** @} */ ++ ++/** ++ * \name Yielding from a protothread ++ * @{ ++ */ ++ ++/** ++ * Yield from the current protothread. ++ * ++ * This function will yield the protothread, thereby allowing other ++ * processing to take place in the system. ++ * ++ * \param pt A pointer to the protothread control structure. ++ * ++ * \hideinitializer ++ */ ++#define PT_YIELD(pt) \ ++ do { \ ++ PT_YIELD_FLAG = 0; \ ++ LC_SET((pt)->lc); \ ++ if (PT_YIELD_FLAG == 0) { \ ++ return PT_YIELDED; \ ++ } \ ++ } while (0) ++ ++/** ++ * \brief Yield from the protothread until a condition occurs. ++ * \param pt A pointer to the protothread control structure. ++ * \param cond The condition. ++ * ++ * This function will yield the protothread, until the ++ * specified condition evaluates to true. ++ * ++ * ++ * \hideinitializer ++ */ ++#define PT_YIELD_UNTIL(pt, cond) \ ++ do { \ ++ PT_YIELD_FLAG = 0; \ ++ LC_SET((pt)->lc); \ ++ if ((PT_YIELD_FLAG == 0) || !(cond)) { \ ++ return PT_YIELDED; \ ++ } \ ++ } while (0) ++ ++/** @} */ ++ ++#endif /* __PT_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/timer.c b/iscsiuio/src/uip/timer.c +new file mode 100644 +index 0000000..da77148 +--- /dev/null ++++ b/iscsiuio/src/uip/timer.c +@@ -0,0 +1,127 @@ ++/** ++ * \addtogroup timer ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Timer library implementation. ++ * \author ++ * Adam Dunkels ++ */ ++ ++/* ++ * Copyright (c) 2004, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++ ++#include "clock.h" ++#include "timer.h" ++ ++/*---------------------------------------------------------------------------*/ ++/** ++ * Set a timer. ++ * ++ * This function is used to set a timer for a time sometime in the ++ * future. The function timer_expired() will evaluate to true after ++ * the timer has expired. ++ * ++ * \param t A pointer to the timer ++ * \param interval The interval before the timer expires. ++ * ++ */ ++void timer_set(struct timer *t, clock_time_t interval) ++{ ++ t->interval = interval; ++ t->start = clock_time(); ++} ++ ++/*---------------------------------------------------------------------------*/ ++/** ++ * Reset the timer with the same interval. ++ * ++ * This function resets the timer with the same interval that was ++ * given to the timer_set() function. The start point of the interval ++ * is the exact time that the timer last expired. Therefore, this ++ * function will cause the timer to be stable over time, unlike the ++ * timer_rester() function. ++ * ++ * \param t A pointer to the timer. ++ * ++ * \sa timer_restart() ++ */ ++void timer_reset(struct timer *t) ++{ ++ t->start += t->interval; ++} ++ ++/*---------------------------------------------------------------------------*/ ++/** ++ * Restart the timer from the current point in time ++ * ++ * This function restarts a timer with the same interval that was ++ * given to the timer_set() function. The timer will start at the ++ * current time. ++ * ++ * \note A periodic timer will drift if this function is used to reset ++ * it. For preioric timers, use the timer_reset() function instead. ++ * ++ * \param t A pointer to the timer. ++ * ++ * \sa timer_reset() ++ */ ++void timer_restart(struct timer *t) ++{ ++ t->start = clock_time(); ++} ++ ++/*---------------------------------------------------------------------------*/ ++/** ++ * Check if a timer has expired. ++ * ++ * This function tests if a timer has expired and returns true or ++ * false depending on its status. ++ * ++ * \param t A pointer to the timer ++ * ++ * \return Non-zero if the timer has expired, zero otherwise. ++ * ++ */ ++int timer_expired(struct timer *t) ++{ ++ return (clock_time_t) (clock_time() - t->start) >= ++ (clock_time_t) t->interval; ++} ++ ++/*---------------------------------------------------------------------------*/ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/timer.h b/iscsiuio/src/uip/timer.h +new file mode 100644 +index 0000000..12739fd +--- /dev/null ++++ b/iscsiuio/src/uip/timer.h +@@ -0,0 +1,84 @@ ++/** ++ * \defgroup timer Timer library ++ * ++ * The timer library provides functions for setting, resetting and ++ * restarting timers, and for checking if a timer has expired. An ++ * application must "manually" check if its timers have expired; this ++ * is not done automatically. ++ * ++ * A timer is declared as a \c struct \c timer and all access to the ++ * timer is made by a pointer to the declared timer. ++ * ++ * \note The timer library uses the \ref clock "Clock library" to ++ * measure time. Intervals should be specified in the format used by ++ * the clock library. ++ * ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Timer library header file. ++ * \author ++ * Adam Dunkels ++ */ ++ ++/* ++ * Copyright (c) 2004, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ * Author: Adam Dunkels ++ * ++ */ ++#ifndef __TIMER_H__ ++#define __TIMER_H__ ++ ++#include "clock.h" ++ ++/** ++ * A timer. ++ * ++ * This structure is used for declaring a timer. The timer must be set ++ * with timer_set() before it can be used. ++ * ++ * \hideinitializer ++ */ ++struct timer { ++ clock_time_t start; ++ clock_time_t interval; ++}; ++ ++void timer_set(struct timer *t, clock_time_t interval); ++void timer_reset(struct timer *t); ++void timer_restart(struct timer *t); ++int timer_expired(struct timer *t); ++ ++#endif /* __TIMER_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/uip-neighbor.c b/iscsiuio/src/uip/uip-neighbor.c +new file mode 100644 +index 0000000..4c80c32 +--- /dev/null ++++ b/iscsiuio/src/uip/uip-neighbor.c +@@ -0,0 +1,219 @@ ++/* ++ * Copyright (c) 2006, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++ ++/** ++ * \file ++ * Database of link-local neighbors, used by IPv6 code and ++ * to be used by a future ARP code rewrite. ++ * \author ++ * Adam Dunkels ++ */ ++ ++#include "logger.h" ++#include "uip.h" ++#include "uip-neighbor.h" ++ ++#include ++#include ++#include ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define PFX "uip-neigh " ++ ++#define MAX_TIME 128 ++ ++/*---------------------------------------------------------------------------*/ ++void uip_neighbor_init(struct uip_stack *ustack) ++{ ++ int i; ++ ++ pthread_mutex_lock(&ustack->lock); ++ for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { ++ memset(&(ustack->neighbor_entries[i].ipaddr), 0, ++ sizeof(ustack->neighbor_entries[i].ipaddr)); ++ memset(&(ustack->neighbor_entries[i].mac_addr), 0, ++ sizeof(ustack->neighbor_entries[i].mac_addr)); ++ ustack->neighbor_entries[i].time = MAX_TIME; ++ } ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++void uip_neighbor_add(struct uip_stack *ustack, ++ struct in6_addr *addr6, struct uip_eth_addr *addr) ++{ ++ int i, oldest; ++ u8_t oldest_time; ++ char buf[INET6_ADDRSTRLEN]; ++ ++ inet_ntop(AF_INET6, addr6, buf, sizeof(buf)); ++ ++ pthread_mutex_lock(&ustack->lock); ++ ++ /* Find the first unused entry or the oldest used entry. */ ++ oldest_time = 0; ++ oldest = 0; ++ for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { ++ if (ustack->neighbor_entries[i].time == MAX_TIME) { ++ oldest = i; ++ break; ++ } ++ if (uip_ip6addr_cmp ++ (ustack->neighbor_entries[i].ipaddr.s6_addr, addr6)) { ++ oldest = i; ++ break; ++ } ++ if (ustack->neighbor_entries[i].time > oldest_time) { ++ oldest = i; ++ oldest_time = ustack->neighbor_entries[i].time; ++ } ++ } ++ ++ /* Use the oldest or first free entry (either pointed to by the ++ "oldest" variable). */ ++ ustack->neighbor_entries[oldest].time = 0; ++ uip_ip6addr_copy(ustack->neighbor_entries[oldest].ipaddr.s6_addr, ++ addr6); ++ memcpy(&ustack->neighbor_entries[oldest].mac_addr, addr, ++ sizeof(struct uip_eth_addr)); ++ ++ LOG_DEBUG("Adding neighbor %s with " ++ "mac address %02x:%02x:%02x:%02x:%02x:%02x at %d", ++ buf, addr->addr[0], addr->addr[1], addr->addr[2], ++ addr->addr[3], addr->addr[4], addr->addr[5], oldest); ++ ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++/*---------------------------------------------------------------------------*/ ++static struct neighbor_entry *find_entry(struct uip_stack *ustack, ++ struct in6_addr *addr6) ++{ ++ int i; ++ ++ for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { ++ if (uip_ip6addr_cmp ++ (ustack->neighbor_entries[i].ipaddr.s6_addr, ++ addr6->s6_addr)) { ++ return &ustack->neighbor_entries[i]; ++ } ++ } ++ ++ return NULL; ++} ++ ++/*---------------------------------------------------------------------------*/ ++void uip_neighbor_update(struct uip_stack *ustack, struct in6_addr *addr6) ++{ ++ struct neighbor_entry *e; ++ ++ pthread_mutex_lock(&ustack->lock); ++ ++ e = find_entry(ustack, addr6); ++ if (e != NULL) ++ e->time = 0; ++ ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++/*---------------------------------------------------------------------------*/ ++int uip_neighbor_lookup(struct uip_stack *ustack, ++ struct in6_addr *addr6, uint8_t *mac_addr) ++{ ++ struct neighbor_entry *e; ++ ++ pthread_mutex_lock(&ustack->lock); ++ e = find_entry(ustack, addr6); ++ if (e != NULL) { ++ char addr6_str[INET6_ADDRSTRLEN]; ++ uint8_t *entry_mac_addr; ++ ++ addr6_str[0] = '\0'; ++ inet_ntop(AF_INET6, addr6->s6_addr, addr6_str, ++ sizeof(addr6_str)); ++ entry_mac_addr = (uint8_t *)&e->mac_addr.addr; ++ ++ LOG_DEBUG(PFX ++ "Found %s at %02x:%02x:%02x:%02x:%02x:%02x", ++ addr6_str, ++ entry_mac_addr[0], entry_mac_addr[1], ++ entry_mac_addr[2], entry_mac_addr[3], ++ entry_mac_addr[4], entry_mac_addr[5]); ++ ++ memcpy(mac_addr, entry_mac_addr, sizeof(e->mac_addr)); ++ pthread_mutex_unlock(&ustack->lock); ++ return 0; ++ } ++ ++ pthread_mutex_unlock(&ustack->lock); ++ return -ENOENT; ++} ++ ++void uip_neighbor_out(struct uip_stack *ustack) ++{ ++ struct neighbor_entry *e; ++ struct uip_eth_hdr *eth_hdr = ++ (struct uip_eth_hdr *)ustack->data_link_layer; ++ struct uip_ipv6_hdr *ipv6_hdr = ++ (struct uip_ipv6_hdr *)ustack->network_layer; ++ ++ pthread_mutex_lock(&ustack->lock); ++ ++ /* Find the destination IP address in the neighbor table and construct ++ the Ethernet header. If the destination IP addres isn't on the ++ local network, we use the default router's IP address instead. ++ ++ If not ARP table entry is found, we overwrite the original IP ++ packet with an ARP request for the IP address. */ ++ e = find_entry(ustack, (struct in6_addr *)ipv6_hdr->destipaddr); ++ if (e == NULL) { ++ struct uip_eth_addr eth_addr_tmp; ++ ++ memcpy(ð_addr_tmp, eth_hdr->src.addr, sizeof(eth_addr_tmp)); ++ memcpy(eth_hdr->src.addr, ustack->uip_ethaddr.addr, ++ sizeof(eth_hdr->src.addr)); ++ memcpy(eth_hdr->dest.addr, ð_addr_tmp, ++ sizeof(eth_hdr->dest.addr)); ++ ++ pthread_mutex_unlock(&ustack->lock); ++ return; ++ } ++ ++ memcpy(eth_hdr->dest.addr, &e->mac_addr, sizeof(eth_hdr->dest.addr)); ++ memcpy(eth_hdr->src.addr, ustack->uip_ethaddr.addr, ++ sizeof(eth_hdr->src.addr)); ++ ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++/*---------------------------------------------------------------------------*/ +diff --git a/iscsiuio/src/uip/uip-neighbor.h b/iscsiuio/src/uip/uip-neighbor.h +new file mode 100644 +index 0000000..d10c57b +--- /dev/null ++++ b/iscsiuio/src/uip/uip-neighbor.h +@@ -0,0 +1,105 @@ ++/* ++ * Copyright (c) 2006, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++ ++/** ++ * \file ++ * Header file for database of link-local neighbors, used by ++ * IPv6 code and to be used by future ARP code. ++ * \author ++ * Adam Dunkels ++ */ ++ ++#ifndef __UIP_NEIGHBOR_H__ ++#define __UIP_NEIGHBOR_H__ ++ ++#include "uip.h" ++#include "uip_eth.h" ++ ++/* ICMP types */ ++/* ICMPv6 error Messages */ ++#define ICMPV6_DEST_UNREACH 1 ++#define ICMPV6_PKT_TOOBIG 2 ++#define ICMPV6_TIME_EXCEED 3 ++#define ICMPV6_PARAMPROB 4 ++ ++/* ICMPv6 Informational Messages */ ++#define ICMPV6_ECHO_REQUEST 128 ++#define ICMPV6_ECHO_REPLY 129 ++#define ICMPV6_MGM_QUERY 130 ++#define ICMPV6_MGM_REPORT 131 ++#define ICMPV6_MGM_REDUCTION 132 ++ ++/* Codes for Destination Unreachable */ ++#define ICMPV6_NOROUTE 0 ++#define ICMPV6_ADM_PROHIBITED 1 ++#define ICMPV6_NOT_NEIGHBOUR 2 ++#define ICMPV6_ADDR_UNREACH 3 ++#define ICMPV6_PORT_UNREACH 4 ++ ++/* Codes for Time Exceeded */ ++#define ICMPV6_EXC_HOPLIMIT 0 ++#define ICMPV6_EXC_FRAGTIME 1 ++ ++/* Codes for Parameter Problem */ ++#define ICMPV6_HDR_FIELD 0 ++#define ICMPV6_UNK_NEXTHDR 1 ++#define ICMPV6_UNK_OPTION 2 ++ ++#if 0 ++struct __attribute__ ((__packed__)) icmpv6_hdr { ++ u8_t type; ++ u8_t code; ++ u16_t checksum; ++ union { ++ struct { ++ u16_t id; ++ u16_t sequence; ++ } echo; ++ u32_t gateway; ++ struct { ++ u16_t unused; ++ u16_t mtu; ++ } frag; ++ } un; ++}; ++#endif ++ ++void uip_neighbor_init(struct uip_stack *ustack); ++void uip_neighbor_add(struct uip_stack *ustack, ++ struct in6_addr *addr6, struct uip_eth_addr *addr); ++void uip_neighbor_update(struct uip_stack *ustack, struct in6_addr *addr6); ++int uip_neighbor_lookup(struct uip_stack *ustack, struct in6_addr *ipaddr, ++ uint8_t *mac_addr); ++void uip_neighbor_periodic(void); ++void uip_neighbor_out(struct uip_stack *ustack); ++ ++#endif /* __UIP-NEIGHBOR_H__ */ +diff --git a/iscsiuio/src/uip/uip.c b/iscsiuio/src/uip/uip.c +new file mode 100644 +index 0000000..ec3d6ce +--- /dev/null ++++ b/iscsiuio/src/uip/uip.c +@@ -0,0 +1,2405 @@ ++#include ++#include ++#include ++#include ++#include ++#include "uip.h" ++#include "dhcpc.h" ++#include "ipv6_ndpc.h" ++#include "brcm_iscsi.h" ++ ++/** ++ * \defgroup uip The uIP TCP/IP stack ++ * @{ ++ * ++ * uIP is an implementation of the TCP/IP protocol stack intended for ++ * small 8-bit and 16-bit microcontrollers. ++ * ++ * uIP provides the necessary protocols for Internet communication, ++ * with a very small code footprint and RAM requirements - the uIP ++ * code size is on the order of a few kilobytes and RAM usage is on ++ * the order of a few hundred bytes. ++ */ ++ ++/** ++ * \file ++ * The uIP TCP/IP stack code. ++ * \author Adam Dunkels ++ */ ++ ++/* ++ * Copyright (c) 2001-2003, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++/* ++ * uIP is a small implementation of the IP, UDP and TCP protocols (as ++ * well as some basic ICMP stuff). The implementation couples the IP, ++ * UDP, TCP and the application layers very tightly. To keep the size ++ * of the compiled code down, this code frequently uses the goto ++ * statement. While it would be possible to break the uip_process() ++ * function into many smaller functions, this would increase the code ++ * size because of the overhead of parameter passing and the fact that ++ * the optimier would not be as efficient. ++ * ++ * The principle is that we have a small buffer, called the uip_buf, ++ * in which the device driver puts an incoming packet. The TCP/IP ++ * stack parses the headers in the packet, and calls the ++ * application. If the remote host has sent data to the application, ++ * this data is present in the uip_buf and the application read the ++ * data from there. It is up to the application to put this data into ++ * a byte stream if needed. The application will not be fed with data ++ * that is out of sequence. ++ * ++ * If the application whishes to send data to the peer, it should put ++ * its data into the uip_buf. The uip_appdata pointer points to the ++ * first available byte. The TCP/IP stack will calculate the ++ * checksums, and fill in the necessary header fields and finally send ++ * the packet back to the peer. ++*/ ++ ++#include "logger.h" ++ ++#include "uip.h" ++#include "uipopt.h" ++#include "uip_arch.h" ++#include "uip_eth.h" ++#include "uip-neighbor.h" ++ ++#include ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define PFX "uip " ++ ++static const uip_ip6addr_t all_ones_addr6 = { ++ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff ++}; ++static const uip_ip4addr_t all_ones_addr4 = { 0xffff, 0xffff }; ++ ++const uip_ip6addr_t all_zeroes_addr6 = { ++ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 ++}; ++const uip_ip4addr_t all_zeroes_addr4 = { 0x0000, 0x0000 }; ++ ++const uint8_t mutlicast_ipv6_prefix[16] = { ++ 0xfc, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++const uint8_t link_local_addres_prefix[16] = { ++ 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++const uint32_t link_local_address_prefix_length = 10; ++ ++/* Structures and definitions. */ ++#define TCP_FIN 0x01 ++#define TCP_SYN 0x02 ++#define TCP_RST 0x04 ++#define TCP_PSH 0x08 ++#define TCP_ACK 0x10 ++#define TCP_URG 0x20 ++#define TCP_CTL 0x3f ++ ++#define TCP_OPT_END 0 /* End of TCP options list */ ++#define TCP_OPT_NOOP 1 /* "No-operation" TCP option */ ++#define TCP_OPT_MSS 2 /* Maximum segment size TCP option */ ++ ++#define TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ ++ ++#define ICMP_ECHO_REPLY 0 ++#define ICMP_ECHO 8 ++ ++#define ICMP6_ECHO_REPLY 129 ++#define ICMP6_ECHO 128 ++#define ICMP6_NEIGHBOR_SOLICITATION 135 ++#define ICMP6_NEIGHBOR_ADVERTISEMENT 136 ++ ++#define ICMP6_FLAG_S (1 << 6) ++ ++#define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 ++#define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 ++ ++/* Macros. */ ++#define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0]) ++#define UDPBUF(ustack) ((struct uip_udpip_hdr *)ustack->network_layer) ++ ++/****************************************************************************** ++ * Utility Functions ++ *****************************************************************************/ ++static int is_ipv6(struct uip_stack *ustack) ++{ ++ u16_t type; ++ ++ type = ETH_BUF(ustack->uip_buf)->type; ++ type = ntohs(type); ++ if (type == UIP_ETHTYPE_8021Q) ++ type = ntohs(VLAN_ETH_BUF(ustack->uip_buf)->type); ++ else ++ type = ntohs(ETH_BUF(ustack->uip_buf)->type); ++ ++ return (type == UIP_ETHTYPE_IPv6); ++} ++ ++int is_ipv6_link_local_address(uip_ip6addr_t *addr) ++{ ++ u8_t *test_adddr = (u8_t *) addr; ++ u8_t test_remainder; ++ ++ if (test_adddr[0] != link_local_addres_prefix[0]) ++ return 0; ++ ++ test_remainder = (test_adddr[1] & 0xC0) >> 6; ++ if (test_remainder != 2) ++ return 0; ++ ++ return 1; ++} ++ ++void uip_sethostaddr4(struct uip_stack *ustack, uip_ip4addr_t *addr) ++{ ++ pthread_mutex_lock(&ustack->lock); ++ uip_ip4addr_copy(ustack->hostaddr, (addr)); ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++void uip_setdraddr4(struct uip_stack *ustack, uip_ip4addr_t *addr) ++{ ++ pthread_mutex_lock(&ustack->lock); ++ uip_ip4addr_copy(ustack->default_route_addr, (addr)); ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++void uip_setnetmask4(struct uip_stack *ustack, uip_ip4addr_t *addr) ++{ ++ pthread_mutex_lock(&ustack->lock); ++ uip_ip4addr_copy(ustack->netmask, (addr)); ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++void uip_setethernetmac(struct uip_stack *ustack, uint8_t *mac) ++{ ++ pthread_mutex_lock(&ustack->lock); ++ memcpy(ustack->uip_ethaddr.addr, (mac), 6); ++ pthread_mutex_unlock(&ustack->lock); ++} ++ ++void set_uip_stack(struct uip_stack *ustack, ++ uip_ip4addr_t *ip, ++ uip_ip4addr_t *netmask, ++ uip_ip4addr_t *default_route, uint8_t *mac_addr) ++{ ++ uip_sethostaddr4(ustack, ip); ++ uip_setnetmask4(ustack, netmask); ++ uip_setdraddr4(ustack, default_route); ++ uip_setethernetmac(ustack, mac_addr); ++} ++ ++#if !UIP_ARCH_ADD32 ++void uip_add32(u8_t *op32, u16_t op16, u8_t *uip_acc32) ++{ ++ uip_acc32[3] = op32[3] + (op16 & 0xff); ++ uip_acc32[2] = op32[2] + (op16 >> 8); ++ uip_acc32[1] = op32[1]; ++ uip_acc32[0] = op32[0]; ++ ++ if (uip_acc32[2] < (op16 >> 8)) { ++ ++uip_acc32[1]; ++ if (uip_acc32[1] == 0) ++ ++uip_acc32[0]; ++ } ++ ++ if (uip_acc32[3] < (op16 & 0xff)) { ++ ++uip_acc32[2]; ++ if (uip_acc32[2] == 0) { ++ ++uip_acc32[1]; ++ if (uip_acc32[1] == 0) ++ ++uip_acc32[0]; ++ } ++ } ++} ++ ++#endif /* UIP_ARCH_ADD32 */ ++ ++#if !UIP_ARCH_CHKSUM ++/*---------------------------------------------------------------------------*/ ++static u16_t chksum(u16_t sum, const u8_t *data, u16_t len) ++{ ++ u16_t t; ++ const u8_t *dataptr; ++ const u8_t *last_byte; ++ ++ dataptr = data; ++ last_byte = data + len - 1; ++ ++ while (dataptr < last_byte) { /* At least two more bytes */ ++ t = (dataptr[0] << 8) + dataptr[1]; ++ sum += t; ++ if (sum < t) ++ sum++; /* carry */ ++ dataptr += 2; ++ } ++ ++ if (dataptr == last_byte) { ++ t = (dataptr[0] << 8) + 0; ++ sum += t; ++ if (sum < t) ++ sum++; /* carry */ ++ } ++ ++ /* Return sum in host byte order. */ ++ return sum; ++} ++ ++/*---------------------------------------------------------------------------*/ ++u16_t uip_chksum(u16_t *data, u16_t len) ++{ ++ return htons(chksum(0, (u8_t *)data, len)); ++} ++ ++/*---------------------------------------------------------------------------*/ ++#ifndef UIP_ARCH_IPCHKSUM ++u16_t uip_ipchksum(struct uip_stack *ustack) ++{ ++ u16_t sum; ++ u16_t uip_iph_len; ++ ++ if (is_ipv6(ustack)) ++ uip_iph_len = UIP_IPv6_H_LEN; ++ else ++ uip_iph_len = UIP_IPv4_H_LEN; ++ ++ sum = chksum(0, ustack->network_layer, uip_iph_len); ++ return (sum == 0) ? 0xffff : htons(sum); ++} ++#endif ++ ++/*---------------------------------------------------------------------------*/ ++static u16_t upper_layer_chksum_ipv4(struct uip_stack *ustack, u8_t proto) ++{ ++ u16_t upper_layer_len; ++ u16_t sum; ++ struct uip_tcp_ipv4_hdr *tcp_ipv4_hdr = NULL; ++ ++ tcp_ipv4_hdr = (struct uip_tcp_ipv4_hdr *)ustack->network_layer; ++ ++ upper_layer_len = (((u16_t) (tcp_ipv4_hdr->len[0]) << 8) + ++ tcp_ipv4_hdr->len[1]) - UIP_IPv4_H_LEN; ++ ++ /* First sum pseudoheader. */ ++ /* IP protocol and length fields. This addition cannot carry. */ ++ sum = upper_layer_len + proto; ++ ++ sum = ++ chksum(sum, (u8_t *)&tcp_ipv4_hdr->srcipaddr[0], ++ 2 * sizeof(uip_ip4addr_t)); ++ /* Sum TCP header and data. */ ++ sum = chksum(sum, ustack->network_layer + UIP_IPv4_H_LEN, ++ upper_layer_len); ++ ++ return (sum == 0) ? 0xffff : htons(sum); ++} ++ ++/*---------------------------------------------------------------------------*/ ++static uint16_t upper_layer_checksum_ipv6(uint8_t *data, uint8_t proto) ++{ ++ uint16_t upper_layer_len; ++ uint16_t sum; ++ struct ip6_hdr *ipv6_hdr; ++ uint8_t *upper_layer; ++ uint32_t val; ++ ++ ipv6_hdr = (struct ip6_hdr *)data; ++ ++ upper_layer_len = ntohs(ipv6_hdr->ip6_plen); ++ ++ /* First sum pseudoheader. */ ++ sum = 0; ++ sum = chksum(sum, (const u8_t *)ipv6_hdr->ip6_src.s6_addr, ++ sizeof(ipv6_hdr->ip6_src)); ++ sum = chksum(sum, (const u8_t *)ipv6_hdr->ip6_dst.s6_addr, ++ sizeof(ipv6_hdr->ip6_dst)); ++ ++ val = htons(upper_layer_len); ++ sum = chksum(sum, (u8_t *)&val, sizeof(val)); ++ ++ val = htons(proto); ++ sum = chksum(sum, (u8_t *)&val, sizeof(val)); ++ ++ upper_layer = (uint8_t *)(ipv6_hdr + 1); ++ sum = chksum(sum, upper_layer, upper_layer_len); ++ ++ return (sum == 0) ? 0xffff : htons(sum); ++} ++ ++/*---------------------------------------------------------------------------*/ ++ ++u16_t uip_icmp6chksum(struct uip_stack *ustack) ++{ ++ uint8_t *data = ustack->network_layer; ++ ++ return upper_layer_checksum_ipv6(data, UIP_PROTO_ICMP6); ++} ++ ++uint16_t icmpv6_checksum(uint8_t *data) ++{ ++ return upper_layer_checksum_ipv6(data, IPPROTO_ICMPV6); ++} ++ ++/*---------------------------------------------------------------------------*/ ++u16_t uip_tcpchksum(struct uip_stack *ustack) ++{ ++ return upper_layer_chksum_ipv4(ustack, UIP_PROTO_TCP); ++} ++ ++/*---------------------------------------------------------------------------*/ ++#if UIP_UDP_CHECKSUMS ++static u16_t uip_udpchksum_ipv4(struct uip_stack *ustack) ++{ ++ return upper_layer_chksum_ipv4(ustack, UIP_PROTO_UDP); ++} ++ ++static u16_t uip_udpchksum_ipv6(struct uip_stack *ustack) ++{ ++ uint8_t *data = ustack->network_layer; ++ ++ return upper_layer_checksum_ipv6(data, UIP_PROTO_UDP); ++} ++ ++u16_t uip_udpchksum(struct uip_stack *ustack) ++{ ++ if (is_ipv6(ustack)) ++ return uip_udpchksum_ipv6(ustack); ++ else ++ return uip_udpchksum_ipv4(ustack); ++} ++#endif /* UIP_UDP_CHECKSUMS */ ++#endif /* UIP_ARCH_CHKSUM */ ++/*---------------------------------------------------------------------------*/ ++void uip_init(struct uip_stack *ustack, uint8_t ipv6_enabled) ++{ ++ u8_t c; ++ ++ for (c = 0; c < UIP_LISTENPORTS; ++c) ++ ustack->uip_listenports[c] = 0; ++ for (c = 0; c < UIP_CONNS; ++c) ++ ustack->uip_conns[c].tcpstateflags = UIP_CLOSED; ++#if UIP_ACTIVE_OPEN ++ ustack->lastport = 1024; ++#endif /* UIP_ACTIVE_OPEN */ ++ ++#if UIP_UDP ++ for (c = 0; c < UIP_UDP_CONNS; ++c) ++ ustack->uip_udp_conns[c].lport = 0; ++#endif /* UIP_UDP */ ++ ++ /* IPv4 initialization. */ ++#if UIP_FIXEDADDR == 0 ++ /* uip_hostaddr[0] = uip_hostaddr[1] = 0; */ ++#endif /* UIP_FIXEDADDR */ ++ ++ /* zero out the uIP statistics */ ++ memset(&ustack->stats, 0, sizeof(ustack->stats)); ++ ++ /* prepare the uIP lock */ ++ pthread_mutex_init(&ustack->lock, NULL); ++ ++ if (ipv6_enabled) ++ ustack->enable_IPv6 = UIP_SUPPORT_IPv6_ENABLED; ++ else ++ ustack->enable_IPv6 = UIP_SUPPORT_IPv6_DISABLED; ++ ++ ustack->dhcpc = NULL; ++ ustack->ndpc = NULL; ++} ++void uip_reset(struct uip_stack *ustack) ++{ ++ /* There was an associated DHCP object, this memory needs to be ++ * freed */ ++ if (ustack->dhcpc) ++ free(ustack->dhcpc); ++ ++ ndpc_exit(ustack->ndpc); ++ ++ memset(ustack, 0, sizeof(*ustack)); ++} ++ ++/*---------------------------------------------------------------------------*/ ++#if UIP_ACTIVE_OPEN ++struct uip_conn *uip_connect(struct uip_stack *ustack, uip_ip4addr_t *ripaddr, ++ u16_t rport) ++{ ++ u8_t c; ++ register struct uip_conn *conn, *cconn; ++ ++ /* Find an unused local port. */ ++again: ++ ++ustack->lastport; ++ ++ if (ustack->lastport >= 32000) ++ ustack->lastport = 4096; ++ ++ /* Check if this port is already in use, and if so try to find ++ another one. */ ++ for (c = 0; c < UIP_CONNS; ++c) { ++ conn = &ustack->uip_conns[c]; ++ if (conn->tcpstateflags != UIP_CLOSED && ++ conn->lport == htons(ustack->lastport)) { ++ goto again; ++ } ++ } ++ ++ conn = 0; ++ for (c = 0; c < UIP_CONNS; ++c) { ++ cconn = &ustack->uip_conns[c]; ++ if (cconn->tcpstateflags == UIP_CLOSED) { ++ conn = cconn; ++ break; ++ } ++ if (cconn->tcpstateflags == UIP_TIME_WAIT) { ++ if (conn == 0 || cconn->timer > conn->timer) ++ conn = cconn; ++ } ++ } ++ ++ if (conn == 0) ++ return 0; ++ ++ conn->tcpstateflags = UIP_SYN_SENT; ++ ++ conn->snd_nxt[0] = ustack->iss[0]; ++ conn->snd_nxt[1] = ustack->iss[1]; ++ conn->snd_nxt[2] = ustack->iss[2]; ++ conn->snd_nxt[3] = ustack->iss[3]; ++ ++ conn->initialmss = conn->mss = UIP_TCP_MSS; ++ ++ conn->len = 1; /* TCP length of the SYN is one. */ ++ conn->nrtx = 0; ++ conn->timer = 1; /* Send the SYN next time around. */ ++ conn->rto = UIP_RTO; ++ conn->sa = 0; ++ conn->sv = 16; /* Initial value of the RTT variance. */ ++ conn->lport = htons(ustack->lastport); ++ conn->rport = rport; ++ uip_ip4addr_copy(&conn->ripaddr, ripaddr); ++ ++ return conn; ++} ++#endif /* UIP_ACTIVE_OPEN */ ++/*---------------------------------------------------------------------------*/ ++#if UIP_UDP ++struct uip_udp_conn *uip_udp_new(struct uip_stack *ustack, ++ uip_ip4addr_t *ripaddr, u16_t rport) ++{ ++ u8_t c; ++ register struct uip_udp_conn *conn; ++ ++ /* Find an unused local port. */ ++again: ++ ++ustack->lastport; ++ ++ if (ustack->lastport >= 32000) ++ ustack->lastport = 4096; ++ ++ for (c = 0; c < UIP_UDP_CONNS; ++c) { ++ if (ustack->uip_udp_conns[c].lport == htons(ustack->lastport)) ++ goto again; ++ } ++ ++ conn = 0; ++ for (c = 0; c < UIP_UDP_CONNS; ++c) { ++ if (ustack->uip_udp_conns[c].lport == 0) { ++ conn = &ustack->uip_udp_conns[c]; ++ break; ++ } ++ } ++ ++ if (conn == 0) ++ return 0; ++ ++ conn->lport = htons(ustack->lastport); ++ conn->rport = rport; ++ if (ripaddr == NULL) ++ memset(conn->ripaddr, 0, sizeof(uip_ip4addr_t)); ++ else ++ uip_ip4addr_copy(&conn->ripaddr, ripaddr); ++ conn->ttl = UIP_TTL; ++ ++ return conn; ++} ++#endif /* UIP_UDP */ ++/*---------------------------------------------------------------------------*/ ++void uip_unlisten(struct uip_stack *ustack, u16_t port) ++{ ++ u8_t c; ++ ++ for (c = 0; c < UIP_LISTENPORTS; ++c) { ++ if (ustack->uip_listenports[c] == port) { ++ ustack->uip_listenports[c] = 0; ++ return; ++ } ++ } ++} ++ ++/*---------------------------------------------------------------------------*/ ++void uip_listen(struct uip_stack *ustack, u16_t port) ++{ ++ u8_t c; ++ ++ for (c = 0; c < UIP_LISTENPORTS; ++c) { ++ if (ustack->uip_listenports[c] == 0) { ++ ustack->uip_listenports[c] = port; ++ return; ++ } ++ } ++} ++ ++/** ++ * Is new incoming data available? ++ * ++ * Will reduce to non-zero if there is new data for the application ++ * present at the uip_appdata pointer. The size of the data is ++ * avaliable through the uip_len variable. ++ * ++ * \hideinitializer ++ */ ++int uip_newdata(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_NEWDATA; ++} ++ ++/** ++ * Has previously sent data been acknowledged? ++ * ++ * Will reduce to non-zero if the previously sent data has been ++ * acknowledged by the remote host. This means that the application ++ * can send new data. ++ * ++ * \hideinitializer ++ */ ++#define uip_acked() (uip_flags & UIP_ACKDATA) ++ ++/** ++ * Has the connection just been connected? ++ * ++ * Reduces to non-zero if the current connection has been connected to ++ * a remote host. This will happen both if the connection has been ++ * actively opened (with uip_connect()) or passively opened (with ++ * uip_listen()). ++ * ++ * \hideinitializer ++ */ ++int uip_connected(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_CONNECTED; ++} ++ ++/** ++ * Has the connection been closed by the other end? ++ * ++ * Is non-zero if the connection has been closed by the remote ++ * host. The application may then do the necessary clean-ups. ++ * ++ * \hideinitializer ++ */ ++int uip_closed(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_CLOSE; ++} ++ ++/** ++ * Has the connection been aborted by the other end? ++ * ++ * Non-zero if the current connection has been aborted (reset) by the ++ * remote host. ++ * ++ * \hideinitializer ++ */ ++int uip_aborted(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_ABORT; ++} ++ ++/** ++ * Has the connection timed out? ++ * ++ * Non-zero if the current connection has been aborted due to too many ++ * retransmissions. ++ * ++ * \hideinitializer ++ */ ++int uip_timedout(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_TIMEDOUT; ++} ++ ++/** ++ * Do we need to retransmit previously data? ++ * ++ * Reduces to non-zero if the previously sent data has been lost in ++ * the network, and the application should retransmit it. The ++ * application should send the exact same data as it did the last ++ * time, using the uip_send() function. ++ * ++ * \hideinitializer ++ */ ++int uip_rexmit(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_REXMIT; ++} ++ ++/** ++ * Is the connection being polled by uIP? ++ * ++ * Is non-zero if the reason the application is invoked is that the ++ * current connection has been idle for a while and should be ++ * polled. ++ * ++ * The polling event can be used for sending data without having to ++ * wait for the remote host to send data. ++ * ++ * \hideinitializer ++ */ ++int uip_poll(struct uip_stack *ustack) ++{ ++ return ustack->uip_flags & UIP_POLL; ++} ++ ++int uip_initialmss(struct uip_stack *ustack) ++{ ++ return ustack->uip_conn->initialmss; ++} ++ ++int uip_mss(struct uip_stack *ustack) ++{ ++ return ustack->uip_conn->mss; ++} ++ ++/*---------------------------------------------------------------------------*/ ++/* XXX: IP fragment reassembly: not well-tested. */ ++ ++#if UIP_REASSEMBLY && !UIP_CONF_IPV6 ++#define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN) ++static u8_t uip_reassbuf[UIP_REASS_BUFSIZE]; ++static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)]; ++static const u8_t bitmap_bits[8] = { 0xff, 0x7f, 0x3f, 0x1f, ++ 0x0f, 0x07, 0x03, 0x01 ++}; ++static u16_t uip_reasslen; ++static u8_t uip_reassflags; ++#define UIP_REASS_FLAG_LASTFRAG 0x01 ++static u8_t uip_reasstmr; ++ ++#define IP_MF 0x20 ++ ++static u8_t uip_reass(void) ++{ ++ u16_t offset, len; ++ u16_t i; ++ ++ /* If ip_reasstmr is zero, no packet is present in the buffer, so we ++ write the IP header of the fragment into the reassembly ++ buffer. The timer is updated with the maximum age. */ ++ if (uip_reasstmr == 0) { ++ memcpy(uip_reassbuf, &BUF(ustack)->vhl, uip_iph_len); ++ uip_reasstmr = UIP_REASS_MAXAGE; ++ uip_reassflags = 0; ++ /* Clear the bitmap. */ ++ memset(uip_reassbitmap, 0, sizeof(uip_reassbitmap)); ++ } ++ ++ /* Check if the incoming fragment matches the one currently present ++ in the reasembly buffer. If so, we proceed with copying the ++ fragment into the buffer. */ ++ if (BUF(ustack)->srcipaddr[0] == FBUF(ustack)->srcipaddr[0] && ++ BUF(ustack)->srcipaddr[1] == FBUF(ustack)->srcipaddr[1] && ++ BUF(ustack)->destipaddr[0] == FBUF(ustack)->destipaddr[0] && ++ BUF(ustack)->destipaddr[1] == FBUF(ustack)->destipaddr[1] && ++ BUF(ustack)->ipid[0] == FBUF(ustack)->ipid[0] && ++ BUF(ustack)->ipid[1] == FBUF(ustack)->ipid[1]) { ++ ++ len = ++ (BUF(ustack)->len[0] << 8) + BUF(ustack)->len[1] - ++ (BUF(ustack)->vhl & 0x0f) * 4; ++ offset = ++ (((BUF(ustack)->ipoffset[0] & 0x3f) << 8) + ++ BUF(ustack)->ipoffset[1]) * 8; ++ ++ /* If the offset or the offset + fragment length overflows the ++ reassembly buffer, we discard the entire packet. */ ++ if (offset > UIP_REASS_BUFSIZE || ++ offset + len > UIP_REASS_BUFSIZE) { ++ uip_reasstmr = 0; ++ goto nullreturn; ++ } ++ ++ /* Copy the fragment into the reassembly buffer, at the right ++ offset. */ ++ memcpy(&uip_reassbuf[uip_iph_len + offset], ++ (char *)BUF + (int)((BUF(ustack)->vhl & 0x0f) * 4), len); ++ ++ /* Update the bitmap. */ ++ if (offset / (8 * 8) == (offset + len) / (8 * 8)) { ++ /* If the two endpoints are in the same byte, we only ++ update that byte. */ ++ ++ uip_reassbitmap[offset / (8 * 8)] |= ++ bitmap_bits[(offset / 8) & 7] & ++ ~bitmap_bits[((offset + len) / 8) & 7]; ++ } else { ++ /* If the two endpoints are in different bytes, we ++ update the bytes in the endpoints and fill the ++ stuff inbetween with 0xff. */ ++ uip_reassbitmap[offset / (8 * 8)] |= ++ bitmap_bits[(offset / 8) & 7]; ++ for (i = 1 + offset / (8 * 8); ++ i < (offset + len) / (8 * 8); ++i) { ++ uip_reassbitmap[i] = 0xff; ++ } ++ uip_reassbitmap[(offset + len) / (8 * 8)] |= ++ ~bitmap_bits[((offset + len) / 8) & 7]; ++ } ++ ++ /* If this fragment has the More Fragments flag set to zero, we ++ know that this is the last fragment, so we can calculate the ++ size of the entire packet. We also set the ++ IP_REASS_FLAG_LASTFRAG flag to indicate that we have received ++ the final fragment. */ ++ ++ if ((BUF(ustack)->ipoffset[0] & IP_MF) == 0) { ++ uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; ++ uip_reasslen = offset + len; ++ } ++ ++ /* Finally, we check if we have a full packet in the buffer. ++ We do this by checking if we have the last fragment and if ++ all bits in the bitmap are set. */ ++ if (uip_reassflags & UIP_REASS_FLAG_LASTFRAG) { ++ /* Check all bytes up to and including all but the last ++ byte in the bitmap. */ ++ for (i = 0; i < uip_reasslen / (8 * 8) - 1; ++i) { ++ if (uip_reassbitmap[i] != 0xff) ++ goto nullreturn; ++ } ++ /* Check the last byte in the bitmap. It should contain ++ just the right amount of bits. */ ++ if (uip_reassbitmap[uip_reasslen / (8 * 8)] != ++ (u8_t) ~bitmap_bits[uip_reasslen / 8 & 7]) ++ goto nullreturn; ++ ++ /* If we have come this far, we have a full packet in ++ the buffer, so we allocate a pbuf and copy the ++ packet into it. We also reset the timer. */ ++ uip_reasstmr = 0; ++ memcpy(BUF, FBUF, uip_reasslen); ++ ++ /* Pretend to be a "normal" (i.e., not fragmented) IP ++ packet from now on. */ ++ BUF(ustack)->ipoffset[0] = BUF(ustack)->ipoffset[1] = 0; ++ BUF(ustack)->len[0] = uip_reasslen >> 8; ++ BUF(ustack)->len[1] = uip_reasslen & 0xff; ++ BUF(ustack)->ipchksum = 0; ++ BUF(ustack)->ipchksum = ~(uip_ipchksum()); ++ ++ return uip_reasslen; ++ } ++ } ++ ++nullreturn: ++ return 0; ++} ++#endif /* UIP_REASSEMBLY */ ++/*---------------------------------------------------------------------------*/ ++static void uip_add_rcv_nxt(struct uip_stack *ustack, u16_t n) ++{ ++ u8_t uip_acc32[4]; ++ ++ uip_add32(ustack->uip_conn->rcv_nxt, n, uip_acc32); ++ ustack->uip_conn->rcv_nxt[0] = uip_acc32[0]; ++ ustack->uip_conn->rcv_nxt[1] = uip_acc32[1]; ++ ustack->uip_conn->rcv_nxt[2] = uip_acc32[2]; ++ ustack->uip_conn->rcv_nxt[3] = uip_acc32[3]; ++} ++ ++/*---------------------------------------------------------------------------*/ ++ ++/** @} */ ++ ++/** ++ * \defgroup uipdevfunc uIP device driver functions ++ * @{ ++ * ++ * These functions are used by a network device driver for interacting ++ * with uIP. ++ */ ++ ++/** ++ * Process an incoming packet. ++ * ++ * This function should be called when the device driver has received ++ * a packet from the network. The packet from the device driver must ++ * be present in the uip_buf buffer, and the length of the packet ++ * should be placed in the uip_len variable. ++ * ++ * When the function returns, there may be an outbound packet placed ++ * in the uip_buf packet buffer. If so, the uip_len variable is set to ++ * the length of the packet. If no packet is to be sent out, the ++ * uip_len variable is set to 0. ++ * ++ * The usual way of calling the function is presented by the source ++ * code below. ++ \code ++ uip_len = devicedriver_poll(); ++ if(uip_len > 0) { ++ uip_input(); ++ if(uip_len > 0) { ++ devicedriver_send(); ++ } ++ } ++ \endcode ++ * ++ * \note If you are writing a uIP device driver that needs ARP ++ * (Address Resolution Protocol), e.g., when running uIP over ++ * Ethernet, you will need to call the uIP ARP code before calling ++ * this function: ++ \code ++ #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) ++ uip_len = ethernet_devicedrver_poll(); ++ if(uip_len > 0) { ++ if (BUF(ustack)->type == HTONS(UIP_ETHTYPE_IP)) { ++ uip_arp_ipin(); ++ uip_input(); ++ if (uip_len > 0) { ++ uip_arp_out(); ++ ethernet_devicedriver_send(); ++ } ++ } else if (BUF(ustack)->type == HTONS(UIP_ETHTYPE_ARP)) { ++ uip_arp_arpin(); ++ if (uip_len > 0) ++ ethernet_devicedriver_send(); ++ } ++ \endcode ++ * ++ * \hideinitializer ++ */ ++void uip_input(struct uip_stack *ustack) ++{ ++ uip_process(ustack, UIP_DATA); ++} ++ ++/** ++ * Periodic processing for a connection identified by its number. ++ * ++ * This function does the necessary periodic processing (timers, ++ * polling) for a uIP TCP conneciton, and should be called when the ++ * periodic uIP timer goes off. It should be called for every ++ * connection, regardless of whether they are open of closed. ++ * ++ * When the function returns, it may have an outbound packet waiting ++ * for service in the uIP packet buffer, and if so the uip_len ++ * variable is set to a value larger than zero. The device driver ++ * should be called to send out the packet. ++ * ++ * The ususal way of calling the function is through a for() loop like ++ * this: ++ \code ++ for(i = 0; i < UIP_CONNS; ++i) { ++ uip_periodic(i); ++ if(uip_len > 0) { ++ devicedriver_send(); ++ } ++ } ++ \endcode ++ * ++ * \note If you are writing a uIP device driver that needs ARP ++ * (Address Resolution Protocol), e.g., when running uIP over ++ * Ethernet, you will need to call the uip_arp_out() function before ++ * calling the device driver: ++ \code ++ for(i = 0; i < UIP_CONNS; ++i) { ++ uip_periodic(i); ++ if(uip_len > 0) { ++ uip_arp_out(); ++ ethernet_devicedriver_send(); ++ } ++ } ++ \endcode ++ * ++ * \param conn The number of the connection which is to be periodically polled. ++ * ++ * \hideinitializer ++ */ ++void uip_periodic(struct uip_stack *ustack, int conn) ++{ ++ ustack->uip_conn = &ustack->uip_conns[conn]; ++ uip_process(ustack, UIP_TIMER); ++} ++ ++#if UIP_UDP ++/** ++ * Periodic processing for a UDP connection identified by its number. ++ * ++ * This function is essentially the same as uip_periodic(), but for ++ * UDP connections. It is called in a similar fashion as the ++ * uip_periodic() function: ++ \code ++ for(i = 0; i < UIP_UDP_CONNS; i++) { ++ uip_udp_periodic(i); ++ if(uip_len > 0) { ++ devicedriver_send(); ++ } ++ } ++ \endcode ++ * ++ * \note As for the uip_periodic() function, special care has to be ++ * taken when using uIP together with ARP and Ethernet: ++ \code ++ for(i = 0; i < UIP_UDP_CONNS; i++) { ++ uip_udp_periodic(i); ++ if(uip_len > 0) { ++ uip_arp_out(); ++ ethernet_devicedriver_send(); ++ } ++ } ++ \endcode ++ * ++ * \param conn The number of the UDP connection to be processed. ++ * ++ * \hideinitializer ++ */ ++void uip_udp_periodic(struct uip_stack *ustack, int conn) ++{ ++ ustack->uip_udp_conn = &ustack->uip_udp_conns[conn]; ++ uip_process(ustack, UIP_UDP_TIMER); ++} ++#endif ++ ++void uip_ndp_periodic(struct uip_stack *ustack) ++{ ++ uip_process(ustack, UIP_NDP_TIMER); ++} ++ ++void uip_process(struct uip_stack *ustack, u8_t flag) ++{ ++ u8_t c; ++ u16_t tmp16; ++ register struct uip_conn *uip_connr = ustack->uip_conn; ++ ++ u16_t uip_iph_len = 0; ++ u16_t uip_ip_udph_len = 0; ++ u16_t uip_ip_tcph_len = 0; ++ struct ip6_hdr *ipv6_hdr = NULL; ++ struct uip_tcp_ipv4_hdr *tcp_ipv4_hdr = NULL; ++ struct uip_tcp_hdr *tcp_hdr = NULL; ++ struct uip_icmpv4_hdr *icmpv4_hdr = NULL; ++ struct uip_icmpv6_hdr *icmpv6_hdr __attribute__((__unused__)) = NULL; ++ struct uip_udp_hdr *udp_hdr = NULL; ++ ++ /* Drop invalid packets */ ++ if (ustack->uip_buf == NULL) { ++ LOG_ERR(PFX "ustack->uip_buf == NULL."); ++ return; ++ } ++ ++ if (is_ipv6(ustack)) { ++ uint8_t *buf; ++ uip_iph_len = UIP_IPv6_H_LEN; ++ uip_ip_udph_len = UIP_IPv6_UDPH_LEN; ++ uip_ip_tcph_len = UIP_IPv6_TCPH_LEN; ++ ++ ipv6_hdr = (struct ip6_hdr *)ustack->network_layer; ++ ++ buf = ustack->network_layer; ++ buf += sizeof(struct uip_ipv6_hdr); ++ tcp_hdr = (struct uip_tcp_hdr *)buf; ++ ++ buf = ustack->network_layer; ++ buf += sizeof(struct uip_ipv6_hdr); ++ udp_hdr = (struct uip_udp_hdr *)buf; ++ ++ buf = ustack->network_layer; ++ buf += sizeof(struct uip_ipv6_hdr); ++ icmpv6_hdr = (struct uip_icmpv6_hdr *)buf; ++ } else { ++ uint8_t *buf; ++ ++ uip_iph_len = UIP_IPv4_H_LEN; ++ uip_ip_udph_len = UIP_IPv4_UDPH_LEN; ++ uip_ip_tcph_len = UIP_IPv4_TCPH_LEN; ++ ++ tcp_ipv4_hdr = (struct uip_tcp_ipv4_hdr *)ustack->network_layer; ++ ++ buf = ustack->network_layer; ++ buf += sizeof(struct uip_ipv4_hdr); ++ tcp_hdr = (struct uip_tcp_hdr *)buf; ++ ++ buf = ustack->network_layer; ++ buf += sizeof(struct uip_ipv4_hdr); ++ icmpv4_hdr = (struct uip_icmpv4_hdr *)buf; ++ ++ buf = ustack->network_layer; ++ buf += sizeof(struct uip_ipv4_hdr); ++ udp_hdr = (struct uip_udp_hdr *)buf; ++ } /* End of ipv6 */ ++ ++#if UIP_UDP ++ if (flag == UIP_UDP_SEND_CONN) ++ goto udp_send; ++#endif /* UIP_UDP */ ++ ustack->uip_sappdata = ustack->uip_appdata = ustack->network_layer + ++ uip_ip_tcph_len; ++ ++ /* Check if we were invoked because of a poll request for a ++ particular connection. */ ++ if (flag == UIP_POLL_REQUEST) { ++ if ((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED ++ && !uip_outstanding(uip_connr)) { ++ ustack->uip_flags = UIP_POLL; ++ UIP_APPCALL(ustack); ++ goto appsend; ++ } ++ goto drop; ++ ++ /* Check if we were invoked because of the perodic timer ++ firing. */ ++ } else if (flag == UIP_TIMER) { ++#if UIP_REASSEMBLY ++ if (uip_reasstmr != 0) ++ --uip_reasstmr; ++#endif /* UIP_REASSEMBLY */ ++ /* Increase the initial sequence number. */ ++ if (++ustack->iss[3] == 0) { ++ if (++ustack->iss[2] == 0) { ++ if (++ustack->iss[1] == 0) ++ ++ustack->iss[0]; ++ } ++ } ++ ++ /* Reset the length variables. */ ++ ustack->uip_len = 0; ++ ustack->uip_slen = 0; ++ ++ /* Check if the connection is in a state in which we simply wait ++ for the connection to time out. If so, we increase the ++ connection's timer and remove the connection if it times ++ out. */ ++ if (uip_connr->tcpstateflags == UIP_TIME_WAIT || ++ uip_connr->tcpstateflags == UIP_FIN_WAIT_2) { ++ ++(uip_connr->timer); ++ if (uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) ++ uip_connr->tcpstateflags = UIP_CLOSED; ++ } else if (uip_connr->tcpstateflags != UIP_CLOSED) { ++ /* If the connection has outstanding data, we increase ++ the connection's timer and see if it has reached the ++ RTO value in which case we retransmit. */ ++ if (uip_outstanding(uip_connr)) { ++ if (uip_connr->timer-- == 0) { ++ if (uip_connr->nrtx == UIP_MAXRTX || ++ ((uip_connr->tcpstateflags == ++ UIP_SYN_SENT ++ || uip_connr->tcpstateflags == ++ UIP_SYN_RCVD) ++ && uip_connr->nrtx == ++ UIP_MAXSYNRTX)) { ++ uip_connr->tcpstateflags = ++ UIP_CLOSED; ++ ++ /* We call UIP_APPCALL() with ++ uip_flags set to UIP_TIMEDOUT ++ to inform the application ++ that the connection has timed ++ out. */ ++ ustack->uip_flags = ++ UIP_TIMEDOUT; ++ UIP_APPCALL(ustack); ++ ++ /* We also send a reset packet ++ to the remote host. */ ++ tcp_hdr->flags = ++ TCP_RST | TCP_ACK; ++ goto tcp_send_nodata; ++ } ++ ++ /* Exponential backoff. */ ++ uip_connr->timer = ++ UIP_RTO << (uip_connr->nrtx > ++ 4 ? 4 : uip_connr-> ++ nrtx); ++ ++(uip_connr->nrtx); ++ ++ /* Ok, so we need to retransmit. ++ We do this differently depending on ++ which state we are in. ++ In ESTABLISHED, we call upon the ++ application so that it may prepare ++ the data for the retransmit. ++ In SYN_RCVD, we resend the SYNACK ++ that we sent earlier and in LAST_ACK ++ we have to retransmit our FINACK. */ ++ ++ustack->stats.tcp.rexmit; ++ switch (uip_connr-> ++ tcpstateflags & UIP_TS_MASK) { ++ case UIP_SYN_RCVD: ++ /* In the SYN_RCVD state, we ++ should retransmit our SYNACK ++ */ ++ goto tcp_send_synack; ++#if UIP_ACTIVE_OPEN ++ case UIP_SYN_SENT: ++ /* In the SYN_SENT state, ++ we retransmit out SYN. */ ++ tcp_hdr->flags = 0; ++ goto tcp_send_syn; ++#endif /* UIP_ACTIVE_OPEN */ ++ ++ case UIP_ESTABLISHED: ++ /* In the ESTABLISHED state, ++ we call upon the application ++ to do the actual retransmit ++ after which we jump into ++ the code for sending out the ++ packet (the apprexmit ++ label). */ ++ ustack->uip_flags = UIP_REXMIT; ++ UIP_APPCALL(ustack); ++ goto apprexmit; ++ ++ case UIP_FIN_WAIT_1: ++ case UIP_CLOSING: ++ case UIP_LAST_ACK: ++ /* In all these states we should ++ retransmit a FINACK. */ ++ goto tcp_send_finack; ++ ++ } ++ } ++ } else if ((uip_connr->tcpstateflags & UIP_TS_MASK) == ++ UIP_ESTABLISHED) { ++ /* If there was no need for a retransmission, ++ we poll the application for new data. */ ++ ustack->uip_flags = UIP_POLL; ++ UIP_APPCALL(ustack); ++ goto appsend; ++ } ++ } ++ goto drop; ++ } /* End of UIP_TIMER */ ++#if UIP_UDP ++ if (flag == UIP_UDP_TIMER) { ++ /* This is for IPv4 DHCP only! */ ++ if (ustack->uip_udp_conn->lport != 0) { ++ ustack->uip_conn = NULL; ++ ustack->uip_sappdata = ustack->uip_appdata = ++ ustack->network_layer + uip_ip_udph_len; ++ ustack->uip_len = ustack->uip_slen = 0; ++ ustack->uip_flags = UIP_POLL; ++ UIP_UDP_APPCALL(ustack); ++ goto udp_send; ++ } else { ++ goto drop; ++ } ++ } ++#endif ++ if (flag == UIP_NDP_TIMER) { ++ /* This is for IPv6 NDP Only! */ ++ if (1) { /* If NDP engine active */ ++ ustack->uip_len = ustack->uip_slen = 0; ++ ustack->uip_flags = UIP_POLL; ++ goto ndp_send; ++ } ++ } ++ ++ /* This is where the input processing starts. */ ++ ++ustack->stats.ip.recv; ++ ++ /* Start of IP input header processing code. */ ++ ++ if (is_ipv6(ustack)) { ++ u8_t version = ((ipv6_hdr->ip6_vfc) & 0xf0) >> 4; ++ ++ /* Check validity of the IP header. */ ++ if (version != 0x6) { /* IP version and header length. */ ++ ++ustack->stats.ip.drop; ++ ++ustack->stats.ip.vhlerr; ++ LOG_DEBUG(PFX "ipv6: invalid version(0x%x).", version); ++ goto drop; ++ } ++ } else { ++ /* Check validity of the IP header. */ ++ if (tcp_ipv4_hdr->vhl != 0x45) { ++ /* IP version and header length. */ ++ ++ustack->stats.ip.drop; ++ ++ustack->stats.ip.vhlerr; ++ LOG_DEBUG(PFX ++ "ipv4: invalid version or header length: " ++ "0x%x.", ++ tcp_ipv4_hdr->vhl); ++ goto drop; ++ } ++ } ++ ++ /* Check the size of the packet. If the size reported to us in ++ uip_len is smaller the size reported in the IP header, we assume ++ that the packet has been corrupted in transit. If the size of ++ uip_len is larger than the size reported in the IP packet header, ++ the packet has been padded and we set uip_len to the correct ++ value.. */ ++ ++ if (is_ipv6(ustack)) { ++ u16_t len = ntohs(ipv6_hdr->ip6_plen); ++ if (len > ustack->uip_len) { ++ LOG_DEBUG(PFX ++ "ip: packet shorter than reported in IP header" ++ ":IPv6_BUF(ustack)->len: %d ustack->uip_len: " ++ "%d", len, ustack->uip_len); ++ goto drop; ++ } ++ } else { ++ if ((tcp_ipv4_hdr->len[0] << 8) + ++ tcp_ipv4_hdr->len[1] <= ustack->uip_len) { ++ ustack->uip_len = (tcp_ipv4_hdr->len[0] << 8) + ++ tcp_ipv4_hdr->len[1]; ++ } else { ++ LOG_DEBUG(PFX ++ "ip: packet shorter than reported in IP header" ++ ":tcp_ipv4_hdr->len: %d ustack->uip_len:%d.", ++ (tcp_ipv4_hdr->len[0] << 8) + ++ tcp_ipv4_hdr->len[1], ustack->uip_len); ++ goto drop; ++ } ++ } ++ ++ if (!is_ipv6(ustack)) { ++ /* Check the fragment flag. */ ++ if ((tcp_ipv4_hdr->ipoffset[0] & 0x3f) != 0 || ++ tcp_ipv4_hdr->ipoffset[1] != 0) { ++#if UIP_REASSEMBLY ++ uip_len = uip_reass(); ++ if (uip_len == 0) ++ goto drop; ++#else /* UIP_REASSEMBLY */ ++ ++ustack->stats.ip.drop; ++ ++ustack->stats.ip.fragerr; ++ LOG_WARN(PFX "ip: fragment dropped."); ++ goto drop; ++#endif /* UIP_REASSEMBLY */ ++ } ++ } ++ ++ if (!is_ipv6(ustack)) { ++ /* ipv4 */ ++ if (uip_ip4addr_cmp(ustack->hostaddr, all_zeroes_addr4)) { ++ /* If we are configured to use ping IP address ++ configuration and hasn't been assigned an IP ++ address yet, we accept all ICMP packets. */ ++#if UIP_PINGADDRCONF && !UIP_CONF_IPV6 ++ if (tcp_ipv4_hdr->proto == UIP_PROTO_ICMP) { ++ LOG_WARN(PFX ++ "ip: possible ping config packet " ++ "received."); ++ goto icmp_input; ++ } else { ++ LOG_WARN(PFX ++ "ip: packet dropped since no " ++ "address assigned."); ++ goto drop; ++ } ++#endif /* UIP_PINGADDRCONF */ ++ } else { ++ int broadcast_addr = 0xFFFFFFFF; ++ /* If IP broadcast support is configured, we check for ++ a broadcast UDP packet, which may be destined to us ++ */ ++ if ((tcp_ipv4_hdr->proto == UIP_PROTO_UDP) && ++ (uip_ip4addr_cmp ++ (tcp_ipv4_hdr->destipaddr, &broadcast_addr)) ++ /*&& ++ uip_ipchksum() == 0xffff */ ++ ) { ++ goto udp_input; ++ } ++ ++ /* Check if the packet is destined for our IP address ++ */ ++ if (!uip_ip4addr_cmp(tcp_ipv4_hdr->destipaddr, ++ ustack->hostaddr)) { ++ ++ustack->stats.ip.drop; ++ goto drop; ++ } ++ } ++ if (uip_ipchksum(ustack) != 0xffff) { ++ /* Compute and check the IP header checksum. */ ++ ++ustack->stats.ip.drop; ++ ++ustack->stats.ip.chkerr; ++ LOG_ERR(PFX "ip: bad checksum."); ++ goto drop; ++ } ++ } /* End of ipv4 */ ++ ++ if (is_ipv6(ustack)) { ++ if (ipv6_hdr->ip6_nxt == UIP_PROTO_TCP) { ++ /* Check for TCP packet. If so, proceed with TCP input ++ processing. */ ++ goto ndp_newdata; ++ } ++#if UIP_UDP ++ if (ipv6_hdr->ip6_nxt == UIP_PROTO_UDP) ++ goto ndp_newdata; ++#endif /* UIP_UDP */ ++ ++ /* This is IPv6 ICMPv6 processing code. */ ++ if (ipv6_hdr->ip6_nxt != UIP_PROTO_ICMP6) { ++ /* We only allow ICMPv6 packets from here. */ ++ ++ustack->stats.ip.drop; ++ ++ustack->stats.ip.protoerr; ++ goto drop; ++ } ++ ++ ++ustack->stats.icmp.recv; ++ ++ndp_newdata: ++ /* This call is to handle the IPv6 Network Discovery Protocol */ ++ ustack->uip_flags = UIP_NEWDATA; ++ ustack->uip_slen = 0; ++ndp_send: ++ UIP_NDP_CALL(ustack); ++ if (ustack->uip_slen != 0) { ++ ustack->uip_len = ustack->uip_slen; ++ goto send; ++ } else { ++ goto drop; ++ } ++ } else { ++ /* IPv4 Processing */ ++ if (tcp_ipv4_hdr->proto == UIP_PROTO_TCP) { ++ /* Check for TCP packet. If so, proceed with TCP input ++ processing. */ ++ goto tcp_input; ++ } ++#if UIP_UDP ++ if (tcp_ipv4_hdr->proto == UIP_PROTO_UDP) ++ goto udp_input; ++#endif /* UIP_UDP */ ++ ++ /* ICMPv4 processing code follows. */ ++ if (tcp_ipv4_hdr->proto != UIP_PROTO_ICMP) { ++ /* We only allow ICMP packets from here. */ ++ ++ustack->stats.ip.drop; ++ ++ustack->stats.ip.protoerr; ++ LOG_DEBUG(PFX "ip: neither tcp nor icmp."); ++ goto drop; ++ } ++#if UIP_PINGADDRCONF ++icmp_input: ++#endif /* UIP_PINGADDRCONF */ ++ ++ustack->stats.icmp.recv; ++ ++ /* ICMP echo (i.e., ping) processing. This is simple, we only ++ change the ICMP type from ECHO to ECHO_REPLY and adjust the ++ ICMP checksum before we return the packet. */ ++ if (icmpv4_hdr->type != ICMP_ECHO) { ++ ++ustack->stats.icmp.drop; ++ ++ustack->stats.icmp.typeerr; ++ LOG_DEBUG(PFX "icmp: not icmp echo."); ++ goto drop; ++ } ++ ++ /* If we are configured to use ping IP address assignment, we ++ use the destination IP address of this ping packet and assign ++ it to ourself. */ ++#if UIP_PINGADDRCONF ++ if ((ustack->hostaddr[0] | ustack->hostaddr[1]) == 0) { ++ ustack->hostaddr[0] = tcp_ipv4_hdr->destipaddr[0]; ++ ustack->hostaddr[1] = tcp_ipv4_hdr->destipaddr[1]; ++ } ++#endif /* UIP_PINGADDRCONF */ ++ ++ icmpv4_hdr->type = ICMP_ECHO_REPLY; ++ ++ if (icmpv4_hdr->icmpchksum >= htons(0xffff - ++ (ICMP_ECHO << 8))) { ++ icmpv4_hdr->icmpchksum += htons(ICMP_ECHO << 8) + 1; ++ } else { ++ icmpv4_hdr->icmpchksum += htons(ICMP_ECHO << 8); ++ } ++ ++ /* Swap IP addresses. */ ++ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, ++ tcp_ipv4_hdr->srcipaddr); ++ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); ++ ++ ++ustack->stats.icmp.sent; ++ goto send; ++ ++ /* End of IPv4 input header processing code. */ ++ } ++ ++#if UIP_UDP ++ /* UDP input processing. */ ++udp_input: ++ /* UDP processing is really just a hack. We don't do anything to the ++ UDP/IP headers, but let the UDP application do all the hard ++ work. If the application sets uip_slen, it has a packet to ++ send. */ ++#if UIP_UDP_CHECKSUMS ++ ustack->uip_len = ustack->uip_len - uip_ip_udph_len; ++ ustack->uip_appdata = ustack->network_layer + uip_ip_udph_len; ++ if (UDPBUF(ustack)->udpchksum != 0 && uip_udpchksum(ustack) != 0xffff) { ++ ++ustack->stats.udp.drop; ++ ++ustack->stats.udp.chkerr; ++ LOG_DEBUG(PFX "udp: bad checksum."); ++ goto drop; ++ } ++#else /* UIP_UDP_CHECKSUMS */ ++ uip_len = uip_len - uip_ip_udph_len; ++#endif /* UIP_UDP_CHECKSUMS */ ++ ++ if (is_ipv6(ustack)) ++ goto udp_found; ++ ++ /* Demultiplex this UDP packet between the UDP "connections". */ ++ for (ustack->uip_udp_conn = &ustack->uip_udp_conns[0]; ++ ustack->uip_udp_conn < &ustack->uip_udp_conns[UIP_UDP_CONNS]; ++ ++ustack->uip_udp_conn) { ++ /* If the local UDP port is non-zero, the connection is ++ considered to be used. If so, the local port number is ++ checked against the destination port number in the ++ received packet. If the two port ++ numbers match, the remote port number is checked if the ++ connection is bound to a remote port. Finally, if the ++ connection is bound to a remote IP address, the source IP ++ address of the packet is checked. */ ++ ++ if (ustack->uip_udp_conn->lport != 0 && ++ UDPBUF(ustack)->destport == ustack->uip_udp_conn->lport && ++ (ustack->uip_udp_conn->rport == 0 || ++ UDPBUF(ustack)->srcport == ustack->uip_udp_conn->rport) && ++ (uip_ip4addr_cmp(ustack->uip_udp_conn->ripaddr, ++ all_zeroes_addr4) || ++ uip_ip4addr_cmp(ustack->uip_udp_conn->ripaddr, ++ all_ones_addr4) || ++ uip_ip4addr_cmp(tcp_ipv4_hdr->srcipaddr, ++ ustack->uip_udp_conn->ripaddr))) { ++ goto udp_found; ++ } ++ } ++ LOG_DEBUG(PFX ++ "udp: no matching connection found: dest port: %d src port: " ++ "%d", udp_hdr->destport, udp_hdr->srcport); ++ goto drop; ++ ++udp_found: ++ ustack->uip_conn = NULL; ++ ustack->uip_flags = UIP_NEWDATA; ++ ustack->uip_sappdata = ustack->uip_appdata = ustack->network_layer + ++ uip_ip_udph_len; ++ ustack->uip_slen = 0; ++ if (is_ipv6(ustack)) ++ UIP_NDP_CALL(ustack); ++ else ++ UIP_UDP_APPCALL(ustack); ++udp_send: ++ if (ustack->uip_slen == 0) ++ goto drop; ++ ++ ustack->uip_len = ustack->uip_slen + uip_ip_udph_len; ++ ++ if (is_ipv6(ustack)) { ++ goto ip_send_nolen; ++ } else { ++ tcp_ipv4_hdr->len[0] = (ustack->uip_len >> 8); ++ tcp_ipv4_hdr->len[1] = (ustack->uip_len & 0xff); ++ tcp_ipv4_hdr->ttl = ustack->uip_udp_conn->ttl; ++ tcp_ipv4_hdr->proto = UIP_PROTO_UDP; ++ } ++ ++ udp_hdr->udplen = htons(ustack->uip_slen + UIP_UDPH_LEN); ++ udp_hdr->udpchksum = 0; ++ ++ udp_hdr->srcport = ustack->uip_udp_conn->lport; ++ udp_hdr->destport = ustack->uip_udp_conn->rport; ++ ++ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); ++ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, ++ ustack->uip_udp_conn->ripaddr); ++ ++ ustack->uip_appdata = ustack->network_layer + uip_ip_tcph_len; ++ ++ if (ustack->uip_buf == NULL) { ++ LOG_WARN(PFX "uip_buf == NULL on udp send"); ++ goto drop; ++ } ++#if UIP_UDP_CHECKSUMS ++ /* Calculate UDP checksum. */ ++ udp_hdr->udpchksum = ~(uip_udpchksum(ustack)); ++ if (udp_hdr->udpchksum == 0) ++ udp_hdr->udpchksum = 0xffff; ++#endif /* UIP_UDP_CHECKSUMS */ ++ ++ goto ip_send_nolen; ++#endif /* UIP_UDP */ ++ ++ /* TCP input processing. */ ++tcp_input: ++ ++ustack->stats.tcp.recv; ++ ++ /* Start of TCP input header processing code. */ ++ ++ if (uip_tcpchksum(ustack) != 0xffff) { /* Compute and check the TCP ++ checksum. */ ++ ++ustack->stats.tcp.drop; ++ ++ustack->stats.tcp.chkerr; ++ LOG_WARN(PFX "tcp: bad checksum."); ++ goto drop; ++ } ++ ++ if (is_ipv6(ustack)) { ++ /* Demultiplex this segment. */ ++ /* First check any active connections. */ ++ for (uip_connr = &ustack->uip_conns[0]; ++ uip_connr <= &ustack->uip_conns[UIP_CONNS - 1]; ++ ++uip_connr) { ++ if (uip_connr->tcpstateflags != UIP_CLOSED && ++ tcp_hdr->destport == uip_connr->lport && ++ tcp_hdr->srcport == uip_connr->rport && ++ uip_ip6addr_cmp(IPv6_BUF(ustack)->srcipaddr, ++ uip_connr->ripaddr)) { ++ goto found; ++ } ++ } ++ } else { ++ /* Demultiplex this segment. */ ++ /* First check any active connections. */ ++ for (uip_connr = &ustack->uip_conns[0]; ++ uip_connr <= &ustack->uip_conns[UIP_CONNS - 1]; ++ ++uip_connr) { ++ if (uip_connr->tcpstateflags != UIP_CLOSED && ++ tcp_hdr->destport == uip_connr->lport && ++ tcp_hdr->srcport == uip_connr->rport && ++ uip_ip4addr_cmp(tcp_ipv4_hdr->srcipaddr, ++ uip_connr->ripaddr)) { ++ goto found; ++ } ++ } ++ } ++ ++ /* If we didn't find and active connection that expected the packet, ++ either this packet is an old duplicate, or this is a SYN packet ++ destined for a connection in LISTEN. If the SYN flag isn't set, ++ it is an old packet and we send a RST. */ ++ if ((tcp_hdr->flags & TCP_CTL) != TCP_SYN) ++ goto reset; ++ ++ tmp16 = tcp_hdr->destport; ++ /* Next, check listening connections. */ ++ for (c = 0; c < UIP_LISTENPORTS; ++c) { ++ if (tmp16 == ustack->uip_listenports[c]) ++ goto found_listen; ++ } ++ ++ /* No matching connection found, so we send a RST packet. */ ++ ++ustack->stats.tcp.synrst; ++reset: ++ ++ /* We do not send resets in response to resets. */ ++ if (tcp_hdr->flags & TCP_RST) ++ goto drop; ++ ++ ++ustack->stats.tcp.rst; ++ ++ tcp_hdr->flags = TCP_RST | TCP_ACK; ++ ustack->uip_len = uip_ip_tcph_len; ++ tcp_hdr->tcpoffset = 5 << 4; ++ ++ /* Flip the seqno and ackno fields in the TCP header. */ ++ c = tcp_hdr->seqno[3]; ++ tcp_hdr->seqno[3] = tcp_hdr->ackno[3]; ++ tcp_hdr->ackno[3] = c; ++ ++ c = tcp_hdr->seqno[2]; ++ tcp_hdr->seqno[2] = tcp_hdr->ackno[2]; ++ tcp_hdr->ackno[2] = c; ++ ++ c = tcp_hdr->seqno[1]; ++ tcp_hdr->seqno[1] = tcp_hdr->ackno[1]; ++ tcp_hdr->ackno[1] = c; ++ ++ c = tcp_hdr->seqno[0]; ++ tcp_hdr->seqno[0] = tcp_hdr->ackno[0]; ++ tcp_hdr->ackno[0] = c; ++ ++ /* We also have to increase the sequence number we are ++ acknowledging. If the least significant byte overflowed, we need ++ to propagate the carry to the other bytes as well. */ ++ if (++tcp_hdr->ackno[3] == 0) { ++ if (++tcp_hdr->ackno[2] == 0) { ++ if (++tcp_hdr->ackno[1] == 0) ++ ++tcp_hdr->ackno[0]; ++ } ++ } ++ ++ /* Swap port numbers. */ ++ tmp16 = tcp_hdr->srcport; ++ tcp_hdr->srcport = tcp_hdr->destport; ++ tcp_hdr->destport = tmp16; ++ ++ /* Swap IP addresses. */ ++ if (is_ipv6(ustack)) { ++ uip_ip6addr_copy(IPv6_BUF(ustack)->destipaddr, ++ IPv6_BUF(ustack)->srcipaddr); ++ uip_ip6addr_copy(IPv6_BUF(ustack)->srcipaddr, ++ ustack->hostaddr6); ++ } else { ++ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, ++ tcp_ipv4_hdr->srcipaddr); ++ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); ++ } ++ ++ /* And send out the RST packet! */ ++ goto tcp_send_noconn; ++ ++ /* This label will be jumped to if we matched the incoming packet ++ with a connection in LISTEN. In that case, we should create a new ++ connection and send a SYNACK in return. */ ++found_listen: ++ /* First we check if there are any connections avaliable. Unused ++ connections are kept in the same table as used connections, but ++ unused ones have the tcpstate set to CLOSED. Also, connections in ++ TIME_WAIT are kept track of and we'll use the oldest one if no ++ CLOSED connections are found. Thanks to Eddie C. Dost for a very ++ nice algorithm for the TIME_WAIT search. */ ++ uip_connr = 0; ++ for (c = 0; c < UIP_CONNS; ++c) { ++ if (ustack->uip_conns[c].tcpstateflags == UIP_CLOSED) { ++ uip_connr = &ustack->uip_conns[c]; ++ break; ++ } ++ if (ustack->uip_conns[c].tcpstateflags == UIP_TIME_WAIT) { ++ if (uip_connr == 0 || ++ ustack->uip_conns[c].timer > uip_connr->timer) { ++ uip_connr = &ustack->uip_conns[c]; ++ } ++ } ++ } ++ ++ if (uip_connr == 0) { ++ /* All connections are used already, we drop packet and hope ++ that the remote end will retransmit the packet at a time when ++ we have more spare connections. */ ++ ++ustack->stats.tcp.syndrop; ++ LOG_WARN(PFX "tcp: found no unused connections."); ++ goto drop; ++ } ++ ustack->uip_conn = uip_connr; ++ ++ /* Fill in the necessary fields for the new connection. */ ++ uip_connr->rto = uip_connr->timer = UIP_RTO; ++ uip_connr->sa = 0; ++ uip_connr->sv = 4; ++ uip_connr->nrtx = 0; ++ uip_connr->lport = tcp_hdr->destport; ++ uip_connr->rport = tcp_hdr->srcport; ++ if (is_ipv6(ustack)) { ++ uip_ip6addr_copy(uip_connr->ripaddr, ++ IPv6_BUF(ustack)->srcipaddr); ++ } else { ++ uip_ip4addr_copy(uip_connr->ripaddr, tcp_ipv4_hdr->srcipaddr); ++ } ++ uip_connr->tcpstateflags = UIP_SYN_RCVD; ++ ++ uip_connr->snd_nxt[0] = ustack->iss[0]; ++ uip_connr->snd_nxt[1] = ustack->iss[1]; ++ uip_connr->snd_nxt[2] = ustack->iss[2]; ++ uip_connr->snd_nxt[3] = ustack->iss[3]; ++ uip_connr->len = 1; ++ ++ /* rcv_nxt should be the seqno from the incoming packet + 1. */ ++ uip_connr->rcv_nxt[3] = tcp_hdr->seqno[3]; ++ uip_connr->rcv_nxt[2] = tcp_hdr->seqno[2]; ++ uip_connr->rcv_nxt[1] = tcp_hdr->seqno[1]; ++ uip_connr->rcv_nxt[0] = tcp_hdr->seqno[0]; ++ uip_add_rcv_nxt(ustack, 1); ++ ++ /* Parse the TCP MSS option, if present. */ ++ if ((tcp_hdr->tcpoffset & 0xf0) > 0x50) { ++ for (c = 0; c < ((tcp_hdr->tcpoffset >> 4) - 5) << 2;) { ++ ustack->opt = ++ ustack->uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + c]; ++ if (ustack->opt == TCP_OPT_END) { ++ /* End of options. */ ++ break; ++ } else if (ustack->opt == TCP_OPT_NOOP) { ++ ++c; ++ /* NOP option. */ ++ } else if (ustack->opt == TCP_OPT_MSS && ++ ustack->uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 1 + c] == ++ TCP_OPT_MSS_LEN) { ++ /* An MSS option with the right option length.*/ ++ tmp16 = ++ ((u16_t) ustack-> ++ uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + 2 + ++ c] << 8) | (u16_t) ustack-> ++ uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + 3 + ++ c]; ++ uip_connr->initialmss = uip_connr->mss = ++ tmp16 > UIP_TCP_MSS ? UIP_TCP_MSS : tmp16; ++ ++ /* And we are done processing options. */ ++ break; ++ } else { ++ /* All other options have a length field, so ++ that we easily can skip past them. */ ++ if (ustack-> ++ uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + 1 + ++ c] == 0) { ++ /* If the length field is zero, the ++ options are malformed ++ and we don't process them further. */ ++ break; ++ } ++ c += ustack->uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 1 + c]; ++ } ++ } ++ } ++ ++ /* Our response will be a SYNACK. */ ++#if UIP_ACTIVE_OPEN ++tcp_send_synack: ++ tcp_hdr->flags = TCP_ACK; ++ ++tcp_send_syn: ++ tcp_hdr->flags |= TCP_SYN; ++#else /* UIP_ACTIVE_OPEN */ ++tcp_send_synack: ++ tcp_hdr->flags = TCP_SYN | TCP_ACK; ++#endif /* UIP_ACTIVE_OPEN */ ++ ++ /* We send out the TCP Maximum Segment Size option with our ++ SYNACK. */ ++ tcp_hdr->optdata[0] = TCP_OPT_MSS; ++ tcp_hdr->optdata[1] = TCP_OPT_MSS_LEN; ++ tcp_hdr->optdata[2] = (UIP_TCP_MSS) / 256; ++ tcp_hdr->optdata[3] = (UIP_TCP_MSS) & 255; ++ ustack->uip_len = uip_ip_tcph_len + TCP_OPT_MSS_LEN; ++ tcp_hdr->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4; ++ goto tcp_send; ++ ++ /* This label will be jumped to if we found an active connection. */ ++found: ++ ustack->uip_conn = uip_connr; ++ ustack->uip_flags = 0; ++ /* We do a very naive form of TCP reset processing; we just accept ++ any RST and kill our connection. We should in fact check if the ++ sequence number of this reset is wihtin our advertised window ++ before we accept the reset. */ ++ if (tcp_hdr->flags & TCP_RST) { ++ uip_connr->tcpstateflags = UIP_CLOSED; ++ LOG_WARN(PFX "tcp: got reset, aborting connection."); ++ ustack->uip_flags = UIP_ABORT; ++ UIP_APPCALL(ustack); ++ goto drop; ++ } ++ /* Calculated the length of the data, if the application has sent ++ any data to us. */ ++ c = (tcp_hdr->tcpoffset >> 4) << 2; ++ /* uip_len will contain the length of the actual TCP data. This is ++ calculated by subtracing the length of the TCP header (in ++ c) and the length of the IP header (20 bytes). */ ++ ustack->uip_len = ustack->uip_len - c - uip_iph_len; ++ ++ /* First, check if the sequence number of the incoming packet is ++ what we're expecting next. If not, we send out an ACK with the ++ correct numbers in. */ ++ if (!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) && ++ ((tcp_hdr->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) { ++ if ((ustack->uip_len > 0 ++ || ((tcp_hdr->flags & (TCP_SYN | TCP_FIN)) != 0)) ++ && (tcp_hdr->seqno[0] != uip_connr->rcv_nxt[0] ++ || tcp_hdr->seqno[1] != uip_connr->rcv_nxt[1] ++ || tcp_hdr->seqno[2] != uip_connr->rcv_nxt[2] ++ || tcp_hdr->seqno[3] != uip_connr->rcv_nxt[3])) { ++ goto tcp_send_ack; ++ } ++ } ++ ++ { ++ u8_t uip_acc32[4]; ++ ++ /* Next, check if the incoming segment acks any outstanding ++ data. If so, we update the sequence number, reset the len of ++ the outstanding data, calc RTT estimations, and reset the ++ retransmission timer. */ ++ if ((tcp_hdr->flags & TCP_ACK) && uip_outstanding(uip_connr)) { ++ uip_add32(uip_connr->snd_nxt, uip_connr->len, ++ uip_acc32); ++ ++ if (tcp_hdr->ackno[0] == uip_acc32[0] && ++ tcp_hdr->ackno[1] == uip_acc32[1] && ++ tcp_hdr->ackno[2] == uip_acc32[2] && ++ tcp_hdr->ackno[3] == uip_acc32[3]) { ++ /* Update sequence number. */ ++ uip_connr->snd_nxt[0] = uip_acc32[0]; ++ uip_connr->snd_nxt[1] = uip_acc32[1]; ++ uip_connr->snd_nxt[2] = uip_acc32[2]; ++ uip_connr->snd_nxt[3] = uip_acc32[3]; ++ ++ /* Do RTT estimation, unless we have done ++ retransmissions. */ ++ if (uip_connr->nrtx == 0) { ++ signed char m; ++ m = uip_connr->rto - uip_connr->timer; ++ /* This is taken directly from VJs ++ original code in his paper */ ++ m = m - (uip_connr->sa >> 3); ++ uip_connr->sa += m; ++ if (m < 0) ++ m = -m; ++ m = m - (uip_connr->sv >> 2); ++ uip_connr->sv += m; ++ uip_connr->rto = ++ (uip_connr->sa >> 3) + ++ uip_connr->sv; ++ ++ } ++ /* Set the acknowledged flag. */ ++ ustack->uip_flags = UIP_ACKDATA; ++ /* Reset the retransmission timer. */ ++ uip_connr->timer = uip_connr->rto; ++ ++ /* Reset length of outstanding data. */ ++ uip_connr->len = 0; ++ } ++ ++ } ++ ++ } ++ ++ /* Do different things depending on in what state the connection is. */ ++ switch (uip_connr->tcpstateflags & UIP_TS_MASK) { ++ /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not ++ implemented, since we force the application to close when the ++ peer sends a FIN (hence the application goes directly from ++ ESTABLISHED to LAST_ACK). */ ++ case UIP_SYN_RCVD: ++ /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, ++ and we are waiting for an ACK that acknowledges the data we ++ sent out the last time. Therefore, we want to have the ++ UIP_ACKDATA flag set. ++ If so, we enter the ESTABLISHED state. */ ++ if (ustack->uip_flags & UIP_ACKDATA) { ++ uip_connr->tcpstateflags = UIP_ESTABLISHED; ++ ustack->uip_flags = UIP_CONNECTED; ++ uip_connr->len = 0; ++ if (ustack->uip_len > 0) { ++ ustack->uip_flags |= UIP_NEWDATA; ++ uip_add_rcv_nxt(ustack, ustack->uip_len); ++ } ++ ustack->uip_slen = 0; ++ UIP_APPCALL(ustack); ++ goto appsend; ++ } ++ goto drop; ++#if UIP_ACTIVE_OPEN ++ case UIP_SYN_SENT: ++ /* In SYN_SENT, we wait for a SYNACK that is sent in response to ++ our SYN. The rcv_nxt is set to sequence number in the SYNACK ++ plus one, and we send an ACK. We move into the ESTABLISHED ++ state. */ ++ if ((ustack->uip_flags & UIP_ACKDATA) && ++ (tcp_hdr->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) { ++ ++ /* Parse the TCP MSS option, if present. */ ++ if ((tcp_hdr->tcpoffset & 0xf0) > 0x50) { ++ for (c = 0; ++ c < ++ ((tcp_hdr->tcpoffset >> 4) - 5) << 2;) { ++ ustack->opt = ++ ustack->uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + c]; ++ if (ustack->opt == TCP_OPT_END) { ++ /* End of options. */ ++ break; ++ } else if (ustack->opt == ++ TCP_OPT_NOOP) { ++ ++c; ++ /* NOP option. */ ++ } else if (ustack->opt == TCP_OPT_MSS && ++ ustack-> ++ uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 1 + ++ c] == ++ TCP_OPT_MSS_LEN) { ++ /* An MSS option with the right ++ option length. */ ++ tmp16 = ++ (ustack-> ++ uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 2 + ++ c] << 8) | ustack-> ++ uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 3 + ++ c]; ++ uip_connr->initialmss = ++ uip_connr->mss = ++ tmp16 > ++ UIP_TCP_MSS ? UIP_TCP_MSS : ++ tmp16; ++ ++ /* And we are done processing ++ options. */ ++ break; ++ } else { ++ /* All other options have a ++ length field, so that we ++ easily can skip past them */ ++ if (ustack-> ++ uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 1 + ++ c] == 0) { ++ /* If the length field ++ is zero, the options ++ are malformed and we ++ don't process them ++ further. */ ++ break; ++ } ++ c += ustack-> ++ uip_buf[uip_ip_tcph_len + ++ UIP_LLH_LEN + 1 + ++ c]; ++ } ++ } ++ } ++ uip_connr->tcpstateflags = UIP_ESTABLISHED; ++ uip_connr->rcv_nxt[0] = tcp_hdr->seqno[0]; ++ uip_connr->rcv_nxt[1] = tcp_hdr->seqno[1]; ++ uip_connr->rcv_nxt[2] = tcp_hdr->seqno[2]; ++ uip_connr->rcv_nxt[3] = tcp_hdr->seqno[3]; ++ uip_add_rcv_nxt(ustack, 1); ++ ustack->uip_flags = UIP_CONNECTED | UIP_NEWDATA; ++ uip_connr->len = 0; ++ ustack->uip_len = 0; ++ ustack->uip_slen = 0; ++ UIP_APPCALL(ustack); ++ goto appsend; ++ } ++ /* Inform the application that the connection failed */ ++ ustack->uip_flags = UIP_ABORT; ++ UIP_APPCALL(ustack); ++ /* The connection is closed after we send the RST */ ++ ustack->uip_conn->tcpstateflags = UIP_CLOSED; ++ goto reset; ++#endif /* UIP_ACTIVE_OPEN */ ++ ++ case UIP_ESTABLISHED: ++ /* In the ESTABLISHED state, we call upon the application to ++ feed data into the uip_buf. If the UIP_ACKDATA flag is set, ++ the application should put new data into the buffer, ++ otherwise we are retransmitting an old segment, and the ++ application should put that data into the buffer. ++ ++ If the incoming packet is a FIN, we should close the ++ connection on this side as well, and we send out a FIN and ++ enter the LAST_ACK state. We require that there is no ++ outstanding data; otherwise the sequence numbers will be ++ screwed up. */ ++ ++ if (tcp_hdr->flags & TCP_FIN ++ && !(uip_connr->tcpstateflags & UIP_STOPPED)) { ++ if (uip_outstanding(uip_connr)) ++ goto drop; ++ uip_add_rcv_nxt(ustack, 1 + ustack->uip_len); ++ ustack->uip_flags |= UIP_CLOSE; ++ if (ustack->uip_len > 0) ++ ustack->uip_flags |= UIP_NEWDATA; ++ UIP_APPCALL(ustack); ++ uip_connr->len = 1; ++ uip_connr->tcpstateflags = UIP_LAST_ACK; ++ uip_connr->nrtx = 0; ++tcp_send_finack: ++ tcp_hdr->flags = TCP_FIN | TCP_ACK; ++ goto tcp_send_nodata; ++ } ++ ++ /* Check the URG flag. If this is set, the segment carries ++ urgent data that we must pass to the application. */ ++ if ((tcp_hdr->flags & TCP_URG) != 0) { ++#if UIP_URGDATA > 0 ++ uip_urglen = (tcp_hdr->urgp[0] << 8) | tcp_hdr->urgp[1]; ++ if (uip_urglen > uip_len) { ++ /* There is more urgent data in the next segment ++ to come. */ ++ uip_urglen = uip_len; ++ } ++ uip_add_rcv_nxt(uip_urglen); ++ uip_len -= uip_urglen; ++ uip_urgdata = uip_appdata; ++ uip_appdata += uip_urglen; ++ } else { ++ uip_urglen = 0; ++#else /* UIP_URGDATA > 0 */ ++ ustack->uip_appdata = ++ ((char *)ustack->uip_appdata) + ++ ((tcp_hdr->urgp[0] << 8) | tcp_hdr->urgp[1]); ++ ustack->uip_len -= ++ (tcp_hdr->urgp[0] << 8) | tcp_hdr->urgp[1]; ++#endif /* UIP_URGDATA > 0 */ ++ } ++ ++ /* If uip_len > 0 we have TCP data in the packet, and we flag ++ this by setting the UIP_NEWDATA flag and update the sequence ++ number we acknowledge. If the application has stopped the ++ dataflow using uip_stop(), we must not accept any data ++ packets from the remote host. */ ++ if (ustack->uip_len > 0 ++ && !(uip_connr->tcpstateflags & UIP_STOPPED)) { ++ ustack->uip_flags |= UIP_NEWDATA; ++ uip_add_rcv_nxt(ustack, ustack->uip_len); ++ } ++ ++ /* Check if the available buffer space advertised by the other ++ end is smaller than the initial MSS for this connection. ++ If so, we set the current MSS to the window size to ensure ++ that the application does not send more data than the other ++ end can handle. ++ ++ If the remote host advertises a zero window, we set the MSS ++ to the initial MSS so that the application will send an ++ entire MSS of data. This data will not be acknowledged by ++ the receiver, and the application will retransmit it. ++ This is called the "persistent timer" and uses the ++ retransmission mechanim. ++ */ ++ tmp16 = ++ ((u16_t) tcp_hdr->wnd[0] << 8) + (u16_t) tcp_hdr->wnd[1]; ++ if (tmp16 > uip_connr->initialmss || tmp16 == 0) ++ tmp16 = uip_connr->initialmss; ++ uip_connr->mss = tmp16; ++ ++ /* If this packet constitutes an ACK for outstanding data ++ (flagged by the UIP_ACKDATA flag, we should call the ++ application since it might want to send more data. ++ If the incoming packet had data from the peer ++ (as flagged by the UIP_NEWDATA flag), the application ++ must also be notified. ++ ++ When the application is called, the global variable uip_len ++ contains the length of the incoming data. The application can ++ access the incoming data through the global pointer ++ uip_appdata, which usually points uip_ip_tcph_len + ++ UIP_LLH_LEN bytes into the uip_buf array. ++ ++ If the application wishes to send any data, this data should ++ be put into the uip_appdata and the length of the data should ++ be put into uip_len. If the application don't have any data ++ to send, uip_len must be set to 0. */ ++ if (ustack->uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) { ++ ustack->uip_slen = 0; ++ UIP_APPCALL(ustack); ++ ++appsend: ++ ++ if (ustack->uip_flags & UIP_ABORT) { ++ ustack->uip_slen = 0; ++ uip_connr->tcpstateflags = UIP_CLOSED; ++ tcp_hdr->flags = TCP_RST | TCP_ACK; ++ goto tcp_send_nodata; ++ } ++ ++ if (ustack->uip_flags & UIP_CLOSE) { ++ ustack->uip_slen = 0; ++ uip_connr->len = 1; ++ uip_connr->tcpstateflags = UIP_FIN_WAIT_1; ++ uip_connr->nrtx = 0; ++ tcp_hdr->flags = TCP_FIN | TCP_ACK; ++ goto tcp_send_nodata; ++ } ++ ++ /* If uip_slen > 0, the application has data to be sent ++ */ ++ if (ustack->uip_slen > 0) { ++ ++ /* If the connection has acknowledged data, the ++ contents of the ->len variable should be ++ discarded. */ ++ if ((ustack->uip_flags & UIP_ACKDATA) != 0) ++ uip_connr->len = 0; ++ ++ /* If the ->len variable is non-zero the ++ connection has already data in transit and ++ cannot send anymore right now. */ ++ if (uip_connr->len == 0) { ++ ++ /* The application cannot send more than ++ what is allowed by the mss (the ++ minumum of the MSS and the available ++ window). */ ++ if (ustack->uip_slen > uip_connr->mss) { ++ ustack->uip_slen = ++ uip_connr->mss; ++ } ++ ++ /* Remember how much data we send out ++ now so that we know when everything ++ has been acknowledged. */ ++ uip_connr->len = ustack->uip_slen; ++ } else { ++ ++ /* If the application already had ++ unacknowledged data, we make sure ++ that the application does not send ++ (i.e., retransmit) out more than it ++ previously sent out. */ ++ ustack->uip_slen = uip_connr->len; ++ } ++ } ++ uip_connr->nrtx = 0; ++apprexmit: ++ ustack->uip_appdata = ustack->uip_sappdata; ++ ++ /* If the application has data to be sent, or if the ++ incoming packet had new data in it, we must send ++ out a packet. */ ++ if (ustack->uip_slen > 0 && uip_connr->len > 0) { ++ /* Add the length of the IP and TCP headers. */ ++ ustack->uip_len = ++ uip_connr->len + uip_ip_tcph_len; ++ /* We always set the ACK flag in response ++ packets. */ ++ tcp_hdr->flags = TCP_ACK | TCP_PSH; ++ /* Send the packet. */ ++ goto tcp_send_noopts; ++ } ++ /* If there is no data to send, just send out a pure ACK ++ if there is newdata. */ ++ if (ustack->uip_flags & UIP_NEWDATA) { ++ ustack->uip_len = uip_ip_tcph_len; ++ tcp_hdr->flags = TCP_ACK; ++ goto tcp_send_noopts; ++ } ++ } ++ goto drop; ++ case UIP_LAST_ACK: ++ /* We can close this connection if the peer has acknowledged our ++ FIN. This is indicated by the UIP_ACKDATA flag. */ ++ if (ustack->uip_flags & UIP_ACKDATA) { ++ uip_connr->tcpstateflags = UIP_CLOSED; ++ ustack->uip_flags = UIP_CLOSE; ++ UIP_APPCALL(ustack); ++ } ++ break; ++ ++ case UIP_FIN_WAIT_1: ++ /* The application has closed the connection, but the remote ++ host hasn't closed its end yet. Thus we do nothing but wait ++ for a FIN from the other side. */ ++ if (ustack->uip_len > 0) ++ uip_add_rcv_nxt(ustack, ustack->uip_len); ++ if (tcp_hdr->flags & TCP_FIN) { ++ if (ustack->uip_flags & UIP_ACKDATA) { ++ uip_connr->tcpstateflags = UIP_TIME_WAIT; ++ uip_connr->timer = 0; ++ uip_connr->len = 0; ++ } else { ++ uip_connr->tcpstateflags = UIP_CLOSING; ++ } ++ uip_add_rcv_nxt(ustack, 1); ++ ustack->uip_flags = UIP_CLOSE; ++ UIP_APPCALL(ustack); ++ goto tcp_send_ack; ++ } else if (ustack->uip_flags & UIP_ACKDATA) { ++ uip_connr->tcpstateflags = UIP_FIN_WAIT_2; ++ uip_connr->len = 0; ++ goto drop; ++ } ++ if (ustack->uip_len > 0) ++ goto tcp_send_ack; ++ goto drop; ++ ++ case UIP_FIN_WAIT_2: ++ if (ustack->uip_len > 0) ++ uip_add_rcv_nxt(ustack, ustack->uip_len); ++ if (tcp_hdr->flags & TCP_FIN) { ++ uip_connr->tcpstateflags = UIP_TIME_WAIT; ++ uip_connr->timer = 0; ++ uip_add_rcv_nxt(ustack, 1); ++ ustack->uip_flags = UIP_CLOSE; ++ UIP_APPCALL(ustack); ++ goto tcp_send_ack; ++ } ++ if (ustack->uip_len > 0) ++ goto tcp_send_ack; ++ goto drop; ++ ++ case UIP_TIME_WAIT: ++ goto tcp_send_ack; ++ ++ case UIP_CLOSING: ++ if (ustack->uip_flags & UIP_ACKDATA) { ++ uip_connr->tcpstateflags = UIP_TIME_WAIT; ++ uip_connr->timer = 0; ++ } ++ } ++ goto drop; ++ ++ /* We jump here when we are ready to send the packet, and just want ++ to set the appropriate TCP sequence numbers in the TCP header. */ ++tcp_send_ack: ++ tcp_hdr->flags = TCP_ACK; ++tcp_send_nodata: ++ ustack->uip_len = uip_ip_tcph_len; ++tcp_send_noopts: ++ tcp_hdr->tcpoffset = (UIP_TCPH_LEN / 4) << 4; ++tcp_send: ++ /* We're done with the input processing. We are now ready to send a ++ reply. Our job is to fill in all the fields of the TCP and IP ++ headers before calculating the checksum and finally send the ++ packet. */ ++ tcp_hdr->ackno[0] = uip_connr->rcv_nxt[0]; ++ tcp_hdr->ackno[1] = uip_connr->rcv_nxt[1]; ++ tcp_hdr->ackno[2] = uip_connr->rcv_nxt[2]; ++ tcp_hdr->ackno[3] = uip_connr->rcv_nxt[3]; ++ ++ tcp_hdr->seqno[0] = uip_connr->snd_nxt[0]; ++ tcp_hdr->seqno[1] = uip_connr->snd_nxt[1]; ++ tcp_hdr->seqno[2] = uip_connr->snd_nxt[2]; ++ tcp_hdr->seqno[3] = uip_connr->snd_nxt[3]; ++ ++ if (is_ipv6(ustack)) { ++ IPv6_BUF(ustack)->proto = UIP_PROTO_TCP; ++ uip_ip6addr_copy(IPv6_BUF(ustack)->srcipaddr, ++ ustack->hostaddr6); ++ uip_ip6addr_copy(IPv6_BUF(ustack)->destipaddr, ++ uip_connr->ripaddr6); ++ } else { ++ tcp_ipv4_hdr->proto = UIP_PROTO_TCP; ++ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); ++ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, uip_connr->ripaddr); ++ } ++ ++ tcp_hdr->srcport = uip_connr->lport; ++ tcp_hdr->destport = uip_connr->rport; ++ ++ if (uip_connr->tcpstateflags & UIP_STOPPED) { ++ /* If the connection has issued uip_stop(), we advertise a zero ++ window so that the remote host will stop sending data. */ ++ tcp_hdr->wnd[0] = tcp_hdr->wnd[1] = 0; ++ } else { ++ tcp_hdr->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8); ++ tcp_hdr->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff); ++ } ++ ++tcp_send_noconn: ++ if (is_ipv6(ustack)) { ++ IPv6_BUF(ustack)->ttl = UIP_TTL; ++ ++ /* For IPv6, the IP length field does not include the IPv6 IP ++ header length. */ ++ IPv6_BUF(ustack)->len[0] = ++ ((ustack->uip_len - uip_iph_len) >> 8); ++ IPv6_BUF(ustack)->len[1] = ++ ((ustack->uip_len - uip_iph_len) & 0xff); ++ } else { ++ tcp_ipv4_hdr->ttl = UIP_TTL; ++ tcp_ipv4_hdr->len[0] = (ustack->uip_len >> 8); ++ tcp_ipv4_hdr->len[1] = (ustack->uip_len & 0xff); ++ } ++ ++ tcp_hdr->urgp[0] = tcp_hdr->urgp[1] = 0; ++ ++ /* Calculate TCP checksum. */ ++ tcp_hdr->tcpchksum = 0; ++ tcp_hdr->tcpchksum = ~(uip_tcpchksum(ustack)); ++ ++ip_send_nolen: ++ ++ if (!is_ipv6(ustack)) { ++ tcp_ipv4_hdr->vhl = 0x45; ++ tcp_ipv4_hdr->tos = 0; ++ tcp_ipv4_hdr->ipoffset[0] = tcp_ipv4_hdr->ipoffset[1] = 0; ++ ++ustack->ipid; ++ tcp_ipv4_hdr->ipid[0] = ustack->ipid >> 8; ++ tcp_ipv4_hdr->ipid[1] = ustack->ipid & 0xff; ++ /* Calculate IP checksum. */ ++ tcp_ipv4_hdr->ipchksum = 0; ++ tcp_ipv4_hdr->ipchksum = ~(uip_ipchksum(ustack)); ++ } ++ ++ ++ustack->stats.tcp.sent; ++send: ++ if (is_ipv6(ustack)) { ++ LOG_DEBUG(PFX "Sending packet with length %d (%d)", ++ ustack->uip_len, ipv6_hdr ? ipv6_hdr->ip6_plen : 0); ++ } else { ++ LOG_DEBUG(PFX "Sending packet with length %d (%d)", ++ ustack->uip_len, ++ (tcp_ipv4_hdr->len[0] << 8) | tcp_ipv4_hdr->len[1]); ++ } ++ ++ustack->stats.ip.sent; ++ /* Return and let the caller do the actual transmission. */ ++ ustack->uip_flags = 0; ++ return; ++drop: ++ ustack->uip_len = 0; ++ ustack->uip_flags = 0; ++ return; ++} ++ ++/*---------------------------------------------------------------------------*/ ++void uip_send(struct uip_stack *ustack, const void *data, int len) ++{ ++ if (len > 0) { ++ ustack->uip_slen = len; ++ if (data != ustack->uip_buf) ++ memcpy(ustack->uip_buf, (data), ustack->uip_slen); ++ } ++} ++ ++void uip_appsend(struct uip_stack *ustack, const void *data, int len) ++{ ++ if (len > 0) { ++ ustack->uip_slen = len; ++ if (data != ustack->uip_sappdata) ++ memcpy(ustack->uip_sappdata, (data), ustack->uip_slen); ++ } ++} ++ ++u16_t uip_datalen(struct uip_stack *ustack) ++{ ++ return ustack->uip_len; ++} ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/uip.h b/iscsiuio/src/uip/uip.h +new file mode 100644 +index 0000000..0225f6a +--- /dev/null ++++ b/iscsiuio/src/uip/uip.h +@@ -0,0 +1,1569 @@ ++ ++/** ++ * \addtogroup uip ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Header file for the uIP TCP/IP stack. ++ * \author Adam Dunkels ++ * ++ * The uIP TCP/IP stack header file contains definitions for a number ++ * of C macros that are used by uIP programs as well as internal uIP ++ * structures, TCP/IP header structures and function declarations. ++ * ++ */ ++ ++/* ++ * Copyright (c) 2001-2003, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++#ifndef __UIP_H__ ++#define __UIP_H__ ++ ++#include ++#include ++ ++#include "uipopt.h" ++ ++#include "debug.h" ++ ++#include "uip_eth.h" ++ ++/* Forware declaration */ ++struct uip_stack; ++ ++/** ++ * Repressentation of an IP address. ++ * ++ */ ++typedef u16_t uip_ip4addr_t[2]; ++typedef u16_t uip_ip6addr_t[8]; ++ ++const uip_ip6addr_t all_zeroes_addr6; ++const uip_ip4addr_t all_zeroes_addr4; ++ ++#define ETH_BUF(buf) ((struct uip_eth_hdr *)buf) ++#define VLAN_ETH_BUF(buf) ((struct uip_vlan_eth_hdr *)buf) ++#define IPv4_BUF(buf) ((struct uip_tcp_ipv4_hdr *)buf) ++#define IPv6_BUF(buf) ((struct uip_tcp_ipv6_hdr *)buf) ++ ++/*---------------------------------------------------------------------------*/ ++/* First, the functions that should be called from the ++ * system. Initialization, the periodic timer and incoming packets are ++ * handled by the following three functions. ++ */ ++ ++/** ++ * Set the IP address of this host. ++ * ++ * The IP address is represented as a 4-byte array where the first ++ * octet of the IP address is put in the first member of the 4-byte ++ * array. ++ * ++ * Example: ++ \code ++ ++ uip_ipaddr_t addr; ++ ++ uip_ipaddr(&addr, 192,168,1,2); ++ uip_sethostaddr(&addr); ++ ++ \endcode ++ * \param addr A pointer to an IP address of type uip_ipaddr_t; ++ * ++ * \sa uip_ipaddr() ++ * ++ * \hideinitializer ++ */ ++void uip_sethostaddr4(struct uip_stack *ustack, uip_ip4addr_t *addr); ++ ++/** ++ * Set the default router's IP address. ++ * ++ * \param addr A pointer to a uip_ipaddr_t variable containing the IP ++ * address of the default router. ++ * ++ * \sa uip_ipaddr() ++ * ++ * \hideinitializer ++ */ ++void uip_setdraddr4(struct uip_stack *ustack, uip_ip4addr_t *addr); ++ ++/** ++ * Set the netmask. ++ * ++ * \param addr A pointer to a uip_ipaddr_t variable containing the IP ++ * address of the netmask. ++ * ++ * \sa uip_ipaddr() ++ * ++ * \hideinitializer ++ */ ++void uip_setnetmask4(struct uip_stack *ustack, uip_ip4addr_t *addr); ++ ++/** ++ * Set the ethernet MAC address. ++ * ++ * \param addr A pointer to a uip_ipaddr_t variable containing the IP ++ * address of the netmask. ++ * ++ * \sa uip_ipaddr() ++ * ++ * \hideinitializer ++ */ ++void uip_setethernetmac(struct uip_stack *ustack, uint8_t *mac); ++ ++/** ++ * Get the default router's IP address. ++ * ++ * \param addr A pointer to a uip_ipaddr_t variable that will be ++ * filled in with the IP address of the default router. ++ * ++ * \hideinitializer ++ */ ++#define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr) ++ ++/** ++ * Get the netmask. ++ * ++ * \param addr A pointer to a uip_ipaddr_t variable that will be ++ * filled in with the value of the netmask. ++ * ++ * \hideinitializer ++ */ ++#define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask) ++ ++void set_uip_stack(struct uip_stack *ustack, ++ uip_ip4addr_t *ip, ++ uip_ip4addr_t *netmask, ++ uip_ip4addr_t *default_route, uint8_t *mac_addr); ++ ++/** @} */ ++ ++/** ++ * \defgroup uipinit uIP initialization functions ++ * @{ ++ * ++ * The uIP initialization functions are used for booting uIP. ++ */ ++ ++/** ++ * uIP initialization function. ++ * ++ * This function should be called at boot up to initilize the uIP ++ * TCP/IP stack. ++ */ ++void uip_init(struct uip_stack *ustack, uint8_t enable_ipv6); ++ ++/** ++ * uIP reset function. ++ * ++ * This function should be called at to reset the uIP TCP/IP stack. ++ */ ++void uip_reset(struct uip_stack *ustack); ++ ++/** ++ * uIP initialization function. ++ * ++ * This function may be used at boot time to set the initial ip_id. ++ */ ++void uip_setipid(u16_t id); ++ ++/** ++ * ++ * ++ */ ++#define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED) ++ ++#if UIP_UDP ++void uip_udp_periodic(struct uip_stack *ustack, int conn); ++#endif /* UIP_UDP */ ++ ++void uip_ndp_periodic(struct uip_stack *ustack); ++ ++/** ++ * The uIP packet buffer. ++ * ++ * The uip_buf array is used to hold incoming and outgoing ++ * packets. The device driver should place incoming data into this ++ * buffer. When sending data, the device driver should read the link ++ * level headers and the TCP/IP headers from this buffer. The size of ++ * the link level headers is configured by the UIP_LLH_LEN define. ++ * ++ * \note The application data need not be placed in this buffer, so ++ * the device driver must read it from the place pointed to by the ++ * uip_appdata pointer as illustrated by the following example: ++ \code ++ void ++ devicedriver_send(void) ++ { ++ hwsend(&uip_buf[0], UIP_LLH_LEN); ++ if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { ++ hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); ++ } else { ++ hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); ++ hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); ++ } ++ } ++ \endcode ++ */ ++/*extern u8_t uip_buf[UIP_BUFSIZE+2]; */ ++ ++/** @} */ ++ ++/*---------------------------------------------------------------------------*/ ++/* Functions that are used by the uIP application program. Opening and ++ * closing connections, sending and receiving data, etc. is all ++ * handled by the functions below. ++*/ ++/** ++ * \defgroup uipappfunc uIP application functions ++ * @{ ++ * ++ * Functions used by an application running of top of uIP. ++ */ ++ ++/** ++ * Start listening to the specified port. ++ * ++ * \note Since this function expects the port number in network byte ++ * order, a conversion using HTONS() or htons() is necessary. ++ * ++ \code ++ uip_listen(HTONS(80)); ++ \endcode ++ * ++ * \param port A 16-bit port number in network byte order. ++ */ ++void uip_listen(struct uip_stack *ustack, u16_t port); ++ ++/** ++ * Stop listening to the specified port. ++ * ++ * \note Since this function expects the port number in network byte ++ * order, a conversion using HTONS() or htons() is necessary. ++ * ++ \code ++ uip_unlisten(HTONS(80)); ++ \endcode ++ * ++ * \param port A 16-bit port number in network byte order. ++ */ ++void uip_unlisten(struct uip_stack *ustack, u16_t port); ++ ++/** ++ * Connect to a remote host using TCP. ++ * ++ * This function is used to start a new connection to the specified ++ * port on the specied host. It allocates a new connection identifier, ++ * sets the connection to the SYN_SENT state and sets the ++ * retransmission timer to 0. This will cause a TCP SYN segment to be ++ * sent out the next time this connection is periodically processed, ++ * which usually is done within 0.5 seconds after the call to ++ * uip_connect(). ++ * ++ * \note This function is avaliable only if support for active open ++ * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h. ++ * ++ * \note Since this function requires the port number to be in network ++ * byte order, a conversion using HTONS() or htons() is necessary. ++ * ++ \code ++ uip_ipaddr_t ipaddr; ++ ++ uip_ipaddr(&ipaddr, 192,168,1,2); ++ uip_connect(&ipaddr, HTONS(80)); ++ \endcode ++ * ++ * \param ripaddr The IP address of the remote hot. ++ * ++ * \param port A 16-bit port number in network byte order. ++ * ++ * \return A pointer to the uIP connection identifier for the new connection, ++ * or NULL if no connection could be allocated. ++ * ++ */ ++struct uip_conn *uip_connect(struct uip_stack *ustack, ++ uip_ip4addr_t *ripaddr, u16_t port); ++ ++/** ++ * \internal ++ * ++ * Check if a connection has outstanding (i.e., unacknowledged) data. ++ * ++ * \param conn A pointer to the uip_conn structure for the connection. ++ * ++ * \hideinitializer ++ */ ++#define uip_outstanding(conn) ((conn)->len) ++ ++/** ++ * Send data on the current connection. ++ * ++ * This function is used to send out a single segment of TCP ++ * data. Only applications that have been invoked by uIP for event ++ * processing can send data. ++ * ++ * The amount of data that actually is sent out after a call to this ++ * funcion is determined by the maximum amount of data TCP allows. uIP ++ * will automatically crop the data so that only the appropriate ++ * amount of data is sent. The function uip_mss() can be used to query ++ * uIP for the amount of data that actually will be sent. ++ * ++ * \note This function does not guarantee that the sent data will ++ * arrive at the destination. If the data is lost in the network, the ++ * application will be invoked with the uip_rexmit() event being ++ * set. The application will then have to resend the data using this ++ * function. ++ * ++ * \param data A pointer to the data which is to be sent. ++ * ++ * \param len The maximum amount of data bytes to be sent. ++ * ++ * \hideinitializer ++ */ ++void uip_send(struct uip_stack *ustack, const void *data, int len); ++void uip_appsend(struct uip_stack *ustack, const void *data, int len); ++ ++/** ++ * The length of any incoming data that is currently avaliable (if avaliable) ++ * in the uip_appdata buffer. ++ * ++ * The test function uip_data() must first be used to check if there ++ * is any data available at all. ++ * ++ * \hideinitializer ++ */ ++/*void uip_datalen(void);*/ ++u16_t uip_datalen(struct uip_stack *ustack); ++ ++/** ++ * The length of any out-of-band data (urgent data) that has arrived ++ * on the connection. ++ * ++ * \note The configuration parameter UIP_URGDATA must be set for this ++ * function to be enabled. ++ * ++ * \hideinitializer ++ */ ++#define uip_urgdatalen() uip_urglen ++ ++/** ++ * Close the current connection. ++ * ++ * This function will close the current connection in a nice way. ++ * ++ * \hideinitializer ++ */ ++#define uip_close() (uip_flags = UIP_CLOSE) ++ ++/** ++ * Abort the current connection. ++ * ++ * This function will abort (reset) the current connection, and is ++ * usually used when an error has occured that prevents using the ++ * uip_close() function. ++ * ++ * \hideinitializer ++ */ ++#define uip_abort() (uip_flags = UIP_ABORT) ++ ++/** ++ * Tell the sending host to stop sending data. ++ * ++ * This function will close our receiver's window so that we stop ++ * receiving data for the current connection. ++ * ++ * \hideinitializer ++ */ ++#define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED) ++ ++/** ++ * Find out if the current connection has been previously stopped with ++ * uip_stop(). ++ * ++ * \hideinitializer ++ */ ++#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED) ++ ++/** ++ * Restart the current connection, if is has previously been stopped ++ * with uip_stop(). ++ * ++ * This function will open the receiver's window again so that we ++ * start receiving data for the current connection. ++ * ++ * \hideinitializer ++ */ ++#define uip_restart() do { uip_flags |= UIP_NEWDATA; \ ++ uip_conn->tcpstateflags &= ~UIP_STOPPED; \ ++ } while (0) ++ ++/* uIP tests that can be made to determine in what state the current ++ connection is, and what the application function should do. */ ++ ++/** ++ * Is the current connection a UDP connection? ++ * ++ * This function checks whether the current connection is a UDP connection. ++ * ++ * \hideinitializer ++ * ++ */ ++#define uip_udpconnection() (uip_conn == NULL) ++ ++/** ++ * Function declarations for hte uip_flags ++ */ ++/** ++ * Is new incoming data available? ++ * ++ * Will reduce to non-zero if there is new data for the application ++ * present at the uip_appdata pointer. The size of the data is ++ * avaliable through the uip_len variable. ++ * ++ * \hideinitializer ++ */ ++int uip_newdata(struct uip_stack *ustack); ++ ++/** ++ * Has previously sent data been acknowledged? ++ * ++ * Will reduce to non-zero if the previously sent data has been ++ * acknowledged by the remote host. This means that the application ++ * can send new data. ++ * ++ * \hideinitializer ++ */ ++int uip_acked(struct uip_stack *ustack); ++ ++/** ++ * Has the connection just been connected? ++ * ++ * Reduces to non-zero if the current connection has been connected to ++ * a remote host. This will happen both if the connection has been ++ * actively opened (with uip_connect()) or passively opened (with ++ * uip_listen()). ++ * ++ * \hideinitializer ++ */ ++int uip_connected(struct uip_stack *ustack); ++ ++/** ++ * Has the connection been closed by the other end? ++ * ++ * Is non-zero if the connection has been closed by the remote ++ * host. The application may then do the necessary clean-ups. ++ * ++ * \hideinitializer ++ */ ++int uip_closed(struct uip_stack *ustack); ++ ++/** ++ * Has the connection been aborted by the other end? ++ * ++ * Non-zero if the current connection has been aborted (reset) by the ++ * remote host. ++ * ++ * \hideinitializer ++ */ ++int uip_aborted(struct uip_stack *ustack); ++ ++/** ++ * Has the connection timed out? ++ * ++ * Non-zero if the current connection has been aborted due to too many ++ * retransmissions. ++ * ++ * \hideinitializer ++ */ ++int uip_timedout(struct uip_stack *ustack); ++ ++/** ++ * Do we need to retransmit previously data? ++ * ++ * Reduces to non-zero if the previously sent data has been lost in ++ * the network, and the application should retransmit it. The ++ * application should send the exact same data as it did the last ++ * time, using the uip_send() function. ++ * ++ * \hideinitializer ++ */ ++int uip_rexmit(struct uip_stack *ustack); ++ ++/** ++ * Is the connection being polled by uIP? ++ * ++ * Is non-zero if the reason the application is invoked is that the ++ * current connection has been idle for a while and should be ++ * polled. ++ * ++ * The polling event can be used for sending data without having to ++ * wait for the remote host to send data. ++ * ++ * \hideinitializer ++ */ ++int uip_poll(struct uip_stack *ustack); ++ ++/** ++ * Get the initial maxium segment size (MSS) of the current ++ * connection. ++ * ++ * \hideinitializer ++ */ ++int uip_initialmss(struct uip_stack *ustack); ++ ++/** ++ * Get the current maxium segment size that can be sent on the current ++ * connection. ++ * ++ * The current maxiumum segment size that can be sent on the ++ * connection is computed from the receiver's window and the MSS of ++ * the connection (which also is available by calling ++ * uip_initialmss()). ++ * ++ * \hideinitializer ++ */ ++int uip_mss(struct uip_stack *ustack); ++ ++/** ++ * Set up a new UDP connection. ++ * ++ * This function sets up a new UDP connection. The function will ++ * automatically allocate an unused local port for the new ++ * connection. However, another port can be chosen by using the ++ * uip_udp_bind() call, after the uip_udp_new() function has been ++ * called. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t addr; ++ struct uip_udp_conn *c; ++ ++ uip_ipaddr(&addr, 192,168,2,1); ++ c = uip_udp_new(&addr, HTONS(12345)); ++ if(c != NULL) { ++ uip_udp_bind(c, HTONS(12344)); ++ } ++ \endcode ++ * \param ripaddr The IP address of the remote host. ++ * ++ * \param rport The remote port number in network byte order. ++ * ++ * \return The uip_udp_conn structure for the new connection or NULL ++ * if no connection could be allocated. ++ */ ++struct uip_udp_conn *uip_udp_new(struct uip_stack *ustack, ++ uip_ip4addr_t *ripaddr, u16_t rport); ++ ++/** ++ * Removed a UDP connection. ++ * ++ * \param conn A pointer to the uip_udp_conn structure for the connection. ++ * ++ * \hideinitializer ++ */ ++#define uip_udp_remove(conn) ((conn)->lport = 0) ++ ++/** ++ * Bind a UDP connection to a local port. ++ * ++ * \param conn A pointer to the uip_udp_conn structure for the ++ * connection. ++ * ++ * \param port The local port number, in network byte order. ++ * ++ * \hideinitializer ++ */ ++#define uip_udp_bind(conn, port) ((conn)->lport = port) ++ ++/** ++ * Send a UDP datagram of length len on the current connection. ++ * ++ * This function can only be called in response to a UDP event (poll ++ * or newdata). The data must be present in the uip_buf buffer, at the ++ * place pointed to by the uip_appdata pointer. ++ * ++ * \param len The length of the data in the uip_buf buffer. ++ * ++ * \hideinitializer ++ */ ++#define uip_udp_send(len) uip_appsend((char *)uip_appdata, len) ++ ++/** @} */ ++ ++/* uIP convenience and converting functions. */ ++ ++/** ++ * \defgroup uipconvfunc uIP conversion functions ++ * @{ ++ * ++ * These functions can be used for converting between different data ++ * formats used by uIP. ++ */ ++ ++/** ++ * Construct an IP address from four bytes. ++ * ++ * This function constructs an IP address of the type that uIP handles ++ * internally from four bytes. The function is handy for specifying IP ++ * addresses to use with e.g. the uip_connect() function. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr; ++ struct uip_conn *c; ++ ++ uip_ipaddr(&ipaddr, 192,168,1,2); ++ c = uip_connect(&ipaddr, HTONS(80)); ++ \endcode ++ * ++ * \param addr A pointer to a uip_ipaddr_t variable that will be ++ * filled in with the IP address. ++ * ++ * \param addr0 The first octet of the IP address. ++ * \param addr1 The second octet of the IP address. ++ * \param addr2 The third octet of the IP address. ++ * \param addr3 The forth octet of the IP address. ++ * ++ * \hideinitializer ++ */ ++#define uip_ipaddr(addr, addr0, addr1, addr2, addr3) do { \ ++ ((u16_t *)(addr))[0] = const_htons(((addr0) << 8) | (addr1)); \ ++ ((u16_t *)(addr))[1] = const_htons(((addr2) << 8) | (addr3)); \ ++ } while (0) ++ ++/** ++ * Construct an IPv6 address from eight 16-bit words. ++ * ++ * This function constructs an IPv6 address. ++ * ++ * \hideinitializer ++ */ ++#define uip_ip6addr(addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, \ ++ addr7) \ ++ do { \ ++ ((u16_t *)(addr))[0] = HTONS((addr0)); \ ++ ((u16_t *)(addr))[1] = HTONS((addr1)); \ ++ ((u16_t *)(addr))[2] = HTONS((addr2)); \ ++ ((u16_t *)(addr))[3] = HTONS((addr3)); \ ++ ((u16_t *)(addr))[4] = HTONS((addr4)); \ ++ ((u16_t *)(addr))[5] = HTONS((addr5)); \ ++ ((u16_t *)(addr))[6] = HTONS((addr6)); \ ++ ((u16_t *)(addr))[7] = HTONS((addr7)); \ ++ } while (0) ++ ++/** ++ * Copy an IP address to another IP address. ++ * ++ * Copies an IP address from one place to another. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr1, ipaddr2; ++ ++ uip_ipaddr(&ipaddr1, 192,16,1,2); ++ uip_ipaddr_copy(&ipaddr2, &ipaddr1); ++ \endcode ++ * ++ * \param dest The destination for the copy. ++ * \param src The source from where to copy. ++ * ++ * \hideinitializer ++ */ ++#define uip_ip4addr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip4addr_t)) ++#define uip_ip6addr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) ++ ++/** ++ * Compare two IP addresses ++ * ++ * Compares two IP addresses. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr1, ipaddr2; ++ ++ uip_ipaddr(&ipaddr1, 192,16,1,2); ++ if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) { ++ printf("They are the same"); ++ } ++ \endcode ++ * ++ * \param addr1 The first IP address. ++ * \param addr2 The second IP address. ++ * ++ * \hideinitializer ++ */ ++#define uip_ip4addr_cmp(addr1, addr2) (memcmp(addr1, addr2, \ ++ sizeof(uip_ip4addr_t)) == 0) ++#define uip_ip6addr_cmp(addr1, addr2) (memcmp(addr1, addr2, \ ++ sizeof(uip_ip6addr_t)) == 0) ++ ++/** ++ * Compare two IP addresses with netmasks ++ * ++ * Compares two IP addresses with netmasks. The masks are used to mask ++ * out the bits that are to be compared. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr1, ipaddr2, mask; ++ ++ uip_ipaddr(&mask, 255,255,255,0); ++ uip_ipaddr(&ipaddr1, 192,16,1,2); ++ uip_ipaddr(&ipaddr2, 192,16,1,3); ++ if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) { ++ printf("They are the same"); ++ } ++ \endcode ++ * ++ * \param addr1 The first IP address. ++ * \param addr2 The second IP address. ++ * \param mask The netmask. ++ * ++ * \hideinitializer ++ */ ++#define uip_ip4addr_maskcmp(addr1, addr2, mask) \ ++ (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \ ++ (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \ ++ ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \ ++ (((u16_t *)addr2)[1] & ((u16_t *)mask)[1]))) ++ ++/** ++ * Mask out the network part of an IP address. ++ * ++ * Masks out the network part of an IP address, given the address and ++ * the netmask. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr1, ipaddr2, netmask; ++ ++ uip_ipaddr(&ipaddr1, 192,16,1,2); ++ uip_ipaddr(&netmask, 255,255,255,0); ++ uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask); ++ \endcode ++ * ++ * In the example above, the variable "ipaddr2" will contain the IP ++ * address 192.168.1.0. ++ * ++ * \param dest Where the result is to be placed. ++ * \param src The IP address. ++ * \param mask The netmask. ++ * ++ * \hideinitializer ++ */ ++#define uip_ip4addr_mask(dest, src, mask) do { \ ++ ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \ ++ ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \ ++ } while (0) ++ ++/** ++ * Pick the first octet of an IP address. ++ * ++ * Picks out the first octet of an IP address. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr; ++ u8_t octet; ++ ++ uip_ipaddr(&ipaddr, 1,2,3,4); ++ octet = uip_ipaddr1(&ipaddr); ++ \endcode ++ * ++ * In the example above, the variable "octet" will contain the value 1. ++ * ++ * \hideinitializer ++ */ ++#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8) ++ ++/** ++ * Pick the second octet of an IP address. ++ * ++ * Picks out the second octet of an IP address. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr; ++ u8_t octet; ++ ++ uip_ipaddr(&ipaddr, 1,2,3,4); ++ octet = uip_ipaddr2(&ipaddr); ++ \endcode ++ * ++ * In the example above, the variable "octet" will contain the value 2. ++ * ++ * \hideinitializer ++ */ ++#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff) ++ ++/** ++ * Pick the third octet of an IP address. ++ * ++ * Picks out the third octet of an IP address. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr; ++ u8_t octet; ++ ++ uip_ipaddr(&ipaddr, 1,2,3,4); ++ octet = uip_ipaddr3(&ipaddr); ++ \endcode ++ * ++ * In the example above, the variable "octet" will contain the value 3. ++ * ++ * \hideinitializer ++ */ ++#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8) ++ ++/** ++ * Pick the fourth octet of an IP address. ++ * ++ * Picks out the fourth octet of an IP address. ++ * ++ * Example: ++ \code ++ uip_ipaddr_t ipaddr; ++ u8_t octet; ++ ++ uip_ipaddr(&ipaddr, 1,2,3,4); ++ octet = uip_ipaddr4(&ipaddr); ++ \endcode ++ * ++ * In the example above, the variable "octet" will contain the value 4. ++ * ++ * \hideinitializer ++ */ ++#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff) ++ ++/** ++ * Convert 16-bit quantity from host byte order to network byte order. ++ * ++ * This macro is primarily used for converting constants from host ++ * byte order to network byte order. For converting variables to ++ * network byte order, use the htons() function instead. ++ * ++ * \hideinitializer ++ */ ++#if 0 ++#ifndef HTONS ++# if UIP_BYTE_ORDER == UIP_BIG_ENDIAN ++# define HTONS(n) (n) ++# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ ++# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) ++# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ ++#else ++#error "HTONS already defined!" ++#endif /* HTONS */ ++#endif ++ ++#if UIP_BYTE_ORDER == UIP_BIG_ENDIAN ++# error "Should not be here" ++# define const_htons(n) (n) ++# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ ++# define const_htons(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) ++# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ ++ ++/* BWL */ ++#if 0 ++/** ++ * Convert 16-bit quantity from host byte order to network byte order. ++ * ++ * This function is primarily used for converting variables from host ++ * byte order to network byte order. For converting constants to ++ * network byte order, use the HTONS() macro instead. ++ */ ++#ifndef htons ++u16_t htons(u16_t val); ++#endif /* htons */ ++#ifndef ntohs ++#define ntohs htons ++#endif ++#endif ++ ++/** @} */ ++ ++/** ++ * Pointer to the application data in the packet buffer. ++ * ++ * This pointer points to the application data when the application is ++ * called. If the application wishes to send data, the application may ++ * use this space to write the data into before calling uip_send(). ++ */ ++/* extern void *uip_appdata; */ ++ ++#if UIP_URGDATA > 0 ++/* u8_t *uip_urgdata: ++ * ++ * This pointer points to any urgent data that has been received. Only ++ * present if compiled with support for urgent data (UIP_URGDATA). ++ */ ++extern void *uip_urgdata; ++#endif /* UIP_URGDATA > 0 */ ++ ++/** ++ * \defgroup uipdrivervars Variables used in uIP device drivers ++ * @{ ++ * ++ * uIP has a few global variables that are used in device drivers for ++ * uIP. ++ */ ++ ++/** ++ * The length of the packet in the uip_buf buffer. ++ * ++ * The global variable uip_len holds the length of the packet in the ++ * uip_buf buffer. ++ * ++ * When the network device driver calls the uIP input function, ++ * uip_len should be set to the length of the packet in the uip_buf ++ * buffer. ++ * ++ * When sending packets, the device driver should use the contents of ++ * the uip_len variable to determine the length of the outgoing ++ * packet. ++ * ++ */ ++/* extern u16_t uip_len; */ ++ ++/** @} */ ++ ++#if UIP_URGDATA > 0 ++extern u16_t uip_urglen, uip_surglen; ++#endif /* UIP_URGDATA > 0 */ ++ ++/** ++ * Representation of a uIP TCP connection. ++ * ++ * The uip_conn structure is used for identifying a connection. All ++ * but one field in the structure are to be considered read-only by an ++ * application. The only exception is the appstate field whos purpose ++ * is to let the application store application-specific state (e.g., ++ * file pointers) for the connection. The type of this field is ++ * configured in the "uipopt.h" header file. ++ */ ++struct __attribute__ ((__packed__)) uip_conn { ++ uip_ip4addr_t ripaddr; ++ uip_ip6addr_t ripaddr6; ++ /**< The IP address of the remote host. */ ++ ++ u16_t lport; /**< The local TCP port, in network byte order. */ ++ u16_t rport; /**< The local remote TCP port, in network byte ++ order. */ ++ ++ u8_t rcv_nxt[4]; ++ /**< The sequence number that we expect to ++ receive next. */ ++ u8_t snd_nxt[4]; ++ /**< The sequence number that was last sent by ++ us. */ ++ u16_t len; /**< Length of the data that was previously sent. */ ++ u16_t mss; /**< Current maximum segment size for the ++ connection. */ ++ u16_t initialmss; ++ /**< Initial maximum segment size for the ++ connection. */ ++ u8_t sa; /**< Retransmission time-out calculation state ++ variable. */ ++ u8_t sv; /**< Retransmission time-out calculation state ++ variable. */ ++ u8_t rto; /**< Retransmission time-out. */ ++ u8_t tcpstateflags; ++ /**< TCP state and flags. */ ++ u8_t timer; /**< The retransmission timer. */ ++ u8_t nrtx; /**< The number of retransmissions for the last ++ segment sent. */ ++}; ++ ++/** ++ * \addtogroup uiparch ++ * @{ ++ */ ++ ++/** ++ * 4-byte array used for the 32-bit sequence number calculations. ++ */ ++extern u8_t uip_acc32[4]; ++ ++/** @} */ ++ ++#if UIP_UDP ++/** ++ * Representation of a uIP UDP connection. ++ */ ++struct uip_udp_conn { ++ uip_ip4addr_t ripaddr; ++ /**< The IP address of the remote peer. */ ++ u16_t lport; /**< The local port number in network byte order. */ ++ u16_t rport; /**< The remote port number in network byte order. */ ++ u8_t ttl; /**< Default time-to-live. */ ++ ++ /** The application state. */ ++/* uip_udp_appstate_t appstate; */ ++}; ++ ++#endif /* UIP_UDP */ ++ ++/** ++ * The structure holding the TCP/IP statistics that are gathered if ++ * UIP_STATISTICS is set to 1. ++ * ++ */ ++struct uip_stats { ++ struct { ++ uip_stats_t drop; ++ /**< Number of dropped packets at the IP ++ layer. */ ++ uip_stats_t recv; ++ /**< Number of received packets at the IP ++ layer. */ ++ uip_stats_t sent; ++ /**< Number of sent packets at the IP ++ layer. */ ++ uip_stats_t vhlerr; ++ /**< Number of packets dropped due to wrong ++ IP version or header length. */ ++ uip_stats_t hblenerr; ++ /**< Number of packets dropped due to wrong ++ IP length, high byte. */ ++ uip_stats_t lblenerr; ++ /**< Number of packets dropped due to wrong ++ IP length, low byte. */ ++ uip_stats_t fragerr; ++ /**< Number of packets dropped since they ++ were IP fragments. */ ++ uip_stats_t chkerr; ++ /**< Number of packets dropped due to IP ++ checksum errors. */ ++ uip_stats_t protoerr; ++ /**< Number of packets dropped since they ++ were neither ICMP, UDP nor TCP. */ ++ } ip; /**< IP statistics. */ ++ struct { ++ uip_stats_t drop; ++ /**< Number of dropped ICMP packets. */ ++ uip_stats_t recv; ++ /**< Number of received ICMP packets. */ ++ uip_stats_t sent; ++ /**< Number of sent ICMP packets. */ ++ uip_stats_t typeerr; ++ /**< Number of ICMP packets with a wrong ++ type. */ ++ } icmp; /**< ICMP statistics. */ ++ struct { ++ uip_stats_t drop; ++ /**< Number of dropped TCP segments. */ ++ uip_stats_t recv; ++ /**< Number of recived TCP segments. */ ++ uip_stats_t sent; ++ /**< Number of sent TCP segments. */ ++ uip_stats_t chkerr; ++ /**< Number of TCP segments with a bad ++ checksum. */ ++ uip_stats_t ackerr; ++ /**< Number of TCP segments with a bad ACK ++ number. */ ++ uip_stats_t rst; ++ /**< Number of recevied TCP RST (reset) segments. */ ++ uip_stats_t rexmit; ++ /**< Number of retransmitted TCP segments. */ ++ uip_stats_t syndrop; ++ /**< Number of dropped SYNs due to too few ++ connections was avaliable. */ ++ uip_stats_t synrst; ++ /**< Number of SYNs for closed ports, ++ triggering a RST. */ ++ } tcp; /**< TCP statistics. */ ++#if UIP_UDP ++ struct { ++ uip_stats_t drop; ++ /**< Number of dropped UDP segments. */ ++ uip_stats_t recv; ++ /**< Number of recived UDP segments. */ ++ uip_stats_t sent; ++ /**< Number of sent UDP segments. */ ++ uip_stats_t chkerr; ++ /**< Number of UDP segments with a bad ++ checksum. */ ++ } udp; /**< UDP statistics. */ ++#endif /* UIP_UDP */ ++}; ++ ++/*---------------------------------------------------------------------------*/ ++/* All the stuff below this point is internal to uIP and should not be ++ * used directly by an application or by a device driver. ++ */ ++/*---------------------------------------------------------------------------*/ ++/* u8_t uip_flags: ++ * ++ * When the application is called, uip_flags will contain the flags ++ * that are defined in this file. Please read below for more ++ * infomation. ++ */ ++/* extern u8_t uip_flags; */ ++ ++/* The following flags may be set in the global variable uip_flags ++ before calling the application callback. The UIP_ACKDATA, ++ UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time, ++ whereas the others are mutualy exclusive. Note that these flags ++ should *NOT* be accessed directly, but only through the uIP ++ functions/macros. */ ++ ++#define UIP_ACKDATA 1 /* Signifies that the outstanding data was ++ acked and the application should send ++ out new data instead of retransmitting ++ the last data. */ ++#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent ++ us new data. */ ++#define UIP_REXMIT 4 /* Tells the application to retransmit the ++ data that was last sent. */ ++#define UIP_POLL 8 /* Used for polling the application, to ++ check if the application has data that ++ it wants to send. */ ++#define UIP_CLOSE 16 /* The remote host has closed the ++ connection, thus the connection has ++ gone away. Or the application signals ++ that it wants to close the ++ connection. */ ++#define UIP_ABORT 32 /* The remote host has aborted the ++ connection, thus the connection has ++ gone away. Or the application signals ++ that it wants to abort the ++ connection. */ ++#define UIP_CONNECTED 64 /* We have got a connection from a remote ++ host and have set up a new connection ++ for it, or an active connection has ++ been successfully established. */ ++ ++#define UIP_TIMEDOUT 128 /* The connection has been aborted due to ++ too many retransmissions. */ ++ ++void uip_input(struct uip_stack *ustack); ++void uip_periodic(struct uip_stack *ustack, int conn); ++ ++/* uip_process(flag): ++ * ++ * The actual uIP function which does all the work. ++ */ ++void uip_process(struct uip_stack *ustack, u8_t flag); ++ ++/* The following flags are passed as an argument to the uip_process() ++ function. They are used to distinguish between the two cases where ++ uip_process() is called. It can be called either because we have ++ incoming data that should be processed, or because the periodic ++ timer has fired. These values are never used directly, but only in ++ the macrose defined in this file. */ ++ ++#define UIP_DATA 1 /* Tells uIP that there is incoming ++ data in the uip_buf buffer. The ++ length of the data is stored in the ++ global variable uip_len. */ ++#define UIP_TIMER 2 /* Tells uIP that the periodic timer ++ has fired. */ ++#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should ++ be polled. */ ++#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram ++ should be constructed in the ++ uip_buf buffer. */ ++#if UIP_UDP ++#define UIP_UDP_TIMER 5 ++#endif /* UIP_UDP */ ++ ++#define UIP_NDP_TIMER 6 ++ ++/* The TCP states used in the uip_conn->tcpstateflags. */ ++#define UIP_CLOSED 0 ++#define UIP_SYN_RCVD 1 ++#define UIP_SYN_SENT 2 ++#define UIP_ESTABLISHED 3 ++#define UIP_FIN_WAIT_1 4 ++#define UIP_FIN_WAIT_2 5 ++#define UIP_CLOSING 6 ++#define UIP_TIME_WAIT 7 ++#define UIP_LAST_ACK 8 ++#define UIP_TS_MASK 15 ++ ++#define UIP_STOPPED 16 ++ ++struct __attribute__ ((__packed__)) uip_tcp_hdr { ++ /* TCP header. */ ++ u16_t srcport, destport; ++ u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; ++ u16_t tcpchksum; ++ u8_t urgp[2]; ++ u8_t optdata[4]; ++}; ++ ++struct __attribute__ ((__packed__)) uip_ipv4_hdr { ++ /* IPv4 header. */ ++ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; ++ u16_t ipchksum; ++ u16_t srcipaddr[2], destipaddr[2]; ++}; ++ ++struct __attribute__ ((__packed__)) uip_ipv6_hdr { ++ /* IPv6 header. */ ++ u8_t vtc, tcflow; ++ u16_t flow; ++ u16_t len; ++ u8_t proto, ttl; ++ uip_ip6addr_t srcipaddr, destipaddr; ++}; ++ ++/* The TCP and IPv4 headers. */ ++struct __attribute__ ((__packed__)) uip_tcp_ipv4_hdr { ++ /* IPv4 header. */ ++ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; ++ u16_t ipchksum; ++ u16_t srcipaddr[2], destipaddr[2]; ++ ++ /* TCP header. */ ++ u16_t srcport, destport; ++ u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; ++ u16_t tcpchksum; ++ u8_t urgp[2]; ++ u8_t optdata[4]; ++}; ++ ++/* The TCP and IP headers. */ ++struct __attribute__ ((__packed__)) uip_tcp_ipv6_hdr { ++ /* IPv6 header. */ ++ u8_t vtc, tcflow; ++ u16_t flow; ++ u8_t len[2]; ++ u8_t proto, ttl; ++ uip_ip6addr_t srcipaddr, destipaddr; ++ ++ /* TCP header. */ ++ u16_t srcport, destport; ++ u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; ++ u16_t tcpchksum; ++ u8_t urgp[2]; ++ u8_t optdata[4]; ++}; ++ ++/* The ICMPv4 */ ++struct __attribute__ ((__packed__)) uip_icmpv4_hdr { ++ /* ICMP (echo) header. */ ++ u8_t type, icode; ++ u16_t icmpchksum; ++ u16_t id, seqno; ++}; ++ ++/* The ICMPv6 */ ++struct __attribute__ ((__packed__)) uip_icmpv6_hdr { ++ /* ICMP (echo) header. */ ++ u8_t type, icode; ++ u16_t icmpchksum; ++ u8_t flags, reserved1, reserved2, reserved3; ++ u8_t icmp6data[16]; ++ u8_t options[1]; ++}; ++ ++/* The ICMP and IP headers. */ ++struct __attribute__ ((__packed__)) uip_icmpip_hdr { ++#if UIP_CONF_IPV6 ++ /* IPv6 header. */ ++ u8_t vtc, tcf; ++ u16_t flow; ++ u8_t len[2]; ++ u8_t proto, ttl; ++ uip_ip6addr_t srcipaddr, destipaddr; ++#else /* UIP_CONF_IPV6 */ ++ /* IPv4 header. */ ++ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; ++ u16_t ipchksum; ++ u16_t srcipaddr[2], destipaddr[2]; ++#endif /* UIP_CONF_IPV6 */ ++ ++ /* ICMP (echo) header. */ ++ u8_t type, icode; ++ u16_t icmpchksum; ++#if !UIP_CONF_IPV6 ++ u16_t id, seqno; ++#else /* !UIP_CONF_IPV6 */ ++ u8_t flags, reserved1, reserved2, reserved3; ++ u8_t icmp6data[16]; ++ u8_t options[1]; ++#endif /* !UIP_CONF_IPV6 */ ++}; ++ ++/* The UDP */ ++struct __attribute__ ((__packed__)) uip_udp_hdr { ++ /* UDP header. */ ++ u16_t srcport, destport; ++ u16_t udplen; ++ u16_t udpchksum; ++}; ++ ++/* The UDP and IP headers. */ ++struct __attribute__ ((__packed__)) uip_udpip_hdr { ++#if UIP_CONF_IPV6 ++ /* IPv6 header. */ ++ u8_t vtc, tcf; ++ u16_t flow; ++ u8_t len[2]; ++ u8_t proto, ttl; ++ uip_ip6addr_t srcipaddr, destipaddr; ++#else /* UIP_CONF_IPV6 */ ++ /* IP header. */ ++ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; ++ u16_t ipchksum; ++ u16_t srcipaddr[2], destipaddr[2]; ++#endif /* UIP_CONF_IPV6 */ ++ ++ /* UDP header. */ ++ u16_t srcport, destport; ++ u16_t udplen; ++ u16_t udpchksum; ++}; ++ ++/** ++ * The buffer size available for user data in the \ref uip_buf buffer. ++ * ++ * This macro holds the available size for user data in the \ref ++ * uip_buf buffer. The macro is intended to be used for checking ++ * bounds of available user data. ++ * ++ * Example: ++ \code ++ snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i); ++ \endcode ++ * ++ * \hideinitializer ++ */ ++#define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) ++ ++#define UIP_PROTO_ICMP 1 ++#define UIP_PROTO_TCP 6 ++#define UIP_PROTO_UDP 17 ++#define UIP_PROTO_ICMP6 58 ++ ++/* Header sizes. */ ++#define UIP_IPv6_H_LEN 40 /* Size of IPv6 header */ ++#define UIP_IPv4_H_LEN 20 /* Size of IPv4 header */ ++ ++#define UIP_UDPH_LEN 8 /* Size of UDP header */ ++#define UIP_TCPH_LEN 20 /* Size of TCP header */ ++ ++#define UIP_IPv4_UDPH_LEN (UIP_UDPH_LEN + UIP_IPv4_H_LEN) /* Size of IPv4 ++ + UDP ++ header */ ++#define UIP_IPv4_TCPH_LEN (UIP_TCPH_LEN + UIP_IPv4_H_LEN) /* Size of IPv4 ++ + TCP ++ header */ ++#define UIP_TCP_IPv4_HLEN UIP_IPv4_TCPH_LEN ++ ++#define UIP_IPv6_UDPH_LEN (UIP_UDPH_LEN + UIP_IPv6_H_LEN) /* Size of IPv6 ++ + UDP ++ header */ ++#define UIP_IPv6_TCPH_LEN (UIP_TCPH_LEN + UIP_IPv6_H_LEN) /* Size of IPv6 ++ + TCP ++ header */ ++#define UIP_TCP_IPv6_HLEN UIP_IPv6_TCPH_LEN ++ ++/** ++ * Calculate the Internet checksum over a buffer. ++ * ++ * The Internet checksum is the one's complement of the one's ++ * complement sum of all 16-bit words in the buffer. ++ * ++ * See RFC1071. ++ * ++ * \param buf A pointer to the buffer over which the checksum is to be ++ * computed. ++ * ++ * \param len The length of the buffer over which the checksum is to ++ * be computed. ++ * ++ * \return The Internet checksum of the buffer. ++ */ ++u16_t uip_chksum(u16_t *buf, u16_t len); ++ ++/** ++ * Calculate the IP header checksum of the packet header in uip_buf. ++ * ++ * The IP header checksum is the Internet checksum of the 20 bytes of ++ * the IP header. ++ * ++ * \return The IP header checksum of the IP header in the uip_buf ++ * buffer. ++ */ ++u16_t uip_ipchksum(struct uip_stack *ustack); ++ ++/** ++ * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. ++ * ++ * The TCP checksum is the Internet checksum of data contents of the ++ * TCP segment, and a pseudo-header as defined in RFC793. ++ * ++ * \return The TCP checksum of the TCP segment in uip_buf and pointed ++ * to by uip_appdata. ++ */ ++u16_t uip_tcpchksum(struct uip_stack *ustack); ++ ++/** ++ * Calculate the UDP checksum of the packet in uip_buf and uip_appdata. ++ * ++ * The UDP checksum is the Internet checksum of data contents of the ++ * UDP segment, and a pseudo-header as defined in RFC768. ++ * ++ * \return The UDP checksum of the UDP segment in uip_buf and pointed ++ * to by uip_appdata. ++ */ ++u16_t uip_udpchksum(struct uip_stack *ustack); ++ ++/* IPv6 checksum */ ++uint16_t icmpv6_checksum(uint8_t *data); ++ ++struct neighbor_entry { ++ struct in6_addr ipaddr; ++ struct uip_eth_addr mac_addr; ++ u8_t time; ++}; ++ ++struct uip_stack { ++ struct uip_eth_addr uip_ethaddr; ++ ++ u8_t *uip_buf; ++ ++ uint8_t *data_link_layer; /* Pointer to the data link layer */ ++ uint8_t *network_layer; /* Pointer to the network layer */ ++ void *uip_appdata; /* The uip_appdata pointer points to ++ application data. */ ++ void *uip_sappdata; /* The uip_appdata pointer points to ++ the application data which is to ++ be sent. */ ++#if UIP_URGDATA > 0 ++ void *uip_urgdata; /* The uip_urgdata pointer points to ++ urgent data (out-of-band data), if ++ present. */ ++ u16_t uip_urglen, uip_surglen; ++#endif /* UIP_URGDATA > 0 */ ++ ++ u16_t uip_len, uip_slen; /* The uip_len is either 8 or 16 bits, ++ depending on the maximum packet ++ size. */ ++ u8_t uip_flags; /* The uip_flags variable is used for ++ communication between the TCP/IP stack ++ and the application program. */ ++ struct uip_conn *uip_conn; /* uip_conn always points to the current ++ connection. */ ++ ++ struct uip_conn uip_conns[UIP_CONNS]; ++ /* The uip_conns array holds all TCP ++ connections. */ ++ u16_t uip_listenports[UIP_LISTENPORTS]; ++ /* The uip_listenports list all currently ++ listning ports. */ ++#if UIP_UDP ++ struct uip_udp_conn *uip_udp_conn; ++ struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; ++#endif /* UIP_UDP */ ++ ++ u16_t ipid; /* This ipid variable is an increasing ++ number that is used for the IP ID ++ field. */ ++ ++ u8_t iss[4]; /* The iss variable is used for the TCP ++ initial sequence number. */ ++ ++#if UIP_ACTIVE_OPEN ++ u16_t lastport; /* Keeps track of the last port used for ++ a new connection. */ ++#endif /* UIP_ACTIVE_OPEN */ ++ ++#define IP_CONFIG_OFF 0x00 ++#define IPV4_CONFIG_OFF 0x01 ++#define IPV4_CONFIG_STATIC 0x02 ++#define IPV4_CONFIG_DHCP 0x04 ++#define IPV6_CONFIG_OFF 0x10 ++#define IPV6_CONFIG_STATIC 0x20 ++#define IPV6_CONFIG_DHCP 0x40 ++ u8_t ip_config; ++ ++ uip_ip4addr_t hostaddr, netmask, default_route_addr; ++ uip_ip6addr_t hostaddr6, netmask6, default_route_addr6, ++ linklocal6; ++ int prefix_len; ++ u8_t ipv6_autocfg; ++#define IPV6_AUTOCFG_DHCPV6 (1<<0) ++#define IPV6_AUTOCFG_ND (1<<1) ++#define IPV6_AUTOCFG_NOTSPEC (1<<6) ++#define IPV6_AUTOCFG_NOTUSED (1<<7) ++ u8_t linklocal_autocfg; ++#define IPV6_LL_AUTOCFG_ON (1<<0) ++#define IPV6_LL_AUTOCFG_OFF (1<<1) ++#define IPV6_LL_AUTOCFG_NOTSPEC (1<<6) ++#define IPV6_LL_AUTOCFG_NOTUSED (1<<7) ++ u8_t router_autocfg; ++#define IPV6_RTR_AUTOCFG_ON (1<<0) ++#define IPV6_RTR_AUTOCFG_OFF (1<<1) ++#define IPV6_RTR_AUTOCFG_NOTSPEC (1<<6) ++#define IPV6_RTR_AUTOCFG_NOTUSED (1<<7) ++ ++#define UIP_NEIGHBOR_ENTRIES 8 ++ struct neighbor_entry neighbor_entries[UIP_NEIGHBOR_ENTRIES]; ++ ++ struct uip_stats stats; ++ ++ u8_t opt; ++ ++ pthread_mutex_t lock; ++ ++ /* IPv6 support */ ++#define UIP_SUPPORT_IPv6_ENABLED 0x01 ++#define UIP_SUPPORT_IPv6_DISABLED 0x02 ++ u8_t enable_IPv6; ++ ++ /* DHCPC client attached */ ++ void *dhcpc; ++ ++ /* NDP client */ ++ void *ndpc; ++}; ++ ++/******************************************************************************* ++ * IPv6 Support ++ ******************************************************************************/ ++int set_ipv6_link_local_address(struct uip_stack *ustack); ++int is_ipv6_link_local_address(uip_ip6addr_t *addr); ++ ++void dump_uip_packet(struct uip_stack *ustack); ++ ++#endif /* __UIP_H__ */ ++ ++/** @} */ +diff --git a/iscsiuio/src/uip/uip_arch.h b/iscsiuio/src/uip/uip_arch.h +new file mode 100644 +index 0000000..3ddacec +--- /dev/null ++++ b/iscsiuio/src/uip/uip_arch.h +@@ -0,0 +1,137 @@ ++/** ++ * \addtogroup uip ++ * {@ ++ */ ++ ++/** ++ * \defgroup uiparch Architecture specific uIP functions ++ * @{ ++ * ++ * The functions in the architecture specific module implement the IP ++ * check sum and 32-bit additions. ++ * ++ * The IP checksum calculation is the most computationally expensive ++ * operation in the TCP/IP stack and it therefore pays off to ++ * implement this in efficient assembler. The purpose of the uip-arch ++ * module is to let the checksum functions to be implemented in ++ * architecture specific assembler. ++ * ++ */ ++ ++/** ++ * \file ++ * Declarations of architecture specific functions. ++ * \author Adam Dunkels ++ */ ++ ++/* ++ * Copyright (c) 2001, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++#ifndef __UIP_ARCH_H__ ++#define __UIP_ARCH_H__ ++ ++#include "uip.h" ++ ++/** ++ * Carry out a 32-bit addition. ++ * ++ * Because not all architectures for which uIP is intended has native ++ * 32-bit arithmetic, uIP uses an external C function for doing the ++ * required 32-bit additions in the TCP protocol processing. This ++ * function should add the two arguments and place the result in the ++ * global variable uip_acc32. ++ * ++ * \note The 32-bit integer pointed to by the op32 parameter and the ++ * result in the uip_acc32 variable are in network byte order (big ++ * endian). ++ * ++ * \param op32 A pointer to a 4-byte array representing a 32-bit ++ * integer in network byte order (big endian). ++ * ++ * \param op16 A 16-bit integer in host byte order. ++ */ ++void uip_add32(u8_t *op32, u16_t op16, u8_t *uip_add32); ++ ++/** ++ * Calculate the Internet checksum over a buffer. ++ * ++ * The Internet checksum is the one's complement of the one's ++ * complement sum of all 16-bit words in the buffer. ++ * ++ * See RFC1071. ++ * ++ * \note This function is not called in the current version of uIP, ++ * but future versions might make use of it. ++ * ++ * \param buf A pointer to the buffer over which the checksum is to be ++ * computed. ++ * ++ * \param len The length of the buffer over which the checksum is to ++ * be computed. ++ * ++ * \return The Internet checksum of the buffer. ++ */ ++u16_t uip_chksum(u16_t *buf, u16_t len); ++ ++/** ++ * Calculate the IP header checksum of the packet header in uip_buf. ++ * ++ * The IP header checksum is the Internet checksum of the 20 bytes of ++ * the IP header. ++ * ++ * \return The IP header checksum of the IP header in the uip_buf ++ * buffer. ++ */ ++u16_t uip_ipchksum(struct uip_stack *ustack); ++ ++/** ++ * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. ++ * ++ * The TCP checksum is the Internet checksum of data contents of the ++ * TCP segment, and a pseudo-header as defined in RFC793. ++ * ++ * \note The uip_appdata pointer that points to the packet data may ++ * point anywhere in memory, so it is not possible to simply calculate ++ * the Internet checksum of the contents of the uip_buf buffer. ++ * ++ * \return The TCP checksum of the TCP segment in uip_buf and pointed ++ * to by uip_appdata. ++ */ ++u16_t uip_tcpchksum(struct uip_stack *ustack); ++ ++u16_t uip_udpchksum(struct uip_stack *ustack); ++ ++/** @} */ ++/** @} */ ++ ++#endif /* __UIP_ARCH_H__ */ +diff --git a/iscsiuio/src/uip/uip_arp.c b/iscsiuio/src/uip/uip_arp.c +new file mode 100644 +index 0000000..1b3761f +--- /dev/null ++++ b/iscsiuio/src/uip/uip_arp.c +@@ -0,0 +1,479 @@ ++#include ++#include ++#include ++ ++#include "logger.h" ++#include "packet.h" ++ ++/** ++ * \addtogroup uip ++ * @{ ++ */ ++ ++/** ++ * \defgroup uiparp uIP Address Resolution Protocol ++ * @{ ++ * ++ * The Address Resolution Protocol ARP is used for mapping between IP ++ * addresses and link level addresses such as the Ethernet MAC ++ * addresses. ARP uses broadcast queries to ask for the link level ++ * address of a known IP address and the host which is configured with ++ * the IP address for which the query was meant, will respond with its ++ * link level address. ++ * ++ * \note This ARP implementation only supports Ethernet. ++ */ ++ ++/** ++ * \file ++ * Implementation of the ARP Address Resolution Protocol. ++ * \author Adam Dunkels ++ * ++ */ ++ ++/* ++ * Copyright (c) 2001-2003, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++#include "uip_arp.h" ++#include "uip_eth.h" ++ ++#include ++#include ++ ++static const struct uip_eth_addr broadcast_ethaddr = { ++ {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} }; ++static const u16_t broadcast_ipaddr[2] = { 0xffff, 0xffff }; ++ ++pthread_mutex_t arp_table_mutex = PTHREAD_MUTEX_INITIALIZER; ++static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; ++ ++static u8_t arptime; ++ ++/** ++ * Initialize the ARP module. ++ * ++ */ ++/*----------------------------------------------------------------------------*/ ++void uip_arp_init(void) ++{ ++ u8_t i; ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) ++ memset(&arp_table[i], 0, sizeof(arp_table[i])); ++ ++ pthread_mutex_init(&arp_table_mutex, NULL); ++} ++ ++/*----------------------------------------------------------------------------*/ ++/** ++ * Periodic ARP processing function. ++ * ++ * This function performs periodic timer processing in the ARP module ++ * and should be called at regular intervals. The recommended interval ++ * is 10 seconds between the calls. ++ * ++ */ ++/*----------------------------------------------------------------------------*/ ++void uip_arp_timer(void) ++{ ++ u8_t i; ++ struct arp_entry *tabptr; ++ ++ ++arptime; ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { ++ tabptr = &arp_table[i]; ++ if ((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && ++ (u8_t)(arptime - tabptr->time) >= UIP_ARP_MAXAGE) ++ memset(tabptr->ipaddr, 0, 4); ++ } ++ ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr) ++{ ++ u8_t i; ++ struct arp_entry *tabptr; ++ ++ pthread_mutex_lock(&arp_table_mutex); ++ /* Walk through the ARP mapping table and try to find an entry to ++ update. If none is found, the IP -> MAC address mapping is ++ inserted in the ARP table. */ ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { ++ ++ tabptr = &arp_table[i]; ++ /* Only check those entries that are actually in use. */ ++ if (tabptr->ipaddr[0] != 0 && tabptr->ipaddr[1] != 0) { ++ ++ /* Check if the source IP address of the incoming packet ++ matches the IP address in this ARP table entry. */ ++ if (ipaddr[0] == tabptr->ipaddr[0] && ++ ipaddr[1] == tabptr->ipaddr[1]) { ++ ++ tabptr->time = arptime; ++ ++ pthread_mutex_unlock(&arp_table_mutex); ++ return; ++ } ++ } ++ } ++ ++ /* If we get here, no existing ARP table entry was found, so we ++ create one. */ ++ ++ /* First, we try to find an unused entry in the ARP table. */ ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { ++ tabptr = &arp_table[i]; ++ if (tabptr->ipaddr[0] == 0 && tabptr->ipaddr[1] == 0) ++ break; ++ } ++ ++ /* If no unused entry is found, we try to find the oldest entry and ++ throw it away. */ ++ if (i == UIP_ARPTAB_SIZE) { ++ u8_t c; ++ u8_t tmpage = 0; ++ c = 0; ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { ++ tabptr = &arp_table[i]; ++ if ((u8_t)(arptime - tabptr->time) > tmpage) { ++ tmpage = (u8_t)(arptime - tabptr->time); ++ c = i; ++ } ++ } ++ i = c; ++ tabptr = &arp_table[i]; ++ } ++ ++ /* Now, i is the ARP table entry which we will fill with the new ++ information. */ ++ memcpy(tabptr->ipaddr, ipaddr, 4); ++ memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); ++ tabptr->time = arptime; ++ ++ pthread_mutex_unlock(&arp_table_mutex); ++} ++ ++/** ++ * ARP processing for incoming ARP packets. ++ * ++ * This function should be called by the device driver when an ARP ++ * packet has been received. The function will act differently ++ * depending on the ARP packet type: if it is a reply for a request ++ * that we previously sent out, the ARP cache will be filled in with ++ * the values from the ARP reply. If the incoming ARP packet is an ARP ++ * request for our IP address, an ARP reply packet is created and put ++ * into the uip_buf[] buffer. ++ * ++ * When the function returns, the value of the global variable uip_len ++ * indicates whether the device driver should send out a packet or ++ * not. If uip_len is zero, no packet should be sent. If uip_len is ++ * non-zero, it contains the length of the outbound packet that is ++ * present in the uip_buf[] buffer. ++ * ++ * This function expects an ARP packet with a prepended Ethernet ++ * header in the uip_buf[] buffer, and the length of the packet in the ++ * global variable uip_len. ++ */ ++void uip_arp_ipin(struct uip_stack *ustack, packet_t *pkt) ++{ ++ struct ip_hdr *ip; ++ struct uip_eth_hdr *eth; ++ ++ eth = (struct uip_eth_hdr *)pkt->data_link_layer; ++ ip = (struct ip_hdr *)pkt->network_layer; ++ ++ if (uip_ip4addr_cmp(ip->destipaddr, ustack->hostaddr)) { ++ /* First, we register the one who made the request in our ARP ++ table, since it is likely that we will do more communication ++ with this host in the future. */ ++ uip_arp_update(ip->srcipaddr, ð->src); ++ } ++} ++ ++void ++uip_arp_arpin(nic_interface_t *nic_iface, ++ struct uip_stack *ustack, packet_t *pkt) ++{ ++ struct arp_hdr *arp; ++ struct uip_eth_hdr *eth; ++ ++ if (pkt->buf_size < sizeof(struct arp_hdr)) { ++ pkt->buf_size = 0; ++ return; ++ } ++ pkt->buf_size = 0; ++ ++ eth = (struct uip_eth_hdr *)pkt->data_link_layer; ++ arp = (struct arp_hdr *)pkt->network_layer; ++ ++ switch (arp->opcode) { ++ case const_htons(ARP_REQUEST): ++ /* ARP request. If it asked for our address, we send out a ++ reply. */ ++ if (uip_ip4addr_cmp(arp->dipaddr, ustack->hostaddr)) { ++ /* First, we register the one who made the request in ++ our ARP table, since it is likely that we will do ++ more communication with this host in the future. */ ++ uip_arp_update(arp->sipaddr, &arp->shwaddr); ++ ++ /* The reply opcode is 2. */ ++ arp->opcode = htons(2); ++ ++ memcpy(arp->dhwaddr.addr, arp->shwaddr.addr, 6); ++ memcpy(arp->shwaddr.addr, ustack->uip_ethaddr.addr, 6); ++ memcpy(eth->src.addr, ustack->uip_ethaddr.addr, 6); ++ memcpy(eth->dest.addr, arp->dhwaddr.addr, 6); ++ ++ arp->dipaddr[0] = arp->sipaddr[0]; ++ arp->dipaddr[1] = arp->sipaddr[1]; ++ arp->sipaddr[0] = ustack->hostaddr[0]; ++ arp->sipaddr[1] = ustack->hostaddr[1]; ++ ++ if (nic_iface->vlan_id == 0) { ++ eth->type = htons(UIP_ETHTYPE_ARP); ++ pkt->buf_size = sizeof(*arp) + sizeof(*eth); ++ } else { ++ eth->type = htons(UIP_ETHTYPE_8021Q); ++ pkt->buf_size = sizeof(*arp) + ++ sizeof(struct uip_vlan_eth_hdr); ++ } ++ } ++ break; ++ case const_htons(ARP_REPLY): ++ uip_arp_update(arp->sipaddr, &arp->shwaddr); ++ break; ++ default: ++ LOG_WARN("Unknown ARP opcode: %d", ntohs(arp->opcode)); ++ break; ++ } ++ ++ return; ++} ++ ++/** ++ * Prepend Ethernet header to an outbound IP packet and see if we need ++ * to send out an ARP request. ++ * ++ * This function should be called before sending out an IP packet. The ++ * function checks the destination IP address of the IP packet to see ++ * what Ethernet MAC address that should be used as a destination MAC ++ * address on the Ethernet. ++ * ++ * If the destination IP address is in the local network (determined ++ * by logical ANDing of netmask and our IP address), the function ++ * checks the ARP cache to see if an entry for the destination IP ++ * address is found. If so, an Ethernet header is prepended and the ++ * function returns. If no ARP cache entry is found for the ++ * destination IP address, the packet in the uip_buf[] is replaced by ++ * an ARP request packet for the IP address. The IP packet is dropped ++ * and it is assumed that they higher level protocols (e.g., TCP) ++ * eventually will retransmit the dropped packet. ++ * ++ * If the destination IP address is not on the local network, the IP ++ * address of the default router is used instead. ++ * ++ * When the function returns, a packet is present in the uip_buf[] ++ * buffer, and the length of the packet is in the global variable ++ * uip_len. ++ */ ++ ++dest_ipv4_addr_t ++uip_determine_dest_ipv4_addr(struct uip_stack *ustack, u16_t *ipaddr) ++{ ++ struct uip_eth_hdr *eth; ++ struct ip_hdr *ip_buf; ++ ++ eth = (struct uip_eth_hdr *)ustack->data_link_layer; ++ ip_buf = (struct ip_hdr *)ustack->network_layer; ++ ++ /* Find the destination IP address in the ARP table and construct ++ the Ethernet header. If the destination IP addres isn't on the ++ local network, we use the default router's IP address instead. ++ ++ If not ARP table entry is found, we overwrite the original IP ++ packet with an ARP request for the IP address. */ ++ ++ /* First check if destination is a local broadcast. */ ++ if (uip_ip4addr_cmp(ip_buf->destipaddr, broadcast_ipaddr)) { ++ memcpy(ð->dest, broadcast_ethaddr.addr, 6); ++ ++ return LOCAL_BROADCAST; ++ } else { ++ /* Check if the destination address is on the local network. */ ++ if (!uip_ip4addr_maskcmp(ip_buf->destipaddr, ++ ustack->hostaddr, ustack->netmask)) { ++ /* Destination address was not on the local network, ++ so we need to use the default router's IP address ++ instead of the destination address when determining ++ the MAC address. */ ++ uip_ip4addr_copy(ipaddr, ustack->default_route_addr); ++ } else { ++ /* Else, we use the destination IP address. */ ++ uip_ip4addr_copy(ipaddr, ip_buf->destipaddr); ++ } ++ ++ return NONLOCAL_BROADCAST; ++ } ++} ++ ++arp_out_t is_in_arp_table(u16_t *ipaddr, struct arp_entry **tabptr) ++{ ++ u8_t i; ++ ++ pthread_mutex_lock(&arp_table_mutex); ++ ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { ++ if (uip_ip4addr_cmp(ipaddr, arp_table[i].ipaddr)) { ++ *tabptr = &arp_table[i]; ++ break; ++ } ++ } ++ ++ pthread_mutex_unlock(&arp_table_mutex); ++ ++ if (i == UIP_ARPTAB_SIZE) ++ return NOT_IN_ARP_TABLE; ++ else ++ return IS_IN_ARP_TABLE; ++} ++ ++void uip_build_arp_request(struct uip_stack *ustack, u16_t *ipaddr) ++{ ++ struct arp_hdr *arp; ++ struct uip_eth_hdr *eth; ++ ++ arp = (struct arp_hdr *)ustack->network_layer; ++ eth = (struct uip_eth_hdr *)ustack->data_link_layer; ++ ++ /* The destination address was not in our ARP table, so we ++ overwrite the IP packet with an ARP request. */ ++ ++ memset(eth->dest.addr, 0xff, 6); ++ memset(arp->dhwaddr.addr, 0x00, 6); ++ memcpy(eth->src.addr, ustack->uip_ethaddr.addr, 6); ++ memcpy(arp->shwaddr.addr, ustack->uip_ethaddr.addr, 6); ++ ++ uip_ip4addr_copy(arp->dipaddr, ipaddr); ++ uip_ip4addr_copy(arp->sipaddr, ustack->hostaddr); ++ arp->opcode = const_htons(ARP_REQUEST); /* ARP request. */ ++ arp->hwtype = const_htons(ARP_HWTYPE_ETH); ++ arp->protocol = const_htons(UIP_ETHTYPE_IPv4); ++ arp->hwlen = 6; ++ arp->protolen = 4; ++ eth->type = const_htons(UIP_ETHTYPE_ARP); ++ ++ ustack->uip_appdata = &ustack->uip_buf[UIP_TCP_IPv4_HLEN + UIP_LLH_LEN]; ++ ++ ustack->uip_len = sizeof(*arp) + sizeof(*eth); ++} ++ ++void ++uip_build_eth_header(struct uip_stack *ustack, ++ u16_t *ipaddr, ++ struct arp_entry *tabptr, ++ struct packet *pkt, u16_t vlan_id) ++{ ++ struct uip_ipv4_hdr *ip_buf; ++ struct uip_eth_hdr *eth; ++ struct uip_vlan_eth_hdr *eth_vlan; ++ ++ ip_buf = (struct uip_ipv4_hdr *)ustack->network_layer; ++ eth = (struct uip_eth_hdr *)ustack->data_link_layer; ++ eth_vlan = (struct uip_vlan_eth_hdr *)ustack->data_link_layer; ++ ++ /* First check if destination is a local broadcast. */ ++ if (uip_ip4addr_cmp(ip_buf->destipaddr, broadcast_ipaddr)) { ++ memcpy(eth->dest.addr, broadcast_ethaddr.addr, 6); ++ } else { ++ /* Build an ethernet header. */ ++ memcpy(eth->dest.addr, tabptr->ethaddr.addr, 6); ++ } ++ memcpy(eth->src.addr, ustack->uip_ethaddr.addr, 6); ++ ++ if (vlan_id == 0) { ++ eth->type = htons(UIP_ETHTYPE_IPv4); ++ ++ ustack->uip_len += sizeof(struct uip_eth_hdr); ++ pkt->buf_size += sizeof(struct uip_eth_hdr); ++ } else { ++ eth_vlan->tpid = htons(UIP_ETHTYPE_8021Q); ++ eth_vlan->vid = htons(vlan_id); ++ eth_vlan->type = htons(UIP_ETHTYPE_IPv4); ++ ++ ustack->uip_len += sizeof(struct uip_vlan_eth_hdr); ++ pkt->buf_size += sizeof(struct uip_vlan_eth_hdr); ++ } ++} ++ ++static struct arp_entry *uip_get_arp_entry(int index) ++{ ++ return &arp_table[index]; ++} ++ ++int uip_lookup_arp_entry(uint32_t ip_addr, uint8_t *mac_addr) ++{ ++ int i; ++ int rc = -EINVAL; ++ ++ pthread_mutex_lock(&arp_table_mutex); ++ ++ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { ++ struct arp_entry *entry = uip_get_arp_entry(i); ++ ++ if (((entry->ipaddr[1] << 16) == (ip_addr & 0xffff0000)) && ++ ((entry->ipaddr[0]) == (ip_addr & 0x0000ffff))) { ++ struct in_addr addr; ++ char *addr_str; ++ ++ addr.s_addr = ip_addr; ++ addr_str = inet_ntoa(addr); ++ ++ memcpy(mac_addr, entry->ethaddr.addr, 6); ++ ++ LOG_INFO("Found %s at %02x:%02x:%02x:%02x:%02x:%02x", ++ addr_str, ++ mac_addr[0], mac_addr[1], mac_addr[2], ++ mac_addr[3], mac_addr[4], mac_addr[5]); ++ rc = 0; ++ break; ++ } ++ } ++ ++ pthread_mutex_unlock(&arp_table_mutex); ++ return rc; ++} ++ ++/*----------------------------------------------------------------------------*/ ++ ++/** @} */ ++/** @} */ +diff --git a/iscsiuio/src/uip/uip_arp.h b/iscsiuio/src/uip/uip_arp.h +new file mode 100644 +index 0000000..339d57d +--- /dev/null ++++ b/iscsiuio/src/uip/uip_arp.h +@@ -0,0 +1,197 @@ ++/** ++ * \addtogroup uip ++ * @{ ++ */ ++ ++/** ++ * \addtogroup uiparp ++ * @{ ++ */ ++ ++/** ++ * \file ++ * Macros and definitions for the ARP module. ++ * \author Adam Dunkels ++ */ ++ ++/* ++ * Copyright (c) 2001-2003, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++#ifndef __UIP_ARP_H__ ++#define __UIP_ARP_H__ ++ ++#include "packet.h" ++#include "uip.h" ++#include "uip_eth.h" ++ ++#define ARP_REQUEST 1 ++#define ARP_REPLY 2 ++ ++#define ARP_HWTYPE_ETH 1 ++ ++struct __attribute__ ((__packed__)) arp_hdr { ++ u16_t hwtype; ++ u16_t protocol; ++ u8_t hwlen; ++ u8_t protolen; ++ u16_t opcode; ++ struct uip_eth_addr shwaddr; ++ u16_t sipaddr[2]; ++ struct uip_eth_addr dhwaddr; ++ u16_t dipaddr[2]; ++}; ++ ++struct __attribute__ ((__packed__)) ip_hdr { ++ /* IP header. */ ++ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; ++ u16_t ipchksum; ++ u16_t srcipaddr[2], destipaddr[2]; ++}; ++ ++struct __attribute__ ((__packed__)) ethip_hdr { ++ struct uip_eth_hdr ethhdr; ++ /* IP header. */ ++ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; ++ u16_t ipchksum; ++ u16_t srcipaddr[2], destipaddr[2]; ++}; ++ ++struct arp_entry { ++ u16_t ipaddr[2]; ++ struct uip_eth_addr ethaddr; ++ u8_t time; ++}; ++ ++/* The uip_arp_init() function must be called before any of the other ++ ARP functions. */ ++void uip_arp_init(void); ++ ++/* The uip_arp_ipin() function should be called whenever an IP packet ++ arrives from the Ethernet. This function refreshes the ARP table or ++ inserts a new mapping if none exists. The function assumes that an ++ IP packet with an Ethernet header is present in the uip_buf buffer ++ and that the length of the packet is in the uip_len variable. */ ++/*void uip_arp_ipin(void);*/ ++/* #define uip_arp_ipin() */ ++void uip_arp_ipin(struct uip_stack *ustack, struct packet *pkt); ++ ++/* The uip_arp_arpin() should be called when an ARP packet is received ++ by the Ethernet driver. This function also assumes that the ++ Ethernet frame is present in the uip_buf buffer. When the ++ uip_arp_arpin() function returns, the contents of the uip_buf ++ buffer should be sent out on the Ethernet if the uip_len variable ++ is > 0. */ ++void uip_arp_arpin(nic_interface_t *nic_iface, ++ struct uip_stack *ustack, struct packet *pkt); ++ ++typedef enum { ++ ARP_SENT = 1, ++ ETH_HEADER_APPEDEND = 2, ++} arp_out_t; ++ ++typedef enum { ++ LOCAL_BROADCAST = 1, ++ NONLOCAL_BROADCAST = 2, ++} dest_ipv4_addr_t; ++ ++typedef enum { ++ IS_IN_ARP_TABLE = 1, ++ NOT_IN_ARP_TABLE = 2, ++} arp_table_query_t; ++ ++dest_ipv4_addr_t ++uip_determine_dest_ipv4_addr(struct uip_stack *ustack, u16_t *ipaddr); ++arp_out_t is_in_arp_table(u16_t *ipaddr, struct arp_entry **tabptr); ++ ++void uip_build_arp_request(struct uip_stack *ustack, u16_t *ipaddr); ++ ++void ++uip_build_eth_header(struct uip_stack *ustack, ++ u16_t *ipaddr, ++ struct arp_entry *tabptr, ++ struct packet *pkt, u16_t vlan_id); ++ ++/* The uip_arp_out() function should be called when an IP packet ++ should be sent out on the Ethernet. This function creates an ++ Ethernet header before the IP header in the uip_buf buffer. The ++ Ethernet header will have the correct Ethernet MAC destination ++ address filled in if an ARP table entry for the destination IP ++ address (or the IP address of the default router) is present. If no ++ such table entry is found, the IP packet is overwritten with an ARP ++ request and we rely on TCP to retransmit the packet that was ++ overwritten. In any case, the uip_len variable holds the length of ++ the Ethernet frame that should be transmitted. */ ++arp_out_t uip_arp_out(struct uip_stack *ustack); ++ ++/* The uip_arp_timer() function should be called every ten seconds. It ++ is responsible for flushing old entries in the ARP table. */ ++void uip_arp_timer(void); ++ ++int uip_lookup_arp_entry(uint32_t ip_addr, uint8_t *mac_addr); ++ ++/** @} */ ++ ++/** ++ * \addtogroup uipconffunc ++ * @{ ++ */ ++ ++/** ++ * Specifiy the Ethernet MAC address. ++ * ++ * The ARP code needs to know the MAC address of the Ethernet card in ++ * order to be able to respond to ARP queries and to generate working ++ * Ethernet headers. ++ * ++ * \note This macro only specifies the Ethernet MAC address to the ARP ++ * code. It cannot be used to change the MAC address of the Ethernet ++ * card. ++ * ++ * \param eaddr A pointer to a struct uip_eth_addr containing the ++ * Ethernet MAC address of the Ethernet card. ++ * ++ * \hideinitializer ++ */ ++#define uip_setethaddr(eaddr) do { \ ++ uip_ethaddr.addr[0] = eaddr.addr[0]; \ ++ uip_ethaddr.addr[1] = eaddr.addr[1]; \ ++ uip_ethaddr.addr[2] = eaddr.addr[2]; \ ++ uip_ethaddr.addr[3] = eaddr.addr[3]; \ ++ uip_ethaddr.addr[4] = eaddr.addr[4]; \ ++ uip_ethaddr.addr[5] = eaddr.addr[5]; \ ++ } while (0) ++ ++/** @} */ ++/** @} */ ++ ++#endif /* __UIP_ARP_H__ */ +diff --git a/iscsiuio/src/uip/uip_eth.c b/iscsiuio/src/uip/uip_eth.c +new file mode 100644 +index 0000000..9e1ea81 +--- /dev/null ++++ b/iscsiuio/src/uip/uip_eth.c +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * uip_eth.c - CNIC UIO uIP user space stack ++ * ++ */ ++ ++#include "uip.h" ++#include "uip_eth.h" ++ ++int is_vlan_packet(struct uip_vlan_eth_hdr *hdr) ++{ ++ /* The TPID field in a 802.1Q Header must be 0x8100 */ ++ if (hdr->tpid == const_htons(UIP_ETHTYPE_8021Q)) ++ return 1; ++ ++ return 0; ++} +diff --git a/iscsiuio/src/uip/uip_eth.h b/iscsiuio/src/uip/uip_eth.h +new file mode 100644 +index 0000000..830c04c +--- /dev/null ++++ b/iscsiuio/src/uip/uip_eth.h +@@ -0,0 +1,43 @@ ++#ifndef __UIP_ETH_H__ ++#define __UIP_ETH_H__ ++ ++#include "uipopt.h" ++ ++/******************************************************************************* ++ * Ether types ++ ******************************************************************************/ ++#define UIP_ETHTYPE_ARP 0x0806 ++#define UIP_ETHTYPE_IPv4 0x0800 ++#define UIP_ETHTYPE_8021Q 0x8100 ++#define UIP_ETHTYPE_IPv6 0x86dd ++ ++/** ++ * Representation of a 48-bit Ethernet address. ++ */ ++struct uip_eth_addr { ++ u8_t addr[6]; ++}; ++ ++/** ++ * The Ethernet header. ++ */ ++struct __attribute__ ((__packed__)) uip_eth_hdr { ++ struct uip_eth_addr dest; ++ struct uip_eth_addr src; ++ u16_t type; ++}; ++ ++/** ++ * The 802.1Q Ethernet header (VLAN). ++ */ ++struct __attribute__ ((__packed__)) uip_vlan_eth_hdr { ++ struct uip_eth_addr dest; ++ struct uip_eth_addr src; ++ u16_t tpid; ++ u16_t vid; ++ u16_t type; ++}; ++ ++int is_vlan_packet(struct uip_vlan_eth_hdr *hdr); ++ ++#endif /* __UIP_ETH_H__ */ +diff --git a/iscsiuio/src/uip/uipopt.h b/iscsiuio/src/uip/uipopt.h +new file mode 100644 +index 0000000..946fce2 +--- /dev/null ++++ b/iscsiuio/src/uip/uipopt.h +@@ -0,0 +1,536 @@ ++/** ++ * \defgroup uipopt Configuration options for uIP ++ * @{ ++ * ++ * uIP is configured using the per-project configuration file ++ * uipopt.h. This file contains all compile-time options for uIP and ++ * should be tweaked to match each specific project. The uIP ++ * distribution contains a documented example "uipopt.h" that can be ++ * copied and modified for each project. ++ * ++ * \note Most of the configuration options in the uipopt.h should not ++ * be changed, but rather the per-project uip-conf.h file. ++ */ ++ ++/** ++ * \file ++ * Configuration options for uIP. ++ * \author Adam Dunkels ++ * ++ * This file is used for tweaking various configuration options for ++ * uIP. You should make a copy of this file into one of your project's ++ * directories instead of editing this example "uipopt.h" file that ++ * comes with the uIP distribution. ++ */ ++ ++/* ++ * Copyright (c) 2001-2003, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++#ifndef __UIPOPT_H__ ++#define __UIPOPT_H__ ++ ++#ifndef UIP_LITTLE_ENDIAN ++#define UIP_LITTLE_ENDIAN 3412 ++#endif /* UIP_LITTLE_ENDIAN */ ++#ifndef UIP_BIG_ENDIAN ++#define UIP_BIG_ENDIAN 1234 ++#endif /* UIP_BIG_ENDIAN */ ++ ++#include "uip-conf.h" ++ ++/*----------------------------------------------------------------------------*/ ++ ++/** ++ * \name Static configuration options ++ * @{ ++ * ++ * These configuration options can be used for setting the IP address ++ * settings statically, but only if UIP_FIXEDADDR is set to 1. The ++ * configuration options for a specific node includes IP address, ++ * netmask and default router as well as the Ethernet address. The ++ * netmask, default router and Ethernet address are appliciable only ++ * if uIP should be run over Ethernet. ++ * ++ * All of these should be changed to suit your project. ++*/ ++ ++/** ++ * Determines if uIP should use a fixed IP address or not. ++ * ++ * If uIP should use a fixed IP address, the settings are set in the ++ * uipopt.h file. If not, the macros uip_sethostaddr(), ++ * uip_setdraddr() and uip_setnetmask() should be used instead. ++ * ++ * \hideinitializer ++ */ ++#define UIP_FIXEDADDR 0 ++ ++/** ++ * Ping IP address asignment. ++ * ++ * uIP uses a "ping" packets for setting its own IP address if this ++ * option is set. If so, uIP will start with an empty IP address and ++ * the destination IP address of the first incoming "ping" (ICMP echo) ++ * packet will be used for setting the hosts IP address. ++ * ++ * \note This works only if UIP_FIXEDADDR is 0. ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_PINGADDRCONF ++#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF ++#else /* UIP_CONF_PINGADDRCONF */ ++#define UIP_PINGADDRCONF 0 ++#endif /* UIP_CONF_PINGADDRCONF */ ++ ++/** ++ * Specifies if the uIP ARP module should be compiled with a fixed ++ * Ethernet MAC address or not. ++ * ++ * If this configuration option is 0, the macro uip_setethaddr() can ++ * be used to specify the Ethernet address at run-time. ++ * ++ * \hideinitializer ++ */ ++#define UIP_FIXEDETHADDR 0 ++ ++/** @} */ ++/*------------------------------------------------------------------------------*/ ++/** ++ * \name IP configuration options ++ * @{ ++ * ++ */ ++/** ++ * The IP TTL (time to live) of IP packets sent by uIP. ++ * ++ * This should normally not be changed. ++ */ ++#define UIP_TTL 64 ++ ++/** ++ * Turn on support for IP packet reassembly. ++ * ++ * uIP supports reassembly of fragmented IP packets. This features ++ * requires an additonal amount of RAM to hold the reassembly buffer ++ * and the reassembly code size is approximately 700 bytes. The ++ * reassembly buffer is of the same size as the uip_buf buffer ++ * (configured by UIP_BUFSIZE). ++ * ++ * \note IP packet reassembly is not heavily tested. ++ * ++ * \hideinitializer ++ */ ++#define UIP_REASSEMBLY 0 ++ ++/** ++ * The maximum time an IP fragment should wait in the reassembly ++ * buffer before it is dropped. ++ * ++ */ ++#define UIP_REASS_MAXAGE 40 ++ ++/** @} */ ++ ++/*----------------------------------------------------------------------------*/ ++/** ++ * \name UDP configuration options ++ * @{ ++ */ ++ ++/** ++ * Toggles wether UDP support should be compiled in or not. ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_UDP ++#define UIP_UDP UIP_CONF_UDP ++#else /* UIP_CONF_UDP */ ++#define UIP_UDP 0 ++#endif /* UIP_CONF_UDP */ ++ ++/** ++ * Toggles if UDP checksums should be used or not. ++ * ++ * \note Support for UDP checksums is currently not included in uIP, ++ * so this option has no function. ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_UDP_CHECKSUMS ++#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS ++#else ++#define UIP_UDP_CHECKSUMS 0 ++#endif ++ ++/** ++ * The maximum amount of concurrent UDP connections. ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_UDP_CONNS ++#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS ++#else /* UIP_CONF_UDP_CONNS */ ++#define UIP_UDP_CONNS 10 ++#endif /* UIP_CONF_UDP_CONNS */ ++ ++/** ++ * The name of the function that should be called when UDP datagrams arrive. ++ * ++ * \hideinitializer ++ */ ++ ++/** @} */ ++/*------------------------------------------------------------------------------*/ ++/** ++ * \name TCP configuration options ++ * @{ ++ */ ++ ++/** ++ * Determines if support for opening connections from uIP should be ++ * compiled in. ++ * ++ * If the applications that are running on top of uIP for this project ++ * do not need to open outgoing TCP connections, this configration ++ * option can be turned off to reduce the code size of uIP. ++ * ++ * \hideinitializer ++ */ ++#define UIP_ACTIVE_OPEN 1 ++ ++/** ++ * The maximum number of simultaneously open TCP connections. ++ * ++ * Since the TCP connections are statically allocated, turning this ++ * configuration knob down results in less RAM used. Each TCP ++ * connection requires approximatly 30 bytes of memory. ++ * ++ * \hideinitializer ++ */ ++#ifndef UIP_CONF_MAX_CONNECTIONS ++#define UIP_CONNS 10 ++#else /* UIP_CONF_MAX_CONNECTIONS */ ++#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS ++#endif /* UIP_CONF_MAX_CONNECTIONS */ ++ ++/** ++ * The maximum number of simultaneously listening TCP ports. ++ * ++ * Each listening TCP port requires 2 bytes of memory. ++ * ++ * \hideinitializer ++ */ ++#ifndef UIP_CONF_MAX_LISTENPORTS ++#define UIP_LISTENPORTS 20 ++#else /* UIP_CONF_MAX_LISTENPORTS */ ++#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS ++#endif /* UIP_CONF_MAX_LISTENPORTS */ ++ ++/** ++ * Determines if support for TCP urgent data notification should be ++ * compiled in. ++ * ++ * Urgent data (out-of-band data) is a rarely used TCP feature that ++ * very seldom would be required. ++ * ++ * \hideinitializer ++ */ ++#define UIP_URGDATA 0 ++ ++/** ++ * The initial retransmission timeout counted in timer pulses. ++ * ++ * This should not be changed. ++ */ ++#define UIP_RTO 3 ++ ++/** ++ * The maximum number of times a segment should be retransmitted ++ * before the connection should be aborted. ++ * ++ * This should not be changed. ++ */ ++#define UIP_MAXRTX 8 ++ ++/** ++ * The maximum number of times a SYN segment should be retransmitted ++ * before a connection request should be deemed to have been ++ * unsuccessful. ++ * ++ * This should not need to be changed. ++ */ ++#define UIP_MAXSYNRTX 5 ++ ++/** ++ * The TCP maximum segment size. ++ * ++ * This is should not be to set to more than ++ * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. ++ */ ++#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCP_IPv4_HLEN) ++ ++/** ++ * The size of the advertised receiver's window. ++ * ++ * Should be set low (i.e., to the size of the uip_buf buffer) is the ++ * application is slow to process incoming data, or high (32768 bytes) ++ * if the application processes data quickly. ++ * ++ * \hideinitializer ++ */ ++#ifndef UIP_CONF_RECEIVE_WINDOW ++#define UIP_RECEIVE_WINDOW UIP_TCP_MSS ++#else ++#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW ++#endif ++ ++/** ++ * How long a connection should stay in the TIME_WAIT state. ++ * ++ * This configiration option has no real implication, and it should be ++ * left untouched. ++ */ ++#define UIP_TIME_WAIT_TIMEOUT 120 ++ ++/** @} */ ++/*------------------------------------------------------------------------------*/ ++/** ++ * \name ARP configuration options ++ * @{ ++ */ ++ ++/** ++ * The size of the ARP table. ++ * ++ * This option should be set to a larger value if this uIP node will ++ * have many connections from the local network. ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_ARPTAB_SIZE ++#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE ++#else ++#define UIP_ARPTAB_SIZE 8 ++#endif ++ ++/** ++ * The maxium age of ARP table entries measured in 10ths of seconds. ++ * ++ * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD ++ * default). ++ * Changed the default to 30 which corresponds to 5 minutes (Linux default) ++ */ ++#define UIP_ARP_MAXAGE 30 ++ ++/** @} */ ++ ++/*----------------------------------------------------------------------------*/ ++ ++/** ++ * \name General configuration options ++ * @{ ++ */ ++ ++/** ++ * The size of the uIP packet buffer. ++ * ++ * The uIP packet buffer should not be smaller than 60 bytes, and does ++ * not need to be larger than 1500 bytes. Lower size results in lower ++ * TCP throughput, larger size results in higher TCP throughput. ++ * ++ * \hideinitializer ++ */ ++#ifndef UIP_CONF_BUFFER_SIZE ++#define UIP_BUFSIZE 400 ++#else /* UIP_CONF_BUFFER_SIZE */ ++#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE ++#endif /* UIP_CONF_BUFFER_SIZE */ ++ ++/** ++ * Determines if statistics support should be compiled in. ++ * ++ * The statistics is useful for debugging and to show the user. ++ * ++ * \hideinitializer ++ */ ++#ifndef UIP_CONF_STATISTICS ++#define UIP_STATISTICS 0 ++#else /* UIP_CONF_STATISTICS */ ++#define UIP_STATISTICS UIP_CONF_STATISTICS ++#endif /* UIP_CONF_STATISTICS */ ++ ++/** ++ * Determines if logging of certain events should be compiled in. ++ * ++ * This is useful mostly for debugging. The function uip_log() ++ * must be implemented to suit the architecture of the project, if ++ * logging is turned on. ++ * ++ * \hideinitializer ++ */ ++#ifndef UIP_CONF_LOGGING ++#define UIP_LOGGING 0 ++#else /* UIP_CONF_LOGGING */ ++#define UIP_LOGGING UIP_CONF_LOGGING ++#endif /* UIP_CONF_LOGGING */ ++ ++/** ++ * Broadcast support. ++ * ++ * This flag configures IP broadcast support. This is useful only ++ * together with UDP. ++ * ++ * \hideinitializer ++ * ++ */ ++#ifndef UIP_CONF_BROADCAST ++#define UIP_BROADCAST 0 ++#else /* UIP_CONF_BROADCAST */ ++#define UIP_BROADCAST UIP_CONF_BROADCAST ++#endif /* UIP_CONF_BROADCAST */ ++ ++/** ++ * Print out a uIP log message. ++ * ++ * This function must be implemented by the module that uses uIP, and ++ * is called by uIP whenever a log message is generated. ++ */ ++void uip_log(char *msg); ++ ++/** ++ * The link level header length. ++ * ++ * This is the offset into the uip_buf where the IP header can be ++ * found. For Ethernet, this should be set to 14. For SLIP, this ++ * should be set to 0. ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_LLH_LEN ++#define UIP_LLH_LEN UIP_CONF_LLH_LEN ++#else /* UIP_CONF_LLH_LEN */ ++#define UIP_LLH_LEN 14 ++#endif /* UIP_CONF_LLH_LEN */ ++ ++#if 0 ++/** @} */ ++/*------------------------------------------------------------------------------*/ ++/** ++ * \name CPU architecture configuration ++ * @{ ++ * ++ * The CPU architecture configuration is where the endianess of the ++ * CPU on which uIP is to be run is specified. Most CPUs today are ++ * little endian, and the most notable exception are the Motorolas ++ * which are big endian. The BYTE_ORDER macro should be changed to ++ * reflect the CPU architecture on which uIP is to be run. ++ */ ++ ++/** ++ * The byte order of the CPU architecture on which uIP is to be run. ++ * ++ * This option can be either BIG_ENDIAN (Motorola byte order) or ++ * LITTLE_ENDIAN (Intel byte order). ++ * ++ * \hideinitializer ++ */ ++#ifdef UIP_CONF_BYTE_ORDER ++#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER ++#else /* UIP_CONF_BYTE_ORDER */ ++#define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN ++#endif /* UIP_CONF_BYTE_ORDER */ ++#endif ++ ++/** @} */ ++/*------------------------------------------------------------------------------*/ ++ ++/** ++ * \name Appication specific configurations ++ * @{ ++ * ++ * An uIP application is implemented using a single application ++ * function that is called by uIP whenever a TCP/IP event occurs. The ++ * name of this function must be registered with uIP at compile time ++ * using the UIP_APPCALL definition. ++ * ++ * uIP applications can store the application state within the ++ * uip_conn structure by specifying the type of the application ++ * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. ++ * ++ * The file containing the definitions must be included in the ++ * uipopt.h file. ++ * ++ * The following example illustrates how this can look. ++ \code ++ ++void httpd_appcall(void); ++#define UIP_APPCALL httpd_appcall ++ ++struct httpd_state { ++ u8_t state; ++ u16_t count; ++ char *dataptr; ++ char *script; ++}; ++typedef struct httpd_state uip_tcp_appstate_t ++ \endcode ++ */ ++ ++/** ++ * \var #define UIP_APPCALL ++ * ++ * The name of the application function that uIP should call in ++ * response to TCP/IP events. ++ * ++ */ ++ ++/** ++ * \var typedef uip_tcp_appstate_t ++ * ++ * The type of the application state that is to be stored in the ++ * uip_conn structure. This usually is typedef:ed to a struct holding ++ * application state information. ++ */ ++ ++/** ++ * \var typedef uip_udp_appstate_t ++ * ++ * The type of the application state that is to be stored in the ++ * uip_conn structure. This usually is typedef:ed to a struct holding ++ * application state information. ++ */ ++/** @} */ ++/** @} */ ++ ++#endif /* __UIPOPT_H__ */ +diff --git a/iscsiuio/src/unix/.gitignore b/iscsiuio/src/unix/.gitignore +new file mode 100644 +index 0000000..a2dca2d +--- /dev/null ++++ b/iscsiuio/src/unix/.gitignore +@@ -0,0 +1,2 @@ ++build_date.c ++build_date.h +diff --git a/iscsiuio/src/unix/Makefile.am b/iscsiuio/src/unix/Makefile.am +new file mode 100644 +index 0000000..898691d +--- /dev/null ++++ b/iscsiuio/src/unix/Makefile.am +@@ -0,0 +1,39 @@ ++SUBDIRS= libs ++ ++AM_CFLAGS = -I${top_srcdir}/src/uip \ ++ -I${top_srcdir}/src/apps/brcm-iscsi \ ++ -I${top_srcdir}/src/apps/dhcpc \ ++ -I${top_srcdir}/src/unix/libs \ ++ -I${top_srcdir}/../include \ ++ -I${top_srcdir}/../usr ++ ++sbin_PROGRAMS = iscsiuio ++ ++iscsiuio_SOURCES = build_date.c \ ++ main.c \ ++ clock-arch.c \ ++ logger.c \ ++ nic.c \ ++ nic_id.c \ ++ nic_vlan.c \ ++ nic_nl.c \ ++ nic_utils.c \ ++ packet.c \ ++ iscsid_ipc.c ++ ++iscsiuio_CFLAGS = $(AM_CFLAGS) \ ++ $(LIBNL_CFLAGS) \ ++ -DBYTE_ORDER=@ENDIAN@ ++ ++iscsiuio_LDFLAGS= $(AM_LDADD) \ ++ -ldl \ ++ -rdynamic \ ++ $(LIBNL_LIBS) \ ++ -lpthread ++ ++iscsiuio_LDADD = ${top_srcdir}/src/uip/lib_iscsi_uip.a \ ++ ${top_srcdir}/src/apps/dhcpc/lib_apps_dhcpc.a\ ++ ${top_srcdir}/src/apps/brcm-iscsi/lib_apps_brcm_iscsi.a \ ++ ${top_srcdir}/src/unix/libs/lib_iscsiuio_hw_cnic.a ++ ++iscsiuio_YFLAGS = -d +diff --git a/iscsiuio/src/unix/clock-arch.c b/iscsiuio/src/unix/clock-arch.c +new file mode 100644 +index 0000000..d853101 +--- /dev/null ++++ b/iscsiuio/src/unix/clock-arch.c +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2006, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++ ++/** ++ * \file ++ * Implementation of architecture-specific clock functionality ++ * \author ++ * Adam Dunkels ++ */ ++ ++#include "clock-arch.h" ++#include ++ ++/*---------------------------------------------------------------------------*/ ++clock_time_t clock_time(void) ++{ ++ struct timeval tv; ++ struct timezone tz; ++ ++ gettimeofday(&tv, &tz); ++ ++ return tv.tv_sec * 1000 + tv.tv_usec / 1000; ++} ++ ++/*---------------------------------------------------------------------------*/ +diff --git a/iscsiuio/src/unix/clock-arch.h b/iscsiuio/src/unix/clock-arch.h +new file mode 100644 +index 0000000..888933f +--- /dev/null ++++ b/iscsiuio/src/unix/clock-arch.h +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2006, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++ ++#ifndef __CLOCK_ARCH_H__ ++#define __CLOCK_ARCH_H__ ++ ++typedef int clock_time_t; ++#define CLOCK_CONF_SECOND 1000 ++ ++#endif /* __CLOCK_ARCH_H__ */ +diff --git a/iscsiuio/src/unix/iscsid_ipc.c b/iscsiuio/src/unix/iscsid_ipc.c +new file mode 100644 +index 0000000..3e92d90 +--- /dev/null ++++ b/iscsiuio/src/unix/iscsid_ipc.c +@@ -0,0 +1,1075 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * iscsi_ipc.c - Generic NIC management/utility functions ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define PFX "iscsi_ipc " ++ ++/* TODO fix me */ ++#define IFNAMSIZ 15 ++ ++#include "nic.h" ++#include "nic_utils.h" ++#include "nic_vlan.h" ++#include "options.h" ++#include "mgmt_ipc.h" ++#include "iscsid_ipc.h" ++#include "uip.h" ++#include "uip_mgmt_ipc.h" ++ ++#include "logger.h" ++#include "uip.h" ++ ++/* private iscsid options stucture */ ++struct iscsid_options { ++ int fd; ++ pthread_t thread; ++}; ++ ++struct iface_rec_decode { ++ /* General */ ++ int32_t iface_num; ++ uint32_t ip_type; ++ ++ /* IPv4 */ ++ struct in_addr ipv4_addr; ++ struct in_addr ipv4_subnet_mask; ++ struct in_addr ipv4_gateway; ++ ++ /* IPv6 */ ++ struct in6_addr ipv6_addr; ++ struct in6_addr ipv6_subnet_mask; ++ uint32_t prefix_len; ++ struct in6_addr ipv6_linklocal; ++ struct in6_addr ipv6_router; ++ ++ uint8_t ipv6_autocfg; ++ uint8_t linklocal_autocfg; ++ uint8_t router_autocfg; ++ ++ uint8_t vlan_state; ++ uint8_t vlan_priority; ++ uint16_t vlan_id; ++ ++#define MIN_MTU_SUPPORT 46 ++#define MAX_MTU_SUPPORT 9000 ++ uint16_t mtu; ++}; ++ ++ ++/****************************************************************************** ++ * iscsid_ipc Constants ++ *****************************************************************************/ ++static const char uio_udev_path_template[] = "/dev/uio%d"; ++ ++/****************************************************************************** ++ * Globals ++ *****************************************************************************/ ++static struct iscsid_options iscsid_opts = { ++ .fd = INVALID_FD, ++ .thread = INVALID_THREAD, ++}; ++ ++/****************************************************************************** ++ * iscsid Functions ++ *****************************************************************************/ ++ ++static void *enable_nic_thread(void *data) ++{ ++ nic_t *nic = (nic_t *) data; ++ ++ prepare_nic_thread(nic); ++ LOG_INFO(PFX "%s: started NIC enable thread state: 0x%x", ++ nic->log_name, nic->state) ++ ++ /* Enable the NIC */ ++ nic_enable(nic); ++ ++ nic->enable_thread = INVALID_THREAD; ++ ++ pthread_exit(NULL); ++} ++ ++static int decode_cidr(char *in_ipaddr_str, struct iface_rec_decode *ird) ++{ ++ int rc = 0, i; ++ char *tmp, *tok; ++ char ipaddr_str[NI_MAXHOST]; ++ char str[INET6_ADDRSTRLEN]; ++ int keepbits = 0; ++ struct in_addr ia; ++ struct in6_addr ia6; ++ ++ if (strlen(in_ipaddr_str) > NI_MAXHOST) ++ strncpy(ipaddr_str, in_ipaddr_str, NI_MAXHOST); ++ else ++ strcpy(ipaddr_str, in_ipaddr_str); ++ ++ /* Find the CIDR if any */ ++ tmp = strchr(ipaddr_str, '/'); ++ if (tmp) { ++ /* CIDR found, now decode, tmpbuf = ip, tmp = netmask */ ++ tmp = ipaddr_str; ++ tok = strsep(&tmp, "/"); ++ LOG_INFO(PFX "in cidr: bitmask '%s' ip '%s'", tmp, tok); ++ keepbits = atoi(tmp); ++ strcpy(ipaddr_str, tok); ++ } ++ ++ /* Determine if the IP address passed from the iface file is ++ * an IPv4 or IPv6 address */ ++ rc = inet_pton(AF_INET, ipaddr_str, &ird->ipv6_addr); ++ if (rc == 0) { ++ /* Test to determine if the addres is an IPv6 address */ ++ rc = inet_pton(AF_INET6, ipaddr_str, &ird->ipv6_addr); ++ if (rc == 0) { ++ LOG_ERR(PFX "Could not parse IP address: '%s'", ++ ipaddr_str); ++ goto out; ++ } ++ ird->ip_type = AF_INET6; ++ if (keepbits > 128) { ++ LOG_ERR(PFX "CIDR netmask > 128 for IPv6: %d(%s)", ++ keepbits, tmp); ++ goto out; ++ } ++ if (!keepbits) { ++ /* Default prefix mask to 64 */ ++ memcpy(&ird->ipv6_subnet_mask.s6_addr, all_zeroes_addr6, ++ sizeof(struct in6_addr)); ++ ird->prefix_len = 64; ++ for (i = 0; i < 2; i++) ++ ird->ipv6_subnet_mask.s6_addr32[i] = 0xffffffff; ++ goto out; ++ } ++ ird->prefix_len = keepbits; ++ memcpy(&ia6.s6_addr, all_zeroes_addr6, sizeof(struct in6_addr)); ++ for (i = 0; i < 4; i++) { ++ if (keepbits < 32) { ++ ia6.s6_addr32[i] = keepbits > 0 ? ++ 0x00 - (1 << (32 - keepbits)) : 0; ++ ia6.s6_addr32[i] = htonl(ia6.s6_addr32[i]); ++ break; ++ } else ++ ia6.s6_addr32[i] = 0xFFFFFFFF; ++ keepbits -= 32; ++ } ++ ird->ipv6_subnet_mask = ia6; ++ if (inet_ntop(AF_INET6, &ia6, str, sizeof(str))) ++ LOG_INFO(PFX "Using netmask: %s", str); ++ } else { ++ ird->ip_type = AF_INET; ++ rc = inet_pton(AF_INET, ipaddr_str, &ird->ipv4_addr); ++ ++ if (keepbits > 32) { ++ LOG_ERR(PFX "CIDR netmask > 32 for IPv4: %d(%s)", ++ keepbits, tmp); ++ goto out; ++ } ++ ia.s_addr = keepbits > 0 ? 0x00 - (1 << (32 - keepbits)) : 0; ++ ird->ipv4_subnet_mask.s_addr = htonl(ia.s_addr); ++ LOG_INFO(PFX "Using netmask: %s", ++ inet_ntoa(ird->ipv4_subnet_mask)); ++ } ++out: ++ return rc; ++} ++ ++static int decode_iface(struct iface_rec_decode *ird, struct iface_rec *rec) ++{ ++ int rc = 0; ++ char ipaddr_str[NI_MAXHOST]; ++ ++ /* Decodes the rec contents */ ++ memset(ird, 0, sizeof(struct iface_rec_decode)); ++ ++ /* Detect for CIDR notation and strip off the netmask if present */ ++ rc = decode_cidr(rec->ipaddress, ird); ++ if (rc && !ird->ip_type) { ++ LOG_ERR(PFX "cidr decode err: rc=%d, ip_type=%d", ++ rc, ird->ip_type); ++ /* Can't decode address, just exit */ ++ return rc; ++ } ++ rc = 0; ++ ird->iface_num = rec->iface_num; ++ ird->vlan_id = rec->vlan_id; ++ if (rec->iface_num != IFACE_NUM_INVALID) { ++ ird->mtu = rec->mtu; ++ if (rec->vlan_id && strcmp(rec->vlan_state, "disable")) { ++ ird->vlan_state = 1; ++ ird->vlan_priority = rec->vlan_priority; ++ ird->vlan_id = rec->vlan_id; ++ } ++ if (ird->ip_type == AF_INET6) { ++ if (!strcmp(rec->ipv6_autocfg, "dhcpv6")) ++ ird->ipv6_autocfg = IPV6_AUTOCFG_DHCPV6; ++ else if (!strcmp(rec->ipv6_autocfg, "nd")) ++ ird->ipv6_autocfg = IPV6_AUTOCFG_ND; ++ else ++ ird->ipv6_autocfg = IPV6_AUTOCFG_NOTSPEC; ++ ++ if (!strcmp(rec->linklocal_autocfg, "auto")) ++ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_ON; ++ else if (!strcmp(rec->linklocal_autocfg, "off")) ++ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_OFF; ++ else /* default */ ++ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_ON; ++ ++ if (!strcmp(rec->router_autocfg, "auto")) ++ ird->router_autocfg = IPV6_RTR_AUTOCFG_ON; ++ else if (!strcmp(rec->router_autocfg, "off")) ++ ird->router_autocfg = IPV6_RTR_AUTOCFG_OFF; ++ else /* default */ ++ ird->router_autocfg = IPV6_RTR_AUTOCFG_ON; ++ ++ /* Decode the addresses based on the control flags */ ++ /* For DHCP, ignore the IPv6 addr in the iface */ ++ if (ird->ipv6_autocfg == IPV6_AUTOCFG_DHCPV6) ++ memcpy(&ird->ipv6_addr, all_zeroes_addr6, ++ sizeof(struct in6_addr)); ++ /* Subnet mask priority: CIDR, then rec */ ++ if (!ird->ipv6_subnet_mask.s6_addr) ++ inet_pton(AF_INET6, rec->subnet_mask, ++ &ird->ipv6_subnet_mask); ++ ++ /* For LL on, ignore the IPv6 addr in the iface */ ++ if (ird->linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) { ++ if (strlen(rec->ipv6_linklocal) > NI_MAXHOST) ++ strncpy(ipaddr_str, rec->ipv6_linklocal, ++ NI_MAXHOST); ++ else ++ strcpy(ipaddr_str, rec->ipv6_linklocal); ++ inet_pton(AF_INET6, ipaddr_str, ++ &ird->ipv6_linklocal); ++ } ++ ++ /* For RTR on, ignore the IPv6 addr in the iface */ ++ if (ird->router_autocfg == IPV6_RTR_AUTOCFG_OFF) { ++ if (strlen(rec->ipv6_router) > NI_MAXHOST) ++ strncpy(ipaddr_str, rec->ipv6_router, ++ NI_MAXHOST); ++ else ++ strcpy(ipaddr_str, rec->ipv6_router); ++ inet_pton(AF_INET6, ipaddr_str, ++ &ird->ipv6_router); ++ } ++ } else { ++ /* Subnet mask priority: CIDR, rec, default */ ++ if (!ird->ipv4_subnet_mask.s_addr) ++ inet_pton(AF_INET, rec->subnet_mask, ++ &ird->ipv4_subnet_mask); ++ if (!ird->ipv4_subnet_mask.s_addr) ++ ird->ipv4_subnet_mask.s_addr = ++ calculate_default_netmask( ++ ird->ipv4_addr.s_addr); ++ ++ if (strlen(rec->gateway) > NI_MAXHOST) ++ strncpy(ipaddr_str, rec->gateway, NI_MAXHOST); ++ else ++ strcpy(ipaddr_str, rec->gateway); ++ inet_pton(AF_INET, ipaddr_str, &ird->ipv4_gateway); ++ } ++ } else { ++ ird->ipv6_autocfg = IPV6_AUTOCFG_NOTUSED; ++ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_NOTUSED; ++ ird->router_autocfg = IPV6_RTR_AUTOCFG_NOTUSED; ++ } ++ return rc; ++} ++ ++static int parse_iface(void *arg) ++{ ++ int rc, i; ++ nic_t *nic = NULL; ++ nic_interface_t *nic_iface; ++ char *transport_name; ++ size_t transport_name_size; ++ nic_lib_handle_t *handle; ++ iscsid_uip_broadcast_t *data; ++ char ipv6_buf_str[INET6_ADDRSTRLEN]; ++ int request_type = 0; ++ struct iface_rec *rec; ++ struct iface_rec_decode ird; ++ struct in_addr src_match, dst_match; ++ pthread_attr_t attr; ++ ++ data = (iscsid_uip_broadcast_t *) arg; ++ rec = &data->u.iface_rec.rec; ++ LOG_INFO(PFX "Received request for '%s' to set IP address: '%s' " ++ "VLAN: '%d'", ++ rec->netdev, ++ rec->ipaddress, ++ rec->vlan_id); ++ ++ rc = decode_iface(&ird, rec); ++ if (ird.vlan_id && valid_vlan(ird.vlan_id) == 0) { ++ LOG_ERR(PFX "Invalid VLAN tag: %d", ird.vlan_id); ++ rc = -EIO; ++ goto early_exit; ++ } ++ if (rc && !ird.ip_type) { ++ LOG_ERR(PFX "iface err: rc=%d, ip_type=%d", rc, ird.ip_type); ++ goto early_exit; ++ } ++ ++ for (i = 0; i < 10; i++) { ++ struct timespec sleep_req, sleep_rem; ++ ++ if (pthread_mutex_trylock(&nic_list_mutex) == 0) ++ break; ++ ++ sleep_req.tv_sec = 0; ++ sleep_req.tv_nsec = 100000; ++ nanosleep(&sleep_req, &sleep_rem); ++ } ++ ++ if (i >= 10) { ++ LOG_WARN(PFX "Could not acquire nic_list_mutex lock"); ++ rc = -EIO; ++ goto early_exit; ++ } ++ ++ /* nic_list_mutex locked */ ++ ++ /* Check if we can find the NIC device using the netdev ++ * name */ ++ rc = from_netdev_name_find_nic(rec->netdev, &nic); ++ ++ if (rc != 0) { ++ LOG_WARN(PFX "Couldn't find NIC: %s, creating an instance", ++ rec->netdev); ++ ++ nic = nic_init(); ++ if (nic == NULL) { ++ LOG_ERR(PFX "Couldn't allocate space for NIC %s", ++ rec->netdev); ++ ++ rc = -ENOMEM; ++ goto done; ++ } ++ ++ strncpy(nic->eth_device_name, ++ rec->netdev, ++ sizeof(nic->eth_device_name)); ++ nic->config_device_name = nic->eth_device_name; ++ nic->log_name = nic->eth_device_name; ++ ++ if (nic_fill_name(nic) != 0) { ++ free(nic); ++ rc = -EIO; ++ goto done; ++ } ++ ++ nic_add(nic); ++ } else { ++ LOG_INFO(PFX " %s, using existing NIC", ++ rec->netdev); ++ } ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ if (nic->flags & NIC_GOING_DOWN) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ rc = -EIO; ++ LOG_INFO(PFX "nic->flags GOING DOWN"); ++ goto done; ++ } ++ ++ /* If we retry too many times allow iscsid to timeout */ ++ if (nic->pending_count > 1000) { ++ nic->pending_count = 0; ++ nic->flags &= ~NIC_ENABLED_PENDING; ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ LOG_WARN(PFX "%s: pending count exceeded 1000", nic->log_name); ++ ++ rc = 0; ++ goto done; ++ } ++ ++ if (nic->flags & NIC_ENABLED_PENDING) { ++ struct timespec sleep_req, sleep_rem; ++ ++ nic->pending_count++; ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ sleep_req.tv_sec = 0; ++ sleep_req.tv_nsec = 100000; ++ nanosleep(&sleep_req, &sleep_rem); ++ ++ LOG_INFO(PFX "%s: enabled pending", nic->log_name); ++ ++ rc = -EAGAIN; ++ goto done; ++ } ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ prepare_library(nic); ++ ++ /* Sanity Check to ensure the transport names are the same */ ++ handle = nic->nic_library; ++ if (handle != NULL) { ++ (*handle->ops->lib_ops.get_transport_name) (&transport_name, ++ &transport_name_size); ++ ++ if (strncmp(transport_name, ++ rec->transport_name, ++ transport_name_size) != 0) { ++ LOG_ERR(PFX "%s Transport name is not equal " ++ "expected: %s got: %s", ++ nic->log_name, ++ rec->transport_name, ++ transport_name); ++ } ++ } else { ++ LOG_ERR(PFX "%s Couldn't find nic library ", nic->log_name); ++ rc = -EIO; ++ goto done; ++ } ++ ++ LOG_INFO(PFX "%s library set using transport_name %s", ++ nic->log_name, transport_name); ++ ++ /* Determine how to configure the IP address */ ++ if (ird.ip_type == AF_INET) { ++ if (memcmp(&ird.ipv4_addr, ++ all_zeroes_addr4, sizeof(uip_ip4addr_t)) == 0) { ++ LOG_INFO(PFX "%s: requesting configuration using DHCP", ++ nic->log_name); ++ request_type = IPV4_CONFIG_DHCP; ++ } else { ++ LOG_INFO(PFX "%s: requesting configuration using " ++ "static IP address", nic->log_name); ++ request_type = IPV4_CONFIG_STATIC; ++ } ++ } else if (ird.ip_type == AF_INET6) { ++ /* For the new 872_22, check ipv6_autocfg for DHCPv6 instead */ ++ switch (ird.ipv6_autocfg) { ++ case IPV6_AUTOCFG_DHCPV6: ++ request_type = IPV6_CONFIG_DHCP; ++ break; ++ case IPV6_AUTOCFG_ND: ++ request_type = IPV6_CONFIG_STATIC; ++ break; ++ case IPV6_AUTOCFG_NOTSPEC: ++ /* Treat NOTSPEC the same as NOTUSED for now */ ++ case IPV6_AUTOCFG_NOTUSED: ++ /* For 871 */ ++ default: ++ /* Just the IP address to determine */ ++ if (memcmp(&ird.ipv6_addr, ++ all_zeroes_addr6, ++ sizeof(struct in6_addr)) == 0) ++ request_type = IPV6_CONFIG_DHCP; ++ else ++ request_type = IPV6_CONFIG_STATIC; ++ } ++ } else { ++ LOG_ERR(PFX "%s: unknown ip_type to configure: 0x%x", ++ nic->log_name, ird.ip_type); ++ ++ rc = -EIO; ++ goto done; ++ } ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ nic_iface = nic_find_nic_iface(nic, ird.ip_type, ird.vlan_id, ++ ird.iface_num, request_type); ++ ++ if (nic->flags & NIC_PATHREQ_WAIT) { ++ if (!nic_iface || ++ !(nic_iface->flags & NIC_IFACE_PATHREQ_WAIT)) { ++ int pathreq_wait; ++ ++ if (nic_iface && ++ (nic_iface->flags & NIC_IFACE_PATHREQ_WAIT2)) ++ pathreq_wait = 12; ++ else ++ pathreq_wait = 10; ++ ++ if (nic->pathreq_pending_count < pathreq_wait) { ++ struct timespec sleep_req, sleep_rem; ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ nic->pathreq_pending_count++; ++ sleep_req.tv_sec = 0; ++ sleep_req.tv_nsec = 100000; ++ nanosleep(&sleep_req, &sleep_rem); ++ /* Somebody else is waiting for PATH_REQ */ ++ LOG_INFO(PFX "%s: path req pending cnt=%d", ++ nic->log_name, ++ nic->pathreq_pending_count); ++ rc = -EAGAIN; ++ goto done; ++ } else { ++ nic->pathreq_pending_count = 0; ++ LOG_DEBUG(PFX "%s: path req pending cnt " ++ "exceeded!", nic->log_name); ++ /* Allow to fall thru */ ++ } ++ } ++ } ++ ++ nic->flags |= NIC_PATHREQ_WAIT; ++ ++ /* Create the network interface if it doesn't exist */ ++ if (nic_iface == NULL) { ++ LOG_DEBUG(PFX "%s couldn't find interface with " ++ "ip_type: 0x%x creating it", ++ nic->log_name, ird.ip_type); ++ nic_iface = nic_iface_init(); ++ ++ if (nic_iface == NULL) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ LOG_ERR(PFX "%s Couldn't allocate " ++ "interface with ip_type: 0x%x", ++ nic->log_name, ird.ip_type); ++ goto done; ++ } ++ nic_iface->protocol = ird.ip_type; ++ nic_iface->vlan_id = ird.vlan_id; ++ nic_iface->vlan_priority = ird.vlan_priority; ++ if (ird.mtu >= MIN_MTU_SUPPORT && ird.mtu <= MAX_MTU_SUPPORT) ++ nic_iface->mtu = ird.mtu; ++ nic_iface->iface_num = ird.iface_num; ++ nic_iface->request_type = request_type; ++ nic_add_nic_iface(nic, nic_iface); ++ ++ persist_all_nic_iface(nic); ++ ++ LOG_INFO(PFX "%s: created network interface", ++ nic->log_name); ++ } else { ++ /* Move the nic_iface to the front */ ++ set_nic_iface(nic, nic_iface); ++ LOG_INFO(PFX "%s: using existing network interface", ++ nic->log_name); ++ } ++ ++ nic_iface->flags |= NIC_IFACE_PATHREQ_WAIT1; ++ if (nic->nl_process_thread == INVALID_THREAD) { ++ pthread_attr_init(&attr); ++ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ++ rc = pthread_create(&nic->nl_process_thread, &attr, ++ nl_process_handle_thread, nic); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not create NIC NL " ++ "processing thread [%s]", nic->log_name, ++ strerror(rc)); ++ nic->nl_process_thread = INVALID_THREAD; ++ /* Reset both WAIT flags */ ++ nic_iface->flags &= ~NIC_IFACE_PATHREQ_WAIT; ++ nic->flags &= ~NIC_PATHREQ_WAIT; ++ } ++ } ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ if (nic_iface->ustack.ip_config == request_type) { ++ /* Same request_type, check for STATIC address change */ ++ if (request_type == IPV4_CONFIG_STATIC) { ++ if (memcmp(nic_iface->ustack.hostaddr, &ird.ipv4_addr, ++ sizeof(struct in_addr))) ++ goto reacquire; ++ } else if (request_type == IPV6_CONFIG_STATIC) { ++ if (memcmp(nic_iface->ustack.hostaddr6, &ird.ipv6_addr, ++ sizeof(struct in6_addr))) ++ goto reacquire; ++ else ++ inet_ntop(AF_INET6, &ird.ipv6_addr, ++ ipv6_buf_str, ++ sizeof(ipv6_buf_str)); ++ } ++ LOG_INFO(PFX "%s: IP configuration didn't change using 0x%x", ++ nic->log_name, nic_iface->ustack.ip_config); ++ /* No need to acquire the IP address */ ++ inet_ntop(AF_INET6, &ird.ipv6_addr, ipv6_buf_str, ++ sizeof(ipv6_buf_str)); ++ ++ goto enable_nic; ++ } ++reacquire: ++ /* Config needs to re-acquire for this nic_iface */ ++ pthread_mutex_lock(&nic->nic_mutex); ++ nic_iface->flags |= NIC_IFACE_ACQUIRE; ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ /* Disable the nic loop from further processing, upon returned, ++ the nic_iface should be cleared */ ++ nic_disable(nic, 0); ++ ++ /* Check to see if this is using DHCP or if this is ++ * a static IPv4 address. This is done by checking ++ * if the IP address is equal to 0.0.0.0. If it is ++ * then the user has specified to use DHCP. If not ++ * then the user has spcicied to use a static IP address ++ * an the default netmask will be used */ ++ switch (request_type) { ++ case IPV4_CONFIG_DHCP: ++ memset(nic_iface->ustack.hostaddr, 0, sizeof(struct in_addr)); ++ LOG_INFO(PFX "%s: configuring using DHCP", nic->log_name); ++ nic_iface->ustack.ip_config = IPV4_CONFIG_DHCP; ++ break; ++ ++ case IPV4_CONFIG_STATIC: ++ memcpy(nic_iface->ustack.hostaddr, &ird.ipv4_addr, ++ sizeof(struct in_addr)); ++ LOG_INFO(PFX "%s: configuring using static IP " ++ "IPv4 address :%s ", ++ nic->log_name, inet_ntoa(ird.ipv4_addr)); ++ ++ if (ird.ipv4_subnet_mask.s_addr) ++ memcpy(nic_iface->ustack.netmask, ++ &ird.ipv4_subnet_mask, sizeof(struct in_addr)); ++ LOG_INFO(PFX " netmask: %s", inet_ntoa(ird.ipv4_subnet_mask)); ++ ++ /* Default route */ ++ if (ird.ipv4_gateway.s_addr) { ++ /* Check for validity */ ++ src_match.s_addr = ird.ipv4_addr.s_addr & ++ ird.ipv4_subnet_mask.s_addr; ++ dst_match.s_addr = ird.ipv4_gateway.s_addr & ++ ird.ipv4_subnet_mask.s_addr; ++ if (src_match.s_addr == dst_match.s_addr) ++ memcpy(nic_iface->ustack.default_route_addr, ++ &ird.ipv4_gateway, ++ sizeof(struct in_addr)); ++ } ++ nic_iface->ustack.ip_config = IPV4_CONFIG_STATIC; ++ break; ++ ++ case IPV6_CONFIG_DHCP: ++ memset(nic_iface->ustack.hostaddr6, 0, ++ sizeof(struct in6_addr)); ++ nic_iface->ustack.prefix_len = ird.prefix_len; ++ nic_iface->ustack.ipv6_autocfg = ird.ipv6_autocfg; ++ nic_iface->ustack.linklocal_autocfg = ird.linklocal_autocfg; ++ nic_iface->ustack.router_autocfg = ird.router_autocfg; ++ ++ if (memcmp(&ird.ipv6_subnet_mask, all_zeroes_addr6, ++ sizeof(struct in6_addr))) ++ memcpy(nic_iface->ustack.netmask6, ++ &ird.ipv6_subnet_mask, sizeof(struct in6_addr)); ++ if (ird.linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) ++ memcpy(nic_iface->ustack.linklocal6, ++ &ird.ipv6_linklocal, sizeof(struct in6_addr)); ++ if (ird.router_autocfg == IPV6_RTR_AUTOCFG_OFF) ++ memcpy(nic_iface->ustack.default_route_addr6, ++ &ird.ipv6_router, sizeof(struct in6_addr)); ++ inet_ntop(AF_INET6, &ird.ipv6_addr, ipv6_buf_str, ++ sizeof(ipv6_buf_str)); ++ LOG_INFO(PFX "%s: configuring using DHCPv6", ++ nic->log_name); ++ nic_iface->ustack.ip_config = IPV6_CONFIG_DHCP; ++ break; ++ ++ case IPV6_CONFIG_STATIC: ++ memcpy(nic_iface->ustack.hostaddr6, &ird.ipv6_addr, ++ sizeof(struct in6_addr)); ++ nic_iface->ustack.prefix_len = ird.prefix_len; ++ nic_iface->ustack.ipv6_autocfg = ird.ipv6_autocfg; ++ nic_iface->ustack.linklocal_autocfg = ird.linklocal_autocfg; ++ nic_iface->ustack.router_autocfg = ird.router_autocfg; ++ ++ if (memcmp(&ird.ipv6_subnet_mask, all_zeroes_addr6, ++ sizeof(struct in6_addr))) ++ memcpy(nic_iface->ustack.netmask6, ++ &ird.ipv6_subnet_mask, sizeof(struct in6_addr)); ++ if (ird.linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) ++ memcpy(nic_iface->ustack.linklocal6, ++ &ird.ipv6_linklocal, sizeof(struct in6_addr)); ++ if (ird.router_autocfg == IPV6_RTR_AUTOCFG_OFF) ++ memcpy(nic_iface->ustack.default_route_addr6, ++ &ird.ipv6_router, sizeof(struct in6_addr)); ++ ++ inet_ntop(AF_INET6, &ird.ipv6_addr, ipv6_buf_str, ++ sizeof(ipv6_buf_str)); ++ LOG_INFO(PFX "%s: configuring using static IP " ++ "IPv6 address: '%s'", nic->log_name, ipv6_buf_str); ++ ++ nic_iface->ustack.ip_config = IPV6_CONFIG_STATIC; ++ break; ++ ++ default: ++ LOG_INFO(PFX "%s: Unknown request type: 0x%x", ++ nic->log_name, request_type); ++ ++ } ++ ++enable_nic: ++ switch (nic->state) { ++ case NIC_STOPPED: ++ /* This thread will be thrown away when completed */ ++ if (nic->enable_thread != INVALID_THREAD) { ++ rc = pthread_cancel(nic->enable_thread); ++ if (rc != 0) { ++ LOG_INFO(PFX "%s: failed to cancel enable NIC " ++ "thread\n", nic->log_name); ++ goto eagain; ++ } ++ } ++ pthread_attr_init(&attr); ++ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ++ rc = pthread_create(&nic->enable_thread, &attr, ++ enable_nic_thread, (void *)nic); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: failed starting enable NIC thread\n", ++ nic->log_name); ++eagain: ++ rc = -EAGAIN; ++ break; ++ ++ case NIC_RUNNING: ++ LOG_INFO(PFX "%s: NIC already enabled " ++ "flags: 0x%x state: 0x%x\n", ++ nic->log_name, nic->flags, nic->state); ++ rc = 0; ++ break; ++ default: ++ LOG_INFO(PFX "%s: NIC enable still in progress " ++ "flags: 0x%x state: 0x%x\n", ++ nic->log_name, nic->flags, nic->state); ++ rc = -EAGAIN; ++ } ++ ++ LOG_INFO(PFX "ISCSID_UIP_IPC_GET_IFACE: command: %x " ++ "name: %s, netdev: %s ipaddr: %s vlan: %d transport_name:%s", ++ data->header.command, rec->name, rec->netdev, ++ (ird.ip_type == AF_INET) ? inet_ntoa(ird.ipv4_addr) : ++ ipv6_buf_str, ++ ird.vlan_id, rec->transport_name); ++ ++done: ++ pthread_mutex_unlock(&nic_list_mutex); ++ ++early_exit: ++ return rc; ++} ++ ++/** ++ * process_iscsid_broadcast() - This function is used to process the ++ * broadcast messages from iscsid ++ */ ++int process_iscsid_broadcast(int s2) ++{ ++ int rc = 0; ++ iscsid_uip_broadcast_t *data; ++ iscsid_uip_rsp_t rsp; ++ FILE *fd; ++ size_t size; ++ iscsid_uip_cmd_e cmd; ++ uint32_t payload_len; ++ ++ fd = fdopen(s2, "r+"); ++ if (fd == NULL) { ++ LOG_ERR(PFX "Couldn't open file descriptor: %d(%s)", ++ errno, strerror(errno)); ++ return -EIO; ++ } ++ ++ /* This will be freed by parse_iface_thread() */ ++ data = (iscsid_uip_broadcast_t *) calloc(1, sizeof(*data)); ++ if (data == NULL) { ++ LOG_ERR(PFX "Couldn't allocate memory for iface data"); ++ rc = -ENOMEM; ++ goto error; ++ } ++ memset(data, 0, sizeof(*data)); ++ ++ size = fread(data, sizeof(iscsid_uip_broadcast_header_t), 1, fd); ++ if (!size) { ++ LOG_ERR(PFX "Could not read request: %d(%s)", ++ errno, strerror(errno)); ++ rc = ferror(fd); ++ goto error; ++ } ++ ++ cmd = data->header.command; ++ payload_len = data->header.payload_len; ++ ++ LOG_DEBUG(PFX "recv iscsid request: cmd: %d, payload_len: %d", ++ cmd, payload_len); ++ ++ size = fread(&data->u.iface_rec, payload_len, 1, fd); ++ if (!size) { ++ LOG_ERR(PFX "Could not read data: %d(%s)", ++ errno, strerror(errno)); ++ goto error; ++ } ++ ++ switch (cmd) { ++ case ISCSID_UIP_IPC_GET_IFACE: ++ rc = parse_iface(data); ++ switch (rc) { ++ case 0: ++ rsp.command = cmd; ++ rsp.err = ISCSID_UIP_MGMT_IPC_DEVICE_UP; ++ break; ++ case -EAGAIN: ++ rsp.command = cmd; ++ rsp.err = ISCSID_UIP_MGMT_IPC_DEVICE_INITIALIZING; ++ break; ++ default: ++ rsp.command = cmd; ++ rsp.err = ISCSID_UIP_MGMT_IPC_ERR; ++ } ++ ++ break; ++ default: ++ LOG_WARN(PFX "Unknown iscsid broadcast command: %x", ++ data->header.command); ++ ++ /* Send a response back to iscsid to tell it the ++ operation succeeded */ ++ rsp.command = cmd; ++ rsp.err = ISCSID_UIP_MGMT_IPC_OK; ++ break; ++ } ++ ++ size = fwrite(&rsp, sizeof(rsp), 1, fd); ++ if (size == -1) { ++ LOG_ERR(PFX "Could not send response: %d(%s)", ++ errno, strerror(errno)); ++ rc = ferror(fd); ++ } ++ ++error: ++ free(data); ++ fclose(fd); ++ ++ return rc; ++} ++ ++static void iscsid_loop_close(void *arg) ++{ ++ close(iscsid_opts.fd); ++ ++ LOG_INFO(PFX "iSCSI daemon socket closed"); ++} ++ ++/** ++ * iscsid_loop() - This is the function which will process the broadcast ++ * messages from iscsid ++ * ++ */ ++static void *iscsid_loop(void *arg) ++{ ++ int rc; ++ sigset_t set; ++ ++ pthread_cleanup_push(iscsid_loop_close, arg); ++ ++ sigfillset(&set); ++ rc = pthread_sigmask(SIG_BLOCK, &set, NULL); ++ if (rc != 0) { ++ LOG_ERR(PFX ++ "Couldn't set signal mask for the iscisd listening " ++ "thread"); ++ } ++ ++ LOG_DEBUG(PFX "Started iscsid listening thread"); ++ ++ while (1) { ++ struct sockaddr_un remote; ++ socklen_t sock_len; ++ int s2; ++ ++ LOG_DEBUG(PFX "Waiting for iscsid command"); ++ ++ sock_len = sizeof(remote); ++ s2 = accept(iscsid_opts.fd, ++ (struct sockaddr *)&remote, &sock_len); ++ if (s2 == -1) { ++ if (errno == EAGAIN) { ++ LOG_DEBUG("Got EAGAIN from accept"); ++ sleep(1); ++ continue; ++ } else if (errno == EINTR) { ++ LOG_DEBUG("Got EINTR from accept"); ++ /* The program is terminating, time to exit */ ++ break; ++ } ++ ++ LOG_ERR(PFX "Could not accept: %d(%s)", ++ s2, strerror(errno)); ++ continue; ++ } ++ ++ process_iscsid_broadcast(s2); ++ close(s2); ++ } ++ ++ pthread_cleanup_pop(0); ++ ++ LOG_ERR(PFX "exit iscsid listening thread"); ++ ++ pthread_exit(NULL); ++} ++ ++#define SD_SOCKET_FDS_START 3 ++ ++static int ipc_systemd(void) ++{ ++ char *env; ++ ++ env = getenv("LISTEN_PID"); ++ ++ if (!env || (strtoul(env, NULL, 10) != getpid())) ++ return -EINVAL; ++ ++ env = getenv("LISTEN_FDS"); ++ ++ if (!env) ++ return -EINVAL; ++ ++ if (strtoul(env, NULL, 10) != 1) { ++ LOG_ERR("Did not receive exactly one IPC socket from systemd"); ++ return -EINVAL; ++ } ++ ++ return SD_SOCKET_FDS_START; ++} ++ ++/****************************************************************************** ++ * Initialize/Cleanup routines ++ ******************************************************************************/ ++/** ++ * iscsid_init() - This function will setup the thread used to listen for ++ * the iscsid broadcast messages ++ * @return 0 on success, <0 on failure ++ */ ++int iscsid_init() ++{ ++ int rc, addr_len; ++ struct sockaddr_un addr; ++ ++ iscsid_opts.fd = ipc_systemd(); ++ if (iscsid_opts.fd >= 0) ++ return 0; ++ ++ iscsid_opts.fd = socket(AF_LOCAL, SOCK_STREAM, 0); ++ if (iscsid_opts.fd < 0) { ++ LOG_ERR(PFX "Can not create IPC socket"); ++ return iscsid_opts.fd; ++ } ++ ++ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSID_UIP_NAMESPACE) + 1; ++ ++ memset(&addr, 0, sizeof(addr)); ++ addr.sun_family = AF_LOCAL; ++ memcpy((char *)&addr.sun_path + 1, ISCSID_UIP_NAMESPACE, ++ strlen(ISCSID_UIP_NAMESPACE)); ++ ++ rc = bind(iscsid_opts.fd, (struct sockaddr *)&addr, addr_len); ++ if (rc < 0) { ++ LOG_ERR(PFX "Can not bind IPC socket: %s", strerror(errno)); ++ goto error; ++ } ++ ++ rc = listen(iscsid_opts.fd, 32); ++ if (rc < 0) { ++ LOG_ERR(PFX "Can not listen IPC socket: %s", strerror(errno)); ++ goto error; ++ } ++ ++ return 0; ++error: ++ close(iscsid_opts.fd); ++ iscsid_opts.fd = INVALID_FD; ++ ++ return rc; ++} ++ ++/** ++ * iscsid_start() - This function will start the thread used to listen for ++ * the iscsid broadcast messages ++ * @return 0 on success, <0 on failure ++ */ ++int iscsid_start() ++{ ++ pthread_attr_t attr; ++ int rc; ++ ++ pthread_attr_init(&attr); ++ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ++ rc = pthread_create(&iscsid_opts.thread, &attr, iscsid_loop, NULL); ++ if (rc != 0) { ++ LOG_ERR(PFX "Could not start iscsid listening thread rc=%d", ++ rc); ++ goto error; ++ } ++ ++ return 0; ++ ++error: ++ close(iscsid_opts.fd); ++ iscsid_opts.fd = INVALID_FD; ++ ++ return rc; ++} ++ ++/** ++ * iscsid_cleanup() - This is called when stoping the thread listening ++ * for the iscsid broadcast messages ++ */ ++void iscsid_cleanup() ++{ ++ int rc; ++ ++ if (iscsid_opts.fd != INVALID_FD) { ++ rc = pthread_cancel(iscsid_opts.thread); ++ if (rc != 0) { ++ LOG_ERR("Could not cancel iscsid listening thread: %s", ++ strerror(rc)); ++ } ++ } ++ ++ LOG_INFO(PFX "iscsid listening thread has shutdown"); ++} +diff --git a/iscsiuio/src/unix/iscsid_ipc.h b/iscsiuio/src/unix/iscsid_ipc.h +new file mode 100644 +index 0000000..60bcd71 +--- /dev/null ++++ b/iscsiuio/src/unix/iscsid_ipc.h +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * iscsid_ipc.h: Generic NIC management/utility functions ++ * ++ */ ++#ifndef __ISCSID_IPC_H__ ++#define __ISCSID_IPC_H__ ++ ++#include "uip.h" ++#include "mgmt_ipc.h" ++ ++enum mgmt_ipc_err iscsid_connect(int *fd); ++int iscsid_get_ipaddr(int fd, uip_ip4addr_t *ipaddr); ++ ++int iscsid_init(); ++int iscsid_start(); ++void iscsid_cleanup(); ++ ++#endif /* __ISCSID_IPC_H__ */ +diff --git a/iscsiuio/src/unix/libs/Makefile.am b/iscsiuio/src/unix/libs/Makefile.am +new file mode 100644 +index 0000000..890415f +--- /dev/null ++++ b/iscsiuio/src/unix/libs/Makefile.am +@@ -0,0 +1,13 @@ ++AM_CFLAGS = -I${top_srcdir}/src/uip \ ++ -I${top_srcdir}/src/unix \ ++ -I${top_srcdir}/src/unix/libs \ ++ -I${top_srcdir}/src/apps/dhcpc \ ++ -I${top_srcdir}/../include \ ++ -I${top_srcdir}/../usr ++ ++noinst_LIBRARIES = lib_iscsiuio_hw_cnic.a ++ ++lib_iscsiuio_hw_cnic_a_SOURCES = ../build_date.c \ ++ cnic.c \ ++ bnx2.c \ ++ bnx2x.c +diff --git a/iscsiuio/src/unix/libs/bnx2.c b/iscsiuio/src/unix/libs/bnx2.c +new file mode 100644 +index 0000000..937336e +--- /dev/null ++++ b/iscsiuio/src/unix/libs/bnx2.c +@@ -0,0 +1,1165 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * bnx2.c - bnx2 user space driver ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "config.h" ++ ++#include "build_date.h" ++#include "bnx2.h" ++#include "cnic.h" ++#include "logger.h" ++#include "nic.h" ++#include "nic_utils.h" ++#include "options.h" ++ ++#define PFX "bnx2 " ++ ++/* Foward struct declarations */ ++struct nic_ops bnx2_op; ++ ++/******************************************************************************* ++ * NIC Library Strings ++ ******************************************************************************/ ++static const char library_name[] = "bnx2"; ++static const char library_version[] = PACKAGE_VERSION; ++static const char library_uio_name[] = "bnx2_cnic"; ++ ++/* The name that should be returned from /sys/class/uio/uio0/name */ ++static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; ++static const char cnic_uio_sysfs_name[] = "bnx2_cnic"; ++ ++/******************************************************************************* ++ * String constants used to display human readable adapter name ++ ******************************************************************************/ ++static const char brcm_5706C[] = "QLogic NetXtreme II BCM5706 1000Base-T"; ++static const char hp_NC370T[] = ++ "HP NC370T Multifunction Gigabit Server Adapter"; ++static const char hp_NC370I[] = ++ "HP NC370i Multifunction Gigabit Server Adapter"; ++static const char brcm_5706S[] = "QLogic NetXtreme II BCM5706 1000Base-SX"; ++static const char hp_NC370F[] = ++ "HP NC370F Multifunction Gigabit Server Adapter"; ++static const char brcm_5708C[] = "QLogic NetXtreme II BCM5708 1000Base-T"; ++static const char brcm_5708S[] = "QLogic NetXtreme II BCM5708 1000Base-SX"; ++static const char brcm_5709C[] = "QLogic NetXtreme II BCM5709 1000Base-T"; ++static const char brcm_5709S[] = "QLogic NetXtreme II BCM5709 1000Base-SX"; ++static const char brcm_5716C[] = "QLogic NetXtreme II BCM5716 1000Base-T"; ++static const char brcm_5716S[] = "QLogic NetXtreme II BCM5716 1000Base-SX"; ++ ++/******************************************************************************* ++ * PCI ID constants ++ ******************************************************************************/ ++#define PCI_VENDOR_ID_BROADCOM 0x14e4 ++#define PCI_DEVICE_ID_NX2_5709 0x1639 ++#define PCI_DEVICE_ID_NX2_5709S 0x163a ++#define PCI_DEVICE_ID_NX2_5706 0x164a ++#define PCI_DEVICE_ID_NX2_5708 0x164c ++#define PCI_DEVICE_ID_NX2_5706S 0x16aa ++#define PCI_DEVICE_ID_NX2_5708S 0x16ac ++ ++#define PCI_VENDOR_ID_HP 0x103c ++ ++#define PCI_ANY_ID (~0) ++ ++/* This is the table used to match PCI vendor and device ID's to the ++ * human readable string names of the devices */ ++static const struct pci_device_id bnx2_pci_tbl[] = { ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, ++ PCI_VENDOR_ID_HP, 0x3101, hp_NC370T}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, ++ PCI_VENDOR_ID_HP, 0x3106, hp_NC370I}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5706S}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5708C}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S, ++ PCI_VENDOR_ID_HP, 0x3102, hp_NC370F}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5706S}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5708S}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5709C}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709S, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5709S}, ++ {PCI_VENDOR_ID_BROADCOM, 0x163b, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5716C}, ++ {PCI_VENDOR_ID_BROADCOM, 0x163c, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_5716S}, ++}; ++ ++/******************************************************************************* ++ * bnx2 Library Functions ++ ******************************************************************************/ ++/** ++ * bnx2_get_library_name() - Used to get the name of this NIC libary ++ * @param name - This function will return the pointer to this NIC ++ * library name ++ * @param name_size ++ */ ++static void bnx2_get_library_name(char **name, size_t *name_size) ++{ ++ *name = (char *)library_name; ++ *name_size = sizeof(library_name); ++} ++ ++/** ++ * bnx2_get_library_version() - Used to get the version string of this ++ * NIC libary ++ * @param version - This function will return the pointer to this NIC ++ * library version string ++ * @param version_size - This will be set with the version size ++ */ ++static void bnx2_get_library_version(char **version, size_t *version_size) ++{ ++ *version = (char *)library_version; ++ *version_size = sizeof(library_version); ++} ++ ++/** ++ * bnx2_get_build_date() - Used to get the build date string of this library ++ * @param version - This function will return the pointer to this NIC ++ * library build date string ++ * @param version_size - This will be set with the build date string size ++ */ ++static void bnx2_get_build_date(char **build, size_t *build_size) ++{ ++ *build = (char *)build_date; ++ *build_size = sizeof(build_date); ++} ++ ++/** ++ * bnx2_get_transport_name() - Used to get the transport name associated ++ * with this this NIC libary ++ * @param transport_name - This function will return the pointer to this NIC ++ * library's associated transport string ++ * @param transport_name_size - This will be set with the transport name size ++ */ ++static void bnx2_get_transport_name(char **transport_name, ++ size_t *transport_name_size) ++{ ++ *transport_name = (char *)bnx2i_library_transport_name; ++ *transport_name_size = bnx2i_library_transport_name_size; ++} ++ ++/** ++ * bnx2_get_uio_name() - Used to get the uio name associated with this this ++ * NIC libary ++ * @param uio_name - This function will return the pointer to this NIC ++ * library's associated uio string ++ * @param transport_name_size - This will be set with the uio name size ++ */ ++static void bnx2_get_uio_name(char **uio_name, size_t *uio_name_size) ++{ ++ *uio_name = (char *)library_uio_name; ++ *uio_name_size = sizeof(library_uio_name); ++} ++ ++/** ++ * bnx2_get_pci_table() - Used to get the PCI table for this NIC libary ++ * to determine which NIC's based off of PCI ID's ++ * are supported ++ * @param table - This function will return the pointer to the PCI table ++ * @param entries - This function will return the number of entries in the NIC ++ * library's PCI table ++ */ ++static void bnx2_get_pci_table(struct pci_device_id **table, uint32_t *entries) ++{ ++ *table = (struct pci_device_id *)bnx2_pci_tbl; ++ *entries = (uint32_t) (sizeof(bnx2_pci_tbl) / sizeof(bnx2_pci_tbl[0])); ++} ++ ++/** ++ * bnx2_get_ops() - Used to get the NIC library op table ++ * @param op - The op table of this NIC library ++ */ ++struct nic_ops *bnx2_get_ops() ++{ ++ return &bnx2_op; ++} ++ ++/******************************************************************************* ++ * bnx2 Utility Functions ++ ******************************************************************************/ ++/******************************************************************************* ++ * Utility Functions Used to read register from the bnx2 device ++ ******************************************************************************/ ++static void bnx2_wr32(bnx2_t *bp, __u32 off, __u32 val) ++{ ++ *((volatile __u32 *)(bp->reg + off)) = val; ++} ++ ++static void bnx2_wr16(bnx2_t *bp, __u32 off, __u16 val) ++{ ++ *((volatile __u16 *)(bp->reg + off)) = val; ++} ++ ++static __u32 bnx2_rd32(bnx2_t *bp, __u32 off) ++{ ++ return *((volatile __u32 *)(bp->reg + off)); ++} ++ ++static int bnx2_reg_sync(bnx2_t *bp, __u32 off, __u16 length) ++{ ++ return msync(bp->reg + off, length, MS_SYNC); ++} ++ ++/** ++ * bnx2_get_chip_id() - Used to retrive the chip ID from the nic ++ * @param dev - Device used to determin NIC type ++ * @return Chip ID read from the MISC ID register ++ */ ++static int bnx2_get_chip_id(bnx2_t *bp) ++{ ++ return bnx2_rd32(bp, BNX2_MISC_ID); ++} ++ ++/** ++ * bnx2_uio_verify() ++ * ++ */ ++static int bnx2_uio_verify(nic_t *nic) ++{ ++ char *raw = NULL, *raw_tmp; ++ uint32_t raw_size = 0; ++ char temp_path[sizeof(cnic_uio_sysfs_name_tempate) + 8]; ++ int rc = 0; ++ ++ /* Build the path to determine uio name */ ++ snprintf(temp_path, sizeof(temp_path), ++ cnic_uio_sysfs_name_tempate, nic->uio_minor); ++ ++ rc = capture_file(&raw, &raw_size, temp_path); ++ if (rc != 0) ++ goto error; ++ ++ /* sanitize name string by replacing newline with null termination */ ++ raw_tmp = raw; ++ while (*raw_tmp != '\n') ++ raw_tmp++; ++ *raw_tmp = '\0'; ++ ++ if (strncmp(raw, cnic_uio_sysfs_name, sizeof(cnic_uio_sysfs_name)) != ++ 0) { ++ LOG_ERR(PFX "%s: uio names not equal: " ++ "expecting %s got %s from %s", ++ nic->log_name, cnic_uio_sysfs_name, raw, temp_path); ++ rc = -EIO; ++ } ++ ++ free(raw); ++ ++ LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); ++ ++error: ++ return rc; ++} ++ ++/******************************************************************************* ++ * bnx2 Utility Functions to get to the hardware consumer indexes ++ ******************************************************************************/ ++static __u16 bnx2_get_rx_msix(bnx2_t *bp) ++{ ++ struct status_block_msix *sblk = bp->status_blk.msix; ++ __u16 rx_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ rx_cons = sblk->status_rx_quick_consumer_index; ++ barrier(); ++ if ((rx_cons & (MAX_RX_DESC_CNT)) == (MAX_RX_DESC_CNT)) ++ rx_cons++; ++ ++ return rx_cons; ++} ++ ++static __u16 bnx2_get_rx_msi(bnx2_t *bp) ++{ ++ struct status_block *sblk = bp->status_blk.msi; ++ __u16 rx_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ rx_cons = BNX2_SBLK_EVEN_IDX(sblk->rx2); ++ barrier(); ++ if ((rx_cons & (MAX_RX_DESC_CNT)) == (MAX_RX_DESC_CNT)) ++ rx_cons++; ++ ++ return rx_cons; ++} ++ ++static __u16 bnx2_get_tx_msix(bnx2_t *bp) ++{ ++ struct status_block_msix *sblk = bp->status_blk.msix; ++ __u16 tx_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ tx_cons = sblk->status_tx_quick_consumer_index; ++ barrier(); ++ if ((tx_cons & (MAX_TX_DESC_CNT)) == (MAX_TX_DESC_CNT)) ++ tx_cons++; ++ ++ return tx_cons; ++} ++ ++static __u16 bnx2_get_tx_msi(bnx2_t *bp) ++{ ++ struct status_block *sblk = bp->status_blk.msi; ++ __u16 tx_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ tx_cons = BNX2_SBLK_EVEN_IDX(sblk->tx2); ++ barrier(); ++ if ((tx_cons & (MAX_TX_DESC_CNT)) == (MAX_TX_DESC_CNT)) ++ tx_cons++; ++ ++ return tx_cons; ++} ++ ++typedef enum { ++ CNIC_VLAN_STRIPPING_ENABLED = 1, ++ CNIC_VLAN_STRIPPING_DISABLED = 2, ++} CNIC_VLAN_STRIPPING_MODE; ++ ++/** ++ * bnx2_strip_vlan_enabled() - This will query the device to determine whether ++ * VLAN tag stripping is enabled or not ++ * @param dev - device to check stripping or not ++ * @ return CNIC_VLAN_STRIPPING_ENABLED stripping is enabled ++ * CNIC_VLAN_STRIPPING_DISABLED stripping is not enabled ++ */ ++static CNIC_VLAN_STRIPPING_MODE bnx2_strip_vlan_enabled(bnx2_t *bp) ++{ ++ uint32_t val; ++ ++ val = bnx2_rd32(bp, BNX2_EMAC_RX_MODE); ++ ++ if (val & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG) ++ return CNIC_VLAN_STRIPPING_DISABLED; ++ else ++ return CNIC_VLAN_STRIPPING_ENABLED; ++} ++ ++/** ++ * bnx2_free() - Used to free a bnx2 structure ++ */ ++static void bnx2_free(nic_t *nic) ++{ ++ if (nic->priv) ++ free(nic->priv); ++ nic->priv = NULL; ++} ++ ++ ++/** ++ * bnx2_alloc() - Used to allocate a bnx2 structure ++ */ ++static bnx2_t *bnx2_alloc(nic_t *nic) ++{ ++ bnx2_t *bp = malloc(sizeof(*bp)); ++ if (bp == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate bnx2 space", nic->log_name); ++ return NULL; ++ } ++ ++ /* Clear out the bnx2 contents */ ++ memset(bp, 0, sizeof(*bp)); ++ ++ bp->bar0_fd = INVALID_FD; ++ bp->flags = BNX2_UIO_TX_HAS_SENT; ++ ++ bp->parent = nic; ++ nic->priv = (void *)bp; ++ ++ return bp; ++} ++ ++/** ++ * bnx2_open() - This will initialize all the hardware resources ++ * @param dev - The struct nic device to open ++ * @return 0 on success, on failure a errno will be returned ++ */ ++static int bnx2_open(nic_t *nic) ++{ ++ bnx2_t *bp; ++ struct stat uio_stat; ++ int i, rc; ++ __u32 val; ++ uint32_t tx_cid; ++ __u32 msix_vector = 0; ++ char sysfs_resc_path[80]; ++ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL) { ++ LOG_ERR(PFX "bnx2_open(): nic == NULL"); ++ return -EINVAL; ++ } ++ ++ if ((nic->priv) != NULL && ++ (((bnx2_t *) (nic->priv))->flags & BNX2_OPENED)) { ++ return 0; ++ } ++ ++ bp = bnx2_alloc(nic); ++ if (bp == NULL) { ++ LOG_ERR(PFX "bnx2_open(): Couldn't allocate bp priv struct", ++ nic->log_name); ++ return -ENOMEM; ++ } ++ ++ while (nic->fd < 0) { ++ nic->fd = open(nic->uio_device_name, O_RDWR | O_NONBLOCK); ++ if (nic->fd != INVALID_FD) { ++ LOG_ERR(PFX ++ "%s: uio device has been brought up via pid: " ++ "%d on fd: %d", ++ nic->uio_device_name, getpid(), nic->fd); ++ ++ rc = bnx2_uio_verify(nic); ++ if (rc != 0) ++ continue; ++ ++ break; ++ } else { ++ LOG_WARN(PFX "%s: Could not open device: %s, [%s]", ++ nic->log_name, nic->uio_device_name, ++ strerror(errno)); ++ manually_trigger_uio_event(nic, nic->uio_minor); ++ ++ /* udev might not have created the file yet */ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ sleep(1); ++ pthread_mutex_lock(&nic->nic_mutex); ++ } ++ } ++ if (fstat(nic->fd, &uio_stat) < 0) { ++ LOG_ERR(PFX "%s: Could not fstat device", nic->log_name); ++ errno = -ENODEV; ++ goto error_alloc_rx_ring; ++ } ++ nic->uio_minor = minor(uio_stat.st_rdev); ++ ++ cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80); ++ bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC); ++ if (bp->bar0_fd < 0) { ++ LOG_ERR(PFX "%s: Could not open %s", nic->log_name, ++ sysfs_resc_path); ++ errno = -ENODEV; ++ goto error_alloc_rx_ring; ++ } ++ ++ /* TODO: hardcoded with the cnic driver */ ++ bp->rx_ring_size = 3; ++ bp->rx_buffer_size = 0x400; ++ ++ LOG_DEBUG(PFX "%s: using rx ring size: %d, rx buffer size: %d", ++ nic->log_name, bp->rx_ring_size, bp->rx_buffer_size); ++ ++ /* Determine the number of UIO events that have already occured */ ++ rc = detemine_initial_uio_events(nic, &nic->intr_count); ++ if (rc != 0) { ++ LOG_ERR("Could not determine the number ofinitial UIO events"); ++ nic->intr_count = 0; ++ } ++ ++ /* Allocate space for rx ring pointer */ ++ bp->rx_ring = malloc(sizeof(struct l2_fhdr *) * bp->rx_ring_size); ++ if (bp->rx_ring == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate space for rx_ring", ++ nic->log_name); ++ errno = -ENOMEM; ++ goto error_alloc_rx_ring; ++ } ++ mlock(bp->rx_ring, sizeof(struct l2_fhdr *) * bp->rx_ring_size); ++ ++ /* Allocate space for rx pkt ring */ ++ bp->rx_pkt_ring = malloc(sizeof(void *) * bp->rx_ring_size); ++ if (bp->rx_pkt_ring == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate space for rx_pkt_ring", ++ nic->log_name); ++ errno = -ENOMEM; ++ goto error_alloc_rx_pkt_ring; ++ } ++ mlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size); ++ ++ bp->reg = mmap(NULL, 0x12800, PROT_READ | PROT_WRITE, MAP_SHARED, ++ bp->bar0_fd, (off_t) 0); ++ if (bp->reg == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Couldn't mmap registers: %s", ++ nic->log_name, strerror(errno)); ++ bp->reg = NULL; ++ goto error_regs; ++ } ++ ++ msync(bp->reg, 0x12800, MS_SYNC); ++ LOG_DEBUG(PFX "Chip ID: %x", bnx2_get_chip_id(bp)); ++ ++ /* on a 5709 when using MSI-X the status block is at an offset */ ++ if (BNX2_CHIP_NUM(bnx2_get_chip_id(bp)) == CHIP_NUM_5709) { ++ /* determine if we are using MSI-X */ ++ val = bnx2_rd32(bp, BNX2_TSCH_TSS_CFG); ++ if (val) { ++ /* We are in MSI-X mode */ ++ uint32_t base_cid = ((val >> 10) & 0x7ff) << 3; ++ msix_vector = (val >> 24) & 0xf; ++ ++ bp->status_blk_size = (128 * 9); ++ ++ tx_cid = base_cid + msix_vector - 1; ++ bp->flags |= BNX2_UIO_MSIX_ENABLED; ++ ++ bp->get_tx_cons = bnx2_get_tx_msix; ++ bp->get_rx_cons = bnx2_get_rx_msix; ++ ++ LOG_DEBUG(PFX "%s: tss_cfg: 0x%x tx cid: %d", ++ nic->log_name, val, tx_cid); ++ ++ LOG_INFO(PFX "%s: detected using MSI-X vector: %d", ++ nic->log_name, msix_vector); ++ } else { ++ /* We are not in MSI-X mode */ ++ bp->status_blk_size = 64; ++ tx_cid = 20; ++ ++ bp->get_tx_cons = bnx2_get_tx_msi; ++ bp->get_rx_cons = bnx2_get_rx_msi; ++ } ++ } else { ++ bp->status_blk_size = 64; ++ tx_cid = 20; ++ ++ bp->get_tx_cons = bnx2_get_tx_msi; ++ bp->get_rx_cons = bnx2_get_rx_msi; ++ } ++ ++ bp->sblk_map = mmap(NULL, bp->status_blk_size, ++ PROT_READ | PROT_WRITE, MAP_SHARED, ++ nic->fd, (off_t) nic->page_size); ++ if (bp->sblk_map == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Could not mmap status block: %s", ++ nic->log_name, strerror(errno)); ++ goto error_sblk; ++ } ++ ++ if (bp->flags & BNX2_UIO_MSIX_ENABLED) { ++ uint8_t *status_blk = (uint8_t *) bp->sblk_map; ++ status_blk += (msix_vector * 128); ++ ++ bp->status_blk.msix = (struct status_block_msix *)status_blk; ++ ++ LOG_DEBUG(PFX "%s: msix initial cons: tx:%d rx:%d", ++ nic->log_name, ++ bp->status_blk.msix->status_tx_quick_consumer_index, ++ bp->status_blk.msix->status_rx_quick_consumer_index); ++ } else { ++ bp->status_blk.msi = (struct status_block *)bp->sblk_map; ++ ++ LOG_DEBUG(PFX "%s: msi initial tx:%d rx:%d", ++ nic->log_name, ++ BNX2_SBLK_EVEN_IDX(bp->status_blk.msi->tx2), ++ BNX2_SBLK_EVEN_IDX(bp->status_blk.msi->rx2)); ++ } ++ ++ bp->tx_ring = mmap(NULL, 2 * nic->page_size, ++ PROT_READ | PROT_WRITE, MAP_SHARED, nic->fd, ++ (off_t) 2 * nic->page_size); ++ if (bp->tx_ring == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Could not mmap tx ring: %s", ++ nic->log_name, strerror(errno)); ++ bp->tx_ring = NULL; ++ goto error_tx_ring; ++ } ++ ++ bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size, ++ PROT_READ | PROT_WRITE, ++ MAP_SHARED, nic->fd, (off_t) 3 * nic->page_size); ++ if (bp->bufs == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Could not mmap buffers: %s", ++ nic->log_name, strerror(errno)); ++ bp->bufs = NULL; ++ goto error_bufs; ++ } ++ ++ bp->tx_bidx_io = MB_GET_CID_ADDR(tx_cid) + BNX2_L2CTX_TX_HOST_BIDX; ++ bp->tx_bseq_io = MB_GET_CID_ADDR(tx_cid) + BNX2_L2CTX_TX_HOST_BSEQ; ++ LOG_INFO(PFX "%s: tx_bidx_io: 0x%x tx_bseq_io: 0x%x", ++ nic->log_name, bp->tx_bidx_io, bp->tx_bseq_io); ++ ++ bp->rx_bidx_io = MB_GET_CID_ADDR(2) + BNX2_L2CTX_HOST_BDIDX; ++ bp->rx_bseq_io = MB_GET_CID_ADDR(2) + BNX2_L2CTX_HOST_BSEQ; ++ ++ bp->tx_cons = 0; ++ bp->tx_prod = 0; ++ bp->tx_pkt = bp->bufs; ++ ++ bp->rx_index = 0; ++ bp->rx_cons = 0; ++ bp->rx_prod = bp->rx_ring_size; ++ bp->rx_bseq = bp->rx_prod * bp->rx_buffer_size; ++ bnx2_wr16(bp, bp->rx_bidx_io, bp->rx_prod); ++ bnx2_wr32(bp, bp->rx_bseq_io, bp->rx_bseq); ++ ++ bnx2_reg_sync(bp, bp->rx_bidx_io, sizeof(__u16)); ++ bnx2_reg_sync(bp, bp->rx_bseq_io, sizeof(__u32)); ++ ++ for (i = 0; i < bp->rx_ring_size; i++) { ++ void *ptr = bp->bufs + (bp->rx_buffer_size * (i + 1)); ++ ++ bp->rx_ring[i] = (struct l2_fhdr *)ptr; ++ bp->rx_pkt_ring[i] = ptr + sizeof(struct l2_fhdr) + 2; ++ } ++ ++ /* Read the MAC address used for the iSCSI interface */ ++ val = bnx2_rd32(bp, BNX2_EMAC_MAC_MATCH4); ++ nic->mac_addr[0] = (__u8) (val >> 8); ++ nic->mac_addr[1] = (__u8) val; ++ ++ val = bnx2_rd32(bp, BNX2_EMAC_MAC_MATCH5); ++ nic->mac_addr[2] = (__u8) (val >> 24); ++ nic->mac_addr[3] = (__u8) (val >> 16); ++ nic->mac_addr[4] = (__u8) (val >> 8); ++ nic->mac_addr[5] = (__u8) val; ++ ++ LOG_INFO(PFX "%s: Using mac address: %2x:%2x:%2x:%2x:%2x:%2x", ++ nic->log_name, ++ nic->mac_addr[0], nic->mac_addr[1], nic->mac_addr[2], ++ nic->mac_addr[3], nic->mac_addr[4], nic->mac_addr[5]); ++ ++ /* Determine if Hardware VLAN tag stripping is enabled or not */ ++ if (CNIC_VLAN_STRIPPING_ENABLED == bnx2_strip_vlan_enabled(bp)) ++ nic->flags |= NIC_VLAN_STRIP_ENABLED; ++ ++ /* Prepare the multicast addresses */ ++ val = 4 | BNX2_RPM_SORT_USER2_BC_EN | BNX2_RPM_SORT_USER2_MC_EN; ++ if (BNX2_CHIP_NUM(bnx2_get_chip_id(bp)) != CHIP_NUM_5709) ++ val |= BNX2_RPM_SORT_USER2_PROM_VLAN; ++ ++ bnx2_wr32(bp, BNX2_RPM_SORT_USER2, 0x0); ++ bnx2_wr32(bp, BNX2_RPM_SORT_USER2, val); ++ bnx2_wr32(bp, BNX2_RPM_SORT_USER2, val | BNX2_RPM_SORT_USER2_ENA); ++ ++ rc = enable_multicast(nic); ++ if (rc != 0) { ++ errno = rc; ++ goto error_bufs; ++ } ++ msync(bp->reg, 0x12800, MS_SYNC); ++ LOG_INFO("%s: bnx2 uio initialized", nic->log_name); ++ ++ bp->flags |= BNX2_OPENED; ++ ++ return 0; ++ ++error_bufs: ++ munmap(bp->tx_ring, 2 * nic->page_size); ++ ++error_tx_ring: ++ munmap(bp->status_blk.msi, bp->status_blk_size); ++ ++error_sblk: ++ munmap(bp->reg, 0x12800); ++ ++error_regs: ++ munlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size); ++ free(bp->rx_pkt_ring); ++ bp->rx_pkt_ring = NULL; ++ ++error_alloc_rx_pkt_ring: ++ munlock(bp->rx_ring, sizeof(struct l2_fhdr *) * bp->rx_ring_size); ++ free(bp->rx_ring); ++ bp->rx_ring = NULL; ++ ++error_alloc_rx_ring: ++ if (nic->fd != INVALID_FD) { ++ close(nic->fd); ++ nic->fd = INVALID_FD; ++ } ++ bnx2_free(nic); ++ ++ return errno; ++} ++ ++/** ++ * bnx2_uio_close_resources() - Used to free resource for the bnx2 NIC ++ * @param nic - NIC device to free resource ++ * @param graceful - whether to wait to close gracefully ++ * @return 0 on success, <0 on failure ++ */ ++static int bnx2_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful) ++{ ++ bnx2_t *bp = (bnx2_t *) nic->priv; ++ int rc = 0; ++ ++ /* Remove the multicast addresses if added */ ++ if ((nic->flags & NIC_ADDED_MULICAST) && ++ (graceful == ALLOW_GRACEFUL_SHUTDOWN)) ++ disable_multicast(nic); ++ ++ /* Check if there is an assoicated bnx2 device */ ++ if (bp == NULL) { ++ LOG_WARN(PFX "%s: when closing resources there is " ++ "no assoicated bnx2", nic->log_name); ++ return -EIO; ++ } ++ ++ /* Clean up allocated memory */ ++ if (bp->rx_ring != NULL) { ++ free(bp->rx_ring); ++ bp->rx_ring = NULL; ++ } ++ ++ if (bp->rx_pkt_ring != NULL) { ++ free(bp->rx_pkt_ring); ++ bp->rx_pkt_ring = NULL; ++ } ++ ++ /* Clean up mapped registers */ ++ if (bp->bufs != NULL) { ++ rc = munmap(bp->bufs, ++ (bp->rx_ring_size + 1) * bp->rx_buffer_size); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap bufs", nic->log_name); ++ bp->bufs = NULL; ++ } ++ ++ if (bp->tx_ring != NULL) { ++ rc = munmap(bp->tx_ring, 2 * nic->page_size); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap tx_rings", ++ nic->log_name); ++ bp->tx_ring = NULL; ++ } ++ ++ if (bp->status_blk.msix != NULL || bp->status_blk.msi != NULL) { ++ rc = munmap(bp->sblk_map, bp->status_blk_size); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap status block", ++ nic->log_name); ++ bp->sblk_map = NULL; ++ ++ bp->status_blk.msix = NULL; ++ bp->status_blk.msi = NULL; ++ } ++ ++ if (bp->reg != NULL) { ++ rc = munmap(bp->reg, 0x12800); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name); ++ bp->reg = NULL; ++ } ++ ++ if (bp->bar0_fd != INVALID_FD) { ++ close(bp->bar0_fd); ++ bp->bar0_fd = INVALID_FD; ++ } ++ ++ if (nic->fd != INVALID_FD) { ++ rc = close(nic->fd); ++ if (rc != 0) { ++ LOG_WARN(PFX ++ "%s: Couldn't close uio file descriptor: %d", ++ nic->log_name, nic->fd); ++ } else { ++ LOG_DEBUG(PFX "%s: Closed uio file descriptor: %d", ++ nic->log_name, nic->fd); ++ } ++ ++ nic->fd = INVALID_FD; ++ } else { ++ LOG_WARN(PFX "%s: Invalid uio file descriptor: %d", ++ nic->log_name, nic->fd); ++ } ++ ++ LOG_INFO(PFX "%s: Closed all resources", nic->log_name); ++ ++ return 0; ++} ++ ++/** ++ * bnx2_close() - Used to close the NIC device ++ * @param nic - NIC device to close ++ * @param graceful - whether to wait to close gracefully ++ * @return 0 if successful, <0 if there is an error ++ */ ++static int bnx2_close(nic_t *nic, NIC_SHUTDOWN_T graceful) ++{ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL) { ++ LOG_ERR(PFX "bnx2_close(): nic == NULL"); ++ return -EINVAL; ++ } ++ ++ LOG_INFO(PFX "Closing NIC device: %s", nic->log_name); ++ ++ bnx2_uio_close_resources(nic, graceful); ++ bnx2_free(nic); ++ ++ return 0; ++} ++ ++static void bnx2_prepare_xmit_packet(nic_t *nic, ++ nic_interface_t *nic_iface, ++ struct packet *pkt) ++{ ++ bnx2_t *bp = (bnx2_t *) nic->priv; ++ struct uip_vlan_eth_hdr *eth_vlan = (struct uip_vlan_eth_hdr *)pkt->buf; ++ struct uip_eth_hdr *eth = (struct uip_eth_hdr *)bp->tx_pkt; ++ ++ if (eth_vlan->tpid == htons(UIP_ETHTYPE_8021Q)) { ++ memcpy(bp->tx_pkt, pkt->buf, sizeof(struct uip_eth_hdr)); ++ eth->type = eth_vlan->type; ++ pkt->buf_size -= (sizeof(struct uip_vlan_eth_hdr) - ++ sizeof(struct uip_eth_hdr)); ++ memcpy(bp->tx_pkt + sizeof(struct uip_eth_hdr), ++ pkt->buf + sizeof(struct uip_vlan_eth_hdr), ++ pkt->buf_size - sizeof(struct uip_eth_hdr)); ++ } else ++ memcpy(bp->tx_pkt, pkt->buf, pkt->buf_size); ++ ++ msync(bp->tx_pkt, pkt->buf_size, MS_SYNC); ++} ++ ++/** ++ * bnx2_get_tx_pkt() - This function is used to a TX packet from the NIC ++ * @param nic - The NIC device to send the packet ++ * ++ */ ++void *bnx2_get_tx_pkt(nic_t *nic) ++{ ++ bnx2_t *bp = (bnx2_t *) nic->priv; ++ return bp->tx_pkt; ++} ++ ++/** ++ * bnx2_start_xmit() - This function is used to send a packet of data ++ * @param nic - The NIC device to send the packet ++ * @param len - the length of the TX packet ++ * ++ */ ++void bnx2_start_xmit(nic_t *nic, size_t len, u16_t vlan_id) ++{ ++ bnx2_t *bp = (bnx2_t *) nic->priv; ++ uint16_t ring_prod; ++ struct tx_bd *txbd; ++ struct rx_bd *rxbd; ++ rxbd = (struct rx_bd *)(((__u8 *) bp->tx_ring) + nic->page_size); ++ ++ if ((rxbd->rx_bd_haddr_hi == 0) && (rxbd->rx_bd_haddr_lo == 0)) { ++ LOG_PACKET(PFX "%s: trying to transmit when device is closed", ++ nic->log_name); ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ return; ++ } ++ ++ ring_prod = TX_RING_IDX(bp->tx_prod); ++ txbd = &bp->tx_ring[ring_prod]; ++ ++ txbd->tx_bd_mss_nbytes = len; ++ ++ if (vlan_id) { ++ txbd->tx_bd_vlan_tag_flags = (vlan_id << 16) | ++ TX_BD_FLAGS_VLAN_TAG | TX_BD_FLAGS_END | TX_BD_FLAGS_START; ++ } else ++ txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_END | ++ TX_BD_FLAGS_START; ++ ++ bp->tx_bseq += len; ++ bp->tx_prod = NEXT_TX_BD(bp->tx_prod); ++ ++ bnx2_wr16(bp, bp->tx_bidx_io, bp->tx_prod); ++ bnx2_wr32(bp, bp->tx_bseq_io, bp->tx_bseq); ++ ++ bnx2_reg_sync(bp, bp->tx_bidx_io, sizeof(__u16)); ++ bnx2_reg_sync(bp, bp->tx_bseq_io, sizeof(__u32)); ++ ++ LOG_PACKET(PFX "%s: sent %d bytes using dev->tx_prod: %d", ++ nic->log_name, len, bp->tx_prod); ++} ++ ++/** ++ * bnx2_write() - Used to write the data to the hardware ++ * @param nic - NIC hardware to read from ++ * @param pkt - The packet which will hold the data to be sent on the wire ++ * @return 0 if successful, <0 if failed ++ */ ++int bnx2_write(nic_t *nic, nic_interface_t *nic_iface, packet_t *pkt) ++{ ++ bnx2_t *bp; ++ struct uip_stack *uip; ++ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL || nic_iface == NULL || pkt == NULL) { ++ LOG_ERR(PFX "%s: bnx2_write() nic == 0x%p || " ++ " nic_iface == 0x%p || " ++ " pkt == 0x%x", nic, nic_iface, pkt); ++ return -EINVAL; ++ } ++ bp = (bnx2_t *)nic->priv; ++ uip = &nic_iface->ustack; ++ ++ if (pkt->buf_size == 0) { ++ LOG_ERR(PFX "%s: Trying to transmitted 0 sized packet", ++ nic->log_name); ++ return -EINVAL; ++ } ++ ++ if (pthread_mutex_trylock(&nic->xmit_mutex) != 0) { ++ LOG_PACKET(PFX "%s: Dropped previous transmitted packet", ++ nic->log_name); ++ return -EINVAL; ++ } ++ ++ bnx2_prepare_xmit_packet(nic, nic_iface, pkt); ++ bnx2_start_xmit(nic, pkt->buf_size, ++ (nic_iface->vlan_priority << 12) | ++ nic_iface->vlan_id); ++ ++ /* bump the bnx2 dev send statistics */ ++ nic->stats.tx.packets++; ++ nic->stats.tx.bytes += uip->uip_len; ++ ++ LOG_PACKET(PFX "%s: transmitted %d bytes " ++ "dev->tx_cons: %d, dev->tx_prod: %d, dev->tx_bseq:%d", ++ nic->log_name, pkt->buf_size, ++ bp->tx_cons, bp->tx_prod, bp->tx_bseq); ++ ++ return 0; ++} ++ ++/** ++ * bnx2_read() - Used to read the data from the hardware ++ * @param nic - NIC hardware to read from ++ * @param pkt - The packet which will hold the data ++ * @return 0 if successful, <0 if failed ++ */ ++static int bnx2_read(nic_t *nic, packet_t *pkt) ++{ ++ bnx2_t *bp; ++ int rc = 0; ++ uint16_t hw_cons, sw_cons; ++ ++ /* Sanity Check: validate the parameters */ ++ if (unlikely(nic == NULL || pkt == NULL)) { ++ LOG_ERR(PFX "%s: bnx2_write() nic == 0x%p || " ++ " pkt == 0x%x", nic, pkt); ++ return -EINVAL; ++ } ++ bp = (bnx2_t *)nic->priv; ++ ++ hw_cons = bp->get_rx_cons(bp); ++ sw_cons = bp->rx_cons; ++ ++ if (sw_cons != hw_cons) { ++ uint8_t rx_index = bp->rx_index % 3; ++ struct l2_fhdr *rx_hdr = bp->rx_ring[rx_index]; ++ void *rx_pkt = bp->rx_pkt_ring[rx_index]; ++ int len; ++ uint16_t errors; ++ ++ LOG_PACKET(PFX "%s: clearing rx interrupt: %d %d %d", ++ nic->log_name, sw_cons, hw_cons, rx_index); ++ ++ msync(rx_hdr, sizeof(struct l2_fhdr), MS_SYNC); ++ errors = ((rx_hdr->l2_fhdr_status & 0xffff0000) >> 16); ++ len = ((rx_hdr->l2_fhdr_vtag_len & 0xffff0000) >> 16) - 4; ++ ++ if (unlikely((errors & (L2_FHDR_ERRORS_BAD_CRC | ++ L2_FHDR_ERRORS_PHY_DECODE | ++ L2_FHDR_ERRORS_ALIGNMENT | ++ L2_FHDR_ERRORS_TOO_SHORT | ++ L2_FHDR_ERRORS_GIANT_FRAME)) || ++ (len <= 0) || ++ (len > (bp->rx_buffer_size - ++ (sizeof(struct l2_fhdr) + 2))) || ++ (len > pkt->max_buf_size))) { ++ /* One of the fields in the BD is bad */ ++ uint16_t status = ((rx_hdr->l2_fhdr_status & ++ 0x0000ffff)); ++ ++ LOG_ERR(PFX "%s: Recv error: 0x%x status: 0x%x " ++ "len: %d", nic->log_name, errors, status, len); ++ ++ if ((len < (bp->rx_buffer_size - ++ (sizeof(struct l2_fhdr) + 2))) && ++ (len < pkt->max_buf_size)) ++ dump_packet_to_log(pkt->nic_iface, rx_pkt, len); ++ } else { ++ if (len < (bp->rx_buffer_size - ++ (sizeof(struct l2_fhdr) + 2))) { ++ msync(rx_pkt, len, MS_SYNC); ++ /* Copy the data */ ++ memcpy(pkt->buf, rx_pkt, len); ++ pkt->buf_size = len; ++ ++ /* Properly set the packet flags */ ++ /* check if there is VLAN tagging on the ++ * packet */ ++ if (rx_hdr->l2_fhdr_status & ++ L2_FHDR_STATUS_VLAN_TAG) { ++ pkt->vlan_tag = ++ rx_hdr->l2_fhdr_vtag_len & 0x0FFF; ++ pkt->flags |= VLAN_TAGGED; ++ } else { ++ pkt->vlan_tag = 0; ++ } ++ ++ rc = 1; ++ ++ LOG_PACKET(PFX "%s: processing packet " ++ "length: %d", nic->log_name, len); ++ } else { ++ /* If the NIC passes up a packet bigger ++ * then the RX buffer, flag it */ ++ LOG_ERR(PFX "%s: invalid packet length %d " ++ "recieve ", nic->log_name, len); ++ } ++ } ++ ++ bp->rx_index++; ++ sw_cons = NEXT_RX_BD(sw_cons); ++ bp->rx_prod = NEXT_RX_BD(bp->rx_prod); ++ bp->rx_bseq += 0x400; ++ ++ bp->rx_cons = sw_cons; ++ bnx2_wr16(bp, bp->rx_bidx_io, bp->rx_prod); ++ bnx2_wr32(bp, bp->rx_bseq_io, bp->rx_bseq); ++ ++ bnx2_reg_sync(bp, bp->rx_bidx_io, sizeof(__u16)); ++ bnx2_reg_sync(bp, bp->rx_bseq_io, sizeof(__u32)); ++ ++ /* bump the bnx2 dev recv statistics */ ++ nic->stats.rx.packets++; ++ nic->stats.rx.bytes += pkt->buf_size; ++ } ++ ++ return rc; ++} ++ ++/******************************************************************************* ++ * Clearing TX interrupts ++ ******************************************************************************/ ++/** ++ * bnx2_clear_tx_intr() - This routine is called when a TX interrupt occurs ++ * @param nic - the nic the interrupt occured on ++ * @return 0 on success ++ */ ++static int bnx2_clear_tx_intr(nic_t *nic) ++{ ++ bnx2_t *bp; ++ uint16_t hw_cons; ++ ++ /* Sanity check: ensure the parameters passed in are valid */ ++ if (unlikely(nic == NULL)) { ++ LOG_ERR(PFX "bnx2_read() nic == NULL"); ++ return -EINVAL; ++ } ++ bp = (bnx2_t *) nic->priv; ++ hw_cons = bp->get_tx_cons(bp); ++ ++ if (bp->flags & BNX2_UIO_TX_HAS_SENT) ++ bp->flags &= ~BNX2_UIO_TX_HAS_SENT; ++ ++ LOG_PACKET(PFX "%s: clearing tx interrupt [%d %d]", ++ nic->log_name, bp->tx_cons, hw_cons); ++ ++ bp->tx_cons = hw_cons; ++ ++ /* There is a queued TX packet that needs to be sent out. The usual ++ * case is when stack will send an ARP packet out before sending the ++ * intended packet */ ++ if (nic->tx_packet_queue != NULL) { ++ packet_t *pkt; ++ ++ LOG_PACKET(PFX "%s: sending queued tx packet", nic->log_name); ++ pkt = nic_dequeue_tx_packet(nic); ++ ++ /* Got a TX packet buffer of the TX queue and put it onto ++ * the hardware */ ++ if (pkt != NULL) { ++ bnx2_prepare_xmit_packet(nic, pkt->nic_iface, pkt); ++ ++ bnx2_start_xmit(nic, pkt->buf_size, ++ (pkt->nic_iface->vlan_priority << 12) | ++ pkt->nic_iface->vlan_id); ++ ++ LOG_PACKET(PFX "%s: transmitted queued packet %d bytes " ++ "dev->tx_cons: %d, dev->tx_prod: %d, " ++ "dev->tx_bseq:%d", ++ nic->log_name, pkt->buf_size, ++ bp->tx_cons, bp->tx_prod, bp->tx_bseq); ++ ++ return -EAGAIN; ++ } ++ } ++ ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ ++ return 0; ++} ++ ++/******************************************************************************* ++ * bnx2 NIC op's table ++ ******************************************************************************/ ++struct nic_ops bnx2_op = { ++ .description = "bnx2", ++ .open = bnx2_open, ++ .close = bnx2_close, ++ .write = bnx2_write, ++ .get_tx_pkt = bnx2_get_tx_pkt, ++ .start_xmit = bnx2_start_xmit, ++ .read = bnx2_read, ++ .clear_tx_intr = bnx2_clear_tx_intr, ++ .handle_iscsi_path_req = cnic_handle_iscsi_path_req, ++ ++ .lib_ops = { ++ .get_library_name = bnx2_get_library_name, ++ .get_pci_table = bnx2_get_pci_table, ++ .get_library_version = bnx2_get_library_version, ++ .get_build_date = bnx2_get_build_date, ++ .get_transport_name = bnx2_get_transport_name, ++ .get_uio_name = bnx2_get_uio_name, ++ }, ++}; +diff --git a/iscsiuio/src/unix/libs/bnx2.h b/iscsiuio/src/unix/libs/bnx2.h +new file mode 100644 +index 0000000..3ec9437 +--- /dev/null ++++ b/iscsiuio/src/unix/libs/bnx2.h +@@ -0,0 +1,304 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * bnx2.h - bnx2 user space driver ++ * ++ */ ++#ifndef __BNX2_H__ ++#define __BNX2_H__ ++ ++#include "nic.h" ++ ++/****************************************************************************** ++ * Default BNX2 values ++ ******************************************************************************/ ++#define DEFAULT_NUM_RXBD 3 ++#define DEFAULT_RX_LEN 0x400 ++ ++/****************************************************************************** ++ * BNX2 Hardware structures ++ ******************************************************************************/ ++/* status_block definition for MSI */ ++struct status_block { ++ volatile __u32 status_attn_bits; ++ volatile __u32 status_attn_bits_ack; ++ volatile __u32 tx0; ++ volatile __u32 tx2; ++ volatile __u32 rx0; ++ volatile __u32 rx2; ++ volatile __u32 rx4; ++ volatile __u32 rx6; ++ volatile __u32 rx8; ++ volatile __u32 rx10; ++ volatile __u32 rx12; ++ volatile __u32 rx14; ++ volatile __u32 cmd; ++ volatile __u32 idx; ++}; ++ ++/* status_block definition for MSI-X */ ++struct status_block_msix { ++#if 0 ++#if defined(__BIG_ENDIAN) ++ __u16 status_tx_quick_consumer_index; ++ __u16 status_rx_quick_consumer_index; ++ __u16 status_completion_producer_index; ++ __u16 status_cmd_consumer_index; ++ __u32 status_unused; ++ __u16 status_idx; ++ __u8 status_unused2; ++ __u8 status_blk_num; ++#elif defined(__LITTLE_ENDIAN) ++ __u16 status_rx_quick_consumer_index; ++ __u16 status_tx_quick_consumer_index; ++ __u16 status_cmd_consumer_index; ++ __u16 status_completion_producer_index; ++ __u32 status_unused; ++ __u8 status_blk_num; ++ __u8 status_unused2; ++ __u16 status_idx; ++#endif ++#endif ++ __u16 status_rx_quick_consumer_index; ++ __u16 status_tx_quick_consumer_index; ++ __u16 status_cmd_consumer_index; ++ __u16 status_completion_producer_index; ++ __u32 status_unused; ++ __u8 status_blk_num; ++ __u8 status_unused2; ++ __u16 status_idx; ++}; ++ ++/* TX Buffer descriptor */ ++struct tx_bd { ++ __u32 tx_bd_haddr_hi; ++ __u32 tx_bd_haddr_lo; ++ __u32 tx_bd_mss_nbytes; ++ __u32 tx_bd_vlan_tag_flags; ++#define TX_BD_FLAGS_VLAN_TAG (1<<3) ++#define TX_BD_FLAGS_END (1<<6) ++#define TX_BD_FLAGS_START (1<<7) ++}; ++ ++/* RX Buffer descriptor */ ++struct rx_bd { ++ __u32 rx_bd_haddr_hi; ++ __u32 rx_bd_haddr_lo; ++ ++ __u32 rx_bd_len; ++ __u32 rx_bd_flags; ++#define RX_BD_FLAGS_END (1<<2) ++#define RX_BD_FLAGS_START (1<<3) ++ ++}; ++ ++/* This is the RX L2 Frame header */ ++struct l2_fhdr { ++ __u32 l2_fhdr_status; ++#define L2_FHDR_ERRORS_BAD_CRC (1<<17) ++#define L2_FHDR_ERRORS_PHY_DECODE (1<<18) ++#define L2_FHDR_ERRORS_ALIGNMENT (1<<19) ++#define L2_FHDR_ERRORS_TOO_SHORT (1<<20) ++#define L2_FHDR_ERRORS_GIANT_FRAME (1<<21) ++#define L2_FHDR_ERRORS_TCP_XSUM (1<<28) ++#define L2_FHDR_ERRORS_UDP_XSUM (1<<31) ++ ++#define L2_FHDR_STATUS_UDP_DATAGRAM (1<<15) ++#define L2_FHDR_STATUS_TCP_DATAGRAM (1<<14) ++#define L2_FHDR_STATUS_IP_DATAGRAM (1<<13) ++#define L2_FHDR_STATUS_LLC_SNAP (1<<7) ++#define L2_FHDR_STATUS_VLAN_TAG (1<<6) ++ ++ __u32 l2_fhdr_hash; ++ ++ __u32 l2_fhdr_vtag_len; ++ __u32 l2_fhdr_xsum; ++}; ++ ++/****************************************************************************** ++ * BNX2 Registers Defitions/Values ++ ******************************************************************************/ ++#define BNX2_MISC_ID 0x00000808 ++#define BNX2_EMAC_MAC_MATCH4 0x00001420 ++#define BNX2_EMAC_MAC_MATCH5 0x00001424 ++ ++#define BNX2_EMAC_RX_MODE 0x000014c8 ++#define BNX2_EMAC_RX_MODE_RESET (1L<<0) ++#define BNX2_EMAC_RX_MODE_FLOW_EN (1L<<2) ++#define BNX2_EMAC_RX_MODE_KEEP_MAC_CONTROL (1L<<3) ++#define BNX2_EMAC_RX_MODE_KEEP_PAUSE (1L<<4) ++#define BNX2_EMAC_RX_MODE_ACCEPT_OVERSIZE (1L<<5) ++#define BNX2_EMAC_RX_MODE_ACCEPT_RUNTS (1L<<6) ++#define BNX2_EMAC_RX_MODE_LLC_CHK (1L<<7) ++#define BNX2_EMAC_RX_MODE_PROMISCUOUS (1L<<8) ++#define BNX2_EMAC_RX_MODE_NO_CRC_CHK (1L<<9) ++#define BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG (1L<<10) ++#define BNX2_EMAC_RX_MODE_FILT_BROADCAST (1L<<11) ++#define BNX2_EMAC_RX_MODE_SORT_MODE (1L<<12) ++ ++#define BNX2_RPM_SORT_USER2 0x00001828 ++#define BNX2_RPM_SORT_USER2_PM_EN (0xffffL<<0) ++#define BNX2_RPM_SORT_USER2_BC_EN (1L<<16) ++#define BNX2_RPM_SORT_USER2_MC_EN (1L<<17) ++#define BNX2_RPM_SORT_USER2_MC_HSH_EN (1L<<18) ++#define BNX2_RPM_SORT_USER2_PROM_EN (1L<<19) ++#define BNX2_RPM_SORT_USER2_VLAN_EN (0xfL<<20) ++#define BNX2_RPM_SORT_USER2_PROM_VLAN (1L<<24) ++#define BNX2_RPM_SORT_USER2_ENA (1L<<31) ++ ++/* ++ * tsch_reg definition ++ * offset: 0x4c00 ++ */ ++#define BNX2_TSCH_TSS_CFG 0x00004c1c ++#define BNX2_TSCH_TSS_CFG_TSS_START_CID (0x7ffL<<8) ++#define BNX2_TSCH_TSS_CFG_NUM_OF_TSS_CON (0xfL<<24) ++#define CNIC_UIO_INVALID_FD -1 ++ ++#define BNX2_L2CTX_TX_HOST_BIDX 0x00000088 ++#define BNX2_L2CTX_TX_HOST_BSEQ 0x00000090 ++ ++#define BNX2_L2CTX_HOST_BDIDX 0x00000004 ++#define BNX2_L2CTX_HOST_BSEQ 0x00000008 ++ ++/* Used to determin the CHIP ID */ ++/* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ ++#define BNX2_CHIP_NUM(bp) ((bp) & 0xffff0000) ++#define CHIP_NUM_5706 0x57060000 ++#define CHIP_NUM_5708 0x57080000 ++#define CHIP_NUM_5709 0x57090000 ++ ++#define CHIP_REV(bp) ((bp) & 0x0000f000) ++#define CHIP_REV_Ax 0x00000000 ++#define CHIP_REV_Bx 0x00001000 ++#define CHIP_REV_Cx 0x00002000 ++ ++#define CHIP_METAL(bp) ((bp) & 0x00000ff0) ++#define CHIP_BONDING(bp) ((bp) & 0x0000000f) ++ ++#define CHIP_ID(bp) ((bp) & 0xfffffff0) ++#define CHIP_ID_5706_A0 0x57060000 ++#define CHIP_ID_5706_A1 0x57060010 ++#define CHIP_ID_5706_A2 0x57060020 ++#define CHIP_ID_5708_A0 0x57080000 ++#define CHIP_ID_5708_B0 0x57081000 ++#define CHIP_ID_5708_B1 0x57081010 ++#define CHIP_ID_5709_A0 0x57090000 ++#define CHIP_ID_5709_A1 0x57090010 ++ ++#define CHIP_BOND_ID(bp) ((bp) & 0xf) ++ ++#define BNX2_SBLK_EVEN_IDX(x) (((x) & 0xffff0000) >> 16) ++ ++#define TX_DESC_CNT (4096 / sizeof(struct tx_bd)) ++#define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) ++ ++#define NEXT_TX_BD(x) ((((x) & (MAX_TX_DESC_CNT - 1)) == \ ++ (MAX_TX_DESC_CNT - 1)) ? \ ++ (x) + 2 : (x) + 1) ++ ++#define TX_RING_IDX(x) ((x) & MAX_TX_DESC_CNT) ++ ++#define RX_DESC_CNT (4096 / sizeof(struct rx_bd)) ++#define MAX_RX_DESC_CNT (RX_DESC_CNT - 1) ++ ++#define NEXT_RX_BD(x) ((((x) & (MAX_RX_DESC_CNT - 1)) == \ ++ (MAX_RX_DESC_CNT - 1)) ? \ ++ (x) + 2 : (x) + 1) ++ ++#define MB_KERNEL_CTX_SHIFT 8 ++#define MB_KERNEL_CTX_SIZE (1 << MB_KERNEL_CTX_SHIFT) ++#define MB_KERNEL_CTX_MASK (MB_KERNEL_CTX_SIZE - 1) ++#define MB_GET_CID_ADDR(_cid) (0x10000 + ((_cid) << MB_KERNEL_CTX_SHIFT)) ++ ++typedef struct bnx2 { ++ nic_t *parent; ++ ++ uint16_t flags; ++#define BNX2_UIO_MSIX_ENABLED 0x0001 ++#define BNX2_UIO_TX_HAS_SENT 0x0002 ++#define BNX2_OPENED 0x0004 ++ ++ int bar0_fd; ++ void *reg; /* Pointer to the mapped registers */ ++ ++ __u32 tx_bidx_io; ++ __u32 tx_bseq_io; ++ ++ __u16 tx_prod; ++ __u16 tx_cons; ++ __u32 tx_bseq; ++ ++ __u32 rx_bidx_io; ++ __u32 rx_bseq_io; ++ ++ __u16 rx_prod; ++ __u16 rx_cons; ++ __u32 rx_bseq; ++ ++ /* RX ring parameters */ ++ uint32_t rx_ring_size; ++ uint32_t rx_buffer_size; ++ ++ void *bufs; /* Pointer to the mapped buffer space */ ++ ++ /* Hardware Status Block locations */ ++ void *sblk_map; ++ union { ++ struct status_block *msi; ++ struct status_block_msix *msix; ++ } status_blk; ++ size_t status_blk_size; ++ ++ __u16(*get_rx_cons) (struct bnx2 *); ++ __u16(*get_tx_cons) (struct bnx2 *); ++ ++ uint16_t rx_index; ++ struct l2_fhdr **rx_ring; ++ void **rx_pkt_ring; ++ ++ struct tx_bd *tx_ring; ++ void *tx_pkt; ++ ++ struct l2_fhdr rcv_l2_fhdr; ++ __u8 rcv_buf[1500 + 2]; ++ __u32 rcv_size; ++} bnx2_t; ++ ++/****************************************************************************** ++ * bnx2 Function Declarations ++ ******************************************************************************/ ++struct nic_ops *bnx2_get_ops(); ++#endif /* __BNX2_H__ */ +diff --git a/iscsiuio/src/unix/libs/bnx2x.c b/iscsiuio/src/unix/libs/bnx2x.c +new file mode 100644 +index 0000000..1495762 +--- /dev/null ++++ b/iscsiuio/src/unix/libs/bnx2x.c +@@ -0,0 +1,1634 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * bnx2x.c - bnx2x user space driver ++ * ++ */ ++#include ++#include ++#include ++#include ++#include /* Needed for linux/ethtool.h on RHEL 5.x */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "config.h" ++ ++#include "build_date.h" ++#include "bnx2x.h" ++#include "cnic.h" ++#include "logger.h" ++#include "nic.h" ++#include "nic_id.h" ++#include "nic_utils.h" ++#include "options.h" ++ ++#define PFX "bnx2x " ++ ++/* Foward struct declarations */ ++struct nic_ops bnx2x_op; ++ ++/******************************************************************************* ++ * NIC Library Strings ++ ******************************************************************************/ ++static const char library_name[] = "bnx2x"; ++static const char library_version[] = PACKAGE_VERSION; ++static const char library_uio_name[] = "bnx2x_cnic"; ++ ++/* The name that should be returned from /sys/class/uio/uio0/name */ ++static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; ++static const char bnx2x_uio_sysfs_name[] = "bnx2x_cnic"; ++ ++/******************************************************************************* ++ * String constants used to display human readable adapter name ++ ******************************************************************************/ ++static const char brcm_57710[] = "QLogic NetXtreme II BCM57710 10-Gigabit"; ++static const char brcm_57711[] = "QLogic NetXtreme II BCM57711 10-Gigabit"; ++static const char brcm_57711e[] = "QLogic NetXtreme II BCM57711E 10-Gigabit"; ++static const char brcm_57712[] = "QLogic NetXtreme II BCM57712 10-Gigabit"; ++static const char brcm_57712_MF[] = "QLogic NetXtreme II BCM57712 MF " ++ "10-Gigabit"; ++static const char brcm_57712_VF[] = "QLogic NetXtreme II BCM57712 VF " ++ "10-Gigabit"; ++static const char brcm_57713[] = "QLogic NetXtreme II BCM57713 10-Gigabit"; ++static const char brcm_57713e[] = "QLogic NetXtreme II BCM57713E 10-Gigabit"; ++static const char brcm_57800[] = "QLogic NetXtreme II BCM57800 10-Gigabit"; ++static const char brcm_57800_MF[] = "QLogic NetXtreme II BCM57800 MF " ++ "10-Gigabit"; ++static const char brcm_57800_VF[] = "QLogic NetXtreme II BCM57800 VF " ++ "10-Gigabit"; ++static const char brcm_57810[] = "QLogic NetXtreme II BCM57810 10-Gigabit"; ++static const char brcm_57810_MF[] = "QLogic NetXtreme II BCM57810 MF " ++ "10-Gigabit"; ++static const char brcm_57810_VF[] = "QLogic NetXtreme II BCM57810 VF " ++ "10-Gigabit"; ++static const char brcm_57811[] = "QLogic NetXtreme II BCM57811 10-Gigabit"; ++static const char brcm_57811_MF[] = "QLogic NetXtreme II BCM57811 MF " ++ "10-Gigabit"; ++static const char brcm_57811_VF[] = "QLogic NetXtreme II BCM57811 VF " ++ "10-Gigabit"; ++static const char brcm_57840[] = "QLogic NetXtreme II BCM57840 10-Gigabit"; ++static const char brcm_57840_MF[] = "QLogic NetXtreme II BCM57840 MF " ++ "10-Gigabit"; ++static const char brcm_57840_VF[] = "QLogic NetXtreme II BCM57840 VF " ++ "10-Gigabit"; ++static const char brcm_57840_4_10[] = "QLogic NetXtreme II BCM57840 4x" ++ "10-Gigabit"; ++static const char brcm_57840_2_20[] = "QLogic NetXtreme II BCM57840 2x" ++ "20-Gigabit"; ++ ++/******************************************************************************* ++ * PCI ID constants ++ ******************************************************************************/ ++#define PCI_VENDOR_ID_BROADCOM 0x14e4 ++#define PCI_DEVICE_ID_NX2_57710 0x164e ++#define PCI_DEVICE_ID_NX2_57711 0x164f ++#define PCI_DEVICE_ID_NX2_57711E 0x1650 ++#define PCI_DEVICE_ID_NX2_57712 0x1662 ++#define PCI_DEVICE_ID_NX2_57712_MF 0x1663 ++#define PCI_DEVICE_ID_NX2_57712_VF 0x166f ++#define PCI_DEVICE_ID_NX2_57713 0x1651 ++#define PCI_DEVICE_ID_NX2_57713E 0x1652 ++#define PCI_DEVICE_ID_NX2_57800 0x168a ++#define PCI_DEVICE_ID_NX2_57800_MF 0x16a5 ++#define PCI_DEVICE_ID_NX2_57800_VF 0x16a9 ++#define PCI_DEVICE_ID_NX2_57810 0x168e ++#define PCI_DEVICE_ID_NX2_57810_MF 0x16ae ++#define PCI_DEVICE_ID_NX2_57810_VF 0x16af ++#define PCI_DEVICE_ID_NX2_57811 0x163d ++#define PCI_DEVICE_ID_NX2_57811_MF 0x163e ++#define PCI_DEVICE_ID_NX2_57811_VF 0x163f ++#define PCI_DEVICE_ID_NX2_57840_OBSOLETE 0x168d ++#define PCI_DEVICE_ID_NX2_57840_MF_OBSOLETE 0x16ab ++#define PCI_DEVICE_ID_NX2_57840_4_10 0x16a1 ++#define PCI_DEVICE_ID_NX2_57840_2_20 0x16a2 ++#define PCI_DEVICE_ID_NX2_57840_MF 0x16a4 ++#define PCI_DEVICE_ID_NX2_57840_VF 0x16ad ++#define PCI_ANY_ID (~0) ++ ++/* This is the table used to match PCI vendor and device ID's to the ++ * human readable string names of the devices */ ++static const struct pci_device_id bnx2x_pci_tbl[] = { ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57710, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57710}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57711, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57711}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57711E, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57711e}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57712}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712_MF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57712_MF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712_VF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57712_VF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57713, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57713}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57713E, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57713e}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57800}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800_MF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57800_MF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800_VF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57800_VF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57810}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810_MF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57810_MF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810_VF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57810_VF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57811}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811_MF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57811_MF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811_VF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57811_VF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_OBSOLETE, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57840}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_MF_OBSOLETE, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_4_10, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_4_10}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_2_20, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_2_20}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_MF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF}, ++ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_VF, ++ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_VF}, ++}; ++ ++static struct iro e1_iro[2] = { ++ {0x45a0, 0x90, 0x8, 0x0, 0x8}, /* T6.0 */ ++ {0x50c8, 0x90, 0x8, 0x0, 0x8}, /* T6.4 */ ++}; ++ ++static struct iro e1h_iro[2] = { ++ {0x1c40, 0xe0, 0x8, 0x0, 0x8}, /* T6.0 */ ++ {0x1e00, 0xe0, 0x8, 0x0, 0x8}, /* T6.4 */ ++}; ++ ++static struct iro e2_iro[2] = { ++ {0x6000, 0x20, 0x0, 0x0, 0x8}, /* T6.0 */ ++ {0x6000, 0x20, 0x0, 0x0, 0x8}, /* T6.4 */ ++}; ++ ++struct bnx2x_driver_version bnx2x_version = { ++ BNX2X_UNKNOWN_MAJOR_VERSION, ++ BNX2X_UNKNOWN_MINOR_VERSION, ++ BNX2X_UNKNOWN_SUB_MINOR_VERSION, ++}; ++ ++static int bnx2x_clear_tx_intr(nic_t *nic); ++ ++/******************************************************************************* ++ * BNX2X Library Functions ++ ******************************************************************************/ ++/** ++ * bnx2x_get_library_name() - Used to get the name of this NIC libary ++ * @param name - This function will return the pointer to this NIC ++ * library name ++ * @param name_size ++ */ ++static void bnx2x_get_library_name(char **name, size_t *name_size) ++{ ++ *name = (char *)library_name; ++ *name_size = sizeof(library_name); ++} ++ ++/** ++ * bnx2x_get_library_version() - Used to get the version string of this ++ * NIC libary ++ * @param version - This function will return the pointer to this NIC ++ * library version string ++ * @param version_size - This will be set with the version size ++ */ ++static void bnx2x_get_library_version(char **version, size_t *version_size) ++{ ++ *version = (char *)library_version; ++ *version_size = sizeof(library_version); ++} ++ ++/** ++ * bnx2x_get_build_date() - Used to get the build date string of this library ++ * @param version - This function will return the pointer to this NIC ++ * library build date string ++ * @param version_size - This will be set with the build date string size ++ */ ++static void bnx2x_get_build_date(char **build, size_t *build_size) ++{ ++ *build = (char *)build_date; ++ *build_size = sizeof(build_date); ++} ++ ++/** ++ * bnx2x_get_transport_name() - Used to get the transport name associated ++ * with this this NIC libary ++ * @param transport_name - This function will return the pointer to this NIC ++ * library's associated transport string ++ * @param transport_name_size - This will be set with the transport name size ++ */ ++static void bnx2x_get_transport_name(char **transport_name, ++ size_t *transport_name_size) ++{ ++ *transport_name = (char *)bnx2i_library_transport_name; ++ *transport_name_size = bnx2i_library_transport_name_size; ++} ++ ++/** ++ * bnx2x_get_uio_name() - Used to get the uio name associated with this this ++ * NIC libary ++ * @param uio_name - This function will return the pointer to this NIC ++ * library's associated uio string ++ * @param transport_name_size - This will be set with the uio name size ++ */ ++static void bnx2x_get_uio_name(char **uio_name, size_t *uio_name_size) ++{ ++ *uio_name = (char *)library_uio_name; ++ *uio_name_size = sizeof(library_uio_name); ++} ++ ++/** ++ * bnx2x_get_pci_table() - Used to get the PCI table for this NIC libary to ++ * determine which NIC's based off of PCI ID's are ++ * supported ++ * @param table - This function will return the pointer to the PCI table ++ * @param entries - This function will return the number of entries in the NIC ++ * library's PCI table ++ */ ++static void bnx2x_get_pci_table(struct pci_device_id **table, ++ uint32_t *entries) ++{ ++ *table = (struct pci_device_id *)bnx2x_pci_tbl; ++ *entries = ++ (uint32_t) (sizeof(bnx2x_pci_tbl) / sizeof(bnx2x_pci_tbl[0])); ++} ++ ++/** ++ * bnx2x_get_ops() - Used to get the NIC library op table ++ * @param op - The op table of this NIC library ++ */ ++struct nic_ops *bnx2x_get_ops() ++{ ++ return &bnx2x_op; ++} ++ ++/******************************************************************************* ++ * bnx2x Utility Functions ++ ******************************************************************************/ ++/******************************************************************************* ++ * Utility Functions Used to read register from the bnx2x device ++ ******************************************************************************/ ++static void bnx2x_set_drv_version_unknown(bnx2x_t *bp) ++{ ++ bp->version.major = BNX2X_UNKNOWN_MAJOR_VERSION; ++ bp->version.minor = BNX2X_UNKNOWN_MINOR_VERSION; ++ bp->version.sub_minor = BNX2X_UNKNOWN_SUB_MINOR_VERSION; ++} ++ ++/* Return: 1 = Unknown, 0 = Known */ ++static int bnx2x_is_drv_version_unknown(struct bnx2x_driver_version *version) ++{ ++ if ((version->major == (uint16_t)BNX2X_UNKNOWN_MAJOR_VERSION) && ++ (version->minor == (uint16_t)BNX2X_UNKNOWN_MINOR_VERSION) && ++ (version->sub_minor == (uint16_t)BNX2X_UNKNOWN_SUB_MINOR_VERSION)) { ++ return 1; ++ } ++ ++ return 0; ++} ++ ++/** ++ * bnx2x_get_drv_version() - Used to determine the driver version ++ * @param bp - Device used to determine bnx2x driver version ++ */ ++static int bnx2x_get_drv_version(bnx2x_t *bp) ++{ ++ nic_t *nic = bp->parent; ++ int fd, rc; ++ struct ifreq ifr; ++ struct ethtool_drvinfo drvinfo; ++ char *tok, *save_ptr = NULL; ++ ++ /* Setup our control structures. */ ++ memset(&ifr, 0, sizeof(ifr)); ++ strcpy(ifr.ifr_name, nic->eth_device_name); ++ ++ /* Open control socket. */ ++ fd = socket(AF_INET, SOCK_DGRAM, 0); ++ if (fd < 0) { ++ LOG_ERR(PFX "%s: Cannot get socket to determine version " ++ "[0x%x %s]", nic->log_name, errno, strerror(errno)); ++ return -EIO; ++ } ++ ++ drvinfo.cmd = ETHTOOL_GDRVINFO; ++ ifr.ifr_data = (caddr_t) &drvinfo; ++ rc = ioctl(fd, SIOCETHTOOL, &ifr); ++ if (rc < 0) { ++ LOG_ERR(PFX "%s: call to ethool IOCTL failed [0x%x %s]", ++ nic->log_name, errno, strerror(errno)); ++ goto error; ++ } ++ ++ tok = strtok_r(drvinfo.version, ".", &save_ptr); ++ if (tok == NULL) { ++ rc = -EIO; ++ goto error; ++ } ++ bp->version.major = atoi(tok); ++ ++ tok = strtok_r(NULL, ".", &save_ptr); ++ if (tok == NULL) { ++ rc = -EIO; ++ goto error; ++ } ++ bp->version.minor = atoi(tok); ++ ++ tok = strtok_r(NULL, ".", &save_ptr); ++ if (tok == NULL) { ++ rc = -EIO; ++ goto error; ++ } ++ bp->version.sub_minor = atoi(tok); ++ ++ LOG_INFO(PFX "%s: bnx2x driver using version %d.%d.%d", ++ nic->log_name, ++ bp->version.major, bp->version.minor, bp->version.sub_minor); ++ ++ close(fd); ++ ++ return 0; ++ ++error: ++ close(fd); ++ bnx2x_set_drv_version_unknown(bp); ++ ++ LOG_ERR(PFX "%s: error parsing driver string: '%s'", ++ nic->log_name, drvinfo.version); ++ ++ return rc; ++ ++} ++ ++static inline int bnx2x_is_ver70(bnx2x_t *bp) ++{ ++ return (bp->version.major == 1 && bp->version.minor >= 70); ++} ++ ++static inline int bnx2x_is_ver60(bnx2x_t *bp) ++{ ++ return (bp->version.major == 1 && (bp->version.minor == 60 || ++ bp->version.minor == 62 || ++ bp->version.minor == 64)); ++} ++ ++static inline int bnx2x_is_ver60_plus(bnx2x_t *bp) ++{ ++ return bnx2x_is_ver60(bp) || bnx2x_is_ver70(bp); ++} ++ ++static inline int bnx2x_is_ver52(bnx2x_t *bp) ++{ ++ return (bp->version.major == 1 && bp->version.minor == 52); ++} ++ ++static void bnx2x_wr32(bnx2x_t *bp, __u32 off, __u32 val) ++{ ++ *((volatile __u32 *)(bp->reg + off)) = val; ++} ++ ++static void bnx2x_doorbell(bnx2x_t *bp, __u32 off, __u32 val) ++{ ++ *((volatile __u32 *)(bp->reg2 + off)) = val; ++} ++ ++static void bnx2x_flush_doorbell(bnx2x_t *bp, __u32 off) ++{ ++ volatile __u32 tmp __attribute__((__unused__)); ++ ++ barrier(); ++ tmp = *((volatile __u32 *)(bp->reg2 + off)); ++} ++ ++static __u32 bnx2x_rd32(bnx2x_t *bp, __u32 off) ++{ ++ return *((volatile __u32 *)(bp->reg + off)); ++} ++ ++static int bnx2x_reg_sync(bnx2x_t *bp, __u32 off, __u16 length) ++{ ++ return msync(bp->reg + off, length, MS_SYNC); ++} ++ ++static void bnx2x_update_rx_prod(bnx2x_t *bp) ++{ ++ struct ustorm_eth_rx_producers rx_prods = { 0 }; ++ int i; ++ ++ rx_prods.bd_prod = bp->rx_bd_prod; ++ rx_prods.cqe_prod = bp->rx_prod; ++ ++ barrier(); ++ ++ for (i = 0; i < sizeof(struct ustorm_eth_rx_producers) / 4; i++) ++ bnx2x_wr32(bp, bp->rx_prod_io + i * 4, ++ ((__u32 *)&rx_prods)[i]); ++ ++ barrier(); ++ ++ bnx2x_reg_sync(bp, bp->rx_prod_io, ++ sizeof(struct ustorm_eth_rx_producers)); ++} ++ ++/** ++ * bnx2x_get_chip_id() - Used to retrive the chip ID from the nic ++ * @param dev - Device used to determin NIC type ++ * @return Chip ID read from the MISC ID register ++ */ ++static int bnx2x_get_chip_id(bnx2x_t *bp) ++{ ++ int val, id; ++ ++ /* Get the chip revision id and number. */ ++ /* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ ++ val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_NUM); ++ id = ((val & 0xffff) << 16); ++ val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_REV); ++ id |= ((val & 0xf) << 12); ++ val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_METAL); ++ id |= ((val & 0xff) << 4); ++ val = bnx2x_rd32(bp, BNX2X_MISC_REG_BOND_ID); ++ id |= (val & 0xf); ++ ++ return id; ++} ++ ++/** ++ * bnx2x_uio_verify() ++ * ++ */ ++static int bnx2x_uio_verify(nic_t *nic) ++{ ++ char *raw = NULL, *raw_tmp; ++ uint32_t raw_size = 0; ++ char temp_path[sizeof(cnic_uio_sysfs_name_tempate) + 8]; ++ int rc = 0; ++ ++ /* Build the path to determine uio name */ ++ snprintf(temp_path, sizeof(temp_path), ++ cnic_uio_sysfs_name_tempate, nic->uio_minor); ++ ++ rc = capture_file(&raw, &raw_size, temp_path); ++ if (rc != 0) ++ goto error; ++ ++ /* sanitize name string by replacing newline with null termination */ ++ raw_tmp = raw; ++ while (*raw_tmp != '\n') ++ raw_tmp++; ++ *raw_tmp = '\0'; ++ ++ if (strncmp(raw, bnx2x_uio_sysfs_name, ++ sizeof(bnx2x_uio_sysfs_name)) != 0) { ++ LOG_ERR(PFX "%s: uio names not equal: " ++ "expecting %s got %s from %s", ++ nic->log_name, bnx2x_uio_sysfs_name, raw, temp_path); ++ rc = -EIO; ++ } ++ ++ free(raw); ++ ++ LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); ++ ++error: ++ return rc; ++} ++ ++/******************************************************************************* ++ * bnx2x Utility Functions to get to the hardware consumer indexes ++ ******************************************************************************/ ++static __u16 bnx2x_get_rx(bnx2x_t *bp) ++{ ++ struct host_def_status_block *sblk = bp->status_blk.def; ++ __u16 rx_comp_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ rx_comp_cons = ++ sblk->u_def_status_block. ++ index_values[HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS]; ++ if ((rx_comp_cons & BNX2X_MAX_RCQ_DESC_CNT(bp)) == ++ BNX2X_MAX_RCQ_DESC_CNT(bp)) ++ rx_comp_cons++; ++ ++ return rx_comp_cons; ++} ++ ++static __u16 bnx2x_get_rx_60(bnx2x_t *bp) ++{ ++ struct host_sp_status_block *sblk = bp->status_blk.sp; ++ __u16 rx_comp_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ rx_comp_cons = ++ sblk->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS]; ++ if ((rx_comp_cons & BNX2X_MAX_RCQ_DESC_CNT(bp)) == ++ BNX2X_MAX_RCQ_DESC_CNT(bp)) ++ rx_comp_cons++; ++ ++ return rx_comp_cons; ++} ++ ++static __u16 bnx2x_get_tx(bnx2x_t *bp) ++{ ++ struct host_def_status_block *sblk = bp->status_blk.def; ++ __u16 tx_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ tx_cons = ++ sblk->c_def_status_block. ++ index_values[HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS]; ++ ++ return tx_cons; ++} ++ ++static __u16 bnx2x_get_tx_60(bnx2x_t *bp) ++{ ++ struct host_sp_status_block *sblk = bp->status_blk.sp; ++ __u16 tx_cons; ++ ++ msync(sblk, sizeof(*sblk), MS_SYNC); ++ tx_cons = sblk->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS]; ++ ++ return tx_cons; ++} ++ ++typedef enum { ++ CNIC_VLAN_STRIPPING_ENABLED = 1, ++ CNIC_VLAN_STRIPPING_DISABLED = 2, ++} CNIC_VLAN_STRIPPING_MODE; ++ ++/** ++ * bnx2x_strip_vlan_enabled() - This will query the device to determine whether ++ * VLAN tag stripping is enabled or not ++ * @param dev - device to check stripping or not ++ * @ return CNIC_VLAN_STRIPPING_ENABLED stripping is enabled ++ * CNIC_VLAN_STRIPPING_DISABLED stripping is not enabled ++ */ ++static CNIC_VLAN_STRIPPING_MODE bnx2x_strip_vlan_enabled(bnx2x_t *bp) ++{ ++ return CNIC_VLAN_STRIPPING_DISABLED; ++} ++ ++/** ++ * bnx2x_free() - Used to free a bnx2x structure ++ */ ++static void bnx2x_free(nic_t *nic) ++{ ++ if (nic->priv) ++ free(nic->priv); ++ nic->priv = NULL; ++} ++ ++/** ++ * bnx2x_alloc() - Used to allocate a bnx2x structure ++ */ ++static bnx2x_t *bnx2x_alloc(nic_t *nic) ++{ ++ bnx2x_t *bp = malloc(sizeof(*bp)); ++ ++ if (bp == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate BNX2X space", ++ nic->log_name); ++ return NULL; ++ } ++ ++ /* Clear out the CNIC contents */ ++ memset(bp, 0, sizeof(*bp)); ++ ++ bp->bar0_fd = INVALID_FD; ++ bp->bar2_fd = INVALID_FD; ++ ++ bp->parent = nic; ++ nic->priv = (void *)bp; ++ ++ bnx2x_set_drv_version_unknown(bp); ++ ++ return bp; ++} ++ ++/** ++ * bnx2x_open() - This will initialize all the hardware resources underneath ++ * a struct cnic_uio device ++ * @param dev - The struct cnic_uio device to attach the hardware with ++ * @return 0 on success, on failure a errno will be returned ++ */ ++static int bnx2x_open(nic_t *nic) ++{ ++ bnx2x_t *bp; ++ struct stat uio_stat; ++ int i, rc; ++ __u32 val; ++ int count; ++ char sysfs_resc_path[80]; ++ uint32_t bus; ++ uint32_t slot; ++ uint32_t func; ++ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL) { ++ LOG_ERR(PFX "nic == NULL"); ++ return -EINVAL; ++ } ++ ++ if ((nic->priv) != NULL && ++ (((bnx2x_t *) (nic->priv))->flags & BNX2X_OPENED)) { ++ return 0; ++ } ++ ++ bp = bnx2x_alloc(nic); ++ if (bp == NULL) ++ return -ENOMEM; ++ ++ if (bnx2x_is_drv_version_unknown(&bnx2x_version)) { ++ /* If version is unknown, go read from ethtool */ ++ rc = bnx2x_get_drv_version(bp); ++ if (rc) ++ goto open_error; ++ } else { ++ /* Version is not unknown, just use it */ ++ bnx2x_version.major = bp->version.major; ++ bnx2x_version.minor = bp->version.minor; ++ bnx2x_version.sub_minor = bp->version.sub_minor; ++ } ++ ++ count = 0; ++ while ((nic->fd < 0) && count < 15) { ++ /* udev might not have created the file yet */ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ sleep(1); ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ nic->fd = open(nic->uio_device_name, O_RDWR | O_NONBLOCK); ++ if (nic->fd != INVALID_FD) { ++ LOG_ERR(PFX "%s: uio device has been brought up " ++ "via pid: %d on fd: %d", ++ nic->uio_device_name, getpid(), nic->fd); ++ ++ rc = bnx2x_uio_verify(nic); ++ if (rc != 0) ++ continue; ++ ++ break; ++ } else { ++ LOG_WARN(PFX "%s: Could not open device: %s, [%s]", ++ nic->log_name, nic->uio_device_name, ++ strerror(errno)); ++ ++ manually_trigger_uio_event(nic, nic->uio_minor); ++ ++ /* udev might not have created the file yet */ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ sleep(1); ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ count++; ++ } ++ } ++ if (fstat(nic->fd, &uio_stat) < 0) { ++ LOG_ERR(PFX "%s: Could not fstat device", nic->log_name); ++ rc = -ENODEV; ++ goto open_error; ++ } ++ nic->uio_minor = minor(uio_stat.st_rdev); ++ ++ cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80); ++ bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC); ++ if (bp->bar0_fd < 0) { ++ LOG_ERR(PFX "%s: Could not open %s", nic->log_name, ++ sysfs_resc_path); ++ rc = -ENODEV; ++ goto open_error; ++ } ++ ++ bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE, ++ MAP_SHARED, bp->bar0_fd, (off_t) 0); ++ ++ if (bp->reg == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Couldn't mmap BAR registers: %s", ++ nic->log_name, strerror(errno)); ++ bp->reg = NULL; ++ rc = errno; ++ goto open_error; ++ } ++ ++ msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC); ++ ++ cnic_get_sysfs_pci_resource_path(nic, 2, sysfs_resc_path, 80); ++ bp->bar2_fd = open(sysfs_resc_path, O_RDWR | O_SYNC); ++ if (bp->bar2_fd < 0) { ++ LOG_ERR(PFX "%s: Could not open %s", nic->log_name, ++ sysfs_resc_path); ++ rc = -ENODEV; ++ goto open_error; ++ } ++ ++ bp->reg2 = mmap(NULL, BNX2X_BAR2_SIZE, PROT_READ | PROT_WRITE, ++ MAP_SHARED, bp->bar2_fd, (off_t) 0); ++ ++ if (bp->reg2 == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Couldn't mmap BAR2 registers: %s", ++ nic->log_name, strerror(errno)); ++ bp->reg2 = NULL; ++ rc = errno; ++ goto open_error; ++ } ++ ++ /* TODO: hardcoded with the cnic driver */ ++ bp->rx_ring_size = 15; ++ bp->rx_buffer_size = 0x400; ++ ++ LOG_DEBUG(PFX "%s: using rx ring size: %d, rx buffer size: %d", ++ nic->log_name, bp->rx_ring_size, bp->rx_buffer_size); ++ ++ /* Determine the number of UIO events that have already occured */ ++ rc = detemine_initial_uio_events(nic, &nic->intr_count); ++ if (rc != 0) { ++ LOG_ERR("Could not determine the number ofinitial UIO events"); ++ nic->intr_count = 0; ++ } ++ ++ /* Allocate space for rx pkt ring */ ++ bp->rx_pkt_ring = malloc(sizeof(void *) * bp->rx_ring_size); ++ if (bp->rx_pkt_ring == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate space for rx_pkt_ring", ++ nic->log_name); ++ rc = errno; ++ goto open_error; ++ } ++ ++ if (bnx2x_is_ver60_plus(bp)) ++ bp->status_blk_size = sizeof(struct host_sp_status_block); ++ else if (bnx2x_is_ver52(bp)) ++ bp->status_blk_size = sizeof(struct host_def_status_block); ++ else { ++ LOG_INFO(PFX "%s: Unsupported bnx2x driver [%d.%d]", ++ nic->log_name, bp->version.major, bp->version.minor); ++ ++ rc = -ENOTSUP; ++ goto open_error; ++ } ++ ++ bp->status_blk.def = mmap(NULL, bp->status_blk_size, ++ PROT_READ | PROT_WRITE, MAP_SHARED, ++ nic->fd, (off_t) nic->page_size); ++ if (bp->status_blk.def == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Could not mmap status block: %s", ++ nic->log_name, strerror(errno)); ++ bp->status_blk.def = NULL; ++ rc = errno; ++ goto open_error; ++ } ++ ++ bp->tx_ring = mmap(NULL, 4 * nic->page_size, ++ PROT_READ | PROT_WRITE, ++ MAP_SHARED | MAP_LOCKED, ++ nic->fd, (off_t) 2 * nic->page_size); ++ if (bp->tx_ring == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Could not mmap tx ring: %s", ++ nic->log_name, strerror(errno)); ++ bp->tx_ring = NULL; ++ rc = errno; ++ goto open_error; ++ } ++ ++ bp->rx_comp_ring.cqe = (union eth_rx_cqe *) ++ (((__u8 *) bp->tx_ring) + 2 * nic->page_size); ++ ++ bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size, ++ PROT_READ | PROT_WRITE, ++ MAP_SHARED | MAP_LOCKED, ++ nic->fd, (off_t) 3 * nic->page_size); ++ if (bp->bufs == MAP_FAILED) { ++ LOG_INFO(PFX "%s: Could not mmap buffers: %s", ++ nic->log_name, strerror(errno)); ++ bp->bufs = NULL; ++ rc = errno; ++ goto open_error; ++ } ++ ++ bp->chip_id = bnx2x_get_chip_id(bp); ++ LOG_DEBUG(PFX "Chip ID: %x", bp->chip_id); ++ ++ rc = get_bus_slot_func_num(nic, &bus, &slot, &func); ++ if (rc != 0) { ++ LOG_INFO(PFX "%s: Couldn't determine bus:slot.func", ++ nic->log_name); ++ goto open_error; ++ } ++ /* In E1/E1H use pci device function as read from sysfs. ++ * In E2/E3 read physical function from ME register since these chips ++ * support Physical Device Assignment where kernel BDF maybe arbitrary ++ * (depending on hypervisor). ++ */ ++ if (CHIP_IS_E2_PLUS(bp)) { ++ func = (bnx2x_rd32(bp, BAR_ME_REGISTER) & ME_REG_ABS_PF_NUM) >> ++ ME_REG_ABS_PF_NUM_SHIFT; ++ } ++ bp->func = func; ++ bp->port = bp->func % PORT_MAX; ++ ++ if (CHIP_IS_E2_PLUS(bp)) { ++ __u32 val = bnx2x_rd32(bp, MISC_REG_PORT4MODE_EN_OVWR); ++ if (!(val & 1)) ++ val = bnx2x_rd32(bp, MISC_REG_PORT4MODE_EN); ++ else ++ val = (val >> 1) & 1; ++ ++ if (val) ++ bp->pfid = func >> 1; ++ else ++ bp->pfid = func & 0x6; ++ } else { ++ bp->pfid = func; ++ } ++ ++ if (bnx2x_is_ver60_plus(bp)) ++ bp->port = bp->pfid & 1; ++ ++ bp->cid = 17; ++ bp->client_id = 17; ++ ++ if (bnx2x_is_ver60_plus(bp)) { ++ struct client_init_general_data *data = bp->bufs; ++ ++ bp->client_id = data->client_id; ++ if (data->uid.cid) ++ bp->cid = data->uid.cid; ++ if (bp->version.minor >= 78 && bp->version.sub_minor >= 55 && ++ data->uid.cid_override_key == UIO_USE_TX_DOORBELL) { ++ bp->tx_doorbell = data->uid.tx_db_off; ++ LOG_INFO(PFX "%s: tx doorbell override offset = 0x%x", ++ nic->log_name, bp->tx_doorbell); ++ } ++ } ++ ++ LOG_INFO(PFX "%s: func 0x%x, pfid 0x%x, client_id 0x%x, cid 0x%x", ++ nic->log_name, bp->func, bp->pfid, bp->client_id, bp->cid); ++ ++ if (CHIP_IS_E1(bp)) ++ bp->iro = e1_iro; ++ else if (CHIP_IS_E1H(bp)) ++ bp->iro = e1h_iro; ++ else if (CHIP_IS_E2_PLUS(bp)) ++ bp->iro = e2_iro; ++ ++ if (bnx2x_is_ver60_plus(bp)) { ++ __u32 cl_qzone_id = BNX2X_CL_QZONE_ID(bp, bp->client_id); ++ ++ bp->iro_idx = 0; ++ if (bp->version.minor >= 64) { ++ bp->iro_idx = 1; ++ cl_qzone_id = BNX2X_CL_QZONE_ID_64(bp, bp->client_id); ++ } ++ ++ bp->rx_prod_io = BAR_USTRORM_INTMEM + ++ (CHIP_IS_E2_PLUS(bp) ? ++ USTORM_RX_PRODS_E2_OFFSET(cl_qzone_id) : ++ USTORM_RX_PRODS_E1X_OFFSET(bp->port, bp->client_id)); ++ ++ if (!bp->tx_doorbell) ++ bp->tx_doorbell = bp->cid * 0x80 + 0x40; ++ ++ bp->get_rx_cons = bnx2x_get_rx_60; ++ bp->get_tx_cons = bnx2x_get_tx_60; ++ bp->tx_vlan_tag_bit = ETH_TX_BD_FLAGS_VLAN_TAG_T6X; ++ } else { ++ bp->rx_prod_io = BAR_USTRORM_INTMEM + ++ USTORM_RX_PRODS_OFFSET(bp->port, bp->client_id); ++ ++ bp->tx_doorbell = bp->cid * nic->page_size + 0x40; ++ ++ bp->get_rx_cons = bnx2x_get_rx; ++ bp->get_tx_cons = bnx2x_get_tx; ++ bp->tx_vlan_tag_bit = ETH_TX_BD_FLAGS_VLAN_TAG_T5X; ++ } ++ ++ bp->tx_cons = 0; ++ bp->tx_prod = 0; ++ bp->tx_bd_prod = 0; ++ bp->tx_pkt = bp->bufs; ++ ++ bp->rx_index = 0; ++ bp->rx_cons = 0; ++ bp->rx_bd_cons = 0; ++ bp->rx_prod = 127; ++ bp->rx_bd_prod = bp->rx_ring_size; ++ ++ for (i = 0; i < bp->rx_ring_size; i++) { ++ void *ptr = bp->bufs + (bp->rx_buffer_size * (i + 1)); ++ ++ bp->rx_pkt_ring[i] = ptr; ++ } ++ ++ val = bnx2x_rd32(bp, MISC_REG_SHARED_MEM_ADDR); ++ ++ bp->shmem_base = val; ++ val = bnx2x_rd32(bp, bp->shmem_base + SHMEM_ISCSI_MAC_UPPER(bp)); ++ nic->mac_addr[0] = (__u8) (val >> 8); ++ nic->mac_addr[1] = (__u8) val; ++ val = bnx2x_rd32(bp, bp->shmem_base + SHMEM_ISCSI_MAC_LOWER(bp)); ++ nic->mac_addr[2] = (__u8) (val >> 24); ++ nic->mac_addr[3] = (__u8) (val >> 16); ++ nic->mac_addr[4] = (__u8) (val >> 8); ++ nic->mac_addr[5] = (__u8) val; ++ ++ if (bnx2x_is_ver60_plus(bp) && CHIP_IS_E2_PLUS(bp)) { ++ __u32 mf_cfg_addr = 0; ++ __u32 mac_offset; ++ __u8 mac[6]; ++ ++ val = bnx2x_rd32(bp, (BNX2X_PATH(bp) ? MISC_REG_GENERIC_CR_1 : ++ MISC_REG_GENERIC_CR_0)); ++ bp->shmem_base2 = val; ++ if (bp->shmem_base2) { ++ /* size */ ++ val = bnx2x_rd32(bp, bp->shmem_base2); ++ ++ if (val > 0x10) ++ mf_cfg_addr = ++ bnx2x_rd32(bp, bp->shmem_base2 + 0x10); ++ } ++ ++ if (!mf_cfg_addr) ++ mf_cfg_addr = bp->shmem_base + 0x7e4; ++ ++ /* shared_feat_cfg.config */ ++ val = bnx2x_rd32(bp, bp->shmem_base + 0x354); ++ /* SI mode */ ++ if ((val & 0x700) == 0x300) { ++ mac_offset = 0xe4 + (bp->func * 0x28) + 4; ++ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); ++ mac[0] = (__u8) (val >> 8); ++ mac[1] = (__u8) val; ++ mac_offset += 4; ++ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); ++ mac[2] = (__u8) (val >> 24); ++ mac[3] = (__u8) (val >> 16); ++ mac[4] = (__u8) (val >> 8); ++ mac[5] = (__u8) val; ++ ++ if (mac[0] != 0xff) { ++ memcpy(nic->mac_addr, mac, 6); ++ } else if (bp->func > 1) { ++ LOG_INFO(PFX "%s: Invalid mac address: " ++ "%02x:%02x:%02x:%02x:%02x:%02x, abort", ++ nic->log_name, ++ mac[0], mac[1], mac[2], ++ mac[3], mac[4], mac[5]); ++ rc = -ENOTSUP; ++ goto open_error; ++ } ++ } else if ((val & 0x700) == 0) { ++ __u32 proto_offset = 0x24 + (bp->func * 0x18); ++ __u32 ovtag_offset = proto_offset + 0xc; ++ ++ rc = -ENOTSUP; ++ val = bnx2x_rd32(bp, mf_cfg_addr + ovtag_offset); ++ val &= 0xffff; ++ /* SD mode, check for valid outer VLAN */ ++ if (val == 0xffff) { ++ LOG_ERR(PFX "%s: Invalid OV detected for SD, " ++ " fallback to SF mode!\n", ++ nic->log_name); ++ goto SF; ++ } ++ /* Check for iSCSI protocol */ ++ val = bnx2x_rd32(bp, mf_cfg_addr + proto_offset); ++ if ((val & 6) != 6) ++ goto open_error; ++ ++ mac_offset = proto_offset + 0x4; ++ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); ++ mac[0] = (__u8) (val >> 8); ++ mac[1] = (__u8) val; ++ mac_offset += 4; ++ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); ++ mac[2] = (__u8) (val >> 24); ++ mac[3] = (__u8) (val >> 16); ++ mac[4] = (__u8) (val >> 8); ++ mac[5] = (__u8) val; ++ memcpy(nic->mac_addr, mac, 6); ++ ++ } ++ } ++SF: ++ LOG_INFO(PFX "%s: Using mac address: %02x:%02x:%02x:%02x:%02x:%02x", ++ nic->log_name, ++ nic->mac_addr[0], nic->mac_addr[1], nic->mac_addr[2], ++ nic->mac_addr[3], nic->mac_addr[4], nic->mac_addr[5]); ++ ++ /* Determine if Hardware VLAN tag stripping is enabled or not */ ++ if (CNIC_VLAN_STRIPPING_ENABLED == bnx2x_strip_vlan_enabled(bp)) ++ nic->flags |= NIC_VLAN_STRIP_ENABLED; ++ ++ msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC); ++ ++ LOG_INFO("%s: bnx2x initialized", nic->log_name); ++ ++ bnx2x_update_rx_prod(bp); ++ bp->flags |= BNX2X_OPENED; ++ ++ return 0; ++ ++open_error: ++ if (bp->tx_ring) { ++ munmap(bp->tx_ring, 4 * nic->page_size); ++ bp->tx_ring = NULL; ++ } ++ ++ if (bp->status_blk.def) { ++ munmap(bp->status_blk.def, bp->status_blk_size); ++ bp->status_blk.def = NULL; ++ } ++ ++ if (bp->reg) { ++ munmap(bp->reg, BNX2X_BAR_SIZE); ++ bp->reg = NULL; ++ } ++ ++ if (bp->reg2) { ++ munmap(bp->reg2, BNX2X_BAR2_SIZE); ++ bp->reg2 = NULL; ++ } ++ ++ if (bp->rx_pkt_ring) { ++ free(bp->rx_pkt_ring); ++ bp->rx_pkt_ring = NULL; ++ } ++ ++ if (bp->bar2_fd != INVALID_FD) { ++ close(bp->bar2_fd); ++ bp->bar2_fd = INVALID_FD; ++ } ++ ++ if (bp->bar0_fd != INVALID_FD) { ++ close(bp->bar0_fd); ++ bp->bar0_fd = INVALID_FD; ++ } ++ if (nic->fd != INVALID_FD) { ++ close(nic->fd); ++ nic->fd = INVALID_FD; ++ } ++ bnx2x_free(nic); ++ ++ return rc; ++} ++ ++/** ++ * bnx2x_uio_close_resources() - Used to free resource for the NIC/CNIC ++ * @param nic - NIC device to free resource ++ * @param graceful - whether to wait to close gracefully ++ * @return 0 on success, <0 on failure ++ */ ++static int bnx2x_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful) ++{ ++ bnx2x_t *bp = (bnx2x_t *) nic->priv; ++ int rc = 0; ++ ++ /* Check if there is an assoicated bnx2x device */ ++ if (bp == NULL) { ++ LOG_WARN(PFX "%s: when closing resources there is " ++ "no assoicated bnx2x", nic->log_name); ++ return -EIO; ++ } ++ ++ /* Clean up allocated memory */ ++ ++ if (bp->rx_pkt_ring != NULL) { ++ free(bp->rx_pkt_ring); ++ bp->rx_pkt_ring = NULL; ++ } ++ ++ /* Clean up mapped registers */ ++ if (bp->bufs != NULL) { ++ rc = munmap(bp->bufs, ++ (bp->rx_ring_size + 1) * bp->rx_buffer_size); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap bufs", nic->log_name); ++ bp->bufs = NULL; ++ } ++ ++ if (bp->tx_ring != NULL) { ++ rc = munmap(bp->tx_ring, 4 * nic->page_size); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap tx_rings", ++ nic->log_name); ++ bp->tx_ring = NULL; ++ } ++ ++ if (bp->status_blk.def != NULL) { ++ rc = munmap(bp->status_blk.def, bp->status_blk_size); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap status block", ++ nic->log_name); ++ bp->status_blk.def = NULL; ++ } ++ ++ if (bp->reg != NULL) { ++ rc = munmap(bp->reg, BNX2X_BAR_SIZE); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name); ++ bp->reg = NULL; ++ } ++ ++ if (bp->reg2 != NULL) { ++ rc = munmap(bp->reg2, BNX2X_BAR2_SIZE); ++ if (rc != 0) ++ LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name); ++ bp->reg2 = NULL; ++ } ++ ++ if (bp->bar2_fd != INVALID_FD) { ++ close(bp->bar2_fd); ++ bp->bar2_fd = INVALID_FD; ++ } ++ ++ if (bp->bar0_fd != INVALID_FD) { ++ close(bp->bar0_fd); ++ bp->bar0_fd = INVALID_FD; ++ } ++ ++ if (nic->fd != INVALID_FD) { ++ rc = close(nic->fd); ++ if (rc != 0) { ++ LOG_WARN(PFX ++ "%s: Couldn't close uio file descriptor: %d", ++ nic->log_name, nic->fd); ++ } else { ++ LOG_DEBUG(PFX "%s: Closed uio file descriptor: %d", ++ nic->log_name, nic->fd); ++ } ++ ++ nic->fd = INVALID_FD; ++ } else { ++ LOG_WARN(PFX "%s: Invalid uio file descriptor: %d", ++ nic->log_name, nic->fd); ++ } ++ ++ bnx2x_set_drv_version_unknown(bp); ++ ++ LOG_INFO(PFX "%s: Closed all resources", nic->log_name); ++ ++ return 0; ++} ++ ++/** ++ * bnx2x_close() - Used to close the NIC device ++ * @param nic - NIC device to close ++ * @param graceful - whether to wait to close gracefully ++ * @return 0 if successful, <0 if there is an error ++ */ ++static int bnx2x_close(nic_t *nic, NIC_SHUTDOWN_T graceful) ++{ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL) { ++ LOG_ERR(PFX "bnx2x_close(): nic == NULL"); ++ return -EINVAL; ++ } ++ if (nic->priv == NULL) { ++ LOG_ERR(PFX "bnx2x_close(): nic->priv == NULL"); ++ return -EINVAL; ++ } ++ ++ LOG_INFO(PFX "Closing NIC device: %s", nic->log_name); ++ ++ bnx2x_uio_close_resources(nic, graceful); ++ bnx2x_free(nic); ++ ++ return 0; ++} ++ ++static void bnx2x_prepare_xmit_packet(nic_t *nic, ++ nic_interface_t *nic_iface, ++ struct packet *pkt) ++{ ++ bnx2x_t *bp = (bnx2x_t *) nic->priv; ++ struct uip_vlan_eth_hdr *eth_vlan = (struct uip_vlan_eth_hdr *)pkt->buf; ++ struct uip_eth_hdr *eth = (struct uip_eth_hdr *)bp->tx_pkt; ++ ++ if (eth_vlan->tpid == htons(UIP_ETHTYPE_8021Q)) { ++ memcpy(bp->tx_pkt, pkt->buf, sizeof(struct uip_eth_hdr)); ++ eth->type = eth_vlan->type; ++ pkt->buf_size -= (sizeof(struct uip_vlan_eth_hdr) - ++ sizeof(struct uip_eth_hdr)); ++ memcpy(bp->tx_pkt + sizeof(struct uip_eth_hdr), ++ pkt->buf + sizeof(struct uip_vlan_eth_hdr), ++ pkt->buf_size - sizeof(struct uip_eth_hdr)); ++ } else ++ memcpy(bp->tx_pkt, pkt->buf, pkt->buf_size); ++ ++ msync(bp->tx_pkt, pkt->buf_size, MS_SYNC); ++} ++ ++/** ++ * bnx2x_get_tx_pkt() - This function is used to a TX packet from the NIC ++ * @param nic - The NIC device to send the packet ++ */ ++void *bnx2x_get_tx_pkt(nic_t *nic) ++{ ++ bnx2x_t *bp = (bnx2x_t *) nic->priv; ++ return bp->tx_pkt; ++} ++ ++/** ++ * bnx2x_start_xmit() - This function is used to send a packet of data ++ * @param nic - The NIC device to send the packet ++ * @param len - the length of the TX packet ++ * ++ */ ++void bnx2x_start_xmit(nic_t *nic, size_t len, u16_t vlan_id) ++{ ++ bnx2x_t *bp = (bnx2x_t *) nic->priv; ++ uint16_t ring_prod; ++ struct eth_tx_start_bd *txbd; ++ struct eth_tx_bd *txbd2; ++ struct eth_rx_bd *rx_bd; ++ rx_bd = (struct eth_rx_bd *)(((__u8 *) bp->tx_ring) + nic->page_size); ++ ++ if ((rx_bd->addr_hi == 0) && (rx_bd->addr_lo == 0)) { ++ LOG_PACKET(PFX "%s: trying to transmit when device is closed", ++ nic->log_name); ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ return; ++ } ++ ++ ring_prod = BNX2X_TX_RING_IDX(bp->tx_bd_prod); ++ txbd = &bp->tx_ring[ring_prod]; ++ ++ BNX2X_SET_TX_VLAN(bp, txbd, vlan_id); ++ ++ bp->tx_prod++; ++ bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod); ++ bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod); ++ ++ ring_prod = BNX2X_TX_RING_IDX(bp->tx_bd_prod); ++ txbd2 = (struct eth_tx_bd *)&bp->tx_ring[ring_prod]; ++ ++ txbd2->nbytes = len - 0x10; ++ txbd2->total_pkt_bytes = len; ++ ++ bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod); ++ ++ barrier(); ++ if (nic->nl_process_if_down == 0) { ++ bnx2x_doorbell(bp, bp->tx_doorbell, 0x02 | ++ (bp->tx_bd_prod << 16)); ++ bnx2x_flush_doorbell(bp, bp->tx_doorbell); ++ } else { ++ /* If the doorbell is not rung, the packet will not ++ get sent. Hence, the xmit_mutex lock will not ++ get freed. ++ */ ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ } ++ LOG_PACKET(PFX "%s: sent %d bytes using bp->tx_prod: %d", ++ nic->log_name, len, bp->tx_prod); ++} ++ ++/** ++ * bnx2x_write() - Used to write the data to the hardware ++ * @param nic - NIC hardware to read from ++ * @param pkt - The packet which will hold the data to be sent on the wire ++ * @return 0 if successful, <0 if failed ++ */ ++int bnx2x_write(nic_t *nic, nic_interface_t *nic_iface, packet_t *pkt) ++{ ++ bnx2x_t *bp; ++ struct uip_stack *uip; ++ int i = 0; ++ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL || nic_iface == NULL || pkt == NULL) { ++ LOG_ERR(PFX "%s: bnx2x_write() nic == 0x%p || " ++ " nic_iface == 0x%p || " ++ " pkt == 0x%x", nic, nic_iface, pkt); ++ return -EINVAL; ++ } ++ bp = (bnx2x_t *) nic->priv; ++ uip = &nic_iface->ustack; ++ ++ if (pkt->buf_size == 0) { ++ LOG_ERR(PFX "%s: Trying to transmitted 0 sized packet", ++ nic->log_name); ++ return -EINVAL; ++ } ++ ++ /* Try to wait for a TX completion */ ++ for (i = 0; i < 15; i++) { ++ struct timespec sleep_req = {.tv_sec = 0, .tv_nsec = 5000000 }, ++ sleep_rem; ++ ++ if (bnx2x_clear_tx_intr(nic) == 0) ++ break; ++ ++ nanosleep(&sleep_req, &sleep_rem); ++ } ++ ++ if (pthread_mutex_trylock(&nic->xmit_mutex) != 0) { ++ LOG_PACKET(PFX "%s: Dropped previous transmitted packet", ++ nic->log_name); ++ return -EINVAL; ++ } ++ ++ bnx2x_prepare_xmit_packet(nic, nic_iface, pkt); ++ bnx2x_start_xmit(nic, pkt->buf_size, ++ (nic_iface->vlan_priority << 12) | ++ nic_iface->vlan_id); ++ ++ /* bump the cnic dev send statistics */ ++ nic->stats.tx.packets++; ++ nic->stats.tx.bytes += uip->uip_len; ++ ++ LOG_PACKET(PFX "%s: transmitted %d bytes " ++ "dev->tx_cons: %d, dev->tx_prod: %d, dev->tx_bd_prod:%d", ++ nic->log_name, pkt->buf_size, ++ bp->tx_cons, bp->tx_prod, bp->tx_bd_prod); ++ ++ return 0; ++} ++ ++static inline int bnx2x_get_rx_pad(bnx2x_t *bp, union eth_rx_cqe *cqe) ++{ ++ int pad = 0; ++ ++ if (bnx2x_is_ver70(bp)) ++ pad = ((union eth_rx_cqe_70 *)cqe)->fast_path_cqe_70. \ ++ placement_offset; ++ else if (bnx2x_is_ver60(bp)) { ++ if (bp->version.minor >= 64) ++ pad = cqe->fast_path_cqe_64.placement_offset; ++ else ++ pad = cqe->fast_path_cqe.placement_offset; ++ } ++ return pad; ++} ++ ++/** ++ * bnx2x_read() - Used to read the data from the hardware ++ * @param nic - NIC hardware to read from ++ * @param pkt - The packet which will hold the data ++ * @return 0 if successful, <0 if failed ++ */ ++static int bnx2x_read(nic_t *nic, packet_t *pkt) ++{ ++ bnx2x_t *bp; ++ int rc = 0; ++ uint16_t hw_cons, sw_cons, bd_cons, bd_prod; ++ ++ /* Sanity Check: validate the parameters */ ++ if (nic == NULL || pkt == NULL) { ++ LOG_ERR(PFX "%s: bnx2x_read() nic == 0x%p || " ++ " pkt == 0x%x", nic, pkt); ++ return -EINVAL; ++ } ++ bp = (bnx2x_t *) nic->priv; ++ ++ hw_cons = bp->get_rx_cons(bp); ++ sw_cons = bp->rx_cons; ++ bd_cons = BNX2X_RX_BD(bp->rx_bd_cons); ++ bd_prod = BNX2X_RX_BD(bp->rx_bd_prod); ++ ++ if (sw_cons != hw_cons) { ++ uint16_t comp_ring_index = sw_cons & BNX2X_MAX_RCQ_DESC_CNT(bp); ++ uint8_t ring_index; ++ union eth_rx_cqe *cqe; ++ __u8 cqe_fp_flags; ++ void *rx_pkt; ++ int len, pad, cqe_size, max_len; ++ rc = 1; ++ ++ if (bnx2x_is_ver70(bp)) { ++ cqe = (union eth_rx_cqe *) ++ &bp->rx_comp_ring.cqe70[comp_ring_index]; ++ cqe_size = sizeof(union eth_rx_cqe_70); ++ } else { ++ cqe = &bp->rx_comp_ring.cqe[comp_ring_index]; ++ cqe_size = sizeof(union eth_rx_cqe); ++ } ++ cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; ++ ++ LOG_PACKET(PFX "%s: clearing rx interrupt: %d %d", ++ nic->log_name, sw_cons, hw_cons); ++ ++ msync(cqe, cqe_size, MS_SYNC); ++ ++ if (!(cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE)) { ++ ring_index = bd_cons % 15; ++ len = cqe->fast_path_cqe.pkt_len; ++ pad = bnx2x_get_rx_pad(bp, cqe); ++ rx_pkt = bp->rx_pkt_ring[ring_index] + pad; ++ ++ /* Doto query MTU size of physical device */ ++ /* Ensure len is valid */ ++ max_len = pkt->max_buf_size < bp->rx_buffer_size ? ++ pkt->max_buf_size : bp->rx_buffer_size; ++ if (len + pad > max_len) { ++ LOG_DEBUG(PFX "%s: bad BD length: %d", ++ nic->log_name, len); ++ len = max_len - pad; ++ } ++ if (len > 0) { ++ msync(rx_pkt, len, MS_SYNC); ++ /* Copy the data */ ++ memcpy(pkt->buf, rx_pkt, len); ++ pkt->buf_size = len; ++ ++ /* Properly set the packet flags */ ++ /* check if there is VLAN tagging */ ++ if (cqe->fast_path_cqe.vlan_tag != 0) { ++ pkt->vlan_tag = ++ cqe->fast_path_cqe.vlan_tag; ++ pkt->flags |= VLAN_TAGGED; ++ } else { ++ pkt->vlan_tag = 0; ++ } ++ ++ LOG_PACKET(PFX ++ "%s: processing packet length: %d", ++ nic->log_name, len); ++ ++ /* bump the cnic dev recv statistics */ ++ nic->stats.rx.packets++; ++ nic->stats.rx.bytes += pkt->buf_size; ++ } ++ ++ bd_cons = BNX2X_NEXT_RX_IDX(bd_cons); ++ bd_prod = BNX2X_NEXT_RX_IDX(bd_prod); ++ ++ } ++ sw_cons = BNX2X_NEXT_RCQ_IDX(bp, sw_cons); ++ bp->rx_prod = BNX2X_NEXT_RCQ_IDX(bp, bp->rx_prod); ++ } ++ bp->rx_cons = sw_cons; ++ bp->rx_bd_cons = bd_cons; ++ bp->rx_bd_prod = bd_prod; ++ bp->rx_hw_prod = hw_cons; ++ ++ if (rc) ++ bnx2x_update_rx_prod(bp); ++ ++ return rc; ++} ++ ++/******************************************************************************* ++ * Clearing TX interrupts ++ ******************************************************************************/ ++/** ++ * bnx2x_clear_tx_intr() - This routine is called when a TX interrupt occurs ++ * @param nic - the nic the interrupt occured on ++ * @return 0 on success ++ */ ++static int bnx2x_clear_tx_intr(nic_t *nic) ++{ ++ bnx2x_t *bp; ++ uint16_t hw_cons; ++ ++ /* Sanity check: ensure the parameters passed in are valid */ ++ if (unlikely(nic == NULL)) { ++ LOG_ERR(PFX "bnx2x_read() nic == NULL"); ++ return -EINVAL; ++ } ++ bp = (bnx2x_t *) nic->priv; ++ hw_cons = bp->get_tx_cons(bp); ++ ++ if (bp->tx_cons == hw_cons) { ++ if (bp->tx_cons == bp->tx_prod) { ++ /* Make sure the xmit_mutex lock is unlock */ ++ if (pthread_mutex_trylock(&nic->xmit_mutex)) ++ LOG_ERR(PFX "bnx2x tx lock with prod == cons"); ++ ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ return 0; ++ } ++ return -EAGAIN; ++ } ++ ++ LOG_PACKET(PFX "%s: clearing tx interrupt [%d %d]", ++ nic->log_name, bp->tx_cons, hw_cons); ++ bp->tx_cons = hw_cons; ++ ++ /* There is a queued TX packet that needs to be sent out. The usual ++ * case is when stack will send an ARP packet out before sending the ++ * intended packet */ ++ if (nic->tx_packet_queue != NULL) { ++ packet_t *pkt; ++ int i; ++ ++ LOG_PACKET(PFX "%s: sending queued tx packet", nic->log_name); ++ pkt = nic_dequeue_tx_packet(nic); ++ ++ /* Got a TX packet buffer of the TX queue and put it onto ++ * the hardware */ ++ if (pkt != NULL) { ++ bnx2x_prepare_xmit_packet(nic, pkt->nic_iface, pkt); ++ ++ bnx2x_start_xmit(nic, pkt->buf_size, ++ (pkt->nic_iface->vlan_priority << 12) | ++ pkt->nic_iface->vlan_id); ++ ++ LOG_PACKET(PFX "%s: transmitted queued packet %d bytes " ++ "dev->tx_cons: %d, dev->tx_prod: %d, " ++ "dev->tx_bd_prod:%d", ++ nic->log_name, pkt->buf_size, ++ bp->tx_cons, bp->tx_prod, bp->tx_bd_prod); ++ ++ return 0; ++ } ++ ++ /* Try to wait for a TX completion */ ++ for (i = 0; i < 15; i++) { ++ struct timespec sleep_req = {.tv_sec = 0, ++ .tv_nsec = 5000000 ++ }, sleep_rem; ++ ++ hw_cons = bp->get_tx_cons(bp); ++ if (bp->tx_cons != hw_cons) { ++ LOG_PACKET(PFX ++ "%s: clearing tx interrupt [%d %d]", ++ nic->log_name, bp->tx_cons, hw_cons); ++ bp->tx_cons = hw_cons; ++ ++ break; ++ } ++ ++ nanosleep(&sleep_req, &sleep_rem); ++ } ++ } ++ ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ ++ return 0; ++} ++ ++/******************************************************************************* ++ * bnx2x NIC op's table ++ ******************************************************************************/ ++struct nic_ops bnx2x_op = { ++ .description = "bnx2x", ++ .open = bnx2x_open, ++ .close = bnx2x_close, ++ .write = bnx2x_write, ++ .get_tx_pkt = bnx2x_get_tx_pkt, ++ .start_xmit = bnx2x_start_xmit, ++ .read = bnx2x_read, ++ .clear_tx_intr = bnx2x_clear_tx_intr, ++ .handle_iscsi_path_req = cnic_handle_iscsi_path_req, ++ ++ .lib_ops = { ++ .get_library_name = bnx2x_get_library_name, ++ .get_pci_table = bnx2x_get_pci_table, ++ .get_library_version = bnx2x_get_library_version, ++ .get_build_date = bnx2x_get_build_date, ++ .get_transport_name = bnx2x_get_transport_name, ++ .get_uio_name = bnx2x_get_uio_name, ++ }, ++}; +diff --git a/iscsiuio/src/unix/libs/bnx2x.h b/iscsiuio/src/unix/libs/bnx2x.h +new file mode 100644 +index 0000000..ce55cfc +--- /dev/null ++++ b/iscsiuio/src/unix/libs/bnx2x.h +@@ -0,0 +1,712 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * bnx2x.h - bnx2x user space driver ++ * ++ */ ++#ifndef __BNX2X_H__ ++#define __BNX2X_H__ ++ ++#include "nic.h" ++ ++/****************************************************************************** ++ * Default CNIC values ++ ******************************************************************************/ ++#define DEFAULT_BNX2X_NUM_RXBD 15 ++#define DEFAULT_BNX2X_RX_LEN 0x400 ++ ++/****************************************************************************** ++ * BNX2X Hardware structures ++ ******************************************************************************/ ++#define HC_USTORM_DEF_SB_NUM_INDICES 8 ++#define HC_CSTORM_DEF_SB_NUM_INDICES 8 ++#define HC_XSTORM_DEF_SB_NUM_INDICES 4 ++#define HC_TSTORM_DEF_SB_NUM_INDICES 4 ++ ++struct atten_def_status_block { ++ volatile __u32 attn_bits; ++ volatile __u32 attn_bits_ack; ++ volatile __u8 status_block_id; ++ volatile __u8 reserved0; ++ volatile __u16 attn_bits_index; ++ volatile __u32 reserved1; ++}; ++ ++struct cstorm_def_status_block_u { ++ volatile __u16 index_values[HC_USTORM_DEF_SB_NUM_INDICES]; ++ volatile __u16 status_block_index; ++ volatile __u8 func; ++ volatile __u8 status_block_id; ++ volatile __u32 __flags; ++}; ++ ++struct cstorm_def_status_block_c { ++ volatile __u16 index_values[HC_CSTORM_DEF_SB_NUM_INDICES]; ++ volatile __u16 status_block_index; ++ volatile __u8 func; ++ volatile __u8 status_block_id; ++ volatile __u32 __flags; ++}; ++ ++struct xstorm_def_status_block { ++ volatile __u16 index_values[HC_XSTORM_DEF_SB_NUM_INDICES]; ++ volatile __u16 status_block_index; ++ volatile __u8 func; ++ volatile __u8 status_block_id; ++ volatile __u32 __flags; ++}; ++ ++struct tstorm_def_status_block { ++ volatile __u16 index_values[HC_TSTORM_DEF_SB_NUM_INDICES]; ++ volatile __u16 status_block_index; ++ volatile __u8 func; ++ volatile __u8 status_block_id; ++ volatile __u32 __flags; ++}; ++ ++struct host_def_status_block { ++ struct atten_def_status_block atten_status_block; ++ struct cstorm_def_status_block_u u_def_status_block; ++ struct cstorm_def_status_block_c c_def_status_block; ++ struct xstorm_def_status_block x_def_status_block; ++ struct tstorm_def_status_block t_def_status_block; ++}; ++ ++#define HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS 1 ++#define HC_INDEX_DEF_U_ETH_ISCSI_RX_BD_CONS 3 ++#define HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS 5 ++ ++struct atten_sp_status_block { ++ __u32 attn_bits; ++ __u32 attn_bits_ack; ++ __u8 status_block_id; ++ __u8 reserved0; ++ __u16 attn_bits_index; ++ __u32 reserved1; ++}; ++ ++#define HC_SP_SB_MAX_INDICES 16 ++ ++struct hc_sp_status_block { ++ __u16 index_values[HC_SP_SB_MAX_INDICES]; ++ __u16 running_index; ++ __u16 rsrv; ++ __u32 rsrv1; ++}; ++ ++struct host_sp_status_block { ++ struct atten_sp_status_block atten_status_block; ++ struct hc_sp_status_block sp_sb; ++}; ++ ++#define HC_SP_INDEX_ETH_ISCSI_CQ_CONS 5 ++#define HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS 1 ++ ++/* ++ * VLAN mode on TX BDs ++ */ ++enum eth_tx_vlan_type { ++ X_ETH_NO_VLAN = 0, ++ X_ETH_OUTBAND_VLAN = 1, ++ X_ETH_INBAND_VLAN = 2, ++ X_ETH_FW_ADDED_VLAN = 3, ++ MAX_ETH_TX_VLAN_TYPE ++}; ++ ++/* TX Buffer descriptor */ ++struct eth_tx_bd_flags { ++ __u8 as_bitfield; ++/* t6.X HSI */ ++#define ETH_TX_BD_FLAGS_IP_CSUM_T6X (0x1<<0) ++#define ETH_TX_BD_FLAGS_IP_CSUM_SHIFT_T6X 0 ++#define ETH_TX_BD_FLAGS_L4_CSUM_T6X (0x1<<1) ++#define ETH_TX_BD_FLAGS_L4_CSUM_SHIFT_T6X 1 ++#define ETH_TX_BD_FLAGS_VLAN_MODE_T6X (0x3<<2) ++#define ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT_T6X 2 ++#define ETH_TX_BD_FLAGS_START_BD_T6X (0x1<<4) ++#define ETH_TX_BD_FLAGS_START_BD_SHIFT_T6X 4 ++#define ETH_TX_BD_FLAGS_IS_UDP_T6X (0x1<<5) ++#define ETH_TX_BD_FLAGS_IS_UDP_SHIFT_T6X 5 ++#define ETH_TX_BD_FLAGS_SW_LSO_T6X (0x1<<6) ++#define ETH_TX_BD_FLAGS_SW_LSO_SHIFT_T6X 6 ++#define ETH_TX_BD_FLAGS_IPV6_T6X (0x1<<7) ++#define ETH_TX_BD_FLAGS_IPV6_SHIFT_T6X 7 ++ ++/* Legacy t5.2 HSI defines */ ++#define ETH_TX_BD_FLAGS_VLAN_TAG_T5X (0x1<<0) ++#define ETH_TX_BD_FLAGS_VLAN_TAG_SHIFT_T5X 0 ++#define ETH_TX_BD_FLAGS_IP_CSUM_T5X (0x1<<1) ++#define ETH_TX_BD_FLAGS_IP_CSUM_SHIFT_T5X 1 ++#define ETH_TX_BD_FLAGS_L4_CSUM_T5X (0x1<<2) ++#define ETH_TX_BD_FLAGS_L4_CSUM_SHIFT_T5X 2 ++#define ETH_TX_BD_FLAGS_END_BD_T5X (0x1<<3) ++#define ETH_TX_BD_FLAGS_END_BD_SHIFT_T5X 3 ++#define ETH_TX_BD_FLAGS_START_BD_T5X (0x1<<4) ++#define ETH_TX_BD_FLAGS_START_BD_SHIFT_T5X 4 ++#define ETH_TX_BD_FLAGS_HDR_POOL_T5X (0x1<<5) ++#define ETH_TX_BD_FLAGS_HDR_POOL_SHIFT_T5X 5 ++#define ETH_TX_BD_FLAGS_SW_LSO_T5X (0x1<<6) ++#define ETH_TX_BD_FLAGS_SW_LSO_SHIFT_T5X 6 ++#define ETH_TX_BD_FLAGS_IPV6_T5X (0x1<<7) ++#define ETH_TX_BD_FLAGS_IPV6_SHIFT_T5X 7 ++}; ++ ++#define ETH_TX_BD_FLAGS_VLAN_TAG_T6X \ ++ (X_ETH_OUTBAND_VLAN << ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT_T6X) ++ ++#define BNX2X_SET_TX_VLAN(bp, txbd, vlan_id) \ ++ do { \ ++ if (vlan_id) { \ ++ (txbd)->vlan = vlan_id; \ ++ (txbd)->bd_flags.as_bitfield |= \ ++ (bp)->tx_vlan_tag_bit; \ ++ } else { \ ++ (txbd)->vlan = (bp)->tx_prod; \ ++ (txbd)->bd_flags.as_bitfield &= \ ++ ~(bp)->tx_vlan_tag_bit; \ ++ } \ ++ } while (0) ++ ++struct eth_tx_start_bd { ++ __u32 addr_lo; ++ __u32 addr_hi; ++ __u16 nbd; ++ __u16 nbytes; ++ __u16 vlan; ++ struct eth_tx_bd_flags bd_flags; ++ __u8 general_data; ++#define ETH_TX_START_BD_HDR_NBDS (0x3F<<0) ++#define ETH_TX_START_BD_HDR_NBDS_SHIFT 0 ++#define ETH_TX_START_BD_ETH_ADDR_TYPE (0x3<<6) ++#define ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT 6 ++}; ++ ++struct eth_tx_bd { ++ __u32 addr_lo; ++ __u32 addr_hi; ++ __u16 total_pkt_bytes; ++ __u16 nbytes; ++ __u8 reserved[4]; ++}; ++ ++/* RX Buffer descriptor */ ++struct eth_rx_bd { ++ __u32 addr_lo; ++ __u32 addr_hi; ++}; ++ ++struct ramrod_data { ++ volatile __u32 data_lo; ++ volatile __u32 data_hi; ++}; ++ ++struct common_ramrod_eth_rx_cqe { ++ volatile __u8 ramrod_type; ++#define COMMON_RAMROD_ETH_RX_CQE_TYPE (0x1<<0) ++#define COMMON_RAMROD_ETH_RX_CQE_TYPE_SHIFT 0 ++#define COMMON_RAMROD_ETH_RX_CQE_RESERVED0 (0x7F<<1) ++#define COMMON_RAMROD_ETH_RX_CQE_RESERVED0_SHIFT 1 ++ volatile __u8 conn_type; ++ volatile __u16 reserved1; ++ volatile __u32 conn_and_cmd_data; ++#define COMMON_RAMROD_ETH_RX_CQE_CID (0xFFFFFF<<0) ++#define COMMON_RAMROD_ETH_RX_CQE_CID_SHIFT 0 ++#define COMMON_RAMROD_ETH_RX_CQE_CMD_ID (0xFF<<24) ++#define COMMON_RAMROD_ETH_RX_CQE_CMD_ID_SHIFT 24 ++ struct ramrod_data protocol_data; ++ __u32 reserved2[4]; ++}; ++ ++struct common_ramrod_eth_rx_cqe_70 { ++ volatile __u8 ramrod_type; ++ volatile __u8 conn_type; ++ volatile __u16 reserved1; ++ volatile __u32 conn_and_cmd_data; ++ struct ramrod_data protocol_data; ++ __u32 echo; ++ __u32 reserved2[11]; ++}; ++ ++struct parsing_flags { ++ volatile __u16 flags; ++}; ++ ++struct eth_fast_path_rx_cqe { ++ volatile __u8 type_error_flags; ++#define ETH_FAST_PATH_RX_CQE_TYPE (0x1<<0) ++#define ETH_FAST_PATH_RX_CQE_TYPE_SHIFT 0 ++#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG (0x1<<1) ++#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_SHIFT 1 ++#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG (0x1<<2) ++#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_SHIFT 2 ++#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG (0x1<<3) ++#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_SHIFT 3 ++#define ETH_FAST_PATH_RX_CQE_START_FLG (0x1<<4) ++#define ETH_FAST_PATH_RX_CQE_START_FLG_SHIFT 4 ++#define ETH_FAST_PATH_RX_CQE_END_FLG (0x1<<5) ++#define ETH_FAST_PATH_RX_CQE_END_FLG_SHIFT 5 ++#define ETH_FAST_PATH_RX_CQE_RESERVED0 (0x3<<6) ++#define ETH_FAST_PATH_RX_CQE_RESERVED0_SHIFT 6 ++ volatile __u8 status_flags; ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE (0x7<<0) ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE_SHIFT 0 ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG (0x1<<3) ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG_SHIFT 3 ++#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG (0x1<<4) ++#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG_SHIFT 4 ++#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG (0x1<<5) ++#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG_SHIFT 5 ++#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG (0x1<<6) ++#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG_SHIFT 6 ++#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG (0x1<<7) ++#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG_SHIFT 7 ++ volatile __u8 placement_offset; ++ volatile __u8 queue_index; ++ volatile __u32 rss_hash_result; ++ volatile __u16 vlan_tag; ++ volatile __u16 pkt_len; ++ volatile __u16 len_on_bd; ++ struct parsing_flags pars_flags; ++ volatile __u16 sgl[8]; ++}; ++ ++union eth_sgl_or_raw_data { ++ volatile __u16 sgl[8]; ++ volatile __u32 raw_data[4]; ++}; ++ ++struct eth_fast_path_rx_cqe_64 { ++ volatile __u8 type_error_flags; ++#define ETH_FAST_PATH_RX_CQE_TYPE_64 (0x3<<0) ++#define ETH_FAST_PATH_RX_CQE_TYPE_SHIFT_64 0 ++#define ETH_FAST_PATH_RX_CQE_SGL_RAW_SEL (0x1<<2) ++#define ETH_FAST_PATH_RX_CQE_SGL_RAW_SEL_SHIFT 2 ++#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_64 (0x1<<3) ++#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_SHIFT_64 3 ++#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_64 (0x1<<4) ++#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_SHIFT_64 4 ++#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_64 (0x1<<5) ++#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_SHIFT_64 5 ++#define ETH_FAST_PATH_RX_CQE_RESERVED0_64 (0x3<<6) ++#define ETH_FAST_PATH_RX_CQE_RESERVED0_SHIFT_64 6 ++ volatile __u8 status_flags; ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE (0x7<<0) ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE_SHIFT 0 ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG (0x1<<3) ++#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG_SHIFT 3 ++#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG (0x1<<4) ++#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG_SHIFT 4 ++#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG (0x1<<5) ++#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG_SHIFT 5 ++#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG (0x1<<6) ++#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG_SHIFT 6 ++#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG (0x1<<7) ++#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG_SHIFT 7 ++ volatile __u8 queue_index; ++ volatile __u8 placement_offset; ++ volatile __u32 rss_hash_result; ++ volatile __u16 vlan_tag; ++ volatile __u16 pkt_len; ++ volatile __u16 len_on_bd; ++ struct parsing_flags pars_flags; ++ union eth_sgl_or_raw_data sgl_or_raw_data; ++}; ++ ++struct eth_fast_path_rx_cqe_70 { ++ volatile __u8 type_error_flags; ++ volatile __u8 status_flags; ++ volatile __u8 queue_index; ++ volatile __u8 placement_offset; ++ volatile __u32 rss_hash_result; ++ volatile __u16 vlan_tag; ++ volatile __u16 pkt_len; ++ volatile __u16 len_on_bd; ++ struct parsing_flags pars_flags; ++ union eth_sgl_or_raw_data sgl_or_raw_data; ++ __u32 reserved1[8]; ++}; ++ ++struct eth_rx_cqe_next_page { ++ __u32 addr_lo; ++ __u32 addr_hi; ++ __u32 reserved[6]; ++}; ++ ++struct eth_rx_cqe_next_page_70 { ++ __u32 addr_lo; ++ __u32 addr_hi; ++ __u32 reserved[14]; ++}; ++ ++union eth_rx_cqe { ++ struct eth_fast_path_rx_cqe fast_path_cqe; ++ struct eth_fast_path_rx_cqe_64 fast_path_cqe_64; ++ struct common_ramrod_eth_rx_cqe ramrod_cqe; ++ struct eth_rx_cqe_next_page next_page_cqe; ++}; ++ ++union eth_rx_cqe_70 { ++ struct eth_fast_path_rx_cqe_70 fast_path_cqe_70; ++ struct common_ramrod_eth_rx_cqe_70 ramrod_cqe_70; ++ struct eth_rx_cqe_next_page_70 next_page_cqe_70; ++}; ++ ++struct uio_init_data { ++ __u32 cid; ++ __u32 tx_db_off; ++ __u32 cid_override_key; ++#define UIO_USE_TX_DOORBELL 0x017855DB ++}; ++ ++struct client_init_general_data { ++ __u8 client_id; ++ __u8 statistics_counter_id; ++ __u8 statistics_en_flg; ++ __u8 is_fcoe_flg; ++ __u8 activate_flg; ++ __u8 sp_client_id; ++ __u16 mtu; ++ __u8 statistics_zero_flg; ++ __u8 func_id; ++ __u8 cos; ++ __u8 traffic_type; ++ struct uio_init_data uid; ++}; ++ ++/****************************************************************************** ++ * BNX2X Registers and HSI ++ ******************************************************************************/ ++#define BNX2X_BAR_SIZE 0x500000 ++#define BNX2X_BAR2_SIZE 0x12000 ++ ++#define BNX2X_CHIP_ID(bp) (bp->chip_id & 0xfffffff0) ++ ++#define PORT_MAX 2 ++ ++/* [R 4] This field indicates the type of the device. '0' - 2 Ports; '1' - 1 ++ * Port. */ ++#define BNX2X_MISC_REG_BOND_ID 0xa400 ++/* [R 8] These bits indicate the metal revision of the chip. This value ++ * starts at 0x00 for each all-layer tape-out and increments by one for each ++ * tape-out. */ ++#define BNX2X_MISC_REG_CHIP_METAL 0xa404 ++/* [R 16] These bits indicate the part number for the chip. */ ++#define BNX2X_MISC_REG_CHIP_NUM 0xa408 ++/* [R 4] These bits indicate the base revision of the chip. This value ++ * starts at 0x0 for the A0 tape-out and increments by one for each ++ * all-layer tape-out. */ ++#define BNX2X_MISC_REG_CHIP_REV 0xa40c ++ ++/* From the bnx2x driver */ ++#define CHIP_NUM(bp) (bp->chip_id >> 16) ++#define CHIP_NUM_57710 0x164e ++#define CHIP_NUM_57711 0x164f ++#define CHIP_NUM_57711E 0x1650 ++#define CHIP_NUM_57712 0x1662 ++#define CHIP_NUM_57712_MF 0x1663 ++#define CHIP_NUM_57712_VF 0x166f ++#define CHIP_NUM_57713 0x1651 ++#define CHIP_NUM_57713E 0x1652 ++#define CHIP_NUM_57800 0x168a ++#define CHIP_NUM_57800_MF 0x16a5 ++#define CHIP_NUM_57800_VF 0x16a9 ++#define CHIP_NUM_57810 0x168e ++#define CHIP_NUM_57810_MF 0x16ae ++#define CHIP_NUM_57810_VF 0x16af ++#define CHIP_NUM_57811 0x163d ++#define CHIP_NUM_57811_MF 0x163e ++#define CHIP_NUM_57811_VF 0x163f ++#define CHIP_NUM_57840_OBSOLETE 0x168d ++#define CHIP_NUM_57840_MF_OBSOLETE 0x16ab ++#define CHIP_NUM_57840_4_10 0x16a1 ++#define CHIP_NUM_57840_2_20 0x16a2 ++#define CHIP_NUM_57840_MF 0x16a4 ++#define CHIP_NUM_57840_VF 0x16ad ++ ++#define CHIP_IS_E1(bp) (CHIP_NUM(bp) == CHIP_NUM_57710) ++#define CHIP_IS_57711(bp) (CHIP_NUM(bp) == CHIP_NUM_57711) ++#define CHIP_IS_57711E(bp) (CHIP_NUM(bp) == CHIP_NUM_57711E) ++#define CHIP_IS_57712(bp) (CHIP_NUM(bp) == CHIP_NUM_57712) ++#define CHIP_IS_57712_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57712_VF) ++#define CHIP_IS_57712_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57712_MF) ++#define CHIP_IS_57800(bp) (CHIP_NUM(bp) == CHIP_NUM_57800) ++#define CHIP_IS_57800_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57800_MF) ++#define CHIP_IS_57800_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57800_VF) ++#define CHIP_IS_57810(bp) (CHIP_NUM(bp) == CHIP_NUM_57810) ++#define CHIP_IS_57810_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57810_MF) ++#define CHIP_IS_57810_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57810_VF) ++#define CHIP_IS_57811(bp) (CHIP_NUM(bp) == CHIP_NUM_57811) ++#define CHIP_IS_57811_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57811_MF) ++#define CHIP_IS_57811_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57811_VF) ++ ++#define CHIP_IS_57840(bp) \ ++ ((CHIP_NUM(bp) == CHIP_NUM_57840_4_10) || \ ++ (CHIP_NUM(bp) == CHIP_NUM_57840_2_20) || \ ++ (CHIP_NUM(bp) == CHIP_NUM_57840_OBSOLETE)) ++#define CHIP_IS_57840_MF(bp) ((CHIP_NUM(bp) == CHIP_NUM_57840_MF) || \ ++ (CHIP_NUM(bp) == CHIP_NUM_57840_MF_OBSOLETE)) ++#define CHIP_IS_57840_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57840_VF) ++#define CHIP_IS_E1H(bp) (CHIP_IS_57711(bp) || \ ++ CHIP_IS_57711E(bp)) ++ ++#define CHIP_IS_E2(bp) (CHIP_IS_57712(bp) || \ ++ CHIP_IS_57712_MF(bp) || \ ++ CHIP_IS_57712_VF(bp)) ++#define CHIP_IS_E3(bp) (CHIP_IS_57800(bp) || \ ++ CHIP_IS_57800_MF(bp) || \ ++ CHIP_IS_57800_VF(bp) || \ ++ CHIP_IS_57810(bp) || \ ++ CHIP_IS_57810_MF(bp) || \ ++ CHIP_IS_57810_VF(bp) || \ ++ CHIP_IS_57840(bp) || \ ++ CHIP_IS_57840_MF(bp) || \ ++ CHIP_IS_57840_VF(bp) || \ ++ CHIP_IS_57811(bp) || \ ++ CHIP_IS_57811_MF(bp) || \ ++ CHIP_IS_57811_VF(bp)) ++ ++#define CHIP_IS_E1x(bp) (CHIP_IS_E1((bp)) || CHIP_IS_E1H((bp))) ++#define USES_WARPCORE(bp) (CHIP_IS_E3(bp)) ++#define IS_E1H_OFFSET (!CHIP_IS_E1H(bp)) ++/* End of From the bnx2x driver */ ++ ++#define CHIP_IS_E2_PLUS(bp) (CHIP_IS_E2(bp) || CHIP_IS_E3(bp)) ++ ++#define MISC_REG_SHARED_MEM_ADDR 0xa2b4 ++ ++#define MISC_REG_BOND_ID 0xa400 ++#define MISC_REG_CHIP_METAL 0xa404 ++#define MISC_REG_CHIP_NUM 0xa408 ++#define MISC_REG_CHIP_REV 0xa40c ++ ++#define MISC_REG_PORT4MODE_EN 0xa750 ++#define MISC_REG_PORT4MODE_EN_OVWR 0xa720 ++ ++#define MISC_REG_GENERIC_CR_0 0xa460 ++#define MISC_REG_GENERIC_CR_1 0xa464 ++ ++#define BAR_USTRORM_INTMEM 0x400000 ++#define BAR_CSTRORM_INTMEM 0x410000 ++#define BAR_XSTRORM_INTMEM 0x420000 ++#define BAR_TSTRORM_INTMEM 0x430000 ++ ++#define BAR_ME_REGISTER 0x450000 ++#define ME_REG_PF_NUM_SHIFT 0 ++#define ME_REG_PF_NUM\ ++ (7L<iro[bp->iro_idx]) ++ ++#define USTORM_RX_PRODS_E1X_OFFSET(port, client_id) \ ++ (IRO_ENT.base + ((port) * IRO_ENT.m1) + ((client_id) * IRO_ENT.m2)) ++ ++#define USTORM_RX_PRODS_E2_OFFSET(qzone_id) \ ++ (IRO_ENT.base + ((qzone_id) * IRO_ENT.m1)) ++ ++#define ETH_MAX_RX_CLIENTS_E1H 28 ++#define ETH_MAX_RX_CLIENTS_E2 28 ++ ++#define BNX2X_CL_QZONE_ID(bp, cli) \ ++ (cli + (bp->port * (CHIP_IS_E2(bp) ? \ ++ ETH_MAX_RX_CLIENTS_E2 : \ ++ ETH_MAX_RX_CLIENTS_E1H))) ++ ++#define BNX2X_CL_QZONE_ID_64(bp, cli) \ ++ (CHIP_IS_E2_PLUS(bp) ? (cli) : \ ++ (cli + (bp->port * ETH_MAX_RX_CLIENTS_E1H))) ++ ++#define BNX2X_PATH(bp) (!CHIP_IS_E2_PLUS(bp) ? 0 : (bp)->func & 1) ++ ++#define SHMEM_P0_ISCSI_MAC_UPPER 0x4c ++#define SHMEM_P0_ISCSI_MAC_LOWER 0x50 ++#define SHMEM_P1_ISCSI_MAC_UPPER 0x1dc ++#define SHMEM_P1_ISCSI_MAC_LOWER 0x1e0 ++ ++#define SHMEM_ISCSI_MAC_UPPER(bp) \ ++ (((bp)->port == 0) ? \ ++ SHMEM_P0_ISCSI_MAC_UPPER : SHMEM_P1_ISCSI_MAC_UPPER) ++ ++#define SHMEM_ISCSI_MAC_LOWER(bp) \ ++ (((bp)->port == 0) ? \ ++ SHMEM_P0_ISCSI_MAC_LOWER : SHMEM_P1_ISCSI_MAC_LOWER) ++ ++#define BNX2X_RCQ_DESC_CNT (4096 / sizeof(union eth_rx_cqe)) ++#define BNX2X_RCQ_DESC_CNT_70 (4096 / sizeof(union eth_rx_cqe_70)) ++#define BNX2X_MAX_RCQ_DESC_CNT(bp) \ ++ ((bnx2x_is_ver70(bp) ? BNX2X_RCQ_DESC_CNT_70 : BNX2X_RCQ_DESC_CNT) - 1) ++ ++#define BNX2X_RX_DESC_CNT (4096 / sizeof(struct eth_rx_bd)) ++#define BNX2X_MAX_RX_DESC_CNT (BNX2X_RX_DESC_CNT - 2) ++#define BNX2X_NUM_RX_BD (BNX2X_RX_DESC_CNT * 1) ++#define BNX2X_MAX_RX_BD (BNX2X_NUM_RX_BD - 1) ++ ++#define BNX2X_TX_DESC_CNT (4096 / sizeof(struct eth_tx_start_bd)) ++#define BNX2X_MAX_TX_DESC_CNT (BNX2X_TX_DESC_CNT - 1) ++ ++#define BNX2X_NEXT_RX_IDX(x) ((((x) & (BNX2X_RX_DESC_CNT - 1)) == \ ++ (BNX2X_MAX_RX_DESC_CNT - 1)) ? \ ++ (x) + 3 : (x) + 1) ++ ++#define BNX2X_NEXT_RCQ_IDX(bp, x) \ ++ ((((x) & BNX2X_MAX_RCQ_DESC_CNT(bp)) == \ ++ (BNX2X_MAX_RCQ_DESC_CNT(bp) - 1)) ? (x) + 2 : (x) + 1) ++#define BNX2X_RX_BD(x) ((x) & BNX2X_MAX_RX_BD) ++ ++#define BNX2X_NEXT_TX_BD(x) ((((x) & (BNX2X_MAX_TX_DESC_CNT - 1)) == \ ++ (BNX2X_MAX_TX_DESC_CNT - 1)) ? \ ++ (x) + 2 : (x) + 1) ++ ++#define BNX2X_TX_RING_IDX(x) ((x) & BNX2X_MAX_TX_DESC_CNT) ++ ++struct ustorm_eth_rx_producers { ++ __u16 cqe_prod; ++ __u16 bd_prod; ++ __u16 sge_prod; ++ __u16 reserved; ++}; ++ ++#define BNX2X_UNKNOWN_MAJOR_VERSION -1 ++#define BNX2X_UNKNOWN_MINOR_VERSION -1 ++#define BNX2X_UNKNOWN_SUB_MINOR_VERSION -1 ++struct bnx2x_driver_version { ++ uint16_t major; ++ uint16_t minor; ++ uint16_t sub_minor; ++}; ++ ++typedef struct bnx2x { ++ nic_t *parent; ++ ++ struct bnx2x_driver_version version; ++ ++ uint16_t flags; ++#define CNIC_UIO_UNITIALIZED 0x0001 ++#define CNIC_UIO_INITIALIZED 0x0002 ++#define CNIC_UIO_ENABLED 0x0004 ++#define CNIC_UIO_DISABLED 0x0008 ++#define CNIC_UIO_IPv6_ENABLED 0x0010 ++#define CNIC_UIO_ADDED_MULICAST 0x0020 ++#define CNIC_UIO_MSIX_ENABLED 0x0200 ++#define CNIC_UIO_TX_HAS_SENT 0x0400 ++#define BNX2X_OPENED 0x0800 ++ ++ void *reg; /* Pointer to the BAR1 mapped registers */ ++ void *reg2; /* Pointer to the BAR2 mapped registers */ ++ ++ int bar0_fd; ++ int bar2_fd; ++ ++ __u32 chip_id; ++ __u32 shmem_base; ++ __u32 shmem_base2; ++ int func; ++ int port; ++ int pfid; ++ __u32 cid; ++ __u32 client_id; ++ ++ struct iro *iro; ++ int iro_idx; ++ ++ __u32 tx_doorbell; ++ ++ __u16 tx_prod; ++ __u16 tx_bd_prod; ++ __u16 tx_cons; ++ __u8 tx_vlan_tag_bit; ++ ++ __u32 rx_prod_io; ++ ++ __u16 rx_prod; ++ __u16 rx_bd_prod; ++ __u16 rx_cons; ++ __u16 rx_bd_cons; ++ __u16 rx_hw_prod; ++ ++ __u16(*get_rx_cons) (struct bnx2x *); ++ __u16(*get_tx_cons) (struct bnx2x *); ++ ++ /* RX ring parameters */ ++ uint32_t rx_ring_size; ++ uint32_t rx_buffer_size; ++ ++ void *bufs; /* Pointer to the mapped buffer space */ ++ ++ /* Hardware Status Block locations */ ++ void *sblk_map; ++ union { ++ struct host_def_status_block *def; ++ struct host_sp_status_block *sp; ++ } status_blk; ++ ++ int status_blk_size; ++ ++ uint16_t rx_index; ++ union { ++ union eth_rx_cqe *cqe; ++ union eth_rx_cqe_70 *cqe70; ++ } rx_comp_ring; ++ void **rx_pkt_ring; ++ ++ struct eth_tx_start_bd *tx_ring; ++ void *tx_pkt; ++ ++} bnx2x_t; ++ ++/****************************************************************************** ++ * bnx2x Function Declarations ++ ******************************************************************************/ ++void bnx2x_start_xmit(nic_t *nic, size_t len, u16_t vlan_id); ++ ++struct nic_ops *bnx2x_get_ops(); ++#endif /* __BNX2X_H__ */ +diff --git a/iscsiuio/src/unix/libs/cnic.c b/iscsiuio/src/unix/libs/cnic.c +new file mode 100644 +index 0000000..7f473c4 +--- /dev/null ++++ b/iscsiuio/src/unix/libs/cnic.c +@@ -0,0 +1,662 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * cnic.c - CNIC UIO uIP user space stack ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "uip_arp.h" ++#include "nic.h" ++#include "nic_utils.h" ++#include "logger.h" ++#include "options.h" ++ ++#include "cnic.h" ++#include "iscsi_if.h" ++#include "ipv6_ndpc.h" ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define PFX "CNIC " ++ ++static const uip_ip6addr_t all_ones_addr6 = { ++ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }; ++ ++/******************************************************************************* ++ * Constants shared between the bnx2 and bnx2x modules ++ ******************************************************************************/ ++const char bnx2i_library_transport_name[] = "bnx2i"; ++const size_t bnx2i_library_transport_name_size = ++ sizeof(bnx2i_library_transport_name); ++ ++/****************************************************************************** ++ * Netlink Functions ++ ******************************************************************************/ ++ ++static int cnic_arp_send(nic_t *nic, nic_interface_t *nic_iface, int fd, ++ __u8 *mac_addr, __u32 ip_addr, char *addr_str) ++{ ++ struct ether_header *eth; ++ struct ether_arp *arp; ++ __u32 dst_ip = ip_addr; ++ int pkt_size = sizeof(*eth) + sizeof(*arp); ++ int rc; ++ struct in_addr addr; ++ static const uint8_t multicast_mac[] = { ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ++ ++ rc = pthread_mutex_trylock(&nic->xmit_mutex); ++ if (rc != 0) { ++ LOG_DEBUG(PFX "%s: could not get xmit_mutex", nic->log_name); ++ return -EAGAIN; ++ } ++ ++ eth = (*nic->ops->get_tx_pkt) (nic); ++ if (eth == NULL) { ++ LOG_WARN(PFX "%s: couldn't get tx packet", nic->log_name); ++ return -EAGAIN; ++ } ++ ++ nic_fill_ethernet_header(nic_iface, eth, ++ nic->mac_addr, (void *)multicast_mac, ++ &pkt_size, (void *)&arp, ETHERTYPE_ARP); ++ ++ arp->arp_hrd = htons(ARPHRD_ETHER); ++ arp->arp_pro = htons(ETHERTYPE_IP); ++ arp->arp_hln = ETH_ALEN; ++ arp->arp_pln = 4; ++ arp->arp_op = htons(ARPOP_REQUEST); ++ memcpy(arp->arp_sha, nic->mac_addr, ETH_ALEN); ++ memset(arp->arp_tha, 0, ETH_ALEN); ++ ++ /* Copy the IP address's into the ARP response */ ++ memcpy(arp->arp_spa, nic_iface->ustack.hostaddr, 4); ++ memcpy(arp->arp_tpa, &dst_ip, 4); ++ ++ (*nic->nic_library->ops->start_xmit) (nic, pkt_size, ++ (nic_iface->vlan_priority << 12) | ++ nic_iface->vlan_id); ++ ++ memcpy(&addr.s_addr, &dst_ip, sizeof(addr.s_addr)); ++ LOG_DEBUG(PFX "%s: Sent cnic arp request for IP: %s", ++ nic->log_name, addr_str); ++ ++ return 0; ++} ++ ++static int cnic_neigh_soliciation_send(nic_t *nic, ++ nic_interface_t *nic_iface, int fd, ++ __u8 *mac_addr, ++ struct in6_addr *addr6_dst, ++ char *addr_str) ++{ ++ struct ether_header *eth; ++ struct ip6_hdr *ipv6_hdr; ++ int rc, pkt_size; ++ char buf[INET6_ADDRSTRLEN]; ++ struct ndpc_reqptr req_ptr; ++ ++ rc = pthread_mutex_trylock(&nic->xmit_mutex); ++ if (rc != 0) { ++ LOG_WARN(PFX "%s: could not get xmit_mutex", nic->log_name); ++ return -EAGAIN; ++ } ++ ++ /* Build the ethernet header */ ++ eth = (*nic->ops->get_tx_pkt) (nic); ++ if (eth == NULL) { ++ LOG_WARN(PFX "%s: couldn't get tx packet", nic->log_name); ++ return -EAGAIN; ++ } ++ ++ /* Copy the requested target address to the ipv6.dst */ ++ ipv6_hdr = ++ (struct ip6_hdr *)((u8_t *) eth + sizeof(struct ether_header)); ++ ++ memcpy(ipv6_hdr->ip6_dst.s6_addr, addr6_dst->s6_addr, ++ sizeof(struct in6_addr)); ++ ++ nic_fill_ethernet_header(nic_iface, eth, nic->mac_addr, nic->mac_addr, ++ &pkt_size, (void *)&ipv6_hdr, ETHERTYPE_IPV6); ++ req_ptr.eth = (void *)eth; ++ req_ptr.ipv6 = (void *)ipv6_hdr; ++ if (ndpc_request(&nic_iface->ustack, &req_ptr, &pkt_size, ++ NEIGHBOR_SOLICIT)) ++ return -EAGAIN; ++ ++ /* Debug to print out the pkt context */ ++ inet_ntop(AF_INET6, ipv6_hdr->ip6_dst.s6_addr, buf, sizeof(buf)); ++ LOG_DEBUG(PFX "%s: ipv6 dst addr: %s", nic->log_name, buf); ++ LOG_DEBUG(PFX "neighbor sol content " ++ "dst mac %02x:%02x:%02x:%02x:%02x:%02x", ++ eth->ether_dhost[0], eth->ether_dhost[1], ++ eth->ether_dhost[2], eth->ether_dhost[3], ++ eth->ether_dhost[4], eth->ether_dhost[5]); ++ LOG_DEBUG(PFX "src mac %02x:%02x:%02x:%02x:%02x:%02x", ++ eth->ether_shost[0], eth->ether_shost[1], ++ eth->ether_shost[2], eth->ether_shost[3], ++ eth->ether_shost[4], eth->ether_shost[5]); ++ (*nic->nic_library->ops->start_xmit) (nic, pkt_size, ++ (nic_iface->vlan_priority << 12) | ++ nic_iface->vlan_id); ++ ++ LOG_DEBUG(PFX "%s: Sent cnic ICMPv6 neighbor request %s", ++ nic->log_name, addr_str); ++ ++ return 0; ++} ++ ++static int cnic_nl_neigh_rsp(nic_t *nic, int fd, ++ struct iscsi_uevent *ev, ++ struct iscsi_path *path_req, ++ __u8 *mac_addr, ++ nic_interface_t *nic_iface, int status, int type) ++{ ++ int rc; ++ uint8_t *ret_buf; ++ struct iscsi_uevent *ret_ev; ++ struct iscsi_path *path_rsp; ++ struct sockaddr_nl dest_addr; ++ char addr_dst_str[INET6_ADDRSTRLEN]; ++ ++ memset(&dest_addr, 0, sizeof(dest_addr)); ++ dest_addr.nl_family = AF_NETLINK; ++ dest_addr.nl_pid = 0; ++ dest_addr.nl_groups = 0; /* unicast */ ++ ++ ret_buf = calloc(1, NLMSG_SPACE(sizeof(struct iscsi_uevent) + 256)); ++ if (ret_buf == NULL) { ++ LOG_ERR(PFX "Could not allocate memory for path req resposne"); ++ return -ENOMEM; ++ } ++ ++ memset(ret_buf, 0, NLMSG_SPACE(sizeof(struct iscsi_uevent) + 256)); ++ ++ /* prepare the iscsi_uevent buffer */ ++ ret_ev = (struct iscsi_uevent *)ret_buf; ++ ret_ev->type = ISCSI_UEVENT_PATH_UPDATE; ++ ret_ev->transport_handle = ev->transport_handle; ++ ret_ev->u.set_path.host_no = ev->r.req_path.host_no; ++ ++ /* Prepare the iscsi_path buffer */ ++ path_rsp = (struct iscsi_path *)(ret_buf + sizeof(*ret_ev)); ++ path_rsp->handle = path_req->handle; ++ if (type == AF_INET) { ++ path_rsp->ip_addr_len = 4; ++ memcpy(&path_rsp->src.v4_addr, nic_iface->ustack.hostaddr, ++ sizeof(nic_iface->ustack.hostaddr)); ++ ++ inet_ntop(AF_INET, &path_rsp->src.v4_addr, ++ addr_dst_str, sizeof(addr_dst_str)); ++ } else { ++ u8_t *src_ipv6; ++ int ret; ++ ++ /* Depending on the IPv6 address of the target we will need to ++ * determine whether we use the assigned IPv6 address or the ++ * link local IPv6 address */ ++ if (ndpc_request(&nic_iface->ustack, &path_req->dst.v6_addr, ++ &ret, CHECK_LINK_LOCAL_ADDR)) { ++ src_ipv6 = (u8_t *)all_zeroes_addr6; ++ LOG_DEBUG(PFX "RSP Check LL failed"); ++ goto src_done; ++ } ++ if (ret) { ++ /* Get link local IPv6 address */ ++ src_ipv6 = (u8_t *)&nic_iface->ustack.linklocal6; ++ } else { ++ if (ndpc_request(&nic_iface->ustack, ++ &path_req->dst.v6_addr, ++ &src_ipv6, GET_HOST_ADDR)) { ++ src_ipv6 = (u8_t *)all_zeroes_addr6; ++ LOG_DEBUG(PFX "RSP Get host addr failed"); ++ } ++ if (src_ipv6 == NULL) { ++ src_ipv6 = (u8_t *)all_zeroes_addr6; ++ LOG_DEBUG(PFX "RSP no Best matched addr found"); ++ } ++ } ++src_done: ++ path_rsp->ip_addr_len = 16; ++ memcpy(&path_rsp->src.v6_addr, src_ipv6, ++ sizeof(nic_iface->ustack.hostaddr6)); ++ ++ inet_ntop(AF_INET6, &path_rsp->src.v6_addr, ++ addr_dst_str, sizeof(addr_dst_str)); ++ } ++ memcpy(path_rsp->mac_addr, mac_addr, 6); ++ path_rsp->vlan_id = (nic_iface->vlan_priority << 12) | ++ nic_iface->vlan_id; ++ path_rsp->pmtu = nic_iface->mtu ? nic_iface->mtu : path_req->pmtu; ++ ++ rc = __kipc_call(fd, ret_ev, sizeof(*ret_ev) + sizeof(*path_rsp)); ++ if (rc > 0) { ++ LOG_DEBUG(PFX "neighbor reply sent back to kernel " ++ "%s at %02x:%02x:%02x:%02x:%02x:%02x with vlan %d", ++ addr_dst_str, ++ mac_addr[0], mac_addr[1], ++ mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], ++ nic_iface->vlan_id); ++ ++ } else { ++ LOG_ERR(PFX "send neighbor reply failed: %d", rc); ++ } ++ ++ free(ret_buf); ++ ++ return rc; ++} ++ ++static const struct timeval tp_wait = { ++ .tv_sec = 0, ++ .tv_usec = 250000, ++}; ++ ++/** ++ * cnic_handle_ipv4_iscsi_path_req() - This function will handle the IPv4 ++ * path req calls the bnx2i kernel module ++ * @param nic - The nic the message is directed towards ++ * @param fd - The file descriptor to be used to extract the private data ++ * @param ev - The iscsi_uevent ++ * @param buf - The private message buffer ++ */ ++int cnic_handle_ipv4_iscsi_path_req(nic_t *nic, int fd, ++ struct iscsi_uevent *ev, ++ struct iscsi_path *path, ++ nic_interface_t *nic_iface) ++{ ++ struct in_addr src_addr, dst_addr, ++ src_matching_addr, dst_matching_addr, netmask; ++ __u8 mac_addr[6]; ++ int rc; ++ uint16_t arp_retry; ++ int status = 0; ++#define MAX_ARP_RETRY 4 ++ ++ memset(mac_addr, 0, sizeof(mac_addr)); ++ memcpy(&dst_addr, &path->dst.v4_addr, sizeof(dst_addr)); ++ memcpy(&src_addr, nic_iface->ustack.hostaddr, sizeof(src_addr)); ++ ++ if (nic_iface->ustack.netmask[0] | nic_iface->ustack.netmask[1]) ++ memcpy(&netmask.s_addr, nic_iface->ustack.netmask, ++ sizeof(src_addr)); ++ else ++ netmask.s_addr = calculate_default_netmask(dst_addr.s_addr); ++ ++ src_matching_addr.s_addr = src_addr.s_addr & netmask.s_addr; ++ dst_matching_addr.s_addr = dst_addr.s_addr & netmask.s_addr; ++ ++ LOG_DEBUG(PFX "%s: src=%s", nic->log_name, inet_ntoa(src_addr)); ++ LOG_DEBUG(PFX "%s: dst=%s", nic->log_name, inet_ntoa(dst_addr)); ++ LOG_DEBUG(PFX "%s: nm=%s", nic->log_name, inet_ntoa(netmask)); ++ if (src_matching_addr.s_addr != dst_matching_addr.s_addr) { ++ /* If there is an assigned gateway address then use it ++ * if the source address doesn't match */ ++ if (nic_iface->ustack.default_route_addr[0] | ++ nic_iface->ustack.default_route_addr[1]) { ++ memcpy(&dst_addr, ++ &nic_iface->ustack.default_route_addr, ++ sizeof(dst_addr)); ++ } else { ++ arp_retry = MAX_ARP_RETRY; ++ LOG_DEBUG(PFX "%s: no default", nic->log_name); ++ goto done; ++ } ++ } ++ arp_retry = 0; ++ ++ rc = uip_lookup_arp_entry(dst_addr.s_addr, mac_addr); ++ if (rc != 0) { ++ while ((arp_retry < MAX_ARP_RETRY) && (event_loop_stop == 0)) { ++ char *dst_addr_str; ++ int count; ++ struct timespec ts; ++ struct timeval tp; ++ struct timeval tp_abs; ++ ++ dst_addr_str = inet_ntoa(dst_addr); ++ ++ LOG_INFO(PFX "%s: Didn't find IPv4: '%s' in ARP table", ++ nic->log_name, dst_addr_str); ++ rc = cnic_arp_send(nic, nic_iface, fd, ++ mac_addr, ++ dst_addr.s_addr, dst_addr_str); ++ if (rc != 0) { ++ status = -EIO; ++ goto done; ++ } ++ ++ for (count = 0; count < 8; count++) { ++ /* Convert from timeval to timespec */ ++ rc = gettimeofday(&tp, NULL); ++ ++ timeradd(&tp, &tp_wait, &tp_abs); ++ ++ ts.tv_sec = tp_abs.tv_sec; ++ ts.tv_nsec = tp_abs.tv_usec * 1000; ++ ++ /* Wait 1s for if_down */ ++ pthread_mutex_lock(&nic->nl_process_mutex); ++ rc = pthread_cond_timedwait ++ (&nic->nl_process_if_down_cond, ++ &nic->nl_process_mutex, &ts); ++ ++ if (rc == ETIMEDOUT) { ++ pthread_mutex_unlock ++ (&nic->nl_process_mutex); ++ ++ rc = uip_lookup_arp_entry(dst_addr. ++ s_addr, ++ mac_addr); ++ if (rc == 0) ++ goto done; ++ } else { ++ nic->nl_process_if_down = 0; ++ pthread_mutex_unlock ++ (&nic->nl_process_mutex); ++ ++ arp_retry = MAX_ARP_RETRY; ++ goto done; ++ ++ } ++ } ++ ++ arp_retry++; ++ } ++ } ++ ++done: ++ ++ if (arp_retry >= MAX_ARP_RETRY) { ++ status = -EIO; ++ rc = -EIO; ++ } ++ ++ if (status != 0 || rc != 0) ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ ++ cnic_nl_neigh_rsp(nic, fd, ev, path, mac_addr, ++ nic_iface, status, AF_INET); ++ ++ return rc; ++} ++ ++/** ++ * cnic_handle_ipv6_iscsi_path_req() - This function will handle the IPv4 ++ * path req calls the bnx2i kernel module ++ * @param nic - The nic the message is directed towards ++ * @param fd - The file descriptor to be used to extract the private data ++ * @param ev - The iscsi_uevent ++ * @param buf - The private message buffer ++ */ ++int cnic_handle_ipv6_iscsi_path_req(nic_t *nic, int fd, ++ struct iscsi_uevent *ev, ++ struct iscsi_path *path, ++ nic_interface_t *nic_iface) ++{ ++ __u8 mac_addr[6]; ++ int rc, i; ++ uint16_t neighbor_retry; ++ int status = 0; ++ char addr_dst_str[INET6_ADDRSTRLEN]; ++ struct in6_addr src_addr, dst_addr, ++ src_matching_addr, dst_matching_addr, netmask; ++ struct in6_addr *addr; ++ struct ndpc_reqptr req_ptr; ++ ++ memset(mac_addr, 0, sizeof(mac_addr)); ++ ++ inet_ntop(AF_INET6, &path->dst.v6_addr, ++ addr_dst_str, sizeof(addr_dst_str)); ++ ++ /* Depending on the IPv6 address of the target we will need to ++ * determine whether we use the assigned IPv6 address or the ++ * link local IPv6 address */ ++ memcpy(&dst_addr, &path->dst.v6_addr, sizeof(struct in6_addr)); ++ if (ndpc_request(&nic_iface->ustack, &dst_addr, ++ &rc, CHECK_LINK_LOCAL_ADDR)) { ++ neighbor_retry = MAX_ARP_RETRY; ++ LOG_DEBUG(PFX "Check LL failed"); ++ goto done; ++ } ++ if (rc) { ++ LOG_DEBUG(PFX "Use LL"); ++ /* Get link local IPv6 address */ ++ addr = (struct in6_addr *)&nic_iface->ustack.linklocal6; ++ } else { ++ LOG_DEBUG(PFX "Use Best matched"); ++ if (ndpc_request(&nic_iface->ustack, ++ &dst_addr, ++ &addr, GET_HOST_ADDR)) { ++ neighbor_retry = MAX_ARP_RETRY; ++ LOG_DEBUG(PFX "Use Best matched failed"); ++ goto done; ++ } ++ if (addr == NULL) { ++ neighbor_retry = MAX_ARP_RETRY; ++ LOG_DEBUG(PFX "No Best matched found"); ++ goto done; ++ } ++ } ++ /* Got the best matched src IP address */ ++ memcpy(&src_addr, addr, sizeof(struct in6_addr)); ++ ++ if (nic_iface->ustack.netmask6[0] | nic_iface->ustack.netmask6[1] | ++ nic_iface->ustack.netmask6[2] | nic_iface->ustack.netmask6[3] | ++ nic_iface->ustack.netmask6[4] | nic_iface->ustack.netmask6[5] | ++ nic_iface->ustack.netmask6[6] | nic_iface->ustack.netmask6[7]) ++ memcpy(&netmask.s6_addr, nic_iface->ustack.netmask6, ++ sizeof(struct in6_addr)); ++ else ++ memcpy(&netmask.s6_addr, all_zeroes_addr6, ++ sizeof(struct in6_addr)); ++ ++ inet_ntop(AF_INET6, &src_addr.s6_addr16, addr_dst_str, ++ sizeof(addr_dst_str)); ++ LOG_DEBUG(PFX "src IP addr %s", addr_dst_str); ++ inet_ntop(AF_INET6, &dst_addr.s6_addr16, addr_dst_str, ++ sizeof(addr_dst_str)); ++ LOG_DEBUG(PFX "dst IP addr %s", addr_dst_str); ++ inet_ntop(AF_INET6, &netmask.s6_addr16, addr_dst_str, ++ sizeof(addr_dst_str)); ++ LOG_DEBUG(PFX "prefix mask %s", addr_dst_str); ++ ++ for (i = 0; i < 4; i++) { ++ src_matching_addr.s6_addr32[i] = src_addr.s6_addr32[i] & ++ netmask.s6_addr32[i]; ++ dst_matching_addr.s6_addr32[i] = dst_addr.s6_addr32[i] & ++ netmask.s6_addr32[i]; ++ if (src_matching_addr.s6_addr32[i] != ++ dst_matching_addr.s6_addr32[i]) { ++ /* No match with the prefix mask, use default route */ ++ if (memcmp(nic_iface->ustack.default_route_addr6, ++ all_zeroes_addr6, sizeof(*addr))) { ++ memcpy(&dst_addr, ++ nic_iface->ustack.default_route_addr6, ++ sizeof(dst_addr)); ++ inet_ntop(AF_INET6, &dst_addr.s6_addr16, ++ addr_dst_str, sizeof(addr_dst_str)); ++ LOG_DEBUG(PFX "Use default router IP addr %s", ++ addr_dst_str); ++ break; ++ } else { ++ neighbor_retry = MAX_ARP_RETRY; ++ goto done; ++ } ++ } ++ } ++ ++#define MAX_ARP_RETRY 4 ++ neighbor_retry = 0; ++ ++ req_ptr.eth = (void *)mac_addr; ++ req_ptr.ipv6 = (void *)&dst_addr; ++ if (ndpc_request(&nic_iface->ustack, &req_ptr, &rc, CHECK_ARP_TABLE)) { ++ /* ndpc request failed, skip neighbor solicit send */ ++ neighbor_retry = MAX_ARP_RETRY; ++ goto done; ++ } ++ if (!rc) { ++ inet_ntop(AF_INET6, &dst_addr.s6_addr16, ++ addr_dst_str, sizeof(addr_dst_str)); ++ LOG_DEBUG(PFX ++ "%s: Preparing to send IPv6 neighbor solicitation " ++ "to dst: '%s'", nic->log_name, addr_dst_str); ++ while ((neighbor_retry < MAX_ARP_RETRY) ++ && (event_loop_stop == 0)) { ++ int count; ++ struct timespec ts; ++ struct timeval tp; ++ struct timeval tp_abs; ++ ++ LOG_INFO(PFX "%s: Didn't find IPv6: '%s'\n", ++ nic->log_name, addr_dst_str); ++ ++ rc = cnic_neigh_soliciation_send(nic, nic_iface, fd, ++ mac_addr, ++ &dst_addr, ++ addr_dst_str); ++ if (rc != 0) { ++ status = -EIO; ++ goto done; ++ } ++ ++ for (count = 0; count < 8; count++) { ++ /* Convert from timeval to timespec */ ++ rc = gettimeofday(&tp, NULL); ++ ++ timeradd(&tp, &tp_wait, &tp_abs); ++ ++ ts.tv_sec = tp_abs.tv_sec; ++ ts.tv_nsec = tp_abs.tv_usec * 1000; ++ ++ pthread_mutex_lock(&nic->nl_process_mutex); ++ rc = pthread_cond_timedwait ++ (&nic->nl_process_if_down_cond, ++ &nic->nl_process_mutex, &ts); ++ ++ if (rc == ETIMEDOUT) { ++ pthread_mutex_unlock ++ (&nic->nl_process_mutex); ++ ++ req_ptr.eth = (void *)mac_addr; ++ req_ptr.ipv6 = (void *)&dst_addr; ++ if (ndpc_request ++ (&nic_iface->ustack, &req_ptr, &rc, ++ CHECK_ARP_TABLE)) { ++ /* ndpc request failed, ++ force retry */ ++ rc = 0; ++ } ++ if (rc) ++ goto done; ++ } else { ++ nic->nl_process_if_down = 0; ++ pthread_mutex_unlock ++ (&nic->nl_process_mutex); ++ ++ neighbor_retry = MAX_ARP_RETRY; ++ goto done; ++ } ++ } ++ neighbor_retry++; ++ } ++ } ++ ++done: ++ if (neighbor_retry >= MAX_ARP_RETRY) { ++ status = -EIO; ++ rc = -EIO; ++ } ++ ++ if (status != 0 || rc != 0) ++ pthread_mutex_unlock(&nic->xmit_mutex); ++ ++ cnic_nl_neigh_rsp(nic, fd, ev, path, mac_addr, ++ nic_iface, status, AF_INET6); ++ return rc; ++} ++ ++/** ++ * cnic_handle_iscsi_path_req() - This function will handle the path req calls ++ * the bnx2i kernel module ++ * @param nic - The nic the message is directed towards ++ * @param fd - The file descriptor to be used to extract the private data ++ * @param ev - The iscsi_uevent ++ * @param path - The private message buffer ++ * @param nic_iface - The nic_iface to use for this connection request ++ */ ++int cnic_handle_iscsi_path_req(nic_t *nic, int fd, struct iscsi_uevent *ev, ++ struct iscsi_path *path, ++ nic_interface_t *nic_iface) ++{ ++ ++ LOG_DEBUG(PFX "%s: Netlink message with VLAN ID: %d, path MTU: %d " ++ "minor: %d ip_addr_len: %d", ++ nic->log_name, path->vlan_id, path->pmtu, 0 /* TODO FIX */ , ++ path->ip_addr_len); ++ ++ if (path->ip_addr_len == 4) ++ return cnic_handle_ipv4_iscsi_path_req(nic, fd, ev, path, ++ nic_iface); ++ else if (path->ip_addr_len == 16) ++ return cnic_handle_ipv6_iscsi_path_req(nic, fd, ev, path, ++ nic_iface); ++ else { ++ LOG_DEBUG(PFX "%s: unknown ip_addr_len: %d size dropping ", ++ nic->log_name, path->ip_addr_len); ++ return -EIO; ++ } ++} +diff --git a/iscsiuio/src/unix/libs/cnic.h b/iscsiuio/src/unix/libs/cnic.h +new file mode 100644 +index 0000000..6244a94 +--- /dev/null ++++ b/iscsiuio/src/unix/libs/cnic.h +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * cnic.h - CNIC UIO uIP user space stack ++ * ++ */ ++#ifndef __CNIC_NL_H__ ++#define __CNIC_NL_H__ ++ ++/******************************************************************************* ++ * Constants shared between the bnx2 and bnx2x modules ++ ******************************************************************************/ ++extern const char bnx2i_library_transport_name[]; ++extern const size_t bnx2i_library_transport_name_size; ++ ++int cnic_nl_open(); ++void cnic_nl_close(); ++ ++int cnic_handle_iscsi_path_req(nic_t *nic, int, struct iscsi_uevent *, ++ struct iscsi_path *path, ++ nic_interface_t *nic_iface); ++ ++#endif /* __CNIC_NL_H__ */ +diff --git a/iscsiuio/src/unix/logger.c b/iscsiuio/src/unix/logger.c +new file mode 100644 +index 0000000..d41f9e8 +--- /dev/null ++++ b/iscsiuio/src/unix/logger.c +@@ -0,0 +1,181 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * logger.c - Logging Utilities ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++ ++#include "options.h" ++#include "logger.h" ++ ++/****************************************************************************** ++ * Default logger values ++ ******************************************************************************/ ++static const char default_logger_filename[] = "/var/log/iscsiuio.log"; ++ ++struct logger main_log = { ++ .enabled = LOGGER_ENABLED, ++ .fp = NULL, ++ .log_file = (char *)default_logger_filename, ++ .level = LOG_LEVEL_INFO, ++ .lock = PTHREAD_MUTEX_INITIALIZER, ++ ++ .stats = { ++ .debug = 0, ++ .info = 0, ++ .warn = 0, ++ .error = 0, ++ ++ .last_log_time = 0, ++ }, ++}; ++ ++/****************************************************************************** ++ * Logger Functions ++ ******************************************************************************/ ++/** ++ * log_uip() - Main logging function ++ * @param level_str - log level string ++ * @param fmt - log format ++ */ ++void log_uip(char *level_str, char *fmt, ...) ++{ ++ char time_buf[32]; ++ va_list ap, ap2; ++ ++ pthread_mutex_lock(&main_log.lock); ++ va_start(ap, fmt); ++ ++ if (main_log.fp == NULL) ++ goto end; ++ ++ main_log.stats.last_log_time = time(NULL); ++ strftime(time_buf, 26, "%a %b %d %T %Y", ++ localtime(&main_log.stats.last_log_time)); ++ va_copy(ap2, ap); ++ ++ if (main_log.enabled == LOGGER_ENABLED) { ++ fprintf(main_log.fp, "%s [%s]", level_str, time_buf); ++ vfprintf(main_log.fp, fmt, ap); ++ fprintf(main_log.fp, "\n"); ++ } ++ ++ if (opt.debug == DEBUG_ON) { ++ fprintf(stdout, "%s [%s]", level_str, time_buf); ++ vfprintf(stdout, fmt, ap2); ++ fprintf(stdout, "\n"); ++ ++ /* Force the printing of the log file */ ++ fflush(main_log.fp); ++ ++ /* Force the printing of the log out to standard output */ ++ fflush(stdout); ++ } ++ ++end: ++ va_end(ap2); ++ va_end(ap); ++ pthread_mutex_unlock(&main_log.lock); ++} ++ ++/****************************************************************************** ++ * Initialize/Clean up routines ++ ******************************************************************************/ ++/** ++ * init_logger() - Prepare the logger ++ * @param filename - path to where the log will be written to ++ * @return 0 on success, <0 on failure ++ */ ++int init_logger(char *filename) ++{ ++ int rc = 0; ++ ++ pthread_mutex_lock(&main_log.lock); ++ ++ if (opt.debug != DEBUG_ON) { ++ rc = -EIO; ++ goto disable; ++ } ++ main_log.fp = fopen(filename, "a"); ++ if (main_log.fp == NULL) { ++ printf("Could not create log file: %s <%s>\n", ++ filename, strerror(errno)); ++ rc = -EIO; ++ } ++disable: ++ if (rc) ++ main_log.enabled = LOGGER_DISABLED; ++ else ++ main_log.enabled = LOGGER_ENABLED; ++ ++ pthread_mutex_unlock(&main_log.lock); ++ ++ if (!rc) ++ LOG_INFO("Initialize logger using log file: %s", filename); ++ ++ return rc; ++} ++ ++void fini_logger(int type) ++{ ++ pthread_mutex_lock(&main_log.lock); ++ ++ if (main_log.fp != NULL) { ++ fclose(main_log.fp); ++ main_log.fp = NULL; ++ ++ if (opt.debug == DEBUG_ON) { ++ printf("Closed logger\n"); ++ fflush(stdout); ++ } ++ } ++ ++ if (type == SHUTDOWN_LOGGER) { ++ if ((main_log.log_file != NULL) && ++ (main_log.log_file != default_logger_filename)) { ++ free(main_log.log_file); ++ main_log.log_file = NULL; ++ } ++ } ++ ++ main_log.enabled = LOGGER_DISABLED; ++ ++ pthread_mutex_unlock(&main_log.lock); ++} +diff --git a/iscsiuio/src/unix/logger.h b/iscsiuio/src/unix/logger.h +new file mode 100644 +index 0000000..06e2084 +--- /dev/null ++++ b/iscsiuio/src/unix/logger.h +@@ -0,0 +1,129 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * logger.h - Logging Utilities ++ * ++ */ ++#ifndef __LOGGER_H__ ++#define __LOGGER_H__ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/******************************************************************************* ++ * Logger Levels ++ ******************************************************************************/ ++#define LOG_LEVEL_PACKET 5 ++#define LOG_LEVEL_DEBUG 4 ++#define LOG_LEVEL_INFO 3 ++#define LOG_LEVEL_WARN 2 ++#define LOG_LEVEL_ERR 1 ++#define LOG_LEVEL_UNKNOWN 0 ++ ++#define LOG_LEVEL_PACKET_STR "PKT " ++#define LOG_LEVEL_DEBUG_STR "DBG " ++#define LOG_LEVEL_INFO_STR "INFO " ++#define LOG_LEVEL_WARN_STR "WARN " ++#define LOG_LEVEL_ERR_STR "ERR " ++#define LOG_LEVEL_UNKNOWN_STR "? " ++ ++/******************************************************************************* ++ * Logging Macro's ++ ******************************************************************************/ ++#define LOG_PACKET(fmt, args...) { if (LOG_LEVEL_PACKET <= \ ++ main_log.level) { \ ++ log_uip(LOG_LEVEL_PACKET_STR, fmt,\ ++ ##args);\ ++ } } ++#define LOG_DEBUG(fmt, args...) { if (LOG_LEVEL_DEBUG <= main_log.level) { \ ++ log_uip(LOG_LEVEL_DEBUG_STR, fmt,\ ++ ##args);\ ++ } } ++ ++#define LOG_INFO(fmt, args...) { if (LOG_LEVEL_INFO <= main_log.level) { \ ++ log_uip(LOG_LEVEL_INFO_STR, fmt,\ ++ ##args); \ ++ } } ++#define LOG_WARN(fmt, args...) { if (LOG_LEVEL_WARN <= main_log.level) { \ ++ log_uip(LOG_LEVEL_WARN_STR, fmt,\ ++ ##args); \ ++ } } ++#define LOG_ERR(fmt, args...) { if (LOG_LEVEL_ERR <= main_log.level) { \ ++ log_uip(LOG_LEVEL_ERR_STR, fmt,\ ++ ##args); \ ++ } } ++ ++/******************************************************************************* ++ * Logging Statistics ++ ******************************************************************************/ ++struct logger_stats { ++ uint64_t debug; ++ uint64_t info; ++ uint64_t warn; ++ uint64_t error; ++ ++ time_t last_log_time; ++}; ++ ++/******************************************************************************* ++ * Logger Structure ++ ******************************************************************************/ ++struct logger { ++ FILE *fp; ++ char *log_file; ++ int8_t level; ++ ++#define LOGGER_ENABLED 0x01 ++#define LOGGER_DISABLED 0x02 ++ int8_t enabled; ++ ++ pthread_mutex_t lock; ++ ++ struct logger_stats stats; ++}; ++ ++extern struct logger main_log; ++ ++int init_logger(char *); ++void log_uip(char *level_str, char *fmt, ...); ++void fini_logger(int); ++ ++#define CLOSE_LOGGER 0x01 ++#define SHUTDOWN_LOGGER 0x02 ++ ++#endif +diff --git a/iscsiuio/src/unix/main.c b/iscsiuio/src/unix/main.c +new file mode 100644 +index 0000000..c1a72d8 +--- /dev/null ++++ b/iscsiuio/src/unix/main.c +@@ -0,0 +1,399 @@ ++/* ++ * Copyright (c) 2001, Adam Dunkels. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * This file is part of the uIP TCP/IP stack. ++ * ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "uip.h" ++#include "uip_arp.h" ++#include "uip_eth.h" ++ ++#include "timer.h" ++ ++#include "build_date.h" ++#include "config.h" ++#include "iscsid_ipc.h" ++#include "logger.h" ++#include "nic.h" ++#include "nic_id.h" ++#include "nic_nl.h" ++#include "nic_utils.h" ++#include "options.h" ++#include "packet.h" ++ ++#include "dhcpc.h" ++ ++#include "iscsid_ipc.h" ++#include "brcm_iscsi.h" ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define PFX "main " ++ ++static const char default_pid_filepath[] = "/var/run/iscsiuio.pid"; ++ ++/******************************************************************************* ++ * Global Variables ++ ******************************************************************************/ ++static const struct option long_options[] = { ++ {"debug", 0, 0, 0}, ++ {"version", 0, 0, 0}, ++ {"help", 0, 0, 0}, ++ {0, 0, 0, 0} ++}; ++ ++struct options opt = { ++ .debug = DEBUG_OFF, ++}; ++ ++int event_loop_stop; ++extern nic_t *nic_list; ++ ++struct utsname cur_utsname; ++ ++/** ++ * cleanup() - This function is called when this program is to be closed ++ * This function will clean up all the cnic uio interfaces and ++ * flush/close the logger ++ */ ++static void cleanup() ++{ ++ iscsid_cleanup(); ++ ++ nic_remove_all(); ++ ++ unload_all_nic_libraries(); ++ ++ LOG_INFO("Done waiting for cnic's/stacks to gracefully close"); ++ ++ fini_logger(SHUTDOWN_LOGGER); ++} ++ ++/** ++ * signal_handle_thread() - This is the signal handling thread of this program ++ * This is the only thread which will handle signals. ++ * All signals are routed here and handled here to ++ * provide consistant handling. ++ */ ++static pthread_t signal_thread; ++static void *signal_handle_thread(void *arg) ++{ ++ sigset_t set; ++ int rc; ++ int signal; ++ ++ sigfillset(&set); ++ ++ LOG_INFO("signal handling thread ready"); ++ ++signal_wait: ++ rc = sigwait(&set, &signal); ++ ++ switch (signal) { ++ case SIGINT: ++ LOG_INFO("Caught SIGINT signal"); ++ break; ++ case SIGUSR1: ++ LOG_INFO("Caught SIGUSR1 signal, rotate log"); ++ fini_logger(SHUTDOWN_LOGGER); ++ rc = init_logger(main_log.log_file); ++ if (rc != 0) ++ printf("Could not initialize the logger in " ++ "signal!\n"); ++ goto signal_wait; ++ default: ++ break; ++ } ++ event_loop_stop = 1; ++ ++ LOG_INFO("terminating..."); ++ ++ cleanup(); ++ exit(EXIT_SUCCESS); ++} ++ ++static void show_version() ++{ ++ printf("%s: Version '%s', Build Date: '%s'\n", ++ APP_NAME, PACKAGE_VERSION, build_date); ++} ++ ++static void main_usage() ++{ ++ show_version(); ++ ++ printf("\nUsage: %s [OPTION]\n", APP_NAME); ++ printf("iscsiuio daemon.\n" ++ "-f, --foreground make the program run in the foreground\n" ++ "-d, --debug debuglevel print debugging information\n" ++ "-p, --pid=pidfile use pid file (default %s).\n" ++ "-h, --help display this help and exit\n" ++ "-v, --version display version and exit\n", ++ default_pid_filepath); ++} ++ ++static void daemon_init() ++{ ++ int fd; ++ ++ fd = open("/dev/null", O_RDWR); ++ if (fd == -1) ++ exit(-1); ++ ++ dup2(fd, 0); ++ dup2(fd, 1); ++ dup2(fd, 2); ++ setsid(); ++ chdir("/"); ++} ++ ++#define ISCSI_OOM_PATH_LEN 48 ++ ++int oom_adjust(void) ++{ ++ int fd; ++ char path[ISCSI_OOM_PATH_LEN]; ++ struct stat statb; ++ ++ if (nice(-10) < 0) ++ LOG_DEBUG("Could not increase process priority: %s", ++ strerror(errno)); ++ ++ snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_score_adj", getpid()); ++ if (stat(path, &statb)) { ++ /* older kernel so use old oom_adj file */ ++ snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_adj", ++ getpid()); ++ } ++ fd = open(path, O_WRONLY); ++ if (fd < 0) ++ return -1; ++ if (write(fd, "-16", 3) < 0) /* for 2.6.11 */ ++ LOG_DEBUG("Could not set oom score to -16: %s", ++ strerror(errno)); ++ if (write(fd, "-17", 3) < 0) /* for Andrea's patch */ ++ LOG_DEBUG("Could not set oom score to -17: %s", ++ strerror(errno)); ++ close(fd); ++ return 0; ++} ++ ++ ++/******************************************************************************* ++ * Main routine ++ ******************************************************************************/ ++int main(int argc, char *argv[]) ++{ ++ int rc; ++ sigset_t set; ++ const char *pid_file = default_pid_filepath; ++ int fd; ++ int foreground = 0; ++ pid_t pid; ++ pthread_attr_t attr; ++ ++ /* Record the start time for the user space daemon */ ++ opt.start_time = time(NULL); ++ ++ /* parse the parameters */ ++ while (1) { ++ int c, option_index; ++ ++ c = getopt_long(argc, argv, "fd:p:vh", ++ long_options, &option_index); ++ ++ if (c == -1) ++ break; ++ ++ switch (c) { ++ ++ case 'f': ++ foreground = 1; ++ break; ++ ++ /* Enable debugging mode */ ++ case 'd': ++ main_log.level = atoi(optarg); ++ opt.debug = DEBUG_ON; ++ break; ++ case 'p': ++ pid_file = optarg; ++ break; ++ case 'v': ++ show_version(); ++ exit(EXIT_SUCCESS); ++ case 'h': ++ default: ++ main_usage(); ++ exit(EXIT_SUCCESS); ++ } ++ } ++ ++ if (main_log.enabled == LOGGER_ENABLED) { ++ /* initialize the logger */ ++ rc = init_logger(main_log.log_file); ++ if (rc != 0 && opt.debug == DEBUG_ON) ++ printf("WARN: Could not initialize the logger\n"); ++ } ++ ++ LOG_INFO("Started iSCSI uio stack: Ver " PACKAGE_VERSION); ++ LOG_INFO("Build date: %s", build_date); ++ ++ if (opt.debug == DEBUG_ON) ++ LOG_INFO("Debug mode enabled"); ++ ++ event_loop_stop = 0; ++ nic_list = NULL; ++ ++ /* Determine the current kernel version */ ++ memset(&cur_utsname, 0, sizeof(cur_utsname)); ++ ++ rc = uname(&cur_utsname); ++ if (rc == 0) { ++ LOG_INFO("Running on sysname: '%s', release: '%s', " ++ "version '%s' machine: '%s'", ++ cur_utsname.sysname, cur_utsname.release, ++ cur_utsname.version, cur_utsname.machine); ++ } else ++ LOG_WARN("Could not determine kernel version"); ++ ++ /* Initialze the iscsid listener */ ++ rc = iscsid_init(); ++ if (rc != 0) ++ goto error; ++ ++ if (!foreground) { ++ char buf[64]; ++ ssize_t written_bytes; ++ ++ fd = open(pid_file, O_WRONLY | O_CREAT, 0644); ++ if (fd < 0) { ++ printf("Unable to create pid file: %s", pid_file); ++ exit(1); ++ } ++ ++ pid = fork(); ++ if (pid < 0) { ++ printf("Starting daemon failed"); ++ exit(1); ++ } else if (pid) { ++ exit(0); ++ } ++ ++ rc = chdir("/"); ++ if (rc == -1) ++ printf("Unable to chdir(\") [%s]", strerror(errno)); ++ ++ if (lockf(fd, F_TLOCK, 0) < 0) { ++ printf("Unable to lock pid file: %s [%s]", ++ pid_file, strerror(errno)); ++ exit(1); ++ } ++ ++ rc = ftruncate(fd, 0); ++ if (rc == -1) ++ printf("ftruncate(%d, 0) failed [%s]", ++ fd, strerror(errno)); ++ ++ sprintf(buf, "%d\n", getpid()); ++ written_bytes = write(fd, buf, strlen(buf)); ++ if (written_bytes == -1) ++ printf("Could not write lock file [%s]", ++ strerror(errno)); ++ ++ daemon_init(); ++ } ++ ++ /* Load the NIC libraries */ ++ rc = load_all_nic_libraries(); ++ if (rc != 0) ++ goto error; ++ ++ brcm_iscsi_init(); ++ ++ /* ensure we don't see any signals */ ++ sigemptyset(&set); ++ sigaddset(&set, SIGINT); ++ sigaddset(&set, SIGQUIT); ++ sigaddset(&set, SIGTERM); ++ sigaddset(&set, SIGUSR1); ++ rc = pthread_sigmask(SIG_SETMASK, &set, NULL); ++ ++ /* Spin off the signal handling thread */ ++ pthread_attr_init(&attr); ++ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ++ rc = pthread_create(&signal_thread, &attr, signal_handle_thread, NULL); ++ if (rc != 0) ++ LOG_ERR("Could not create signal handling thread"); ++ ++ /* Using sysfs to discover iSCSI hosts */ ++ nic_discover_iscsi_hosts(); ++ ++ /* oom-killer will not kill us at the night... */ ++ if (oom_adjust()) ++ LOG_DEBUG("Can not adjust oom-killer's pardon"); ++ ++ /* we don't want our active sessions to be paged out... */ ++ if (mlockall(MCL_CURRENT | MCL_FUTURE)) { ++ LOG_ERR("failed to mlockall, exiting..."); ++ goto error; ++ } ++ ++ /* Start the iscsid listener */ ++ rc = iscsid_start(); ++ if (rc != 0) ++ goto error; ++ ++ /* NetLink connection to listen to NETLINK_ISCSI private messages */ ++ nic_nl_open(); ++ ++error: ++ cleanup(); ++ exit(EXIT_FAILURE); ++} +diff --git a/iscsiuio/src/unix/nic.c b/iscsiuio/src/unix/nic.c +new file mode 100644 +index 0000000..38a5776 +--- /dev/null ++++ b/iscsiuio/src/unix/nic.c +@@ -0,0 +1,1533 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic.c - Generic NIC management/utility functions ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "dhcpc.h" ++#include "ipv6_ndpc.h" ++ ++#include "logger.h" ++#include "nic.h" ++#include "nic_utils.h" ++#include "options.h" ++ ++#include "uip.h" ++#include "uip_arp.h" ++#include "uip_eth.h" ++#include "uip-neighbor.h" ++ ++#include "bnx2.h" ++#include "bnx2x.h" ++#include "ipv6.h" ++ ++/****************************************************************************** ++ * Constants ++ *****************************************************************************/ ++#define PFX "nic " ++#define PCI_ANY_ID (~0) ++ ++/****************************************************************************** ++ * Global variables ++ *****************************************************************************/ ++/* Used to store a list of NIC libraries */ ++pthread_mutex_t nic_lib_list_mutex = PTHREAD_MUTEX_INITIALIZER; ++nic_lib_handle_t *nic_lib_list; ++ ++/* Used to store a list of active cnic devices */ ++pthread_mutex_t nic_list_mutex = PTHREAD_MUTEX_INITIALIZER; ++nic_t *nic_list; ++ ++/****************************************************************************** ++ * Functions to handle NIC libraries ++ *****************************************************************************/ ++/** ++ * alloc_nic_library_handle() - Used to allocate a NIC library handle ++ * @return NULL if memory couldn't be allocated, pointer to the handle ++ * to the NIC library handle ++ */ ++static nic_lib_handle_t *alloc_nic_library_handle() ++{ ++ nic_lib_handle_t *handle; ++ ++ handle = malloc(sizeof(*handle)); ++ if (handle == NULL) { ++ LOG_ERR("Could not allocate memory for library handle"); ++ return NULL; ++ } ++ ++ memset(handle, 0, sizeof(*handle)); ++ handle->ops = NULL; ++ ++ pthread_mutex_init(&handle->mutex, NULL); ++ ++ return handle; ++} ++ ++static void free_nic_library_handle(nic_lib_handle_t *handle) ++{ ++ free(handle); ++} ++ ++/** ++ * load_nic_library() - This function is used to load a NIC library ++ * @param handle - This is the library handle to load ++ * @return 0 = Success; <0 = failure ++ */ ++static int load_nic_library(nic_lib_handle_t *handle) ++{ ++ int rc; ++ char *library_name; ++ size_t library_name_size; ++ char *library_version; ++ size_t library_version_size; ++ char *build_date_str; ++ size_t build_date_str_size; ++ ++ pthread_mutex_lock(&handle->mutex); ++ ++ /* Validate the NIC ops table ensure that all the fields are not NULL */ ++ if ((handle->ops->open) == NULL || ++ (handle->ops->close) == NULL || ++ (handle->ops->read) == NULL || ++ (handle->ops->write) == NULL || ++ (handle->ops->clear_tx_intr == NULL)) { ++ LOG_ERR("Invalid NIC ops table: open: 0x%x, close: 0x%x," ++ "read: 0x%x, write: 0x%x clear_tx_intr: 0x%x " ++ "lib_ops: 0x%x", ++ handle->ops->open, handle->ops->close, ++ handle->ops->read, handle->ops->write, ++ handle->ops->clear_tx_intr, handle->ops->lib_ops); ++ rc = -EINVAL; ++ handle->ops = NULL; ++ goto error; ++ } ++ ++ /* Validate the NIC library ops table to ensure that all the proper ++ * fields are filled */ ++ if ((handle->ops->lib_ops.get_library_name == NULL) || ++ (handle->ops->lib_ops.get_pci_table == NULL) || ++ (handle->ops->lib_ops.get_library_version == NULL) || ++ (handle->ops->lib_ops.get_build_date == NULL) || ++ (handle->ops->lib_ops.get_transport_name == NULL)) { ++ rc = -EINVAL; ++ goto error; ++ } ++ ++ (*handle->ops->lib_ops.get_library_name) (&library_name, ++ &library_name_size); ++ (*handle->ops->lib_ops.get_library_version) (&library_version, ++ &library_version_size); ++ (*handle->ops->lib_ops.get_build_date) (&build_date_str, ++ &build_date_str_size); ++ ++ LOG_DEBUG("Loaded nic library '%s' Version: '%s' build on %s'", ++ library_name, library_version, build_date_str); ++ ++ pthread_mutex_unlock(&handle->mutex); ++ ++ return 0; ++ ++error: ++ pthread_mutex_unlock(&handle->mutex); ++ ++ return rc; ++} ++ ++static struct nic_ops *(*nic_get_ops[]) () = { ++bnx2_get_ops, bnx2x_get_ops,}; ++ ++int load_all_nic_libraries() ++{ ++ int rc, i = 0; ++ nic_lib_handle_t *handle; ++ ++ for (i = 0; i < sizeof(nic_get_ops) / sizeof(nic_get_ops[0]); i++) { ++ /* Add the CNIC library */ ++ handle = alloc_nic_library_handle(); ++ if (handle == NULL) { ++ LOG_ERR("Could not allocate memory for CNIC nic lib"); ++ return -ENOMEM; ++ } ++ ++ handle->ops = (*nic_get_ops[i]) (); ++ ++ rc = load_nic_library(handle); ++ if (rc != 0) { ++ free_nic_library_handle(handle); ++ return rc; ++ } ++ /* Add the CNIC library to the list of library handles */ ++ pthread_mutex_lock(&nic_lib_list_mutex); ++ ++ /* Add this library to the list of nic libraries we ++ * know about */ ++ if (nic_lib_list == NULL) { ++ nic_lib_list = handle; ++ } else { ++ nic_lib_handle_t *current = nic_lib_list; ++ ++ while (current->next != NULL) ++ current = current->next; ++ ++ current->next = handle; ++ } ++ pthread_mutex_unlock(&nic_lib_list_mutex); ++ ++ LOG_DEBUG("Added '%s' nic library", handle->ops->description); ++ } ++ ++ return rc; ++} ++ ++int unload_all_nic_libraries() ++{ ++ nic_lib_handle_t *current, *next; ++ ++ pthread_mutex_lock(&nic_lib_list_mutex); ++ current = nic_lib_list; ++ ++ while (current != NULL) { ++ next = current->next; ++ free_nic_library_handle(current); ++ ++ current = next; ++ } ++ ++ pthread_mutex_unlock(&nic_lib_list_mutex); ++ ++ nic_lib_list = NULL; ++ ++ return 0; ++} ++ ++NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name) ++{ ++ NIC_LIBRARY_EXIST_T rc; ++ nic_lib_handle_t *current; ++ ++ pthread_mutex_lock(&nic_lib_list_mutex); ++ current = nic_lib_list; ++ ++ while (current != NULL) { ++ char *uio_name; ++ size_t uio_name_size; ++ ++ (*current->ops->lib_ops.get_uio_name) (&uio_name, ++ &uio_name_size); ++ ++ if (strncmp(name, uio_name, uio_name_size) == 0) { ++ rc = NIC_LIBRARY_EXSITS; ++ goto done; ++ } ++ ++ current = current->next; ++ } ++ ++ rc = NIC_LIBRARY_DOESNT_EXIST; ++ ++done: ++ pthread_mutex_unlock(&nic_lib_list_mutex); ++ return rc; ++} ++ ++NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name) ++{ ++ NIC_LIBRARY_EXIST_T rc; ++ nic_lib_handle_t *current; ++ ++ pthread_mutex_lock(&nic_lib_list_mutex); ++ current = nic_lib_list; ++ ++ while (current != NULL) { ++ char *library_name; ++ size_t library_name_size; ++ ++ (*current->ops->lib_ops.get_library_name) (&library_name, ++ &library_name_size); ++ ++ if (strncmp(name, library_name, library_name_size) == 0) { ++ rc = NIC_LIBRARY_EXSITS; ++ goto done; ++ } ++ ++ current = current->next; ++ } ++ ++ rc = NIC_LIBRARY_DOESNT_EXIST; ++ ++done: ++ pthread_mutex_unlock(&nic_lib_list_mutex); ++ return rc; ++} ++ ++/** ++ * find_nic_lib_using_pci_id() - Find the proper NIC library using the ++ * PCI ID's ++ * @param vendor - PCI vendor ID to search on ++ * @param device - PCI device ID to search on ++ * @param subvendor - PCI subvendor ID to search on ++ * @param subdevice - PCI subdevice ID to search on ++ * @param handle - This function will return the nic lib handle if found ++ * @return 0 if found, <0 not found ++ */ ++int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device, ++ uint32_t subvendor, uint32_t subdevice, ++ nic_lib_handle_t **handle, ++ struct pci_device_id **pci_entry) ++{ ++ int rc; ++ nic_lib_handle_t *current; ++ ++ pthread_mutex_lock(&nic_lib_list_mutex); ++ current = nic_lib_list; ++ ++ while (current != NULL) { ++ struct pci_device_id *pci_table; ++ uint32_t entries; ++ int i; ++ ++ current->ops->lib_ops.get_pci_table(&pci_table, &entries); ++ ++ /* Sanity check the the pci table coming from the ++ * hardware library */ ++ if (entries > MAX_PCI_DEVICE_ENTRIES) { ++ LOG_WARN(PFX "Too many pci_table entries(%d) skipping", ++ entries); ++ continue; ++ } ++ ++ for (i = 0; i < entries; i++) { ++ LOG_DEBUG(PFX "Checking against: " ++ "vendor: 0x%x device:0x%x " ++ "subvendor:0x%x subdevice:0x%x", ++ pci_table[i].vendor, pci_table[i].device, ++ pci_table[i].subvendor, ++ pci_table[i].subdevice); ++ ++ if ((pci_table[i].vendor == vendor) && ++ (pci_table[i].device == device) && ++ (pci_table[i].subvendor == PCI_ANY_ID || ++ pci_table[i].subvendor == subvendor) && ++ (pci_table[i].subdevice == PCI_ANY_ID || ++ pci_table[i].subdevice == subdevice)) { ++ *handle = current; ++ *pci_entry = &pci_table[i]; ++ rc = 0; ++ goto done; ++ } ++ } ++ ++ current = current->next; ++ } ++ rc = -EINVAL; ++ ++done: ++ pthread_mutex_unlock(&nic_lib_list_mutex); ++ ++ return rc; ++} ++ ++/** ++ * nic_init() - This will properly initialize a struct cnic_uio device ++ * @return NULL is there is a failure and pointer to an allocated/initialized ++ * struct cnic_uio on success ++ */ ++nic_t *nic_init() ++{ ++ nic_t *nic; ++ ++ nic = malloc(sizeof(*nic)); ++ if (nic == NULL) { ++ LOG_ERR("Couldn't malloc space for nic"); ++ return NULL; ++ } ++ ++ memset(nic, 0, sizeof(*nic)); ++ nic->uio_minor = -1; ++ nic->fd = INVALID_FD; ++ nic->next = NULL; ++ nic->thread = INVALID_THREAD; ++ nic->enable_thread = INVALID_THREAD; ++ nic->flags |= NIC_DISABLED; ++ nic->state = NIC_STOPPED; ++ nic->free_packet_queue = NULL; ++ nic->tx_packet_queue = NULL; ++ nic->nic_library = NULL; ++ nic->pci_id = NULL; ++ nic->page_size = getpagesize(); ++ ++ /* nic_mutex is used to protect nic ops */ ++ pthread_mutex_init(&nic->nic_mutex, NULL); ++ pthread_mutex_init(&nic->xmit_mutex, NULL); ++ pthread_mutex_init(&nic->free_packet_queue_mutex, NULL); ++ ++ pthread_cond_init(&nic->enable_wait_cond, NULL); ++ pthread_cond_init(&nic->enable_done_cond, NULL); ++ pthread_cond_init(&nic->nic_loop_started_cond, NULL); ++ pthread_cond_init(&nic->disable_wait_cond, NULL); ++ ++ nic->rx_poll_usec = DEFAULT_RX_POLL_USEC; ++ ++ pthread_mutex_init(&nic->nl_process_mutex, NULL); ++ pthread_cond_init(&nic->nl_process_if_down_cond, NULL); ++ pthread_cond_init(&nic->nl_process_cond, NULL); ++ nic->nl_process_thread = INVALID_THREAD; ++ nic->nl_process_if_down = 0; ++ nic->nl_process_head = 0; ++ nic->nl_process_tail = 0; ++ memset(&nic->nl_process_ring, 0, sizeof(nic->nl_process_ring)); ++ ++ return nic; ++} ++ ++void nic_add(nic_t *nic) ++{ ++ /* Add this device to our list of nics */ ++ if (nic_list == NULL) { ++ nic_list = nic; ++ } else { ++ nic_t *current = nic_list; ++ ++ while (current->next != NULL) ++ current = current->next; ++ ++ current->next = nic; ++ } ++} ++ ++/** ++ * nic_remove() - Used to remove the NIC for the nic list ++ * @param nic - the nic to remove ++ */ ++int nic_remove(nic_t *nic) ++{ ++ int rc; ++ nic_t *prev, *current; ++ struct stat file_stat; ++ nic_interface_t *nic_iface, *next_nic_iface, *vlan_iface; ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ /* Check if the file node exists before closing */ ++ rc = stat(nic->uio_device_name, &file_stat); ++ if ((rc == 0) && (nic->ops)) ++ nic->ops->close(nic, 0); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ nic->state = NIC_EXIT; ++ ++ if (nic->enable_thread != INVALID_THREAD) { ++ LOG_DEBUG(PFX "%s: Canceling nic enable thread", nic->log_name); ++ ++ rc = pthread_cancel(nic->enable_thread); ++ if (rc != 0) ++ LOG_DEBUG(PFX "%s: Couldn't send cancel to nic enable " ++ "thread", nic->log_name); ++ ++ nic->enable_thread = INVALID_THREAD; ++ LOG_DEBUG(PFX "%s: nic enable thread cleaned", nic->log_name); ++ } else { ++ LOG_DEBUG(PFX "%s: NIC enable thread already canceled", ++ nic->log_name); ++ } ++ ++ if (nic->thread != INVALID_THREAD) { ++ LOG_DEBUG(PFX "%s: Canceling nic thread", nic->log_name); ++ ++ rc = pthread_cancel(nic->thread); ++ if (rc != 0) ++ LOG_DEBUG(PFX "%s: Couldn't send cancel to nic", ++ nic->log_name); ++ ++ nic->thread = INVALID_THREAD; ++ LOG_DEBUG(PFX "%s: nic thread cleaned", nic->log_name); ++ } else { ++ LOG_DEBUG(PFX "%s: NIC thread already canceled", nic->log_name); ++ } ++ ++ if (nic->nl_process_thread != INVALID_THREAD) { ++ LOG_DEBUG(PFX "%s: Canceling nic nl thread", nic->log_name); ++ ++ rc = pthread_cancel(nic->nl_process_thread); ++ if (rc != 0) ++ LOG_DEBUG(PFX "%s: Couldn't send cancel to nic nl " ++ "thread", nic->log_name); ++ ++ nic->nl_process_thread = INVALID_THREAD; ++ LOG_DEBUG(PFX "%s: nic nl thread cleaned", nic->log_name); ++ } else { ++ LOG_DEBUG(PFX "%s: NIC nl thread already canceled", ++ nic->log_name); ++ } ++ ++ current = prev = nic_list; ++ while (current != NULL) { ++ if (current == nic) ++ break; ++ ++ prev = current; ++ current = current->next; ++ } ++ ++ if (current != NULL) { ++ if (current == nic_list) ++ nic_list = current->next; ++ else ++ prev->next = current->next; ++ ++ /* Before freeing the nic, must free all the associated ++ nic_iface */ ++ nic_iface = current->nic_iface; ++ while (nic_iface != NULL) { ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface != NULL) { ++ next_nic_iface = vlan_iface->vlan_next; ++ free(vlan_iface); ++ vlan_iface = next_nic_iface; ++ } ++ next_nic_iface = nic_iface->next; ++ free(nic_iface); ++ nic_iface = next_nic_iface; ++ } ++ free(nic); ++ } else { ++ LOG_ERR(PFX "%s: Couldn't find nic to remove", nic->log_name); ++ } ++ ++ return 0; ++} ++ ++/** ++ * nic_close() - Used to indicate to a NIC that it should close ++ * Must be called with nic->nic_mutex ++ * @param nic - the nic to close ++ * @param graceful - ALLOW_GRACEFUL_SHUTDOWN will check the nic state ++ * before proceeding to close() ++ * FORCE_SHUTDOWN will force the nic to close() ++ * reguardless of the state ++ * @param clean - this will free the proper strings assoicated ++ * with the NIC ++ * ++ */ ++void nic_close(nic_t *nic, NIC_SHUTDOWN_T graceful, int clean) ++{ ++ int rc; ++ nic_interface_t *nic_iface, *vlan_iface; ++ struct stat file_stat; ++ ++ /* The NIC could be configured by the uIP config file ++ * but not assoicated with a hardware library just yet ++ * we will need to check for this */ ++ if (nic->ops == NULL) { ++ LOG_WARN(PFX "%s: when closing nic->ops == NULL", ++ nic->log_name); ++ goto error; ++ } ++ ++ /* Check if the file node exists */ ++ rc = stat(nic->uio_device_name, &file_stat); ++ if ((rc == 0) && (nic->ops)) ++ rc = (*nic->ops->close) (nic, graceful); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not close nic", nic->log_name); ++ } else { ++ nic->state = NIC_STOPPED; ++ nic->flags &= ~NIC_ENABLED; ++ nic->flags |= NIC_DISABLED; ++ } ++ ++ nic_iface = nic->nic_iface; ++ while (nic_iface != NULL) { ++ if (!((nic_iface->flags & NIC_IFACE_PERSIST) == ++ NIC_IFACE_PERSIST)) { ++ uip_reset(&nic_iface->ustack); ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface != NULL) { ++ uip_reset(&vlan_iface->ustack); ++ vlan_iface = vlan_iface->vlan_next; ++ } ++ } ++ nic_iface = nic_iface->next; ++ } ++ ++ /* The NIC must be destroyed and init'ed once again, ++ * POSIX defines that the mutex will be undefined it ++ * init'ed twice without a destroy */ ++ pthread_mutex_destroy(&nic->xmit_mutex); ++ pthread_mutex_init(&nic->xmit_mutex, NULL); ++ ++ if (clean & FREE_CONFIG_NAME) { ++ /* Free any named strings we might be holding onto */ ++ if (nic->flags & NIC_CONFIG_NAME_MALLOC) { ++ free(nic->config_device_name); ++ nic->flags &= ~NIC_CONFIG_NAME_MALLOC; ++ } ++ nic->config_device_name = NULL; ++ } ++ ++ if (clean & FREE_UIO_NAME) { ++ if (nic->flags & NIC_UIO_NAME_MALLOC) { ++ free(nic->uio_device_name); ++ nic->uio_device_name = NULL; ++ ++ nic->flags &= ~NIC_UIO_NAME_MALLOC; ++ } ++ } ++ ++ LOG_ERR(PFX "%s: nic closed", nic->log_name); ++error: ++ return; ++} ++ ++/** ++ * nic_iface_init() - This function is used to add an interface to the ++ * structure cnic_uio ++ * @return 0 on success, <0 on failure ++ */ ++nic_interface_t *nic_iface_init() ++{ ++ nic_interface_t *nic_iface = malloc(sizeof(*nic_iface)); ++ if (nic_iface == NULL) { ++ LOG_ERR("Could not allocate space for nic iface"); ++ return NULL; ++ } ++ ++ memset(nic_iface, 0, sizeof(*nic_iface)); ++ nic_iface->next = NULL; ++ nic_iface->vlan_next = NULL; ++ nic_iface->iface_num = IFACE_NUM_INVALID; ++ nic_iface->request_type = IP_CONFIG_OFF; ++ ++ return nic_iface; ++} ++ ++/** ++ * nic_add_nic_iface() - This function is used to add an interface to the ++ * nic structure ++ * Called with nic_mutex held ++ * @param nic - struct nic device to add the interface to ++ * @param nic_iface - network interface used to add to the nic ++ * @return 0 on success, <0 on failure ++ */ ++int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface) ++{ ++ nic_interface_t *current, *prev; ++ ++ /* Make sure it doesn't already exist */ ++ current = nic_find_nic_iface(nic, nic_iface->protocol, ++ nic_iface->vlan_id, nic_iface->iface_num, ++ nic_iface->request_type); ++ if (current) { ++ LOG_DEBUG(PFX "%s: nic interface for VLAN: %d, protocol: %d" ++ " already exist", nic->log_name, nic_iface->vlan_id, ++ nic_iface->protocol); ++ return 0; ++ } ++ ++ prev = NULL; ++ current = nic->nic_iface; ++ while (current != NULL) { ++ if (current->protocol == nic_iface->protocol) { ++ /* Replace parent */ ++ nic_iface->vlan_next = current; ++ nic_iface->next = current->next; ++ current->next = NULL; ++ if (prev) ++ prev->next = nic_iface; ++ else ++ nic->nic_iface = nic_iface; ++ goto done; ++ } ++ prev = current; ++ current = current->next; ++ } ++ nic_iface->next = nic->nic_iface; ++ nic->nic_iface = nic_iface; ++done: ++ /* Set nic_interface common fields */ ++ nic_iface->parent = nic; ++ memcpy(&nic_iface->ustack.uip_ethaddr.addr, nic->mac_addr, ETH_ALEN); ++ nic->num_of_nic_iface++; ++ ++ LOG_INFO(PFX "%s: Added nic interface for VLAN: %d, protocol: %d", ++ nic->log_name, nic_iface->vlan_id, nic_iface->protocol); ++ ++ return 0; ++} ++ ++/****************************************************************************** ++ * Routine to process interrupts from the NIC device ++ ******************************************************************************/ ++/** ++ * nic_process_intr() - Routine used to process interrupts from the hardware ++ * @param nic - NIC hardware to process the interrupt on ++ * @return 0 on success, <0 on failure ++ */ ++int nic_process_intr(nic_t *nic, int discard_check) ++{ ++ fd_set fdset; ++ int ret; ++ int count; ++ struct timeval tv; ++ ++ /* Simple sanity checks */ ++ if (discard_check != 1 && nic->state != NIC_RUNNING) { ++ LOG_ERR(PFX "%s: Couldn't process interupt NIC not running", ++ nic->log_name); ++ return -EBUSY; ++ } ++ ++ if (discard_check != 1 && nic->fd == INVALID_FD) { ++ LOG_ERR(PFX "%s: NIC fd not valid", nic->log_name); ++ return -EIO; ++ } ++ ++ FD_ZERO(&fdset); ++ FD_SET(nic->fd, &fdset); ++ ++ tv.tv_sec = 0; ++ pthread_mutex_lock(&nic->nic_mutex); ++ if (nic->flags & NIC_LONG_SLEEP) ++ tv.tv_usec = 1000; ++ else ++ tv.tv_usec = nic->rx_poll_usec; ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ /* Wait for an interrupt to come in or timeout */ ++ ret = select(nic->fd + 1, &fdset, NULL, NULL, &tv); ++ switch (ret) { ++ case 1: ++ /* Usually there should only be one file descriptor ready ++ * to read */ ++ break; ++ case 0: ++ return ret; ++ case -1: ++ LOG_ERR(PFX "%s: error waiting for interrupt: %s", ++ nic->log_name, strerror(errno)); ++ return 0; ++ default: ++ LOG_ERR(PFX "%s: unknown number of FD's, ignoring: %d ret", ++ nic->log_name, ret); ++ return 0; ++ } ++ ++ ret = read(nic->fd, &count, sizeof(count)); ++ pthread_mutex_lock(&nic->nic_mutex); ++ if (ret > 0) { ++ nic->stats.interrupts++; ++ LOG_PACKET(PFX "%s: interrupt count: %d prev: %d", ++ nic->log_name, count, nic->intr_count); ++ ++ if (count == nic->intr_count) { ++ LOG_PACKET(PFX "%s: got interrupt but count still the " ++ "same", nic->log_name, count); ++ } ++ ++ /* Check if we missed an interrupt. With UIO, ++ * the count should be incremental */ ++ if (count != nic->intr_count + 1) { ++ nic->stats.missed_interrupts++; ++ LOG_PACKET(PFX "%s: Missed interrupt! on %d not %d", ++ nic->log_name, count, nic->intr_count); ++ } ++ ++ nic->intr_count = count; ++ ++ (*nic->ops->clear_tx_intr) (nic); ++ ret = 1; ++ } ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ return ret; ++} ++ ++static void prepare_ipv4_packet(nic_t *nic, ++ nic_interface_t *nic_iface, ++ struct uip_stack *ustack, packet_t *pkt) ++{ ++ u16_t ipaddr[2]; ++ arp_table_query_t arp_query; ++ dest_ipv4_addr_t dest_ipv4_addr; ++ struct arp_entry *tabptr; ++ int queue_rc; ++ int vlan_id = 0; ++ ++ /* If the rx vlan tag is not stripped and vlan is present in the pkt, ++ manual stripping is required because tx is using hw vlan tag! */ ++ if (pkt->network_layer == pkt->data_link_layer + ++ sizeof(struct uip_vlan_eth_hdr)) { ++ /* VLAN is detected in the pkt buf */ ++ memcpy(pkt->data_link_layer + 12, pkt->network_layer - 2, ++ pkt->buf_size - sizeof(struct uip_vlan_eth_hdr) + 2); ++ } ++ dest_ipv4_addr = uip_determine_dest_ipv4_addr(ustack, ipaddr); ++ if (dest_ipv4_addr == LOCAL_BROADCAST) { ++ uip_build_eth_header(ustack, ipaddr, NULL, pkt, vlan_id); ++ return; ++ } ++ ++ arp_query = is_in_arp_table(ipaddr, &tabptr); ++ ++ switch (arp_query) { ++ case IS_IN_ARP_TABLE: ++ uip_build_eth_header(ustack, ++ ipaddr, tabptr, pkt, vlan_id); ++ break; ++ case NOT_IN_ARP_TABLE: ++ queue_rc = nic_queue_tx_packet(nic, nic_iface, pkt); ++ if (queue_rc) { ++ LOG_ERR("could not queue TX packet: %d", queue_rc); ++ } else { ++ uip_build_arp_request(ustack, ipaddr); ++ } ++ break; ++ default: ++ LOG_ERR("Unknown arp state"); ++ break; ++ } ++} ++ ++static void prepare_ipv6_packet(nic_t *nic, ++ nic_interface_t *nic_iface, ++ struct uip_stack *ustack, packet_t *pkt) ++{ ++ struct uip_eth_hdr *eth; ++ struct uip_vlan_eth_hdr *eth_vlan; ++ int vlan_id = 0; ++ ++ if (pkt->network_layer == pkt->data_link_layer + ++ sizeof(struct uip_vlan_eth_hdr)) { ++ /* VLAN is detected in the pkt buf */ ++ memcpy(pkt->data_link_layer + 12, pkt->network_layer - 2, ++ pkt->buf_size - sizeof(struct uip_vlan_eth_hdr) + 2); ++ } ++ eth = (struct uip_eth_hdr *)ustack->data_link_layer; ++ eth_vlan = (struct uip_vlan_eth_hdr *)ustack->data_link_layer; ++ if (vlan_id == 0) { ++ eth->type = htons(UIP_ETHTYPE_IPv6); ++ } else { ++ eth_vlan->tpid = htons(UIP_ETHTYPE_8021Q); ++ eth_vlan->vid = htons(vlan_id); ++ eth_vlan->type = htons(UIP_ETHTYPE_IPv6); ++ } ++} ++ ++static void prepare_ustack(nic_t *nic, ++ nic_interface_t *nic_iface, ++ struct uip_stack *ustack, struct packet *pkt) ++{ ++ struct ether_header *eth = NULL; ++ ustack->uip_buf = pkt->buf; ++ ustack->uip_len = pkt->buf_size; ++ ++ pkt->nic = nic; ++ pkt->nic_iface = nic_iface; ++ ++ ustack->data_link_layer = pkt->buf; ++ /* Adjust the network layer pointer depending if ++ * there is a VLAN tag or not, or if the hardware ++ * has stripped out the ++ * VLAN tag */ ++ ustack->network_layer = ustack->data_link_layer + ++ sizeof(struct uip_eth_hdr); ++ /* Init buffer to be IPv6 */ ++ if (nic_iface->ustack.ip_config == IPV6_CONFIG_DHCP || ++ nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) { ++ eth = (struct ether_header *)ustack->data_link_layer; ++ eth->ether_type = htons(UIP_ETHTYPE_IPv6); ++ } ++} ++ ++int do_timers_per_nic_iface(nic_t *nic, nic_interface_t *nic_iface, ++ struct timer *arp_timer) ++{ ++ packet_t *pkt; ++ struct uip_stack *ustack = &nic_iface->ustack; ++ int i; ++ ++ pkt = get_next_free_packet(nic); ++ if (pkt == NULL) ++ return -EIO; ++ ++ if (nic_iface->protocol == AF_INET) { ++ for (i = 0; i < UIP_UDP_CONNS; i++) { ++ prepare_ustack(nic, nic_iface, ustack, pkt); ++ ++ uip_udp_periodic(ustack, i); ++ /* If the above function invocation resulted ++ * in data that should be sent out on the ++ * network, the global variable uip_len is ++ * set to a value > 0. */ ++ if (ustack->uip_len > 0) { ++ pkt->buf_size = ustack->uip_len; ++ ++ prepare_ipv4_packet(nic, nic_iface, ustack, ++ pkt); ++ ++ (*nic->ops->write) (nic, nic_iface, pkt); ++ ustack->uip_len = 0; ++ } ++ } ++ } else { ++ /* Added periodic poll for IPv6 NDP engine */ ++ if (ustack->ndpc != NULL) { /* If engine is active */ ++ prepare_ustack(nic, nic_iface, ustack, pkt); ++ ++ uip_ndp_periodic(ustack); ++ /* If the above function invocation resulted ++ * in data that should be sent out on the ++ * network, the global variable uip_len is ++ * set to a value > 0. */ ++ if (ustack->uip_len > 0) { ++ pkt->buf_size = ustack->uip_len; ++ prepare_ipv6_packet(nic, nic_iface, ustack, ++ pkt); ++ (*nic->ops->write) (nic, nic_iface, pkt); ++ ustack->uip_len = 0; ++ } ++ } ++ } ++ /* Call the ARP timer function every 10 seconds. */ ++ if (timer_expired(arp_timer)) { ++ timer_reset(arp_timer); ++ uip_arp_timer(); ++ } ++ put_packet_in_free_queue(pkt, nic); ++ return 0; ++} ++ ++static int check_timers(nic_t *nic, ++ struct timer *periodic_timer, struct timer *arp_timer) ++{ ++ if (timer_expired(periodic_timer)) { ++ nic_interface_t *nic_iface, *vlan_iface; ++ ++ timer_reset(periodic_timer); ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ nic_iface = nic->nic_iface; ++ while (nic_iface != NULL) { ++ do_timers_per_nic_iface(nic, nic_iface, arp_timer); ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface != NULL) { ++ do_timers_per_nic_iface(nic, vlan_iface, ++ arp_timer); ++ vlan_iface = vlan_iface->vlan_next; ++ } ++ nic_iface = nic_iface->next; ++ } ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ } ++ return 0; ++} ++ ++int process_packets(nic_t *nic, ++ struct timer *periodic_timer, ++ struct timer *arp_timer, nic_interface_t *nic_iface) ++{ ++ int rc; ++ packet_t *pkt; ++ ++ pkt = get_next_free_packet(nic); ++ if (pkt == NULL) { ++ LOG_DEBUG(PFX "%s: Couldn't get buffer for processing packet", ++ nic->log_name); ++ return -ENOMEM; ++ } ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ rc = (*nic->ops->read) (nic, pkt); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ if ((rc != 0) && (pkt->buf_size > 0)) { ++ uint16_t type = 0; ++ int af_type = 0; ++ struct uip_stack *ustack; ++ uint16_t vlan_id; ++ ++ pkt->data_link_layer = pkt->buf; ++ ++ vlan_id = pkt->vlan_tag & 0xFFF; ++ if ((vlan_id == 0) || ++ (NIC_VLAN_STRIP_ENABLED & nic->flags)) { ++ struct uip_eth_hdr *hdr = ETH_BUF(pkt->buf); ++ type = ntohs(hdr->type); ++ pkt->network_layer = pkt->data_link_layer + ++ sizeof(struct uip_eth_hdr); ++ } else { ++ struct uip_vlan_eth_hdr *hdr = VLAN_ETH_BUF(pkt->buf); ++ type = ntohs(hdr->type); ++ pkt->network_layer = pkt->data_link_layer + ++ sizeof(struct uip_vlan_eth_hdr); ++ } ++ ++ switch (type) { ++ case UIP_ETHTYPE_IPv6: ++ af_type = AF_INET6; ++ break; ++ case UIP_ETHTYPE_IPv4: ++ case UIP_ETHTYPE_ARP: ++ af_type = AF_INET; ++ break; ++ default: ++ LOG_PACKET(PFX "%s: Ignoring vlan:0x%x ethertype:0x%x", ++ nic->log_name, vlan_id, type); ++ goto done; ++ } ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ /* check if we have the given VLAN interface */ ++ if (nic_iface != NULL) { ++ if (vlan_id != nic_iface->vlan_id) { ++ /* Matching nic_iface not found, drop */ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ rc = EINVAL; /* Return the +error code */ ++ goto done; ++ } ++ goto nic_iface_present; ++ } ++ ++ /* Best effort to find the correct instance ++ Input: protocol and vlan_tag */ ++ nic_iface = nic_find_nic_iface(nic, af_type, vlan_id, ++ IFACE_NUM_INVALID, ++ IP_CONFIG_OFF); ++ if (nic_iface == NULL) { ++ /* Matching nic_iface not found */ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ LOG_PACKET(PFX "%s: Couldn't find interface for " ++ "VLAN: %d af_type %d", ++ nic->log_name, vlan_id, af_type); ++ rc = EINVAL; /* Return the +error code */ ++ goto done; ++ } ++nic_iface_present: ++ pkt->nic_iface = nic_iface; ++ ++ ustack = &nic_iface->ustack; ++ ++ ustack->uip_buf = pkt->buf; ++ ustack->uip_len = pkt->buf_size; ++ ustack->data_link_layer = pkt->buf; ++ ++ /* Adjust the network layer pointer depending if there is a ++ * VLAN tag or not, or if the hardware has stripped out the ++ * VLAN tag */ ++ if ((vlan_id == 0) || ++ (NIC_VLAN_STRIP_ENABLED & nic->flags)) ++ ustack->network_layer = ustack->data_link_layer + ++ sizeof(struct uip_eth_hdr); ++ else ++ ustack->network_layer = ustack->data_link_layer + ++ sizeof(struct uip_vlan_eth_hdr); ++ ++ /* determine how we should process this packet based on the ++ * ethernet type */ ++ switch (type) { ++ case UIP_ETHTYPE_IPv6: ++ uip_input(ustack); ++ if (ustack->uip_len > 0) { ++ /* The pkt generated has already consulted ++ the IPv6 ARP table */ ++ pkt->buf_size = ustack->uip_len; ++ prepare_ipv6_packet(nic, nic_iface, ++ ustack, pkt); ++ ++ (*nic->ops->write) (nic, nic_iface, pkt); ++ } ++ break; ++ case UIP_ETHTYPE_IPv4: ++ uip_arp_ipin(ustack, pkt); ++ uip_input(ustack); ++ /* If the above function invocation resulted ++ * in data that should be sent out on the ++ * network, the global variable uip_len is ++ * set to a value > 0. */ ++ if (ustack->uip_len > 0) { ++ prepare_ipv4_packet(nic, nic_iface, ++ ustack, pkt); ++ ++ (*nic->ops->write) (nic, nic_iface, pkt); ++ } ++ ++ break; ++ case UIP_ETHTYPE_ARP: ++ uip_arp_arpin(nic_iface, ustack, pkt); ++ ++ /* If the above function invocation resulted ++ * in data that should be sent out on the ++ * network, the global variable uip_len ++ * is set to a value > 0. */ ++ if (pkt->buf_size > 0) ++ (*nic->ops->write) (nic, nic_iface, pkt); ++ break; ++ } ++ ustack->uip_len = 0; ++ pthread_mutex_unlock(&nic->nic_mutex); ++ } ++ ++done: ++ put_packet_in_free_queue(pkt, nic); ++ ++ return rc; ++} ++ ++static int process_dhcp_loop(nic_t *nic, ++ nic_interface_t *nic_iface, ++ struct timer *periodic_timer, ++ struct timer *arp_timer) ++{ ++ struct dhcpc_state *s; ++ struct ndpc_state *n; ++ int rc; ++ struct timeval start_time; ++ struct timeval current_time; ++ struct timeval wait_time; ++ struct timeval total_time; ++ ++ /* 10s loop time to wait for DHCP */ ++ switch (nic_iface->ustack.ip_config) { ++ case IPV4_CONFIG_DHCP: ++ wait_time.tv_sec = 10; ++ break; ++ case IPV6_CONFIG_DHCP: ++ wait_time.tv_sec = 15; ++ break; ++ case IPV6_CONFIG_STATIC: ++ wait_time.tv_sec = 4; ++ break; ++ default: ++ wait_time.tv_sec = 2; ++ } ++ wait_time.tv_usec = 0; ++ ++ s = nic_iface->ustack.dhcpc; ++ n = nic_iface->ustack.ndpc; ++ ++ if (gettimeofday(&start_time, NULL)) { ++ LOG_ERR(PFX "%s: Couldn't get time of day to start DHCP timer", ++ nic->log_name); ++ return -EIO; ++ } ++ ++ timeradd(&start_time, &wait_time, &total_time); ++ ++ periodic_timer->start = periodic_timer->start - ++ periodic_timer->interval; ++ ++ while ((event_loop_stop == 0) && ++ (nic->flags & NIC_ENABLED) && !(nic->flags & NIC_GOING_DOWN)) { ++ ++ if (nic_iface->ustack.ip_config == IPV4_CONFIG_DHCP) { ++ if (s->state == STATE_CONFIG_RECEIVED) ++ break; ++ } ++ if (nic_iface->ustack.ip_config == IPV6_CONFIG_DHCP || ++ nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) { ++ if (n->state == NDPC_STATE_BACKGROUND_LOOP) ++ break; ++ } ++ ++ /* Check the periodic and ARP timer */ ++ check_timers(nic, periodic_timer, arp_timer); ++ ++ rc = nic_process_intr(nic, 1); ++ ++ while ((rc > 0) && (!(nic->flags & NIC_GOING_DOWN))) { ++ rc = process_packets(nic, ++ periodic_timer, ++ arp_timer, nic_iface); ++ } ++ ++ if (gettimeofday(¤t_time, NULL)) { ++ LOG_ERR(PFX "%s: Couldn't get current time for " ++ "DHCP start", nic->log_name); ++ return -EIO; ++ } ++ ++ if (timercmp(&total_time, ¤t_time, <)) { ++ LOG_ERR(PFX "%s: timeout waiting for DHCP/NDP", ++ nic->log_name); ++ if (nic_iface->ustack.ip_config == IPV6_CONFIG_DHCP || ++ nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) ++ n->retry_count = IPV6_MAX_ROUTER_SOL_RETRY; ++ return -EIO; ++ } ++ } ++ ++ if (nic->flags & NIC_GOING_DOWN) ++ return -EIO; ++ else if (nic->flags & NIC_DISABLED) ++ return -EINVAL; ++ else ++ return 0; ++} ++ ++/* Called with nic_mutex locked */ ++static int do_acquisition(nic_t *nic, nic_interface_t *nic_iface, ++ struct timer *periodic_timer, struct timer *arp_timer) ++{ ++ struct in_addr addr; ++ struct in6_addr addr6; ++ char buf[INET6_ADDRSTRLEN]; ++ int rc = -1; ++ ++ /* New acquisition */ ++ uip_init(&nic_iface->ustack, nic->flags & NIC_IPv6_ENABLED); ++ memcpy(&nic_iface->ustack.uip_ethaddr.addr, nic->mac_addr, ETH_ALEN); ++ ++ LOG_INFO(PFX "%s: Initialized ip stack: VLAN: %d", ++ nic->log_name, nic_iface->vlan_id); ++ ++ LOG_INFO(PFX "%s: mac: %02x:%02x:%02x:%02x:%02x:%02x", ++ nic->log_name, ++ nic_iface->mac_addr[0], ++ nic_iface->mac_addr[1], ++ nic_iface->mac_addr[2], ++ nic_iface->mac_addr[3], ++ nic_iface->mac_addr[4], ++ nic_iface->mac_addr[5]); ++ ++ switch (nic_iface->ustack.ip_config) { ++ case IPV4_CONFIG_STATIC: ++ memcpy(&addr.s_addr, nic_iface->ustack.hostaddr, ++ sizeof(addr.s_addr)); ++ ++ LOG_INFO(PFX "%s: Using IP address: %s", ++ nic->log_name, inet_ntoa(addr)); ++ ++ memcpy(&addr.s_addr, nic_iface->ustack.netmask, ++ sizeof(addr.s_addr)); ++ ++ LOG_INFO(PFX "%s: Using netmask: %s", ++ nic->log_name, inet_ntoa(addr)); ++ ++ set_uip_stack(&nic_iface->ustack, ++ &nic_iface->ustack.hostaddr, ++ &nic_iface->ustack.netmask, ++ &nic_iface->ustack.default_route_addr, ++ nic_iface->mac_addr); ++ break; ++ ++ case IPV4_CONFIG_DHCP: ++ set_uip_stack(&nic_iface->ustack, ++ &nic_iface->ustack.hostaddr, ++ &nic_iface->ustack.netmask, ++ &nic_iface->ustack.default_route_addr, ++ nic_iface->mac_addr); ++ if (dhcpc_init(nic, &nic_iface->ustack, ++ nic_iface->mac_addr, ETH_ALEN)) { ++ if (nic_iface->ustack.dhcpc) { ++ LOG_DEBUG(PFX "%s: DHCPv4 engine already " ++ "initialized!", nic->log_name); ++ goto skip; ++ } else { ++ LOG_DEBUG(PFX "%s: DHCPv4 engine failed " ++ "initialization!", nic->log_name); ++ goto error; ++ } ++ } ++ pthread_mutex_unlock(&nic->nic_mutex); ++ rc = process_dhcp_loop(nic, nic_iface, periodic_timer, ++ arp_timer); ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ if (rc) { ++ LOG_ERR(PFX "%s: DHCP failed", nic->log_name); ++ /* For DHCPv4 failure, the ustack must be cleaned so ++ it can re-acquire on the next iscsid request */ ++ uip_reset(&nic_iface->ustack); ++ ++ /* Signal that the device enable is ++ done */ ++ pthread_cond_broadcast(&nic->enable_done_cond); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ if (nic->enable_thread == INVALID_THREAD) ++ goto dhcp_err; ++ ++ rc = pthread_cancel(nic->enable_thread); ++ if (rc != 0) ++ LOG_ERR(PFX "%s: Couldn't cancel " ++ "enable nic thread", nic->log_name); ++dhcp_err: ++ pthread_mutex_lock(&nic->nic_mutex); ++ goto error; ++ } ++ ++ if (nic->flags & NIC_DISABLED) { ++ /* Break out of this loop */ ++ break; ++ } ++ ++ LOG_INFO(PFX "%s: Initialized dhcp client", nic->log_name); ++ break; ++ ++ case IPV6_CONFIG_DHCP: ++ case IPV6_CONFIG_STATIC: ++ if (ndpc_init(nic, &nic_iface->ustack, nic_iface->mac_addr, ++ ETH_ALEN)) { ++ LOG_DEBUG(PFX "%s: IPv6 engine already initialized!", ++ nic->log_name); ++ goto skip; ++ } ++ pthread_mutex_unlock(&nic->nic_mutex); ++ rc = process_dhcp_loop(nic, nic_iface, periodic_timer, ++ arp_timer); ++ pthread_mutex_lock(&nic->nic_mutex); ++ if (rc) { ++ /* Don't reset and allow to use RA and LL */ ++ LOG_ERR(PFX "%s: IPv6 DHCP/NDP failed", nic->log_name); ++ } ++ if (nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) { ++ memcpy(&addr6.s6_addr, nic_iface->ustack.hostaddr6, ++ sizeof(addr6.s6_addr)); ++ inet_ntop(AF_INET6, addr6.s6_addr, buf, sizeof(buf)); ++ LOG_INFO(PFX "%s: hostaddr IP: %s", nic->log_name, buf); ++ memcpy(&addr6.s6_addr, nic_iface->ustack.netmask6, ++ sizeof(addr6.s6_addr)); ++ inet_ntop(AF_INET6, addr6.s6_addr, buf, sizeof(buf)); ++ LOG_INFO(PFX "%s: netmask IP: %s", nic->log_name, buf); ++ } ++ break; ++ ++ default: ++ LOG_INFO(PFX "%s: ipconfig = %d?", nic->log_name, ++ nic_iface->ustack.ip_config); ++ } ++skip: ++ /* Mark acquisition done for this nic iface */ ++ nic_iface->flags &= ~NIC_IFACE_ACQUIRE; ++ ++ LOG_INFO(PFX "%s: enabled vlan %d protocol: %d", nic->log_name, ++ nic_iface->vlan_id, nic_iface->protocol); ++ return 0; ++ ++error: ++ return -EIO; ++} ++ ++ ++void *nic_loop(void *arg) ++{ ++ nic_t *nic = (nic_t *) arg; ++ int rc = -1; ++ sigset_t set; ++ struct timer periodic_timer, arp_timer; ++ ++ sigfillset(&set); ++ rc = pthread_sigmask(SIG_BLOCK, &set, NULL); ++ if (rc != 0) { ++ /* TODO: determine if we need to exit this thread if we fail ++ * to set the signal mask */ ++ LOG_ERR(PFX "%s: Couldn't set signal mask", nic->log_name); ++ } ++ ++ /* Signal the device to enable itself */ ++ pthread_mutex_lock(&nic->nic_mutex); ++ pthread_cond_signal(&nic->nic_loop_started_cond); ++ ++ /* nic_mutex must be locked */ ++ while ((event_loop_stop == 0) && ++ !(nic->flags & NIC_EXIT_MAIN_LOOP) && ++ !(nic->flags & NIC_GOING_DOWN)) { ++ nic_interface_t *nic_iface, *vlan_iface; ++ ++ if (nic->flags & NIC_DISABLED) { ++ LOG_DEBUG(PFX "%s: Waiting to be enabled", ++ nic->log_name); ++ ++ /* Wait for the device to be enabled */ ++ /* nic_mutex is already locked */ ++ pthread_cond_wait(&nic->enable_wait_cond, ++ &nic->nic_mutex); ++ ++ if (nic->state == NIC_EXIT) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ pthread_exit(NULL); ++ } ++ LOG_DEBUG(PFX "%s: is now enabled", nic->log_name); ++ } ++ /* initialize the device to send/rec data */ ++ rc = (*nic->ops->open) (nic); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not initialize CNIC UIO device", ++ nic->log_name); ++ ++ if (rc == -ENOTSUP) ++ nic->flags |= NIC_EXIT_MAIN_LOOP; ++ else ++ nic->flags &= ~NIC_ENABLED; ++ ++ /* Signal that the device enable is done */ ++ pthread_cond_broadcast(&nic->enable_done_cond); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ goto dev_close; ++ } ++ nic_set_all_nic_iface_mac_to_parent(nic); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ rc = alloc_free_queue(nic, 5); ++ if (rc != 5) { ++ if (rc != 0) { ++ LOG_WARN(PFX "%s: Allocated %d packets " ++ "instead of %d", nic->log_name, rc, 5); ++ } else { ++ LOG_ERR(PFX "%s: No packets allocated " ++ "instead of %d", nic->log_name, 5); ++ /* Signal that the device enable is done */ ++ pthread_cond_broadcast(&nic->enable_done_cond); ++ goto dev_close; ++ } ++ } ++ /* Indication for the nic_disable routine that the nic ++ has started running */ ++ nic->state = NIC_STARTED_RUNNING; ++ ++ /* Initialize the system clocks */ ++ timer_set(&periodic_timer, CLOCK_SECOND / 2); ++ timer_set(&arp_timer, CLOCK_SECOND * 10); ++ ++ /* Prepare the stack for each of the VLAN interfaces */ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ /* If DHCP fails, exit loop and restart the engine */ ++ nic_iface = nic->nic_iface; ++ while (nic_iface != NULL) { ++ if (nic_iface->flags & NIC_IFACE_ACQUIRE) { ++ do_acquisition(nic, nic_iface, ++ &periodic_timer, ++ &arp_timer); ++ } ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface != NULL) { ++ if (vlan_iface->flags & NIC_IFACE_ACQUIRE) { ++ do_acquisition(nic, vlan_iface, ++ &periodic_timer, ++ &arp_timer); ++ } ++ vlan_iface = vlan_iface->next; ++ } ++ nic_iface = nic_iface->next; ++ } ++ if (nic->flags & NIC_DISABLED) { ++ LOG_WARN(PFX "%s: nic was disabled during nic loop, " ++ "closing flag 0x%x", ++ nic->log_name, nic->flags); ++ /* Signal that the device enable is done */ ++ pthread_cond_broadcast(&nic->enable_done_cond); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ goto dev_close_free; ++ } ++ ++ /* This is when we start the processing of packets */ ++ nic->start_time = time(NULL); ++ nic->state = NIC_RUNNING; ++ ++ nic->flags &= ~NIC_ENABLED_PENDING; ++ ++ /* Signal that the device enable is done */ ++ pthread_cond_broadcast(&nic->enable_done_cond); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ LOG_INFO(PFX "%s: entering main nic loop", nic->log_name); ++ ++ while ((nic->state == NIC_RUNNING) && ++ (event_loop_stop == 0) && ++ !(nic->flags & NIC_GOING_DOWN)) { ++ /* Check the periodic and ARP timer */ ++ check_timers(nic, &periodic_timer, &arp_timer); ++ rc = nic_process_intr(nic, 0); ++ while ((rc > 0) && ++ (nic->state == NIC_RUNNING) && ++ !(nic->flags & NIC_GOING_DOWN)) { ++ rc = process_packets(nic, ++ &periodic_timer, ++ &arp_timer, NULL); ++ } ++ } ++ ++ LOG_INFO(PFX "%s: exited main processing loop", nic->log_name); ++ ++dev_close_free: ++ free_free_queue(nic); ++dev_close: ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ if (nic->flags & NIC_GOING_DOWN) { ++ nic_close(nic, 1, FREE_NO_STRINGS); ++ ++ nic->flags &= ~NIC_GOING_DOWN; ++ } else { ++ pthread_mutex_destroy(&nic->xmit_mutex); ++ pthread_mutex_init(&nic->xmit_mutex, NULL); ++ } ++ nic->pending_count = 0; ++ ++ if (!(nic->flags & NIC_EXIT_MAIN_LOOP)) { ++ /* Signal we are done closing CNIC/UIO device */ ++ pthread_cond_broadcast(&nic->disable_wait_cond); ++ } ++ } ++ /* clean up the nic flags */ ++ nic->flags &= ~NIC_ENABLED_PENDING; ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ LOG_INFO(PFX "%s: nic loop thread exited", nic->log_name); ++ ++ nic->thread = INVALID_THREAD; ++ ++ pthread_exit(NULL); ++} +diff --git a/iscsiuio/src/unix/nic.h b/iscsiuio/src/unix/nic.h +new file mode 100644 +index 0000000..8484032 +--- /dev/null ++++ b/iscsiuio/src/unix/nic.h +@@ -0,0 +1,384 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic.h - NIC header file ++ * ++ */ ++ ++#include ++ ++#ifndef __NIC_H__ ++#define __NIC_H__ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "nic_nl.h" ++#include "packet.h" ++#include "uip.h" ++ ++#include "iscsi_if.h" ++ ++/* Foward declarations */ ++struct nic_ops; ++struct nic_lib_handle; ++struct packet; ++struct nic_op; ++ ++extern pthread_mutex_t nic_lib_list_mutex; ++extern struct nic_lib_handle *nic_lib_list; ++ ++/* Used to store a list of active cnic devices */ ++extern pthread_mutex_t nic_list_mutex; ++extern struct nic *nic_list; ++ ++extern void *nl_process_handle_thread(void *arg); ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define MAX_PCI_DEVICE_ENTRIES 64 /* Maxium number of pci_device_id ++ entries a hw library may contain */ ++ ++#define FREE_CONFIG_NAME 0x0001 ++#define FREE_UIO_NAME 0x0002 ++#define FREE_ALL_STRINGS (FREE_CONFIG_NAME | FREE_UIO_NAME) ++#define FREE_NO_STRINGS 0x0000 ++ ++/****************************************************************************** ++ * Enumerations ++ ******************************************************************************/ ++typedef enum { ++ ALLOW_GRACEFUL_SHUTDOWN = 1, ++ FORCE_SHUTDOWN = 2, ++} NIC_SHUTDOWN_T; ++ ++/******************************************************************************* ++ * Structure used to hold PCI vendor, device, subvendor and subdevice ID's ++ ******************************************************************************/ ++struct pci_device_id { ++ const uint32_t vendor, device; /* Vendor and device ID or PCI_ANY_ID */ ++ const uint32_t subvendor, subdevice; /* Subsystem ID's/PCI_ANY_ID */ ++ const char *device_name; /* Data private to the driver */ ++}; ++ ++/****************************************************************************** ++ * NIC statistics structure ++ ******************************************************************************/ ++struct nic_stats { ++ uint64_t interrupts; ++ uint64_t missed_interrupts; ++ ++ struct { ++ uint64_t packets; ++ uint64_t bytes; ++ } tx; ++ ++ struct { ++ uint64_t packets; ++ uint64_t bytes; ++ } rx; ++}; ++ ++/****************************************************************************** ++ * NIC interface structure ++ ******************************************************************************/ ++typedef struct nic_interface { ++ struct nic_interface *vlan_next; ++ struct nic_interface *next; ++ struct nic *parent; ++ ++ uint16_t protocol; ++ uint16_t flags; ++#define NIC_IFACE_PERSIST (1<<0) ++#define NIC_IFACE_ACQUIRE (1<<1) ++#define NIC_IFACE_PATHREQ_WAIT1 (1<<2) ++#define NIC_IFACE_PATHREQ_WAIT2 (1<<3) ++#define NIC_IFACE_PATHREQ_WAIT (NIC_IFACE_PATHREQ_WAIT1 | \ ++ NIC_IFACE_PATHREQ_WAIT2) ++ uint8_t mac_addr[ETH_ALEN]; ++ uint8_t vlan_priority; ++ uint16_t vlan_id; ++#define NO_VLAN 0x8000 ++ ++ uint16_t mtu; ++ time_t start_time; ++ ++ struct uip_stack ustack; ++ ++#define IFACE_NUM_PRESENT (1<<0) ++#define IFACE_NUM_INVALID -1 ++ int iface_num; ++ int request_type; ++} nic_interface_t; ++ ++/****************************************************************************** ++ * NIC lib operations structure ++ ******************************************************************************/ ++struct nic_lib_ops { ++ /* Used to get the NIC library name */ ++ void (*get_library_name) (char **library_name, ++ size_t *library_name_size); ++ ++ /* Used to get to the PCI table supported by the NIC library */ ++ void (*get_pci_table) (struct pci_device_id **table, ++ uint32_t *entries); ++ ++ /* Used to get the version of this NIC library */ ++ void (*get_library_version) (char **version_string, ++ size_t *version_string_size); ++ ++ /* Used to get the NIC library build date */ ++ void (*get_build_date) (char **build_date_string, ++ size_t *build_date_string_size); ++ ++ /* Used to get the transport name assoicated with this library */ ++ void (*get_transport_name) (char **transport_name, ++ size_t *transport_name_size); ++ ++ /* Used to get the uio name assoicated with this library */ ++ void (*get_uio_name) (char **uio_name, size_t *uio_name_size); ++ ++}; ++ ++/******************************************************************************* ++ * NIC op table definition ++ ******************************************************************************/ ++typedef struct nic_ops { ++ struct nic_lib_ops lib_ops; ++ ++ char *description; ++ int (*open) (struct nic *); ++ int (*close) (struct nic *, NIC_SHUTDOWN_T); ++ int (*read) (struct nic *, struct packet *); ++ int (*write) (struct nic *, nic_interface_t *, struct packet *); ++ void *(*get_tx_pkt) (struct nic *); ++ void (*start_xmit) (struct nic *, size_t, u16_t vlan_id); ++ int (*clear_tx_intr) (struct nic *); ++ int (*handle_iscsi_path_req) (struct nic *, ++ int, ++ struct iscsi_uevent *ev, ++ struct iscsi_path *path, ++ nic_interface_t *nic_iface); ++} net_ops_t; ++ ++typedef struct nic_lib_handle { ++ struct nic_lib_handle *next; ++ ++ pthread_mutex_t mutex; ++ struct nic_ops *ops; ++} nic_lib_handle_t; ++ ++typedef struct nic { ++ struct nic *next; ++ ++ uint32_t flags; ++#define NIC_UNITIALIZED 0x0001 ++#define NIC_INITIALIZED 0x0002 ++#define NIC_ENABLED 0x0004 ++#define NIC_DISABLED 0x0008 ++#define NIC_IPv6_ENABLED 0x0010 ++#define NIC_ADDED_MULICAST 0x0020 ++#define NIC_LONG_SLEEP 0x0040 ++#define NIC_PATHREQ_WAIT 0x0080 ++ ++#define NIC_VLAN_STRIP_ENABLED 0x0100 ++#define NIC_MSIX_ENABLED 0x0200 ++#define NIC_TX_HAS_SENT 0x0400 ++#define NIC_ENABLED_PENDING 0x0800 ++ ++#define NIC_UIO_NAME_MALLOC 0x1000 ++#define NIC_CONFIG_NAME_MALLOC 0x2000 ++#define NIC_EXIT_MAIN_LOOP 0x4000 ++#define NIC_GOING_DOWN 0x8000 ++#define NIC_RESET_UIP 0x10000 ++ ++ uint16_t state; ++#define NIC_STOPPED 0x0001 ++#define NIC_STARTED_RUNNING 0x0002 ++#define NIC_RUNNING 0x0004 ++#define NIC_EXIT 0x0010 ++ ++ int fd; /* Holds the file descriptor to UIO */ ++ uint16_t uio_minor; /* Holds the UIO minor number */ ++ ++ uint32_t host_no; /* Holds the associated host number */ ++ ++ char *library_name; /* Name of the library to assoicate with */ ++ char *log_name; /* Human friendly name used in the log ++ file */ ++ char *config_device_name; /* Name read from the XML configuration ++ file */ ++ char eth_device_name[IFNAMSIZ]; /* Network interface name */ ++ char *uio_device_name; /* UIO device name */ ++ ++ uint32_t intr_count; /* Total UIO interrupt count */ ++ ++ int page_size; ++ ++ /* Held for nic ops manipulation */ ++ pthread_mutex_t nic_mutex; ++ ++ /* iSCSI ring ethernet MAC address */ ++ __u8 mac_addr[ETH_ALEN]; ++ ++ /* Used to manage the network interfaces of this device */ ++ __u32 num_of_nic_iface; ++ nic_interface_t *nic_iface; ++ ++ /* Wait for the device to be enabled */ ++ pthread_cond_t enable_wait_cond; ++ ++ /* Wait for the device to be finished enabled */ ++ pthread_cond_t enable_done_cond; ++ ++ /* Wait for the nic loop to start */ ++ pthread_cond_t nic_loop_started_cond; ++ ++ /* Wait for the device to be disabled */ ++ pthread_cond_t disable_wait_cond; ++ ++ /* Held when transmitting */ ++ pthread_mutex_t xmit_mutex; ++ ++ /* The thread this device is running on */ ++ pthread_t thread; ++ ++ /* The thread used to enable the device */ ++ pthread_t enable_thread; ++ ++ /* Statistical Information on this device */ ++ time_t start_time; ++ struct nic_stats stats; ++ ++ /* Number of retrys from iscsid */ ++ uint32_t pending_count; ++ uint32_t pathreq_pending_count; ++ ++#define DEFAULT_RX_POLL_USEC 100 /* usec */ ++ /* options enabled by the user */ ++ uint32_t rx_poll_usec; ++ ++ /* Used to hold hardware specific data */ ++ void *priv; ++ ++ /* Used to hold the TX packets that are needed to be sent */ ++ struct packet *tx_packet_queue; ++ ++ /* Mutex to protect the list of free packets */ ++ pthread_mutex_t free_packet_queue_mutex; ++ ++ /* Used to hold the free packets that are needed to be sent */ ++ struct packet *free_packet_queue; ++ ++ /* Points to the NIC library */ ++ nic_lib_handle_t *nic_library; ++ ++ /* Points to the PCI table entry */ ++ struct pci_device_id *pci_id; ++ ++ /* Used to process the interrupt */ ++ int (*process_intr) (struct nic *nic); ++ ++ struct nic_ops *ops; ++ ++ /* NL processing parameters */ ++ pthread_t nl_process_thread; ++ pthread_cond_t nl_process_cond; ++ pthread_cond_t nl_process_if_down_cond; ++ pthread_mutex_t nl_process_mutex; ++ int nl_process_if_down; ++ int nl_process_head; ++ int nl_process_tail; ++#define NIC_NL_PROCESS_MAX_RING_SIZE 128 ++#define NIC_NL_PROCESS_LAST_ENTRY (NIC_NL_PROCESS_MAX_RING_SIZE - 1) ++#define NIC_NL_PROCESS_NEXT_ENTRY(x) ((x + 1) & NIC_NL_PROCESS_MAX_RING_SIZE) ++ void *nl_process_ring[NIC_NL_PROCESS_MAX_RING_SIZE]; ++} nic_t; ++ ++/****************************************************************************** ++ * Function Prototypes ++ *****************************************************************************/ ++int load_all_nic_libraries(); ++ ++nic_t *nic_init(); ++void nic_add(nic_t *nic); ++int nic_remove(nic_t *nic); ++ ++int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface); ++int nic_process_intr(nic_t *nic, int discard_check); ++ ++nic_interface_t *nic_iface_init(); ++ ++typedef enum { ++ NIC_LIBRARY_EXSITS = 1, ++ NIC_LIBRARY_DOESNT_EXIST = 2, ++} NIC_LIBRARY_EXIST_T; ++ ++NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name); ++NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name); ++ ++/******************************************************************************* ++ * Packet management utility functions ++ ******************************************************************************/ ++struct packet *get_next_tx_packet(nic_t *nic); ++struct packet *get_next_free_packet(nic_t *nic); ++void put_packet_in_tx_queue(struct packet *pkt, nic_t *nic); ++void put_packet_in_free_queue(struct packet *pkt, nic_t *nic); ++ ++int unload_all_nic_libraries(); ++void nic_close(nic_t *nic, NIC_SHUTDOWN_T graceful, int clean); ++ ++/* Use this function to fill in minor number and uio, and eth names */ ++int nic_fill_name(nic_t *nic); ++ ++int enable_multicast(nic_t *nic); ++int disable_multicast(nic_t *nic); ++ ++void nic_set_all_nic_iface_mac_to_parent(nic_t *nic); ++int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device, ++ uint32_t subvendor, uint32_t subdevice, ++ nic_lib_handle_t **handle, ++ struct pci_device_id **pci_entry); ++ ++void *nic_loop(void *arg); ++ ++int nic_packet_capture(struct nic *, struct packet *pkt); ++ ++#endif /* __NIC_H__ */ +diff --git a/iscsiuio/src/unix/nic_id.c b/iscsiuio/src/unix/nic_id.c +new file mode 100644 +index 0000000..6b2467c +--- /dev/null ++++ b/iscsiuio/src/unix/nic_id.c +@@ -0,0 +1,362 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_id.c - Using sysfs to determine the PCI vendor, device, subvendor and ++ * subdevice ID's ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "logger.h" ++#include "nic.h" ++ ++#define PFX "nic_id " ++ ++/******************************************************************************* ++ * Sysfs constant strings used to get PCI vendor, and device ID's ++ ******************************************************************************/ ++const char uio_vendor_id_template[] = "/sys/class/uio/uio%d/device/vendor"; ++const char uio_subvendor_id_template[] = ++ "/sys/class/uio/uio%d/device/subsystem_vendor"; ++const char uio_device_id_template[] = "/sys/class/uio/uio%d/device/device"; ++const char uio_subdevice_id_template[] = ++ "/sys/class/uio/uio%d/device/subsystem_device"; ++const char uio_device_symlink_template[] = "/sys/class/uio/uio%d/device"; ++ ++/** ++ * get_id() - Utility function to read hex values from sysfs ++ * @param nic - NIC device to use ++ * @param sysfs_template - sysfs path template to use ++ * @param sysfs_template_size - sysfs path template size in bytes ++ * @parm id - this is the value returned from the sysfs entry ++ * @return 0 on success <0 on failure ++ */ ++static int get_id(nic_t *nic, ++ const char *sysfs_template, ++ const size_t sysfs_template_size, uint32_t *id) ++{ ++ int rc = 0; ++ FILE *fp; ++ size_t chars_read; ++ char buf[7]; ++ char *path; ++ size_t path_size; ++ ++ path_size = sysfs_template_size + 4; ++ path = malloc(path_size); ++ if (path == NULL) { ++ LOG_ERR("Could not allocate memory for %s", sysfs_template); ++ return -ENOMEM; ++ } ++ ++ snprintf(path, path_size, sysfs_template, nic->uio_minor); ++ ++ fp = fopen(path, "r"); ++ if (fp == NULL) { ++ LOG_ERR(PFX "%s: Could not open path: %s [%s]", ++ nic->log_name, path, strerror(errno)); ++ rc = -EIO; ++ goto error_fopen; ++ } ++ ++ chars_read = fread(buf, sizeof(buf), 1, fp); ++ if (chars_read != 1) { ++ LOG_ERR(PFX "%s: Could not read from: %s [%s]", ++ nic->log_name, path, strerror(ferror(fp))); ++ rc = -EIO; ++ goto error; ++ } ++ ++ chars_read = sscanf(buf, "%x", id); ++ if (chars_read != 1) { ++ LOG_ERR(PFX "%s: Could interpret value: %s from: %s [%s]", ++ nic->log_name, buf, path, strerror(errno)); ++ rc = -EIO; ++ goto error; ++ } ++ ++error: ++ fclose(fp); ++ ++error_fopen: ++ free(path); ++ ++ return rc; ++} ++ ++static int get_vendor(nic_t *nic, uint32_t *id) ++{ ++ return get_id(nic, ++ uio_vendor_id_template, sizeof(uio_vendor_id_template), ++ id); ++} ++ ++static int get_subvendor(nic_t *nic, uint32_t *id) ++{ ++ return get_id(nic, ++ uio_subvendor_id_template, ++ sizeof(uio_subvendor_id_template), id); ++} ++ ++static int get_device(nic_t *nic, uint32_t *id) ++{ ++ return get_id(nic, ++ uio_device_id_template, ++ sizeof(uio_device_id_template), id); ++} ++ ++static int get_subdevice(nic_t *nic, uint32_t *id) ++{ ++ return get_id(nic, ++ uio_subdevice_id_template, ++ sizeof(uio_subdevice_id_template), id); ++} ++ ++int get_bus_slot_func_num(nic_t *nic, ++ uint32_t *bus, uint32_t *slot, uint32_t *func) ++{ ++ size_t size; ++ char *path, *tok, *tok2; ++ int path_tokens, i; ++ size_t path_size; ++ char *read_pci_bus_slot_func_str; ++ char pci_bus_slot_func_str[32]; ++ int rc; ++ char *saveptr; ++ ++ path_size = sizeof(uio_device_symlink_template) + 4; ++ path = malloc(path_size); ++ if (path == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate path memory for %s", ++ nic->log_name, uio_device_symlink_template); ++ rc = -ENOMEM; ++ goto error_alloc_path; ++ } ++ ++ read_pci_bus_slot_func_str = malloc(128); ++ if (read_pci_bus_slot_func_str == NULL) { ++ LOG_ERR(PFX "%s: Could not allocate read pci bus memory for %s", ++ nic->log_name, uio_device_symlink_template); ++ rc = -ENOMEM; ++ goto error_alloc_read_pci_bus; ++ } ++ ++ snprintf(path, path_size, uio_device_symlink_template, nic->uio_minor); ++ ++ size = readlink(path, read_pci_bus_slot_func_str, 128); ++ if (size == -1) { ++ LOG_ERR(PFX "%s: Error with %s: %s", ++ nic->log_name, path, strerror(errno)); ++ rc = errno; ++ goto error; ++ } ++ ++ if (size > ((128) - 1)) { ++ read_pci_bus_slot_func_str[128 - 1] = '\0'; ++ LOG_ERR(PFX "%s: not enough space (%d) for reading PCI " ++ "slot:bus.func %s: %s", ++ nic->log_name, size, path, strerror(errno)); ++ rc = -EIO; ++ goto error; ++ } ++ ++ /* readlink() doesn't NULL terminate the string */ ++ read_pci_bus_slot_func_str[size] = '\0'; ++ ++ path_tokens = 0; ++ tok = strtok_r(read_pci_bus_slot_func_str, "/", &saveptr); ++ while (tok != NULL) { ++ path_tokens++; ++ tok = strtok_r(NULL, "/", &saveptr); ++ } ++ ++ size = readlink(path, read_pci_bus_slot_func_str, 128); ++ if (size == -1) { ++ LOG_ERR(PFX "%s: Error with %s: %s", ++ nic->log_name, path, strerror(errno)); ++ rc = errno; ++ goto error; ++ } ++ ++ if (size > ((128) - 1)) { ++ read_pci_bus_slot_func_str[128 - 1] = '\0'; ++ LOG_ERR(PFX "%s: not enough space for reading PCI " ++ "slot:bus.func %s: %s", ++ nic->log_name, path, strerror(errno)); ++ rc = -EIO; ++ goto error; ++ } ++ ++ /* readlink() doesn't NULL terminate the string */ ++ read_pci_bus_slot_func_str[size] = '\0'; ++ ++ tok = strtok_r(read_pci_bus_slot_func_str, "/", &saveptr); ++ for (i = 0; i < path_tokens - 1; i++) ++ tok = strtok_r(NULL, "/", &saveptr); ++ strcpy(pci_bus_slot_func_str, tok); ++ ++ tok = strtok_r(pci_bus_slot_func_str, ":", &saveptr); ++ if (tok == NULL) { ++ LOG_ERR(PFX "%s: Error with slot string: %s", ++ nic->log_name, pci_bus_slot_func_str); ++ rc = -EIO; ++ goto error; ++ } ++ ++ tok = strtok_r(NULL, ":", &saveptr); ++ if (tok == NULL) { ++ LOG_ERR(PFX "%s: Error parsing slot: %s", ++ nic->log_name, pci_bus_slot_func_str); ++ rc = -EIO; ++ goto error; ++ } ++ ++ sscanf(tok, "%x", bus); ++ ++ /* Need to extract the next token "xx.x" */ ++ tok = strtok_r(NULL, ":", &saveptr); ++ if (tok == NULL) { ++ LOG_ERR(PFX "%s: Error extracing bus.func: %s", ++ nic->log_name, pci_bus_slot_func_str); ++ rc = -EIO; ++ goto error; ++ } ++ ++ tok2 = strtok_r(tok, ".", &saveptr); ++ if (tok2 == NULL) { ++ LOG_ERR(PFX "%s: Error parsing bus: %s", ++ nic->log_name, pci_bus_slot_func_str); ++ rc = -EIO; ++ goto error; ++ } ++ ++ sscanf(tok2, "%x", slot); ++ ++ tok2 = strtok_r(NULL, ".", &saveptr); ++ if (tok2 == NULL) { ++ LOG_ERR(PFX "%s: Error parsing func: %s", ++ nic->log_name, pci_bus_slot_func_str); ++ rc = -EIO; ++ goto error; ++ } ++ ++ sscanf(tok2, "%x", func); ++ LOG_INFO(PFX "%s: is found at %02x:%02x.%02x", nic->log_name, ++ *bus, *slot, *func); ++ rc = 0; ++error: ++ free(read_pci_bus_slot_func_str); ++error_alloc_read_pci_bus: ++ free(path); ++error_alloc_path: ++ return rc; ++} ++ ++/** ++ * find_set_nic_lib() - Match the NIC library to the NIC ++ * @param nic - NIC device to determine which NIC library to use ++ * @return 0 on success <0 on failure ++ */ ++int find_set_nic_lib(nic_t *nic) ++{ ++ uint32_t vendor; ++ uint32_t subvendor; ++ uint32_t device; ++ uint32_t subdevice; ++ ++ uint32_t pci_bus; ++ uint32_t pci_slot; ++ uint32_t pci_func; ++ int rc = 0; ++ ++ nic_lib_handle_t *handle; ++ struct pci_device_id *pci_entry; ++ ++ rc = get_vendor(nic, &vendor); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not get vendor id [0x%x]", ++ nic->log_name, rc); ++ return rc; ++ } ++ ++ rc = get_subvendor(nic, &subvendor); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not get subvendor id [0x%x]", ++ nic->log_name, rc); ++ return rc; ++ } ++ ++ rc = get_device(nic, &device); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not get device id [0x%x]", ++ nic->log_name, rc); ++ return rc; ++ } ++ ++ rc = get_subdevice(nic, &subdevice); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Could not get subdevice id [0x%x]", ++ nic->log_name, rc); ++ return rc; ++ } ++ ++ get_bus_slot_func_num(nic, &pci_bus, &pci_slot, &pci_func); ++ ++ LOG_DEBUG(PFX "%s: Looking for device vendor: " ++ "0x%x subvendor: 0x%x device: 0x%x subdevice: 0x%x", ++ nic->log_name, vendor, subvendor, device, subdevice); ++ ++ rc = find_nic_lib_using_pci_id(vendor, device, subvendor, subdevice, ++ &handle, &pci_entry); ++ ++ if (rc != 0) { ++ LOG_WARN(PFX "%s: Couldn't find proper NIC library", ++ nic->log_name); ++ return rc; ++ } ++ ++ nic->nic_library = handle; ++ nic->pci_id = pci_entry; ++ ++ /* Prepare the NIC library op table */ ++ nic->ops = handle->ops; ++ ++ return 0; ++} +diff --git a/iscsiuio/src/unix/nic_id.h b/iscsiuio/src/unix/nic_id.h +new file mode 100644 +index 0000000..340580f +--- /dev/null ++++ b/iscsiuio/src/unix/nic_id.h +@@ -0,0 +1,47 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_id.h - NIC uIP NetLink user space stack ++ * ++ */ ++#ifndef __NIC_ID_H__ ++#define __NIC_ID_H__ ++ ++int find_set_nic_lib(nic_t *nic); ++ ++int get_bus_slot_func_num(nic_t *nic, ++ uint32_t *bus, uint32_t *slot, uint32_t *func); ++ ++#endif /* __NIC_ID_H__ */ +diff --git a/iscsiuio/src/unix/nic_nl.c b/iscsiuio/src/unix/nic_nl.c +new file mode 100644 +index 0000000..391003f +--- /dev/null ++++ b/iscsiuio/src/unix/nic_nl.c +@@ -0,0 +1,678 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_nl.c - NIC uIP NetLink user space stack ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "uip_arp.h" ++#include "logger.h" ++#include "options.h" ++ ++#include "nic.h" ++#include "nic_nl.h" ++#include "nic_utils.h" ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define PFX "NIC_NL " ++ ++static u8_t nlm_sendbuf[NLM_BUF_DEFAULT_MAX]; ++ ++static struct sockaddr_nl src_addr; ++ ++static const struct sockaddr_nl dest_addr = { ++ .nl_family = AF_NETLINK, ++ .nl_pid = 0, /* kernel */ ++ .nl_groups = 0, /* unicast */ ++}; ++ ++#define POLL_NL 0 ++#define POLL_MAX 1 ++ ++/* Netlink */ ++int nl_sock = INVALID_FD; ++ ++static int nl_read(int ctrl_fd, char *data, int size, int flags) ++{ ++ int rc; ++ struct iovec iov; ++ struct msghdr msg; ++ ++ iov.iov_base = data; ++ iov.iov_len = size; ++ ++ memset(&src_addr, 0, sizeof(src_addr)); ++ src_addr.nl_family = AF_NETLINK; ++ src_addr.nl_pid = getpid(); ++ src_addr.nl_groups = 1; ++ ++ memset(&msg, 0, sizeof(msg)); ++ msg.msg_name = (void *)&src_addr; ++ msg.msg_namelen = sizeof(src_addr); ++ msg.msg_iov = &iov; ++ msg.msg_iovlen = 1; ++ ++ rc = recvmsg(ctrl_fd, &msg, flags); ++ ++ return rc; ++} ++ ++static int ++kwritev(int fd, enum iscsi_uevent_e type, struct iovec *iovp, int count) ++{ ++ int i, rc; ++ struct nlmsghdr *nlh; ++ struct msghdr msg; ++ struct iovec iov; ++ int datalen = 0; ++ ++ for (i = 0; i < count; i++) ++ datalen += iovp[i].iov_len; ++ ++ nlh = (struct nlmsghdr *)nlm_sendbuf; ++ memset(nlh, 0, NLMSG_SPACE(datalen)); ++ ++ nlh->nlmsg_len = NLMSG_SPACE(datalen); ++ nlh->nlmsg_pid = getpid(); ++ nlh->nlmsg_flags = 0; ++ nlh->nlmsg_type = type; ++ ++ datalen = 0; ++ for (i = 0; i < count; i++) { ++ memcpy(NLMSG_DATA(nlh) + datalen, iovp[i].iov_base, ++ iovp[i].iov_len); ++ datalen += iovp[i].iov_len; ++ } ++ iov.iov_base = (void *)nlh; ++ iov.iov_len = nlh->nlmsg_len; ++ ++ memset(&msg, 0, sizeof(msg)); ++ msg.msg_name = (void *)&dest_addr; ++ msg.msg_namelen = sizeof(dest_addr); ++ msg.msg_iov = &iov; ++ msg.msg_iovlen = 1; ++ ++ do { ++ rc = sendmsg(fd, &msg, 0); ++ if (rc == -ENOMEM) { ++ LOG_ERR(PFX "sendmsg: alloc_skb() failed"); ++ sleep(1); ++ } else if (rc < 0) { ++ LOG_ERR(PFX "sendmsg: bug?: on %d %s[0x%x]", ++ fd, strerror(errno), errno); ++ sleep(1); ++ } ++ } while ((rc < 0) && (event_loop_stop == 0)); ++ ++ return rc; ++} ++ ++/* ++ * __kipc_call() should never block. Therefore ++ * Netlink's xmit logic is serialized. This means we do not allocate on ++ * xmit path. Instead we reuse nlm_sendbuf buffer. ++ * ++ * Transport must assure non-blocking operations for: ++ * ++ * - session_create() ++ * - conn_create() ++ * - conn_bind() ++ * _ set_param() ++ * - conn_start() ++ * - conn_stop() ++ * ++ * Its OK to block for cleanup for short period of time in operatations for: ++ * ++ * - conn_destroy() ++ * - session_destroy() ++ * ++ * FIXME: interface needs to be extended to allow longer blocking on ++ * cleanup. (Dima) ++ */ ++int __kipc_call(int fd, void *iov_base, int iov_len) ++{ ++ int rc; ++ struct iovec iov; ++ struct iscsi_uevent *ev = iov_base; ++ enum iscsi_uevent_e type = ev->type; ++ ++ /* Sanity check */ ++ if (iov_base == NULL) ++ return -EINVAL; ++ ++ iov.iov_base = iov_base; ++ iov.iov_len = iov_len; ++ ++ rc = kwritev(fd, type, &iov, 1); ++ ++ return rc; ++} ++ ++static int pull_from_nl(char **buf) ++{ ++ int rc; ++ size_t ev_size, payload_size, alloc_size; ++ char nlm_ev[NLMSG_SPACE(sizeof(struct iscsi_uevent))]; ++ struct nlmsghdr *nlh; ++ char *data = NULL; ++ struct iscsi_uevent *ev; ++ ++ /* Take a quick peek at what how much uIP will need to read */ ++ rc = nl_read(nl_sock, nlm_ev, ++ NLMSG_SPACE(sizeof(struct iscsi_uevent)), ++ MSG_PEEK | MSG_WAITALL); ++ if (rc <= 0) { ++ LOG_ERR("can not read nlm_ev, error %s[%d]", ++ strerror(errno), rc); ++ if (rc == 0) ++ return -EIO; ++ else ++ return errno; ++ } ++ nlh = (struct nlmsghdr *)nlm_ev; ++ ++ if (unlikely(nlh->nlmsg_len < NLMSG_ALIGN(sizeof(struct nlmsghdr)))) { ++ LOG_ERR(PFX "Invalid nlh->nlmsg_len length: " ++ "nlh->nlmsg_len(%d) < " ++ "NLMSG_ALIGN(sizeof(struct nlmsghdr))(%d)", ++ nlh->nlmsg_len, NLMSG_ALIGN(sizeof(struct nlmsghdr))); ++ return -EINVAL; ++ } ++ ++ ev = (struct iscsi_uevent *)NLMSG_DATA(nlh); ++ if (ev->type == ISCSI_KEVENT_PATH_REQ) { ++ ev_size = nlh->nlmsg_len - NLMSG_ALIGN(sizeof(struct nlmsghdr)); ++ payload_size = ev_size - sizeof(struct iscsi_uevent); ++ if (payload_size < sizeof(struct iscsi_path)) ++ alloc_size = nlh->nlmsg_len + (payload_size - ++ sizeof(struct iscsi_path)); ++ else ++ alloc_size = nlh->nlmsg_len; ++ } else { ++ alloc_size = nlh->nlmsg_len; ++ } ++ data = (char *)malloc(alloc_size); ++ if (unlikely(data == NULL)) { ++ LOG_ERR(PFX "Couldn't allocate %d bytes for Netlink " ++ "iSCSI message", alloc_size); ++ return -ENOMEM; ++ } ++ ++ memset(data, 0, alloc_size); ++ rc = nl_read(nl_sock, data, (int)nlh->nlmsg_len, MSG_WAITALL); ++ if (rc <= 0) { ++ LOG_ERR("can not read nlm_ev, error %s[%d]", ++ strerror(errno), rc); ++ if (rc == 0) ++ rc = -EIO; ++ else ++ rc = errno; ++ ++ goto error; ++ } ++ *buf = data; ++ return 0; ++error: ++ if (data != NULL) ++ free(data); ++ ++ return rc; ++} ++ ++static const struct timespec ctldev_sleep_req = { ++ .tv_sec = 0, ++ .tv_nsec = 250000000, ++}; ++ ++static int ctldev_handle(char *data, nic_t *nic) ++{ ++ int rc; ++ struct iscsi_uevent *ev; ++ uint8_t *payload; ++ struct iscsi_path *path; ++ char *msg_type_str; ++ int i; ++ nic_interface_t *nic_iface = NULL; ++ ++ ev = (struct iscsi_uevent *)NLMSG_DATA(data); ++ switch (ev->type) { ++ case ISCSI_KEVENT_PATH_REQ: ++ msg_type_str = "path_req"; ++ break; ++ default: ++ /* We don't care about other iSCSI Netlink messages */ ++ LOG_DEBUG(PFX "Received ev->type: 0x%x", ev->type); ++ rc = 0; ++ goto error; ++ } ++ ++ /* This is a message that drivers should be interested in */ ++ LOG_INFO(PFX "%s: Processing '%s'", nic->log_name, msg_type_str); ++ ++ payload = (uint8_t *) ((uint8_t *) ev) + sizeof(*ev); ++ path = (struct iscsi_path *)payload; ++ ++ if (ev->type == ISCSI_KEVENT_PATH_REQ) { ++ struct timespec sleep_rem; ++ nic_interface_t *vlan_iface; ++ uint16_t ip_type; ++ int iface_num, vlan_id; ++ ++ if (path->ip_addr_len == 4) ++ ip_type = AF_INET; ++ else if (path->ip_addr_len == 16) ++ ip_type = AF_INET6; ++ else ++ ip_type = 0; ++#ifdef REQ_PATH_IFACE_NUM ++ /* Find the nic_iface to use */ ++ iface_num = ev->r.req_path.iface_num ? ++ ev->r.req_path.iface_num : IFACE_NUM_INVALID; ++#else ++ iface_num = IFACE_NUM_INVALID; ++#endif ++ vlan_id = path->vlan_id ? path->vlan_id : NO_VLAN; ++ ++ LOG_DEBUG(PFX "%s: PATH_REQ with iface_num %d VLAN %d", ++ nic->log_name, iface_num, vlan_id); ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ nic_iface = nic_find_nic_iface(nic, ip_type, vlan_id, ++ iface_num, IP_CONFIG_OFF); ++ if (nic_iface == NULL) { ++ nic_iface = nic_find_nic_iface(nic, ip_type, ++ NO_VLAN, ++ IFACE_NUM_INVALID, ++ IP_CONFIG_OFF); ++ if (nic_iface == NULL) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ LOG_ERR(PFX "%s: Couldn't find nic iface parent" ++ " vlan: %d ip_type: %d " ++ "ip_addr_len: %d to clone", ++ nic->log_name, path->vlan_id, ip_type, ++ path->ip_addr_len); ++ goto error; ++ } ++ if (nic_iface->iface_num != IFACE_NUM_INVALID) { ++ /* New VLAN support: ++ Use the nic_iface found from the top ++ of the protocol family and ignore ++ the VLAN id from the path_req */ ++ if (!(nic_iface->iface_num == 0 && ++ nic_iface->vlan_id == 0 && ++ path->vlan_id)) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ goto nic_iface_done; ++ } ++ /* If iface_num == 0 and vlan_id == 0 but ++ the vlan_id from path_req is > 0, ++ then fallthru to the legacy support since ++ this is most likely from an older iscsid ++ (RHEL6.2/6.3 but has iface_num support) ++ */ ++ } ++ /* Legacy VLAN support: ++ This newly created nic_iface must inherit the ++ network parameters from the parent nic_iface ++ */ ++ LOG_DEBUG(PFX "%s: Created the nic_iface for vlan: %d " ++ "ip_type: %d", nic->log_name, path->vlan_id, ++ ip_type); ++ vlan_iface = nic_iface_init(); ++ if (vlan_iface == NULL) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ LOG_ERR(PFX "%s: Couldn't allocate " ++ "space for vlan: %d ip_type: " ++ "%d", nic->log_name, path->vlan_id, ++ ip_type); ++ goto error; ++ } ++ vlan_iface->protocol = ip_type; ++ vlan_iface->vlan_id = path->vlan_id; ++ nic_add_nic_iface(nic, vlan_iface); ++ ++ vlan_iface->ustack.ip_config = ++ nic_iface->ustack.ip_config; ++ memcpy(vlan_iface->ustack.hostaddr, ++ nic_iface->ustack.hostaddr, ++ sizeof(nic_iface->ustack.hostaddr)); ++ memcpy(vlan_iface->ustack.netmask, ++ nic_iface->ustack.netmask, ++ sizeof(nic_iface->ustack.netmask)); ++ memcpy(vlan_iface->ustack.netmask6, ++ nic_iface->ustack.netmask6, ++ sizeof(nic_iface->ustack.netmask6)); ++ memcpy(vlan_iface->ustack.hostaddr6, ++ nic_iface->ustack.hostaddr6, ++ sizeof(nic_iface->ustack.hostaddr6)); ++ ++ /* Persist so when nic_close won't call uip_reset ++ to nullify nic_iface->ustack */ ++ persist_all_nic_iface(nic); ++ ++ nic_iface = vlan_iface; ++ nic_iface->flags |= NIC_IFACE_ACQUIRE; ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ /* nic_disable but not going down */ ++ nic_disable(nic, 0); ++ } else { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ } ++nic_iface_done: ++ /* Force enable the NIC */ ++ if (nic->state == NIC_STOPPED) ++ nic_enable(nic); ++ ++ /* Ensure that the NIC is RUNNING */ ++ rc = -EIO; ++ for (i = 0; i < 10; i++) { ++ if (nic->state == NIC_RUNNING) { ++ rc = 0; ++ break; ++ } ++ ++ nanosleep(&ctldev_sleep_req, &sleep_rem); ++ } ++ ++ if (rc != 0) { ++ LOG_WARN(PFX "%s[vlan: %d protocol: %d]: not running, " ++ "cmd: 0x%x nic state: 0x%x flags: 0x%x", ++ nic->log_name, ++ nic_iface->vlan_id, nic_iface->protocol, ++ ev->type, nic->state, nic->flags); ++ goto error; ++ } ++ } ++ ++ if (nic->ops) { ++ switch (ev->type) { ++ case ISCSI_KEVENT_PATH_REQ: ++ /* pass the request up to the user space ++ * library driver */ ++ nic_iface->flags |= NIC_IFACE_PATHREQ_WAIT2; ++ nic_iface->flags &= ~NIC_IFACE_PATHREQ_WAIT1; ++ if (nic->ops->handle_iscsi_path_req) ++ nic->ops->handle_iscsi_path_req(nic, ++ nl_sock, ev, ++ path, ++ nic_iface); ++ nic_iface->flags &= ~NIC_IFACE_PATHREQ_WAIT; ++ pthread_mutex_lock(&nic->nic_mutex); ++ nic->flags &= ~NIC_PATHREQ_WAIT; ++ pthread_mutex_unlock(&nic->nic_mutex); ++ LOG_INFO(PFX "%s: 'path_req' operation finished", ++ nic->log_name); ++ ++ rc = 0; ++ break; ++ default: ++ rc = -EAGAIN; ++ break; ++ } ++ } ++ ++error: ++ ++ return rc; ++} ++ ++/* NIC specific nl processing thread */ ++void *nl_process_handle_thread(void *arg) ++{ ++ int rc; ++ nic_t *nic = (nic_t *)arg; ++ ++ if (nic == NULL) ++ goto error; ++ ++ while (!event_loop_stop) { ++ char *data = NULL; ++ ++ rc = pthread_cond_wait(&nic->nl_process_cond, ++ &nic->nl_process_mutex); ++ if (rc != 0) { ++ LOG_ERR("Fatal error in NL processing thread " ++ "during wait[%s]", strerror(rc)); ++ break; ++ } ++ ++ data = nic->nl_process_ring[nic->nl_process_head]; ++ nic->nl_process_ring[nic->nl_process_head] = NULL; ++ nic->nl_process_tail = ++ NIC_NL_PROCESS_NEXT_ENTRY(nic->nl_process_tail); ++ ++ pthread_mutex_unlock(&nic->nl_process_mutex); ++ ++ if (data) { ++ ctldev_handle(data, nic); ++ free(data); ++ } ++ } ++error: ++ return NULL; ++} ++ ++static void flush_nic_nl_process_ring(nic_t *nic) ++{ ++ int i; ++ ++ for (i = 0; i < NIC_NL_PROCESS_MAX_RING_SIZE; i++) { ++ if (nic->nl_process_ring[i] != NULL) { ++ free(nic->nl_process_ring[i]); ++ nic->nl_process_ring[i] = NULL; ++ } ++ } ++ ++ nic->nl_process_head = 0; ++ nic->nl_process_tail = 0; ++ ++ LOG_DEBUG(PFX "%s: Flushed NIC NL ring", nic->log_name); ++} ++ ++/** ++ * nic_nl_open() - This is called when opening/creating the Netlink listening ++ * thread ++ * @param dev - CNIC UIO device to create a NetLink listener on ++ * @return 0 on success, <0 on failure ++ */ ++int nic_nl_open() ++{ ++ int rc; ++ char *msg_type_str; ++ ++ /* Prepare the thread to issue the ARP's */ ++ nl_sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ISCSI); ++ if (nl_sock < 0) { ++ LOG_ERR(PFX "can not create NETLINK_ISCSI socket [%s]", ++ strerror(errno)); ++ rc = -ENOMEM; ++ goto error; ++ } ++ ++ memset(&src_addr, 0, sizeof(src_addr)); ++ src_addr.nl_family = AF_NETLINK; ++ src_addr.nl_pid = getpid(); ++ src_addr.nl_groups = ISCSI_NL_GRP_UIP; ++ ++ while ((!event_loop_stop)) { ++ rc = bind(nl_sock, ++ (struct sockaddr *)&src_addr, sizeof(src_addr)); ++ if (rc == 0) ++ break; ++ ++ LOG_ERR(PFX "waiting binding to NETLINK_ISCSI socket"); ++ ++ sleep(1); ++ } ++ ++ if (event_loop_stop) { ++ rc = -EINVAL; ++ goto error; ++ } ++ ++ LOG_INFO(PFX "Netlink to CNIC on pid %d is ready", src_addr.nl_pid); ++ ++ while (!event_loop_stop) { ++ struct iscsi_uevent *ev; ++ char *buf = NULL; ++ uint32_t host_no; ++ nic_t *nic; ++ ++ rc = pull_from_nl(&buf); ++ if (rc != 0) ++ continue; ++ ++ /* Try to abort ARP'ing if a if_down was received */ ++ ev = (struct iscsi_uevent *)NLMSG_DATA(buf); ++ switch (ev->type) { ++ case ISCSI_KEVENT_IF_DOWN: ++ host_no = ev->r.notify_if_down.host_no; ++ msg_type_str = "if_down"; ++ break; ++ case ISCSI_KEVENT_PATH_REQ: ++ host_no = ev->r.req_path.host_no; ++ msg_type_str = "path_req"; ++ break; ++ default: ++ /* We don't care about other iSCSI Netlink messages */ ++ continue; ++ } ++ LOG_INFO(PFX "Received %s for host %d", msg_type_str, host_no); ++ ++ /* Make sure the nic list doesn't get yanked */ ++ pthread_mutex_lock(&nic_list_mutex); ++ ++ rc = from_host_no_find_associated_eth_device(host_no, &nic); ++ if (rc != 0) { ++ pthread_mutex_unlock(&nic_list_mutex); ++ LOG_ERR(PFX "Dropping msg, couldn't find nic with host " ++ "no: %d", host_no); ++ continue; ++ } ++ ++ /* Found the nic */ ++ if (nic->nl_process_thread == INVALID_THREAD) { ++ /* If thread is not valid, just drop it */ ++ pthread_mutex_unlock(&nic_list_mutex); ++ LOG_ERR(PFX "Dropping msg, nic nl process thread " ++ "not ready for host no: %d", host_no); ++ continue; ++ } ++ ++ if (ev->type == ISCSI_KEVENT_IF_DOWN) { ++ char eth_device_name[IFNAMSIZ]; ++ ++ pthread_mutex_lock(&nic->nl_process_mutex); ++ nic->nl_process_if_down = 1; ++ flush_nic_nl_process_ring(nic); ++ pthread_cond_broadcast(&nic->nl_process_if_down_cond); ++ pthread_mutex_unlock(&nic->nl_process_mutex); ++ ++ memcpy(eth_device_name, nic->eth_device_name, ++ sizeof(eth_device_name)); ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ nic->flags &= ~NIC_PATHREQ_WAIT; ++ nic->flags |= NIC_EXIT_MAIN_LOOP; ++ pthread_cond_broadcast(&nic->enable_done_cond); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ pthread_mutex_lock(&nic->nl_process_mutex); ++ nic->nl_process_if_down = 0; ++ pthread_mutex_unlock(&nic->nl_process_mutex); ++ ++ nic_disable(nic, 1); ++ ++ nic_remove(nic); ++ pthread_mutex_unlock(&nic_list_mutex); ++ ++ LOG_INFO(PFX "%s: 'if_down' operation finished", ++ eth_device_name); ++ continue; ++ } ++ ++ /* Place msg into the nic specific queue */ ++ pthread_mutex_lock(&nic->nl_process_mutex); ++ if ((nic->nl_process_head + 1 == nic->nl_process_tail) || ++ (nic->nl_process_tail == 0 && ++ nic->nl_process_head == NIC_NL_PROCESS_LAST_ENTRY)) { ++ pthread_mutex_unlock(&nic->nl_process_mutex); ++ pthread_mutex_unlock(&nic_list_mutex); ++ LOG_WARN(PFX "%s: No space on Netlink ring", ++ nic->log_name); ++ continue; ++ } ++ ++ nic->nl_process_ring[nic->nl_process_head] = buf; ++ nic->nl_process_head = ++ NIC_NL_PROCESS_NEXT_ENTRY(nic->nl_process_head); ++ pthread_cond_signal(&nic->nl_process_cond); ++ ++ pthread_mutex_unlock(&nic->nl_process_mutex); ++ ++ pthread_mutex_unlock(&nic_list_mutex); ++ ++ LOG_DEBUG(PFX "Pulled nl event"); ++ } ++ ++ LOG_INFO(PFX "Netlink thread exit'ing"); ++ rc = 0; ++ ++error: ++ return 0; ++} +diff --git a/iscsiuio/src/unix/nic_nl.h b/iscsiuio/src/unix/nic_nl.h +new file mode 100644 +index 0000000..c68d81c +--- /dev/null ++++ b/iscsiuio/src/unix/nic_nl.h +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_nl.h - NIC uIP NetLink user space stack ++ * ++ */ ++ ++#ifndef __NIC_NL_H__ ++#define __NIC_NL_H__ ++ ++#include ++ ++int nic_nl_open(); ++void nic_nl_close(); ++ ++int __kipc_call(int fd, void *iov_base, int iov_len); ++ ++extern pthread_cond_t nl_process_if_down_cond; ++extern pthread_mutex_t nl_process_mutex; ++extern int nl_process_if_down; ++ ++#endif /* __NIC_NL_H__ */ +diff --git a/iscsiuio/src/unix/nic_utils.c b/iscsiuio/src/unix/nic_utils.c +new file mode 100644 +index 0000000..d57cc4f +--- /dev/null ++++ b/iscsiuio/src/unix/nic_utils.c +@@ -0,0 +1,1640 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_util.c - shared NIC utility functions ++ * ++ */ ++#include ++#include ++#include ++#define _GNU_SOURCE ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "logger.h" ++#include "nic.h" ++#include "nic_id.h" ++#include "nic_vlan.h" ++#include "nic_utils.h" ++#include "options.h" ++ ++#define PFX "nic_utils " ++ ++/****************************************************************************** ++ * String constants ++ *****************************************************************************/ ++static const char nic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; ++static const char cnic_sysfs_uio_event_template[] = ++ "/sys/class/uio/uio%d/event"; ++static const char base_uio_sysfs_name[] = "/sys/class/uio/"; ++static const char uio_name[] = "uio"; ++ ++static const char uio_base_dir[] = "/dev/uio"; ++static const char uio_udev_path_template[] = "/dev/uio%hd"; ++static const char uio_uevent_path_template[] = "/sys/class/uio/uio%d/uevent"; ++ ++static const char base_iscsi_host_name[] = "/sys/class/iscsi_host/"; ++static const char host_template[] = "host%d"; ++static const char iscsi_host_path_template[] = "/sys/class/iscsi_host/host%d"; ++static const char iscsi_host_path_netdev_template[] = ++ "/sys/class/iscsi_host/host%d/netdev"; ++static const char cnic_uio_sysfs_resc_template[] = ++ "/sys/class/uio/uio%i/device/resource%i"; ++ ++/** ++ * manually_trigger_uio_event() - If the uio file node doesn't exist then ++ * try to retrigger udev to create the file ++ * node by touch the uevent file in sysfs ++ * @param nic - the nic to trigger on ++ * @param uio_minor - UIO the minor number to use ++ * @return 0 on success ++ */ ++int manually_trigger_uio_event(nic_t *nic, int uio_minor) ++{ ++ int fd; ++ char uio_uevent_path[sizeof(uio_uevent_path_template) + 10]; ++ char enable_str[] = "online"; ++ int rc; ++ size_t bytes_wrote; ++ ++ rc = sprintf(uio_uevent_path, uio_uevent_path_template, uio_minor); ++ if (rc < 0) { ++ LOG_ERR(PFX "%s: Could not build uio uevent path", ++ nic->log_name); ++ return -EIO; ++ } ++ ++ LOG_DEBUG(PFX "%s: triggering UIO uevent path: %s", ++ nic->log_name, uio_uevent_path); ++ ++ fd = open(uio_uevent_path, O_WRONLY); ++ if (fd == -1) { ++ LOG_ERR(PFX "%s: Could not open uio uevent path: %s [%s]", ++ nic->log_name, uio_uevent_path, strerror(errno)); ++ return -EIO; ++ } ++ ++ bytes_wrote = write(fd, enable_str, sizeof(enable_str)); ++ if (bytes_wrote != sizeof(enable_str)) { ++ LOG_ERR(PFX "%s: Could write to uio uevent path: %s [%s]", ++ nic->log_name, uio_uevent_path, strerror(errno)); ++ rc = -EIO; ++ } else ++ rc = 0; ++ ++ close(fd); ++ return rc; ++} ++ ++static int wait_for_file_node_timed(nic_t *nic, char *filepath, int seconds) ++{ ++ struct timeval start_time; ++ struct timeval wait_time; ++ struct timeval total_time; ++ struct timespec sleep_req, sleep_rem; ++ ++ sleep_req.tv_sec = 0; ++ sleep_req.tv_nsec = 250000000; ++ ++ wait_time.tv_sec = seconds; ++ wait_time.tv_usec = 0; ++ ++ if (gettimeofday(&start_time, NULL)) { ++ LOG_ERR(PFX "%s: Couldn't gettimeofday() during watch file: %s" ++ "[%s]", nic->log_name, filepath, strerror(errno)); ++ return -EIO; ++ } ++ ++ timeradd(&start_time, &wait_time, &total_time); ++ ++ while (1) { ++ struct timeval current_time; ++ struct stat file_stat; ++ ++ /* Check if the file node exists */ ++ if (stat(filepath, &file_stat) == 0) ++ return 0; ++ ++ if (gettimeofday(¤t_time, NULL)) { ++ LOG_ERR(PFX "%s: Couldn't get current time for " ++ "watching file: %s [%s]", ++ nic->log_name, filepath, strerror(errno)); ++ return -EIO; ++ } ++ ++ /* Timeout has excceded return -ETIME */ ++ if (timercmp(&total_time, ¤t_time, <)) { ++ LOG_ERR(PFX "%s: timeout waiting %d secs for file: %s", ++ nic->log_name, seconds, filepath); ++ return -ETIME; ++ } ++ ++ nanosleep(&sleep_req, &sleep_rem); ++ } ++} ++ ++/****************************************************************************** ++ * Autodiscovery of iscsi_hosts ++ *****************************************************************************/ ++static int filter_host_name(const struct dirent *entry) ++{ ++ if ((memcmp(entry->d_name, "host", 4) == 0)) ++ return 1; ++ else ++ return 0; ++} ++ ++int nic_discover_iscsi_hosts() ++{ ++ struct dirent **files; ++ int count; ++ int i; ++ int rc; ++ ++ count = scandir(base_iscsi_host_name, &files, filter_host_name, ++ alphasort); ++ ++ switch (count) { ++ case 0: ++ /* Currently there are no iSCSI hosts */ ++ rc = 0; ++ break; ++ ++ case -1: ++ LOG_WARN(PFX "Error when scanning path: %s[%s]", ++ base_iscsi_host_name, strerror(errno)); ++ rc = -EINVAL; ++ break; ++ ++ default: ++ /* There are iSCSI hosts */ ++ pthread_mutex_lock(&nic_list_mutex); ++ for (i = 0; i < count; i++) { ++ int host_no; ++ char *raw = NULL; ++ uint32_t raw_size = 0; ++ char temp_path[sizeof(iscsi_host_path_netdev_template) + ++ 8]; ++ rc = sscanf(files[i]->d_name, host_template, &host_no); ++ nic_t *nic; ++ ++ LOG_INFO(PFX "Found host[%d]: %s", ++ host_no, files[i]->d_name); ++ ++ /* Build the path to determine netdev name */ ++ snprintf(temp_path, sizeof(temp_path), ++ iscsi_host_path_netdev_template, host_no); ++ ++ rc = capture_file(&raw, &raw_size, temp_path); ++ if (rc != 0) ++ continue; ++ ++ rc = from_host_no_find_associated_eth_device(host_no, ++ &nic); ++ if (rc != 0) { ++ /* Normalize the string */ ++ if (raw[raw_size - 1] == '\n') ++ raw[raw_size - 1] = '\0'; ++ ++ nic = nic_init(); ++ if (nic == NULL) { ++ LOG_ERR(PFX "Couldn't allocate " ++ "space for NIC %s " ++ "during scan", raw); ++ ++ rc = -ENOMEM; ++ break; ++ } ++ ++ strncpy(nic->eth_device_name, raw, raw_size); ++ nic->config_device_name = nic->eth_device_name; ++ nic->log_name = nic->eth_device_name; ++ ++ if (nic_fill_name(nic) != 0) { ++ free(nic); ++ free(raw); ++ rc = -EIO; ++ continue; ++ } ++ ++ nic_add(nic); ++ ++ LOG_INFO(PFX "NIC not found creating an " ++ "instance for host_no: %d %s", ++ host_no, nic->eth_device_name); ++ } else ++ LOG_INFO(PFX "%s: NIC found host_no: %d", ++ nic->log_name, host_no); ++ ++ free(raw); ++ } ++ pthread_mutex_unlock(&nic_list_mutex); ++ ++ /* Cleanup the scandir() call */ ++ for (i = 0; i < count; i++) ++ free(files[i]); ++ free(files); ++ ++ rc = 0; ++ break; ++ } ++ ++ return rc; ++} ++ ++/****************************************************************************** ++ * Enable/Disable Multicast on physical interface ++ *****************************************************************************/ ++static int nic_util_enable_disable_multicast(nic_t *nic, uint32_t cmd) ++{ ++ int rc = 0; ++ struct uip_eth_addr multicast_addr; ++ int fd; ++ struct ifreq ifr; ++ ++ /* adding ethernet multicast address for IPv6 */ ++ memcpy(&multicast_addr, nic->mac_addr, ETH_ALEN); ++ multicast_addr.addr[0] = 0x33; ++ multicast_addr.addr[1] = 0x33; ++ multicast_addr.addr[2] = 0xff; ++ ++ /* Prepare the request */ ++ memset(&ifr, 0, sizeof(ifr)); ++ strncpy(ifr.ifr_name, nic->eth_device_name, ++ sizeof(nic->eth_device_name)); ++ memcpy(ifr.ifr_hwaddr.sa_data, multicast_addr.addr, ETH_ALEN); ++ ++ fd = socket(AF_INET, SOCK_DGRAM, 0); ++ if (fd < 0) { ++ LOG_ERR(PFX "%s: Couldn't create socket to %s " ++ "multicast address: %s", ++ nic->log_name, ++ cmd == SIOCADDMULTI ? "added" : "delete", ++ strerror(errno)); ++ return errno; ++ } ++ ++ rc = fcntl(fd, F_SETFL, O_NONBLOCK); ++ if (rc != 0) { ++ LOG_WARN("%s: Couldn't set to ethtool IOCTL to " ++ "non-blocking [%s]", nic->log_name, strerror(errno)); ++ } ++ ++ if (ioctl(fd, cmd, (char *)&ifr) != 0) { ++ LOG_ERR("%s: Couldn't issue ioctl socket to %s " ++ "multicast address: %s", ++ nic->log_name, ++ cmd == SIOCADDMULTI ? "add" : "delete", ++ strerror(errno)); ++ rc = errno; ++ goto error; ++ } ++ ++ LOG_INFO(PFX "%s: %s address %02x:%02x:%02x:%02x:%02x:%02x " ++ "to multicast list", ++ nic->log_name, ++ cmd == SIOCADDMULTI ? "Added" : "Deleted", ++ multicast_addr.addr[0], multicast_addr.addr[1], ++ multicast_addr.addr[2], multicast_addr.addr[3], ++ multicast_addr.addr[4], multicast_addr.addr[5]); ++ ++ if (cmd == SIOCADDMULTI) ++ nic->flags |= NIC_ADDED_MULICAST; ++ else ++ nic->flags &= ~NIC_ADDED_MULICAST; ++ ++error: ++ close(fd); ++ ++ return rc; ++} ++ ++/** ++ * enable_multicast() - This fuction is used to enable ++ * the listening of multicast addresses for a given network interface ++ * @param nic - NIC device to enable multicast on ++ * @return 0 for success or <0 for failure ++ */ ++int enable_multicast(nic_t *nic) ++{ ++ return nic_util_enable_disable_multicast(nic, SIOCADDMULTI); ++} ++ ++/** ++ * disable_multicast() - This fuction is used to disable ++ * the listening of multicast addresses for a given network interface ++ * @param dev - NIC device to disable multicast on ++ * @return 0 for success or <0 for failure ++ */ ++int disable_multicast(nic_t *nic) ++{ ++ return nic_util_enable_disable_multicast(nic, SIOCDELMULTI); ++} ++ ++/******************************************************************************* ++ * Finding associated UIO/physical network interfaces ++ ******************************************************************************/ ++static int filter_net_name(const struct dirent *entry) ++{ ++ if ((memcmp(entry->d_name, "net:", 4) == 0)) ++ return 1; ++ else ++ return 0; ++} ++ ++static char *extract_net_name(struct dirent **files) ++{ ++ return strstr(files[0]->d_name, ":"); ++} ++ ++static int filter_dot_out(const struct dirent *entry) ++{ ++ if ((memcmp(entry->d_name, ".", 1) == 0)) ++ return 0; ++ else ++ return 1; ++} ++ ++static char *extract_none(struct dirent **files) ++{ ++ return files[0]->d_name; ++} ++ ++/** ++ * from_host_no_find_nic() - Given the host number ++ * this function will try to find the assoicated nic interface ++ * Must be called with nic_list_mutex lock ++ * @param host_no - minor number of the UIO device ++ * @param nic - pointer to the NIC will set if successful ++ * @return 0 on success, <0 on error ++ */ ++int from_host_no_find_associated_eth_device(int host_no, nic_t **nic) ++{ ++ nic_t *current_nic = nic_list; ++ char *raw = NULL, *raw_tmp; ++ uint32_t raw_size = 0; ++ ++ char temp_path[sizeof(iscsi_host_path_netdev_template) + 8]; ++ int rc = -EIO; ++ ++ /* Build the path to determine uio name */ ++ snprintf(temp_path, sizeof(temp_path), ++ iscsi_host_path_netdev_template, host_no); ++ ++ rc = capture_file(&raw, &raw_size, temp_path); ++ if (rc != 0) ++ goto error; ++ ++ /* sanitize name string by replacing newline with null termination */ ++ raw_tmp = raw; ++ while (*raw_tmp != '\n' && raw_size--) ++ raw_tmp++; ++ *raw_tmp = '\0'; ++ ++ rc = -EIO; ++ ++ current_nic = nic_list; ++ while (current_nic != NULL) { ++ if (strcmp(raw, current_nic->eth_device_name) == 0) { ++ *nic = current_nic; ++ rc = 0; ++ break; ++ } ++ ++ current_nic = current_nic->next; ++ } ++ ++ free(raw); ++ ++error: ++ return rc; ++} ++ ++/******************************************************************************* ++ * NIC packet handling functions ++ ******************************************************************************/ ++/** ++ * from_uio_find_associated_eth_device() - Given the uio minor number ++ * this function will try to find the assoicated phyisical network ++ * interface ++ * @param uio_minor - minor number of the UIO device ++ * @param name - char buffer which will be filled if successful ++ * @param name_size - size of the name buffer ++ * @return >0 minor number <0 an error ++ */ ++static int from_uio_find_associated_eth_device(nic_t *nic, ++ int uio_minor, ++ char *name, size_t name_size) ++{ ++ char *path; ++ int rc; ++ int count; ++ struct dirent **files; ++ char *parsed_name; ++ int i; ++ int path_iterator; ++ char *search_paths[] = { "/sys/class/uio/uio%i/device/", ++ "/sys/class/uio/uio%i/device/net" ++ }; ++ int path_to[] = { 5, 1 }; ++ int (*search_filters[]) (const struct dirent *) = { ++ filter_net_name, filter_dot_out,}; ++ char *(*extract_name[]) (struct dirent **files) = { ++ extract_net_name, extract_none,}; ++ int extract_name_offset[] = { 1, 0 }; ++ ++ path = malloc(PATH_MAX); ++ if (path == NULL) { ++ LOG_ERR(PFX "Could not allocate memory for path"); ++ rc = -ENOMEM; ++ goto error; ++ } ++ ++ for (path_iterator = 0; ++ path_iterator < sizeof(search_paths) / sizeof(search_paths[0]); ++ path_iterator++) { ++ /* Build the path to determine uio name */ ++ rc = sprintf(path, search_paths[path_iterator], uio_minor); ++ ++ wait_for_file_node_timed(nic, path, path_to[path_iterator]); ++ ++ count = scandir(path, &files, ++ search_filters[path_iterator], alphasort); ++ ++ switch (count) { ++ case 1: ++ parsed_name = (*extract_name[path_iterator]) (files); ++ if (parsed_name == NULL) { ++ LOG_WARN(PFX "Couldn't find delimiter in: %s", ++ files[0]->d_name); ++ ++ break; ++ } ++ ++ strncpy(name, ++ parsed_name + ++ extract_name_offset[path_iterator], name_size); ++ ++ free(files[0]); ++ free(files); ++ ++ rc = 0; ++ break; ++ ++ case 0: ++ rc = -EINVAL; ++ break; ++ ++ case -1: ++ LOG_WARN(PFX "Error when scanning path: %s[%s]", ++ path, strerror(errno)); ++ rc = -EINVAL; ++ break; ++ ++ default: ++ LOG_WARN(PFX ++ "Too many entries when looking for device: %s", ++ path); ++ ++ /* Cleanup the scandir() call */ ++ for (i = 0; i < count; i++) ++ free(files[i]); ++ free(files); ++ ++ rc = -EINVAL; ++ break; ++ } ++ ++ if (rc == 0) ++ break; ++ } ++ ++error: ++ free(path); ++ ++ return rc; ++} ++ ++/** ++ * filter_uio_name() - This is the callback used by scandir when looking for ++ * the number of uio entries ++ */ ++static int filter_uio_name(const struct dirent *entry) ++{ ++ /* Only return if the name of the file begins with 'uio' */ ++ if ((memcmp(entry->d_name, uio_name, sizeof(uio_name) - 1) == 0)) ++ return 1; ++ else ++ return 0; ++} ++ ++/** ++ * from_netdev_name_find_nic() - This is used to find the NIC device given ++ * the netdev name ++ * @param interface_name - name of the interface to search on ++ * @param nic - pointer of the pointer to the NIC ++ * @return 0 on success, <0 on failure ++ */ ++int from_netdev_name_find_nic(char *interface_name, nic_t **nic) ++{ ++ nic_t *current_nic; ++ ++ current_nic = nic_list; ++ while (current_nic != NULL) { ++ if (strcmp(interface_name, current_nic->eth_device_name) == 0) ++ break; ++ ++ current_nic = current_nic->next; ++ } ++ ++ if (current_nic == NULL) ++ return -EINVAL; ++ ++ *nic = current_nic; ++ return 0; ++} ++ ++/** ++ * from_phys_name_find_assoicated_uio_device() - This is used to find the ++ * uio minor ++ * when given a network interface name ++ * @param interface_name - network interface name to search for ++ * @return >0 minor number <0 an error ++ */ ++int from_phys_name_find_assoicated_uio_device(nic_t *nic) ++{ ++ char *path = NULL; ++ int count; ++ struct dirent **files; ++ int i; ++ int rc; ++ char *interface_name = nic->config_device_name; ++ ++ if (interface_name == NULL) ++ interface_name = nic->eth_device_name; ++ ++ /* Wait at least 10 seconds for uio sysfs entries to appear */ ++ rc = wait_for_file_node_timed(nic, (char *)base_uio_sysfs_name, 10); ++ if (rc != 0) ++ return rc; ++ ++ count = scandir(base_uio_sysfs_name, ++ &files, filter_uio_name, alphasort); ++ ++ switch (count) { ++ case 0: ++ LOG_WARN(PFX "Couldn't find %s to determine uio minor", ++ interface_name); ++ return -EINVAL; ++ ++ case -1: ++ LOG_WARN(PFX "Error when scanning for %s in path: %s [%s]", ++ interface_name, base_uio_sysfs_name, strerror(errno)); ++ return -EINVAL; ++ } ++ ++ path = malloc(PATH_MAX); ++ if (path == NULL) { ++ LOG_ERR(PFX "Could not allocate memory for path"); ++ return -ENOMEM; ++ } ++ ++ /* Run through the contents of the filtered files to see if the ++ * network interface name matches that of the uio device */ ++ for (i = 0; i < count; i++) { ++ int uio_minor; ++ char eth_name[IFNAMSIZ]; ++ ++ rc = sscanf(files[i]->d_name, "uio%d", &uio_minor); ++ if (rc != 1) { ++ LOG_WARN("Could not parse: %s", files[i]->d_name); ++ continue; ++ } ++ ++ rc = from_uio_find_associated_eth_device(nic, ++ uio_minor, ++ eth_name, ++ sizeof(eth_name)); ++ if (rc != 0) { ++ LOG_WARN("uio minor: %d not valid [%D]", uio_minor, rc); ++ continue; ++ } ++ ++ if (strncmp(eth_name, interface_name, sizeof(eth_name)) == 0) { ++ memcpy(nic->eth_device_name, ++ eth_name, sizeof(nic->eth_device_name)); ++ ++ LOG_INFO(PFX "%s associated with uio%d", ++ nic->eth_device_name, uio_minor); ++ ++ rc = uio_minor; ++ goto done; ++ } ++ } ++ ++ LOG_WARN("Could not find assoicate uio device with %s", interface_name); ++ ++ rc = -EINVAL; ++done: ++ if (path != NULL) ++ free(path); ++ ++ for (i = 0; i < count; i++) ++ free(files[i]); ++ free(files); ++ ++ return rc; ++ ++} ++ ++/** ++ * nic_verify_uio_sysfs_name() - Using the name entry in sysfs it will try to ++ * match the NIC library name ++ * @param nic - The NIC hardware to check ++ * ++ */ ++int nic_verify_uio_sysfs_name(nic_t *nic) ++{ ++ char *raw = NULL, *raw_tmp; ++ uint32_t raw_size = 0; ++ char temp_path[sizeof(nic_uio_sysfs_name_tempate) + 8]; ++ int rc = 0; ++ ++ /* Build the path to determine uio name */ ++ snprintf(temp_path, sizeof(temp_path), ++ nic_uio_sysfs_name_tempate, nic->uio_minor); ++ ++ rc = capture_file(&raw, &raw_size, temp_path); ++ if (rc != 0) ++ goto error; ++ ++ /* sanitize name string by replacing newline with null termination */ ++ raw_tmp = raw; ++ while (*raw_tmp != '\n' && raw_size--) ++ raw_tmp++; ++ *raw_tmp = '\0'; ++ ++ /* If the nic library is not set then check if there is a library ++ * which matches the library name */ ++ if (nic->nic_library == NULL) { ++ NIC_LIBRARY_EXIST_T exist; ++ ++ exist = does_nic_uio_name_exist(raw); ++ if (exist == NIC_LIBRARY_DOESNT_EXIST) { ++ LOG_ERR(PFX "%s: could not find library: %s ", ++ nic->log_name, raw); ++ rc = -EIO; ++ } ++ } else { ++ char *library_name; ++ size_t library_name_size; ++ ++ /* Get the string name from the NIC library */ ++ (*nic->ops->lib_ops.get_library_name) (&library_name, ++ &library_name_size); ++ ++ if (strcmp(raw, library_name) != 0) { ++ LOG_ERR(PFX "%s: uio names not equal: " ++ "expecting %s got %s from %s", ++ nic->log_name, library_name, raw, temp_path); ++ rc = -EIO; ++ } ++ } ++ ++ free(raw); ++ ++ LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); ++ ++error: ++ return rc; ++} ++ ++/** ++ * nic_fill_name() - This will initialize all the hardware resources underneath ++ * a struct cnic_uio device ++ * @param nic - The nic device to attach the hardware with ++ * @return 0 on success, on failure a errno will be returned ++ */ ++int nic_fill_name(nic_t *nic) ++{ ++ int rc; ++ ++ if ((nic->config_device_name != NULL) && ++ (memcmp(uio_base_dir, nic->config_device_name, ++ sizeof(uio_base_dir) - 1) == 0)) { ++ uint16_t uio_minor; ++ char eth_name[sizeof(nic->eth_device_name)]; ++ ++ wait_for_file_node_timed(nic, nic->config_device_name, 5); ++ ++ /* Determine the minor number for the UIO device */ ++ rc = sscanf(nic->config_device_name, uio_udev_path_template, ++ &uio_minor); ++ if (rc != 1) { ++ LOG_WARN(PFX "%s: Could not parse for minor number", ++ nic->uio_device_name); ++ return -EINVAL; ++ } else ++ nic->uio_minor = uio_minor; ++ ++ nic->uio_device_name = nic->config_device_name; ++ ++ /* Determine the assoicated physical network interface */ ++ rc = from_uio_find_associated_eth_device(nic, ++ nic->uio_minor, ++ eth_name, ++ sizeof(eth_name)); ++ if (rc != 0) { ++ LOG_WARN(PFX "%s: Couldn't find associated eth device", ++ nic->uio_device_name); ++ } else { ++ memcpy(nic->eth_device_name, ++ eth_name, sizeof(eth_name)); ++ } ++ ++ LOG_INFO(PFX "%s: configured for uio device for %s", ++ nic->log_name, nic->uio_device_name); ++ ++ } else { ++ LOG_INFO(PFX "looking for uio device for %s", ++ nic->config_device_name); ++ ++ rc = from_phys_name_find_assoicated_uio_device(nic); ++ if (rc < 0) { ++ LOG_ERR(PFX "Could not determine UIO name for %s", ++ nic->config_device_name); ++ ++ return -rc; ++ } ++ ++ nic->uio_minor = rc; ++ ++ if (nic->flags & NIC_UIO_NAME_MALLOC) ++ free(nic->uio_device_name); ++ ++ nic->uio_device_name = ++ malloc(sizeof(uio_udev_path_template) + 8); ++ if (nic->uio_device_name == NULL) { ++ LOG_INFO(PFX "%s: Couldn't malloc space for uio name", ++ nic->log_name); ++ return -ENOMEM; ++ } ++ ++ snprintf(nic->uio_device_name, ++ sizeof(uio_udev_path_template) + 8, ++ uio_udev_path_template, nic->uio_minor); ++ ++ nic->flags |= NIC_UIO_NAME_MALLOC; ++ } ++ ++ return 0; ++} ++ ++void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no, ++ char *sys_path, size_t size) ++{ ++ /* Build the path to sysfs pci resource */ ++ snprintf(sys_path, size, ++ cnic_uio_sysfs_resc_template, nic->uio_minor, resc_no); ++ ++} ++ ++void prepare_library(nic_t *nic) ++{ ++ int rc; ++ NIC_LIBRARY_EXIST_T exist; ++ ++ nic_fill_name(nic); ++ ++ /* No assoicated library, we can skip it */ ++ if (nic->library_name != NULL) { ++ /* Check that we have the proper NIC library loaded */ ++ exist = does_nic_library_exist(nic->library_name); ++ if (exist == NIC_LIBRARY_DOESNT_EXIST) { ++ LOG_ERR(PFX "NIC library doesn't exists: %s", ++ nic->library_name); ++ goto error; ++ } ++ } ++ ++ /* Determine the NIC library to use based on the PCI Id */ ++ rc = find_set_nic_lib(nic); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Couldn't find NIC library", nic->log_name); ++ goto error; ++ } ++ ++ LOG_INFO("%s: found NIC '%s'", nic->log_name, nic->pci_id->device_name); ++error: ++ return; ++} ++ ++void prepare_nic_thread(nic_t *nic) ++{ ++ pthread_attr_t attr; ++ int rc; ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ if (nic->thread == INVALID_THREAD) { ++ struct timespec ts; ++ struct timeval tp; ++ ++ LOG_INFO(PFX "%s: spinning up thread for nic", nic->log_name); ++ ++ /* Try to spin up the nic thread */ ++ pthread_attr_init(&attr); ++ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ++ rc = pthread_create(&nic->thread, &attr, nic_loop, nic); ++ if (rc != 0) { ++ LOG_ERR(PFX "%s: Couldn't create thread for nic", ++ nic->log_name); ++ goto error; ++ } ++ ++ /* Convert from timeval to timespec */ ++ rc = gettimeofday(&tp, NULL); ++ ts.tv_sec = tp.tv_sec; ++ ts.tv_nsec = tp.tv_usec * 1000; ++ ts.tv_sec += 5; /* TODO: hardcoded wait for 5 seconds */ ++ ++ /* Wait for the nic loop thread to to running */ ++ rc = pthread_cond_timedwait(&nic->nic_loop_started_cond, ++ &nic->nic_mutex, &ts); ++ ++ LOG_INFO("Created nic thread: %s", nic->log_name); ++ } ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++error: ++ return; ++} ++ ++/******************************************************************************* ++ * Functions used to enable/disable the NIC ++ ******************************************************************************/ ++/** ++ * nic_enable() - Function used to enable the NIC ++ * @param nic - NIC to enable ++ * @return 0 on success, <0 on failure ++ */ ++int nic_enable(nic_t *nic) ++{ ++ if (nic->flags & NIC_GOING_DOWN) { ++ LOG_INFO(PFX "%s: NIC device is going down, " ++ "flag: 0x%x state: 0x%x", ++ nic->log_name, nic->flags, nic->state); ++ return -EINVAL; ++ } ++ if (nic->state == NIC_STOPPED) { ++ struct timespec ts; ++ struct timeval tp; ++ int rc; ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ /* Signal the device to enable itself */ ++ pthread_cond_broadcast(&nic->enable_wait_cond); ++ ++ nic->flags &= ~NIC_DISABLED; ++ nic->flags |= NIC_ENABLED; ++ nic->flags |= NIC_ENABLED_PENDING; ++ ++ /* Convert from timeval to timespec */ ++ rc = gettimeofday(&tp, NULL); ++ ts.tv_sec = tp.tv_sec; ++ ts.tv_nsec = tp.tv_usec * 1000; ++ ts.tv_sec += 100; ++ ++ /* Wait for the device to be enabled */ ++ rc = pthread_cond_timedwait(&nic->enable_done_cond, ++ &nic->nic_mutex, &ts); ++ if (rc == 0 && nic->flags & NIC_ENABLED) { ++ LOG_DEBUG(PFX "%s: device enabled", nic->log_name); ++ } else { ++ nic->flags &= ~NIC_ENABLED; ++ nic->flags |= NIC_DISABLED; ++ nic->flags &= ~NIC_ENABLED_PENDING; ++ ++ LOG_ERR(PFX "%s: waiting to finish nic_enable err: %s", ++ nic->log_name, strerror(rc)); ++ } ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ return rc; ++ } else { ++ LOG_INFO(PFX "%s: device already enabled: " ++ "flag: 0x%x state: 0x%x", ++ nic->log_name, nic->flags, nic->state); ++ return -EALREADY; ++ } ++} ++ ++/** ++ * nic_disable() - Function used to disable the NIC ++ * @param nic - NIC to disble ++ * @return void ++ */ ++void nic_disable(nic_t *nic, int going_down) ++{ ++ if (nic->state == NIC_STARTED_RUNNING || ++ nic->state == NIC_RUNNING) { ++ struct timespec ts; ++ struct timeval tp; ++ int rc; ++ ++ /* Wait for the device to be disabled */ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ nic->flags &= ~NIC_ENABLED; ++ nic->flags |= NIC_DISABLED; ++ nic->flags &= ~NIC_STARTED_RUNNING; ++ nic->state = NIC_STOPPED; ++ ++ if (going_down) ++ nic->flags |= NIC_GOING_DOWN; ++ ++ /* Convert from timeval to timespec */ ++ rc = gettimeofday(&tp, NULL); ++ if (rc) { ++ LOG_ERR("gettimeofday failed, should never happen: %d\n", errno); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ return; ++ } ++ ++ ts.tv_sec = tp.tv_sec; ++ ts.tv_nsec = tp.tv_usec * 1000; ++ ts.tv_sec += 5; /* TODO: hardcoded wait for 5 seconds */ ++ ++ /* Wait for the device to be disabled */ ++ rc = pthread_cond_timedwait(&nic->disable_wait_cond, ++ &nic->nic_mutex, &ts); ++ if (rc) { ++ LOG_ERR("cond_timedwait failed, should never happen: %d\n", errno); ++ } ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ LOG_DEBUG(PFX "%s: device disabled", nic->log_name); ++ ++ } else { ++ LOG_WARN(PFX "%s: device already disabled: " ++ "flag: 0x%x state: 0x%x", ++ nic->log_name, nic->flags, nic->state); ++ } ++} ++ ++void nic_close_all() ++{ ++ nic_t *nic; ++ ++ pthread_mutex_lock(&nic_list_mutex); ++ ++ /* Start the shutdown process */ ++ nic = nic_list; ++ while (nic != NULL) { ++ pthread_mutex_lock(&nic->nic_mutex); ++ nic_close(nic, 1, FREE_ALL_STRINGS); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ nic = nic->next; ++ } ++ pthread_mutex_unlock(&nic_list_mutex); ++ ++ LOG_INFO(PFX "All NICs closed"); ++} ++ ++void nic_remove_all() ++{ ++ nic_t *nic, *nic_next; ++ ++ pthread_mutex_lock(&nic_list_mutex); ++ ++ /* Start the shutdown process */ ++ nic = nic_list; ++ while (nic != NULL) { ++ nic_next = nic->next; ++ pthread_mutex_lock(&nic->nic_mutex); ++ nic_close(nic, 1, FREE_ALL_STRINGS); ++ pthread_mutex_unlock(&nic->nic_mutex); ++ nic_remove(nic); ++ nic = nic_next; ++ } ++ pthread_mutex_unlock(&nic_list_mutex); ++ ++ LOG_INFO(PFX "All NICs removed"); ++} ++ ++ ++/****************************************************************************** ++ * Routines to read initialized UIO values from sysfs ++ *****************************************************************************/ ++/** ++ * determine_initial_uio_events() - This utility function will ++ * determine the number of uio events that have occured on the ++ * given device. This value is read from the UIO sysfs entry ++ * @param dev - device to read from ++ * @param num_of_event - number of UIO events ++ * @return 0 is success, <0 failure ++ */ ++int detemine_initial_uio_events(nic_t *nic, uint32_t *num_of_events) ++{ ++ char *raw = NULL; ++ uint32_t raw_size = 0; ++ ssize_t elements_read; ++ char temp_path[sizeof(cnic_sysfs_uio_event_template) + 8]; ++ int rc; ++ ++ /* Capture RX buffer size */ ++ snprintf(temp_path, sizeof(temp_path), ++ cnic_sysfs_uio_event_template, nic->uio_minor); ++ ++ rc = capture_file(&raw, &raw_size, temp_path); ++ if (rc != 0) ++ goto error; ++ ++ elements_read = sscanf(raw, "%d", num_of_events); ++ if (elements_read != 1) { ++ LOG_ERR(PFX "%s: Couldn't parse UIO events size from %s", ++ nic->log_name, temp_path); ++ rc = -EIO; ++ goto error; ++ } ++ ++ rc = 0; ++error: ++ if (raw != NULL) ++ free(raw); ++ ++ return rc; ++} ++ ++/** ++ * nic_set_all_nic_iface_mac_to_parent() - This is a utility function used to ++ * intialize all the MAC addresses of the network interfaces for a given ++ * CNIC UIO device ++ * Call with nic mutex held ++ * @param dev - CNIC UIO device to initialize ++ */ ++void nic_set_all_nic_iface_mac_to_parent(nic_t *nic) ++{ ++ nic_interface_t *current, *vlan_current; ++ ++ current = nic->nic_iface; ++ while (current != NULL) { ++ /* Set the initial MAC address of this interface to the parent ++ * adapter */ ++ memcpy(current->mac_addr, nic->mac_addr, 6); ++ ++ vlan_current = current->vlan_next; ++ while (vlan_current != NULL) { ++ memcpy(vlan_current->mac_addr, nic->mac_addr, 6); ++ vlan_current = vlan_current->vlan_next; ++ } ++ current = current->next; ++ } ++} ++ ++/******************************************************************************* ++ * NIC packet handling functions ++ ******************************************************************************/ ++/** ++ * nic_alloc_packet_buffer() - Used to allocate a packet buffer used to ++ * send a TX packet later ++ * @param nic - nic device to send the packet on ++ * @param nic_iface - nic interface to send out on ++ * @param buf - pointer to the buffer to send ++ * @param buf_size - size in bytes of the buffer to send ++ * @return pointer to the allocated packet buffer ++ * NULL if memory could not be allocated ++ */ ++static packet_t *nic_alloc_packet_buffer(nic_t *nic, ++ nic_interface_t *nic_iface, ++ uint8_t *buf, size_t buf_size) ++{ ++ packet_t *pkt; ++ ++ pkt = malloc(sizeof(*pkt) + buf_size); ++ if (pkt == NULL) { ++ LOG_ERR(PFX "%s: Couldn't allocate space for packet buffer", ++ nic->log_name); ++ return NULL; ++ } ++ ++ pkt->next = NULL; ++ pkt->nic = nic; ++ pkt->nic_iface = nic_iface; ++ pkt->buf_size = buf_size; ++ memcpy(pkt->buf, buf, buf_size); ++ ++ return pkt; ++} ++ ++/** ++ * nic_queue_tx_packet() - Used to queue a TX packet buffer to send later ++ * @param nic - NIC device to send the packet on ++ * @param nic_iface - NIC interface to send on the packet on ++ * @param pkt - packet to queue ++ * @return 0 if successful or <0 if unsuccessful ++ */ ++int nic_queue_tx_packet(nic_t *nic, ++ nic_interface_t *nic_iface, packet_t *pkt) ++{ ++ packet_t *queued_pkt; ++ ++ queued_pkt = nic_alloc_packet_buffer(nic, nic_iface, ++ pkt->buf, pkt->buf_size); ++ if (queued_pkt == NULL) { ++ LOG_ERR(PFX "%s: Couldn't allocate tx packet to queue", ++ nic->log_name); ++ return -ENOMEM; ++ } ++ ++ if (nic->tx_packet_queue == NULL) { ++ nic->tx_packet_queue = queued_pkt; ++ } else { ++ packet_t *current_pkt; ++ ++ current_pkt = nic->tx_packet_queue; ++ while (current_pkt->next != NULL) ++ current_pkt = current_pkt->next; ++ ++ current_pkt->next = queued_pkt; ++ } ++ ++ LOG_DEBUG(PFX "%s: tx packet queued", nic->log_name); ++ ++ return 0; ++} ++ ++/** ++ * nic_dequeue_tx_packet() - Used pop a TX packet buffer of the TX ++ * @param dev - cnic_uio device to send the packet on ++ * @param buf - pointer to the buffer to send ++ * @param buf_size - size in bytes of the buffer to send ++ * @return NULL if there are no more TX packet buffers to send ++ * pointer to the packet buffer which is detached from the device ++ */ ++packet_t *nic_dequeue_tx_packet(nic_t *nic) ++{ ++ packet_t *pkt; ++ ++ pkt = nic->tx_packet_queue; ++ ++ /* There is a packet buffer to send, time to detach it from the ++ * cnic_uio device */ ++ if (pkt != NULL) { ++ nic->tx_packet_queue = pkt->next; ++ pkt->next = NULL; ++ } ++ ++ return pkt; ++} ++ ++void nic_fill_ethernet_header(nic_interface_t *nic_iface, ++ void *data, ++ void *src_addr, void *dest_addr, ++ int *pkt_size, void **start_addr, ++ uint16_t ether_type) ++{ ++ struct ether_header *eth; ++ uint16_t *vlan_hdr; ++ ++ eth = data; ++ ++ memcpy(eth->ether_shost, src_addr, ETH_ALEN); ++ memcpy(eth->ether_dhost, dest_addr, ETH_ALEN); ++ ++ vlan_hdr = (uint16_t *) (eth + 1); ++ eth->ether_type = htons(ether_type); ++ ++ *start_addr = vlan_hdr; ++} ++ ++/******************************************************************************* ++ * NIC interface management utility functions ++ ******************************************************************************/ ++/** ++ * nic_find_nic_iface() - This function is used to find an interface ++ * from the NIC ++ * @param nic - NIC to look for network interfaces ++ * @param vlan_id - VLAN id to look for ++ * @param protocol - either AF_INET or AF_INET6 ++ * @param iface_num - iface num to use if present ++ * @param request_type - IPV4/6 DHCP/STATIC ++ * @return nic_iface - if found network interface with the given VLAN ID ++ * if not found a NULL is returned ++ */ ++nic_interface_t *nic_find_nic_iface(nic_t *nic, ++ uint16_t protocol, ++ uint16_t vlan_id, ++ int iface_num, ++ int request_type) ++{ ++ nic_interface_t *current = nic->nic_iface; ++ nic_interface_t *current_vlan = NULL; ++ ++ while (current != NULL) { ++ if (current->protocol != protocol) ++ goto next; ++ ++ /* Check for iface_num first */ ++ if (iface_num != IFACE_NUM_INVALID) { ++ if (current->iface_num == iface_num) { ++ /* Exception is when iface_num == 0, need to ++ check for request_type also if != ++ IP_CONFIG_OFF */ ++ if (!iface_num && request_type != ++ IP_CONFIG_OFF) { ++ if (current->request_type == ++ request_type) ++ goto found; ++ } else { ++ goto found; ++ } ++ } ++ } else if (vlan_id == NO_VLAN) { ++ /* Just return the top of the family */ ++ goto found; ++ } else { ++ if ((current->vlan_id == vlan_id) && ++ ((request_type == IP_CONFIG_OFF) || ++ (current->request_type == request_type))) ++ goto found; ++ } ++ /* vlan_next loop */ ++ current_vlan = current->vlan_next; ++ while (current_vlan != NULL) { ++ if (iface_num != IFACE_NUM_INVALID) { ++ if (current_vlan->iface_num == iface_num) { ++ if (!iface_num && request_type != ++ IP_CONFIG_OFF) { ++ if (current_vlan->request_type ++ == request_type) ++ goto vlan_found; ++ } else { ++ goto vlan_found; ++ } ++ } ++ } ++ if ((current_vlan->vlan_id == vlan_id) && ++ ((request_type == IP_CONFIG_OFF) || ++ (current_vlan->request_type == request_type))) ++ goto vlan_found; ++ ++ current_vlan = current_vlan->vlan_next; ++ } ++next: ++ current = current->next; ++ } ++vlan_found: ++ current = current_vlan; ++found: ++ return current; ++} ++ ++/* Called with nic mutex held */ ++void persist_all_nic_iface(nic_t *nic) ++{ ++ nic_interface_t *current_vlan, *current; ++ ++ current = nic->nic_iface; ++ while (current != NULL) { ++ current->flags |= NIC_IFACE_PERSIST; ++ current_vlan = current->vlan_next; ++ while (current_vlan != NULL) { ++ current_vlan->flags |= NIC_IFACE_PERSIST; ++ current_vlan = current_vlan->vlan_next; ++ } ++ current = current->next; ++ } ++} ++ ++/* Sets the nic_iface to the front of the AF */ ++void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface) ++{ ++ nic_interface_t *current, *prev; ++ nic_interface_t *current_vlan, *prev_vlan; ++ ++ prev = NULL; ++ current = nic->nic_iface; ++ while (current != NULL) { ++ if (current->protocol != nic_iface->protocol) ++ goto next; ++ /* If its already on top of the list, exit */ ++ if (current == nic_iface) ++ goto done; ++ ++ prev_vlan = current; ++ current_vlan = current->vlan_next; ++ ++ while (current_vlan != NULL) { ++ if (current_vlan == nic_iface) { ++ /* Found inside the vlan list */ ++ /* For vlan == 0, place on top of ++ the AF list */ ++ prev_vlan->vlan_next = ++ current_vlan->vlan_next; ++ current_vlan->vlan_next = current; ++ if (prev) ++ prev->next = current_vlan; ++ else ++ nic->nic_iface = current_vlan; ++ goto done; ++ } ++ prev_vlan = current_vlan; ++ current_vlan = current_vlan->vlan_next; ++ } ++next: ++ prev = current; ++ current = current->next; ++ } ++done: ++ return; ++} ++ ++/******************************************************************************* ++ * Packet management utility functions ++ ******************************************************************************/ ++/** ++ * get_next_packet_in_queue() - This function will return the next packet in ++ * the queue ++ * @param queue - the queue to pull the packet from ++ * @return the packet in the queue ++ */ ++static packet_t *get_next_packet_in_queue(packet_t **queue) ++{ ++ packet_t *pkt; ++ ++ if (*queue == NULL) ++ return NULL; ++ ++ pkt = *queue; ++ *queue = pkt->next; ++ ++ return pkt; ++} ++ ++/** ++ * get_next_tx_packet() - This function will return the next packet in ++ * the TX queue ++ * @param nic - NIC to pull the TX packet from ++ * @return the packet in hte queue ++ */ ++packet_t *get_next_tx_packet(nic_t *nic) ++{ ++ return get_next_packet_in_queue(&nic->tx_packet_queue); ++} ++ ++/** ++ * get_next_free_packet() - This function will return the next packet in ++ * the free queue ++ * @param nic - NIC to pull the RX packet from ++ * @return the packet in hte queue ++ */ ++packet_t *get_next_free_packet(nic_t *nic) ++{ ++ packet_t *pkt; ++ pthread_mutex_lock(&nic->free_packet_queue_mutex); ++ pkt = get_next_packet_in_queue(&nic->free_packet_queue); ++ pthread_mutex_unlock(&nic->free_packet_queue_mutex); ++ ++ if (pkt != NULL) ++ reset_packet(pkt); ++ ++ return pkt; ++} ++ ++/** ++ * put_packet_in_queue() - This function will place the packet in the given ++ * queue ++ * @param pkt - the packet to place ++ * @param queue - the queue to place the packet ++ * @return the packet in the queue ++ */ ++static void put_packet_in_queue(packet_t *pkt, packet_t **queue) ++{ ++ if (*queue == NULL) ++ *queue = pkt; ++ else { ++ pkt->next = *queue; ++ *queue = pkt; ++ } ++} ++ ++/** ++ * put_packet_in_tx_queue() - This function will place the packet in ++ * the TX queue ++ * @param pkt - packet to place ++ * @param nic - NIC to pull the TX packet from ++ * @return the packet in hte queue ++ */ ++void put_packet_in_tx_queue(packet_t *pkt, nic_t *nic) ++{ ++ return put_packet_in_queue(pkt, &nic->tx_packet_queue); ++} ++ ++/** ++ * put_packet_in_free_queue() - This function will place the packet in ++ * the RX queue ++ * @param pkt - packet to place ++ * @param nic - NIC to pull the RX packet from ++ * @return the packet in hte queue ++ */ ++void put_packet_in_free_queue(packet_t *pkt, nic_t *nic) ++{ ++ pthread_mutex_lock(&nic->free_packet_queue_mutex); ++ put_packet_in_queue(pkt, &nic->free_packet_queue); ++ pthread_mutex_unlock(&nic->free_packet_queue_mutex); ++} ++ ++uint32_t calculate_default_netmask(uint32_t ip_addr) ++{ ++ uint32_t netmask; ++ ++ if (IN_CLASSA(ntohl(ip_addr))) ++ netmask = htonl(IN_CLASSA_NET); ++ else if (IN_CLASSB(ntohl(ip_addr))) ++ netmask = htonl(IN_CLASSB_NET); ++ else if (IN_CLASSC(ntohl(ip_addr))) ++ netmask = htonl(IN_CLASSC_NET); ++ else { ++ LOG_ERR("Unable to guess netmask for address %x\n", &ip_addr); ++ return -1; ++ } ++ ++ return netmask; ++} ++ ++void dump_packet_to_log(struct nic_interface *iface, ++ uint8_t *buf, uint16_t buf_len) ++{ ++ ++ FILE *file; ++ char str[80]; ++ int i, count; ++ ++ file = fmemopen(str, sizeof(str), "w+"); ++ if (file == NULL) { ++ LOG_ERR(PFX "Could not create logging file stream for packet " ++ "logging: [%d: %s]", errno, strerror(errno)); ++ return; ++ } ++ ++ LOG_PACKET(PFX "%s: Start packet dump len: %d", iface->parent->log_name, ++ buf_len); ++ ++ for (i = 0; i < buf_len; i++) { ++ rewind(file); ++ fprintf(file, "%03x: ", i); ++ ++ for (count = 0; (count < 8) && i < buf_len; count++, i++) ++ fprintf(file, " %02x", buf[i]); ++ fflush(file); ++ ++ LOG_PACKET(PFX "%s: %s", iface->parent->log_name, str); ++ } ++ ++ LOG_PACKET(PFX "%s: end packet dump", iface->parent->log_name); ++ ++ fclose(file); ++} ++ ++/******************************************************************************* ++ * File Management ++ ******************************************************************************/ ++ /** ++ * determine_file_size_read() - when fstat doesn't work on filepath ++ * within the /proc filesytem, we need to read/count the size of the file ++ * until we hit a EOF ++ * @parm filepath - path of the file in which to determine the filesize in ++ * bytes ++ * @return file size in bytes, <0 on failure ++ */ ++int determine_file_size_read(const char *filepath) ++{ ++ size_t total_size = 0; ++ ssize_t size = 1; ++ int fd; ++ char buf[1024]; ++ ++ fd = open(filepath, O_RDONLY); ++ if (fd == -1) { ++ LOG_ERR("Could not open file: %s [%s]", ++ filepath, strerror(errno)); ++ return -1; ++ } ++ ++ while (size > 0) { ++ size = read(fd, buf, sizeof(buf)); ++ ++ switch (size) { ++ case 0: ++ break; ++ case -1: ++ LOG_ERR("Error reading file: %s [%s]", ++ filepath, strerror(errno)); ++ total_size = -1; ++ break; ++ default: ++ total_size += size; ++ break; ++ } ++ } ++ ++ close(fd); ++ ++ return total_size; ++} ++ ++/** ++ * capture_file() - Used to capture a file into a buffer ++ * @param raw - This pointer will be set to the buffer which will hold the ++ * file contents ++ * @param raw_size - This is the size of the buffer returned ++ * @param path - The file path to capture the data from ++ * @return 0 is returned on success, <0 is returned on failure ++ */ ++int capture_file(char **raw, uint32_t *raw_size, const char *path) ++{ ++ FILE *fp; ++ size_t read_size; ++ int rc = 0; ++ int file_size; ++ ++ file_size = determine_file_size_read(path); ++ if (file_size < 0) { ++ LOG_ERR("Could not determine size %s", path); ++ return -EIO; ++ } ++ ++ fp = fopen(path, "r"); ++ if (fp == NULL) { ++ LOG_ERR("Could not open path %s [%s]", path, strerror(errno)); ++ return -EIO; ++ } ++ ++ *raw = malloc(file_size); ++ if (*raw == NULL) { ++ LOG_ERR("Could not malloc space for capture %s", path); ++ rc = -ENOMEM; ++ goto error; ++ } ++ ++ read_size = fread(*raw, file_size, 1, fp); ++ if (!read_size) { ++ LOG_ERR("Could not read capture, path: %s len: %d [%s]", ++ path, file_size, strerror(ferror(fp))); ++ free(*raw); ++ *raw = NULL; ++ rc = errno; ++ } else ++ *raw_size = file_size; ++ ++error: ++ fclose(fp); ++ ++ LOG_INFO("Done capturing %s", path); ++ ++ return rc; ++} +diff --git a/iscsiuio/src/unix/nic_utils.h b/iscsiuio/src/unix/nic_utils.h +new file mode 100644 +index 0000000..d5c1b58 +--- /dev/null ++++ b/iscsiuio/src/unix/nic_utils.h +@@ -0,0 +1,102 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_util.h - NIC utility functions ++ * ++ */ ++#ifndef __NIC_UTILS_H__ ++#define __NIC_UTILS_H__ ++ ++#include "nic.h" ++ ++/****************************************************************************** ++ * Function Prototype ++ ******************************************************************************/ ++int manually_trigger_uio_event(nic_t *nic, int uio_minor); ++ ++int nic_discover_iscsi_hosts(); ++ ++int enable_mutlicast(nic_t *nic); ++int disable_mutlicast(nic_t *nic); ++ ++int from_netdev_name_find_nic(char *interface_name, nic_t **nic); ++ ++int from_host_no_find_associated_eth_device(int host_no, nic_t **nic); ++ ++int from_phys_name_find_assoicated_uio_device(nic_t *nic); ++ ++int nic_queue_tx_packet(nic_t *nic, ++ nic_interface_t *nic_iface, packet_t *pkt); ++ ++packet_t *nic_dequeue_tx_packet(nic_t *nic); ++ ++void nic_fill_ethernet_header(nic_interface_t *nic_iface, ++ void *data, ++ void *src_addr, void *dest_addr, ++ int *pkt_size, void **start_addr, ++ uint16_t ether_type); ++ ++struct nic_interface *nic_find_nic_iface(nic_t *nic, uint16_t protocol, ++ uint16_t vlan_id, int iface_num, ++ int request_type); ++void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface); ++ ++void persist_all_nic_iface(nic_t *nic); ++ ++int add_vlan_interfaces(nic_t *nic); ++ ++int nic_verify_uio_sysfs_name(nic_t *nic); ++void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no, ++ char *sys_path, size_t size); ++void nic_close_all(); ++void nic_remove_all(); ++ ++int detemine_initial_uio_events(nic_t *nic, uint32_t *num_of_events); ++ ++uint32_t calculate_default_netmask(uint32_t ip_addr); ++ ++void prepare_nic_thread(nic_t *nic); ++void prepare_library(nic_t *nic); ++ ++int nic_enable(nic_t *nic); ++void nic_disable(nic_t *nic, int going_down); ++ ++void dump_packet_to_log(struct nic_interface *iface, ++ uint8_t *buf, uint16_t buf_len); ++ ++int determine_file_size_read(const char *filepath); ++int capture_file(char **raw, uint32_t *raw_size, const char *path); ++ ++#endif /* __NIC_UTILS_H__ */ +diff --git a/iscsiuio/src/unix/nic_vlan.c b/iscsiuio/src/unix/nic_vlan.c +new file mode 100644 +index 0000000..eb33381 +--- /dev/null ++++ b/iscsiuio/src/unix/nic_vlan.c +@@ -0,0 +1,337 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_vlan.c - uIP user space stack VLAN utilities ++ * ++ */ ++#define _GNU_SOURCE ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include "logger.h" ++#include "nic.h" ++#include "nic_utils.h" ++#include "nic_vlan.h" ++ ++/******************************************************************************* ++ * Constants ++ ******************************************************************************/ ++#define PFX "vlan" ++ ++static const char proc_vlan_config_path[] = "/proc/net/vlan/config"; ++ ++/******************************************************************************* ++ * Resolving Found VLAN's for CNIC ++ ******************************************************************************/ ++int init_vlan_found_handle(struct vlan_found_handle *found_handle, ++ struct vlan_handle *handle) ++{ ++ memset(found_handle, 0, sizeof(*found_handle)); ++ ++ found_handle->entries = malloc(found_handle->num_of_entries * ++ sizeof(struct vlan_found_entry)); ++ if (found_handle->entries == NULL) { ++ LOG_ERR("Could not allocate space for found entries"); ++ return -ENOMEM; ++ } ++ ++ found_handle->handle = handle; ++ found_handle->num_of_entries = handle->num_of_entries; ++ ++ memset(found_handle->entries, 0, found_handle->num_of_entries * ++ sizeof(struct vlan_found_entry)); ++ ++ handle->outstanding_found_handles++; ++ ++ return 0; ++} ++ ++void release_vlan_found_handle(struct vlan_found_handle *found_handle) ++{ ++ if (found_handle->entries != NULL) { ++ free(found_handle->entries); ++ found_handle->entries = NULL; ++ } ++ ++ found_handle->num_of_entries = 0; ++ ++ found_handle->handle->outstanding_found_handles--; ++ ++ found_handle->handle = NULL; ++ ++} ++ ++/******************************************************************************* ++ * Resolving VLAN's for CNIC ++ ******************************************************************************/ ++/** ++ * init_vlan_handle() - Used to initialize struct ipv4_route_handle so ++ * that is can be used ++ * @param handle - Pointer to struct ipv4_route_handle to initialize ++ * @return 0 on success and <0 on failure ++ */ ++void init_vlan_table(struct vlan_handle *handle) ++{ ++ handle->entries = NULL; ++ handle->num_of_entries = 0; ++} ++ ++/** ++ * parse_vlan_table() - Given the raw dump of a Linux vlan table, this ++ * function will parse the into entries held by ++ * struct vlan_handle ++ * @param handle - struct vlan_handle used to hold the parsed contents ++ * @param raw - buffer to parse the contents from ++ * @param raw_size - size of the buffer in bytes ++ * @return 0 on success, <0 on failure ++ */ ++int parse_vlan_table(struct vlan_handle *handle, char *raw, uint32_t raw_size) ++{ ++ FILE *fp; ++ int i; ++ char *token; ++ size_t size; ++ int rc; ++ ++ token = raw; ++ ++ /* determine the number of entries */ ++ while (*token != '\0') { ++ if (*token == '\n') ++ handle->num_of_entries++; ++ ++ token++; ++ } ++ ++ /* There are 2 lines which describe the vlan table ++ * This lines need to be skipped with counting */ ++ handle->num_of_entries -= 2; ++ ++ LOG_INFO("Number of vlan entries: %d", handle->num_of_entries); ++ ++ size = handle->num_of_entries * sizeof(struct vlan_entry); ++ handle->entries = malloc(size); ++ if (handle->entries == NULL) { ++ LOG_ERR ++ ("Couldn't malloc space to parse vlan table. entires: %d " ++ "size: %d", ++ handle->num_of_entries, size); ++ return -ENOMEM; ++ } ++ ++ fp = fmemopen(raw, raw_size, "r"); ++ if (fp == NULL) { ++ LOG_ERR("Could not open raw dump of vlan table"); ++ rc = errno; ++ goto fmemopen_error; ++ } ++ ++ if (fscanf(fp, "%*[^\n]\n") < 0) { /* Skip the first line. */ ++ LOG_ERR("Empty or missing line, or read error"); ++ rc = -EIO; ++ goto error; ++ } ++ ++ if (fscanf(fp, "%*[^\n]\n") < 0) { /* Skip the second line. */ ++ LOG_ERR("Empty or missing line, or read error"); ++ rc = -EIO; ++ goto error; ++ } ++ ++ i = 0; ++ /* Time to parse the routing table */ ++ while (1) { ++ struct vlan_entry *entry = &handle->entries[i]; ++ int r; ++ ++ r = fscanf(fp, "%15s |%hu |%15s", ++ entry->vlan_iface_name, ++ &entry->vlan_id, entry->phy_iface_name); ++ if (r != 3) { ++ if (feof(fp)) { /* EOF with no (nonspace) chars read. */ ++ break; ++ } ++ ++ LOG_WARN("Parsing error: parsed %d elements", r); ++ break; ++ } ++ ++ i++; ++ ++ LOG_DEBUG("Vlan %d: vlan iface:%s vlan id:%d phys iface:%s", ++ i, ++ entry->vlan_iface_name, ++ entry->vlan_id, entry->phy_iface_name); ++ } ++ ++ fclose(fp); ++ ++ return 0; ++ ++error: ++ fclose(fp); ++ ++fmemopen_error: ++ if (handle->entries != NULL) ++ free(handle->entries); ++ ++ return rc; ++} ++ ++/** ++ * capture_vlan_table() - This function will snapshot the Linux vlan ++ * routing table for further processing ++ * @param handle - struct vlan_handle used to hold the routing context ++ * @return 0 on success, <0 on failure ++ */ ++int capture_vlan_table(struct vlan_handle *handle) ++{ ++ char *raw = NULL; ++ uint32_t raw_size = 0; ++ int rc; ++ ++ rc = capture_file(&raw, &raw_size, proc_vlan_config_path); ++ if (rc != 0) ++ goto error; ++ ++ rc = parse_vlan_table(handle, raw, raw_size); ++ if (rc != 0) ++ goto error; ++ ++error: ++ if (raw != NULL) ++ free(raw); ++ ++ return rc; ++} ++ ++/** ++ * release_vlan_table() - This function will free all resources used by ++ * the handle ++ * @param handle - struct vlan_handle used to hold the routing context ++ */ ++void release_vlan_table(struct vlan_handle *handle) ++{ ++ if (handle->entries != NULL) { ++ free(handle->entries); ++ handle->entries = NULL; ++ } ++ ++ handle->num_of_entries = 0; ++} ++ ++/** ++ * find_phy_using_vlan_interface() - Given the interface name determine VLAN ++ * tag ID to match either the physical or VLAN interface name ++ * @param vlan_iface_name - VLAN interface used to find the physical ++ * interface ++ * @param phy_iface_name - returned value is the physical interface name ++ * @param vlan_id - returned value is the VLAN id ++ * @return 1 is returned if the interface is a VLAN, 0 if the interface is not ++ * <0 is returned if there is an error ++ */ ++int find_phy_using_vlan_interface(struct vlan_handle *handle, ++ char *vlan_iface_name, ++ char **phy_iface_name, uint16_t *vlan_id) ++{ ++ int i, rc = 0; ++ ++ for (i = 0; i < handle->num_of_entries; i++) { ++ struct vlan_entry *entry = &handle->entries[i]; ++ ++ /* Compare VLAN interface names to find a match */ ++ if (strcmp(entry->vlan_iface_name, vlan_iface_name) == 0) { ++ *phy_iface_name = entry->phy_iface_name; ++ *vlan_id = entry->vlan_id; ++ rc = 1; ++ break; ++ } ++ } ++ ++ return rc; ++} ++ ++/** ++ * find_vlans_using_phy_interface() - Given the physical interface name this ++ * function will determine the VLAN interface name and VLAN ID ++ * @param iface_name - physical interface used to find the vlan interface ++ * @param vlan_iface_name - returned value is the VLAN interface name ++ * @return The number of VLAN interfaces found ++ */ ++int find_vlans_using_phy_interface(struct vlan_handle *handle, ++ struct vlan_found_handle *found_handle, ++ char *phy_iface_name) ++{ ++ int i, num_found = 0; ++ ++ for (i = 0; i < handle->num_of_entries; i++) { ++ struct vlan_entry *entry = &handle->entries[i]; ++ ++ /* Compare interface names to find a match */ ++ if (strcmp(entry->phy_iface_name, phy_iface_name) == 0) { ++ found_handle->entries[i].found = VLAN_ENTRY_FOUND; ++ num_found++; ++ } ++ } ++ ++ return num_found; ++} ++ ++/** ++ * valid_vlan() - determine if the vlan value which is passed is valid ++ * @param vlan - vlan value to test ++ * @return 0 - not valid, 1 - valid ++ */ ++int valid_vlan(short int vlan) ++{ ++ /* Allow vlan 1 to connect */ ++ if (vlan > 0 && vlan < 4095) ++ return 1; ++ ++ return 0; ++} +diff --git a/iscsiuio/src/unix/nic_vlan.h b/iscsiuio/src/unix/nic_vlan.h +new file mode 100644 +index 0000000..610f721 +--- /dev/null ++++ b/iscsiuio/src/unix/nic_vlan.h +@@ -0,0 +1,89 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * nic_vlan.h - uIP user space stack VLAN utilities ++ * ++ */ ++#ifndef __NIC_VLAN_H__ ++#define __NIC_VLAN_H__ ++ ++#include ++ ++/* Used to hold entries in the vlan table */ ++struct vlan_entry { ++ char vlan_iface_name[16]; ++ char phy_iface_name[16]; ++ uint16_t vlan_id; ++}; ++ ++struct vlan_handle { ++ struct vlan_entry *entries; ++ uint32_t num_of_entries; ++ ++ uint32_t outstanding_found_handles; ++}; ++ ++struct vlan_found_entry { ++#define VLAN_ENTRY_FOUND 1 ++#define VLAN_ENTRY_NOT_FOUND 0 ++ uint8_t found; ++}; ++ ++struct vlan_found_handle { ++ struct vlan_handle *handle; ++ uint32_t num_of_entries; ++ struct vlan_found_entry *entries; ++}; ++ ++/******************************************************************************* ++ * Function Prototypes ++ ******************************************************************************/ ++void init_vlan_table(struct vlan_handle *handle); ++int capture_vlan_table(struct vlan_handle *handle); ++void release_vlan_table(struct vlan_handle *handle); ++ ++int find_phy_using_vlan_interface(struct vlan_handle *handle, ++ char *vlan_iface_name, ++ char **phy_iface_name, uint16_t *vlan_id); ++int find_vlans_using_phy_interface(struct vlan_handle *handle, ++ struct vlan_found_handle *found_handle, ++ char *phy_iface_name); ++ ++int init_vlan_found_handle(struct vlan_found_handle *found_handle, ++ struct vlan_handle *handle); ++void release_vlan_found_handle(struct vlan_found_handle *found_handle); ++ ++int valid_vlan(short int vlan); ++#endif /* __NIC_VLAN_H__ */ +diff --git a/iscsiuio/src/unix/options.h b/iscsiuio/src/unix/options.h +new file mode 100644 +index 0000000..df03255 +--- /dev/null ++++ b/iscsiuio/src/unix/options.h +@@ -0,0 +1,117 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * options.h - CNIC UIO uIP user space stack ++ * ++ */ ++#ifndef __OPTIONS_H__ ++#define __OPTIONS_H__ ++ ++#include ++#include ++#include ++ ++/****************************************************************************** ++ * Constants which are tuned at compile time by the user ++ *****************************************************************************/ ++ ++/** ++ * MAX_COUNT_NIC_NL_RESP - This is the maximum number of polls uIP will ++ * try for a kernel response after a PATH_REQ ++ */ ++#define MAX_COUNT_NIC_NL_RESP 128 ++ ++/** ++ * NLM_BUF_DEFAULT_MAX - This is the buffer size allocated for the send/receive ++ * buffers used by the uIP Netlink subsystem. This ++ * value is in bytes. ++ */ ++#define NLM_BUF_DEFAULT_MAX 8192 /* bytes */ ++ ++/****************************************************************************** ++ * Non adjustable constants ++ *****************************************************************************/ ++#ifndef ETHERTYPE_IP ++#define ETHERTYPE_IP 0x0800 /* IP */ ++#endif /* ETHERTYPE_IP */ ++ ++#ifndef ETHERTYPE_IPV6 ++#define ETHERTYPE_IPV6 0x86dd /* IP protocol version 6 */ ++#endif /* ETHERTYPE_IPV6 */ ++ ++#ifndef ETHERTYPE_ARP ++#define ETHERTYPE_ARP 0x0806 /* Address resolution */ ++#endif /* ETHERTYPE_ARP */ ++ ++#ifndef ETHERTYPE_VLAN ++#define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */ ++#endif /* ETHERTYPE_VLAN */ ++ ++#define APP_NAME "iscsiuio" ++/* BUILD_DATE is automatically generated from the Makefile */ ++ ++#define DEBUG_OFF 0x1 ++#define DEBUG_ON 0x2 ++ ++#define INVALID_FD -1 ++#define INVALID_THREAD -1 ++ ++struct options { ++ char debug; ++ ++ /* Time the userspace daemon was started */ ++ time_t start_time; ++}; ++ ++extern int event_loop_stop; ++extern struct options opt; ++ ++#ifdef WORDS_BIGENDIAN ++#define ntohll(x) (x) ++#define htonll(x) (x) ++#else ++#define ntohll(x) bswap_64(x) ++#define htonll(x) bswap_64(x) ++#endif ++ ++# define likely(x) __builtin_expect(!!(x), 1) ++# define unlikely(x) __builtin_expect(!!(x), 0) ++ ++/* taken from Linux kernel, include/linux/compiler-gcc.h */ ++/* Optimization barrier */ ++/* The "volatile" is due to gcc bugs */ ++#define barrier() __asm__ __volatile__("": : :"memory") ++ ++#endif +diff --git a/iscsiuio/src/unix/packet.c b/iscsiuio/src/unix/packet.c +new file mode 100644 +index 0000000..c0eeb1f +--- /dev/null ++++ b/iscsiuio/src/unix/packet.c +@@ -0,0 +1,143 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * packet.c - packet management ++ * ++ */ ++#include ++#include ++ ++#include "logger.h" ++#include "packet.h" ++#include "nic.h" ++ ++/** ++ * alloc_packet() - Function used to allocate memory for a packet ++ * @param max_buf_size - max packet size ++ * @param priv_size - size of the assoicated private data ++ * @return NULL if failed, on success return a pointer to the packet ++ */ ++struct packet *alloc_packet(size_t max_buf_size, size_t priv_size) ++{ ++ struct packet *pkt; ++ void *priv; ++ ++ pkt = malloc(max_buf_size + sizeof(struct packet)); ++ if (pkt == NULL) { ++ LOG_ERR("Could not allocate any memory for packet"); ++ return NULL; ++ } ++ ++ priv = malloc(priv_size); ++ if (priv == NULL) { ++ LOG_ERR("Could not allocate any memory for private structure"); ++ goto free_pkt; ++ } ++ ++ pkt->max_buf_size = max_buf_size; ++ pkt->priv = priv; ++ ++ return pkt; ++ ++free_pkt: ++ free(pkt); ++ ++ return NULL; ++} ++ ++void free_packet(struct packet *pkt) ++{ ++ if (pkt->priv != NULL) ++ free(pkt->priv); ++ ++ free(pkt); ++} ++ ++/** ++ * reset_packet() - This will reset the packet fields to default values ++ * @param pkt - the packet to reset ++ */ ++void reset_packet(packet_t *pkt) ++{ ++ pkt->next = NULL; ++ ++ pkt->flags = 0; ++ pkt->vlan_tag = 0; ++ ++ pkt->buf_size = 0; ++ ++ pkt->data_link_layer = NULL; ++ pkt->network_layer = NULL; ++} ++ ++int alloc_free_queue(nic_t *nic, size_t num_of_packets) ++{ ++ int i; ++ ++ pthread_mutex_lock(&nic->free_packet_queue_mutex); ++ for (i = 0; i < num_of_packets; i++) { ++ packet_t *pkt; ++ ++ pkt = alloc_packet(1500, 1500); ++ if (pkt == NULL) { ++ goto done; ++ } ++ ++ reset_packet(pkt); ++ ++ pkt->next = nic->free_packet_queue; ++ nic->free_packet_queue = pkt; ++ } ++ ++done: ++ pthread_mutex_unlock(&nic->free_packet_queue_mutex); ++ ++ return i; ++} ++ ++void free_free_queue(nic_t *nic) ++{ ++ packet_t *pkt, *pkt_next; ++ ++ pthread_mutex_lock(&nic->free_packet_queue_mutex); ++ pkt = nic->free_packet_queue; ++ while (pkt) { ++ pkt_next = pkt->next; ++ free_packet(pkt); ++ pkt = pkt_next; ++ } ++ nic->free_packet_queue = NULL; ++ pthread_mutex_unlock(&nic->free_packet_queue_mutex); ++} +diff --git a/iscsiuio/src/unix/packet.h b/iscsiuio/src/unix/packet.h +new file mode 100644 +index 0000000..b63d688 +--- /dev/null ++++ b/iscsiuio/src/unix/packet.h +@@ -0,0 +1,76 @@ ++/* ++ * Copyright (c) 2009-2011, Broadcom Corporation ++ * Copyright (c) 2014, QLogic Corporation ++ * ++ * Written by: Benjamin Li (benli@broadcom.com) ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by Adam Dunkels. ++ * 4. The name of the author may not be used to endorse or promote ++ * products derived from this software without specific prior ++ * written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. ++ * ++ * packet.h - packet definitions ++ * ++ */ ++#include ++ ++#ifndef __PACKET_H__ ++#define __PACKET_H__ ++ ++#include "nic.h" ++ ++struct nic; ++struct nic_interface; ++ ++typedef struct packet { ++ struct packet *next; ++ ++ uint32_t flags; ++#define VLAN_TAGGED 0x0001 ++ uint16_t vlan_tag; ++ ++ size_t max_buf_size; ++ size_t buf_size; ++ ++ uint8_t *data_link_layer; ++ uint8_t *network_layer; ++ ++ struct nic *nic; ++ struct nic_interface *nic_iface; ++ ++ void *priv; ++ uint8_t buf[]; ++} packet_t; ++ ++/****************************************************************************** ++ * Packet Function Declarations ++ *****************************************************************************/ ++int alloc_free_queue(struct nic *, size_t num_of_packets); ++void free_free_queue(struct nic *); ++void reset_packet(packet_t *pkt); ++ ++#endif /* __PACKET_H__ */ +diff --git a/iscsiuio/src/unix/uip-conf.h b/iscsiuio/src/unix/uip-conf.h +new file mode 100644 +index 0000000..e6e11a5 +--- /dev/null ++++ b/iscsiuio/src/unix/uip-conf.h +@@ -0,0 +1,160 @@ ++/** ++ * \addtogroup uipopt ++ * @{ ++ */ ++ ++/** ++ * \name Project-specific configuration options ++ * @{ ++ * ++ * uIP has a number of configuration options that can be overridden ++ * for each project. These are kept in a project-specific uip-conf.h ++ * file and all configuration names have the prefix UIP_CONF. ++ */ ++ ++/* ++ * Copyright (c) 2006, Swedish Institute of Computer Science. ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. 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. ++ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. ++ * ++ * This file is part of the uIP TCP/IP stack ++ * ++ */ ++ ++/** ++ * \file ++ * An example uIP configuration file ++ * \author ++ * Adam Dunkels ++ */ ++ ++#ifndef __UIP_CONF_H__ ++#define __UIP_CONF_H__ ++ ++#include ++ ++/** ++ * 8 bit datatype ++ * ++ * This typedef defines the 8-bit type used throughout uIP. ++ * ++ * \hideinitializer ++ */ ++typedef uint8_t u8_t; ++ ++/** ++ * 16 bit datatype ++ * ++ * This typedef defines the 16-bit type used throughout uIP. ++ * ++ * \hideinitializer ++ */ ++typedef uint16_t u16_t; ++ ++/** ++ * 32 bit datatype ++ * ++ * This typedef defines the 16-bit type used throughout uIP. ++ * ++ * \hideinitializer ++ */ ++typedef uint32_t u32_t; ++ ++/** ++ * Statistics datatype ++ * ++ * This typedef defines the dataype used for keeping statistics in ++ * uIP. ++ * ++ * \hideinitializer ++ */ ++typedef uint64_t uip_stats_t; ++ ++/** ++ * Maximum number of TCP connections. ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_MAX_CONNECTIONS 40 ++ ++/** ++ * Maximum number of listening TCP ports. ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_MAX_LISTENPORTS 40 ++ ++/** ++ * uIP buffer size. ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_BUFFER_SIZE 420 ++ ++/** ++ * CPU byte order. ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN ++ ++/** ++ * Logging on or off ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_LOGGING 1 ++ ++/** ++ * UDP support on or off ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_UDP 1 ++ ++/** ++ * UDP checksums on or off ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_UDP_CHECKSUMS 1 ++ ++/** ++ * uIP statistics on or off ++ * ++ * \hideinitializer ++ */ ++#define UIP_CONF_STATISTICS 1 ++ ++#define UIP_CONF_IPV6 0 ++ ++#define INET_ADDRSTRLEN 16 ++#define INET6_ADDRSTRLEN 46 ++ ++#endif /* __UIP_CONF_H__ */ ++ ++/** @} */ ++/** @} */ +diff --git a/sysfs-documentation b/sysfs-documentation +new file mode 100644 +index 0000000..54fc497 +--- /dev/null ++++ b/sysfs-documentation +@@ -0,0 +1,514 @@ ++Description of iface attributes and their valid values ++====================================================== ++ ++== IPv4 attributes == ++ ++ipaddress ++--------- ++IP address in format XXX.XXX.XXX.XXX ++ ++gateway ++------- ++IP address of the network router or gateway device in format XXX.XXX.XXX.XXX ++ ++subnet ++------ ++Broadcast address in format XXX.XXX.XXX.XXX ++ ++bootproto ++--------- ++The protocol type used to initialize interface ++ ++Valid values: "dhcp" or "static" ++ ++dhcp_dns_address_en ++------------------- ++Request DNS Server IP Addresses and Domain Name ++ ++If bootproto is set to dhcp and dhcp_dns_address_en is enable, ++requests DNS addresses (option 6) and domain name (option 15) in its ++DHCP parameter request list. ++ ++Valid values: "enable" or "disable" ++ ++dhcp_slp_da_info_en ++------------------- ++Request SLP DA Information and SLP Scope ++If bootproto is set to dhcp and dhcp_slp_da_info_en is enable, ++requests SLP DA information (option 78) and SLP scope (option 79) ++in its DHCP parameter request list. ++ ++Valid values: "enable" or "disable" ++ ++tos_en ++------ ++Enable IPv4 type of service (ToS) ++ ++When tos_en is set to enable, use value set in tos when transmitting IPv4 TCP ++packets on iSCSI connections. ++ ++Valid values: "enable" or "disable" ++ ++tos ++--- ++IPv4 Type of service (ToS) ++ ++When tos_en is set to enable, use value set in tos when transmitting IPv4 TCP ++packets on iSCSI connections. ++ ++Valid range: 8-bit value. [0-255] ++ ++grat_arp_en ++----------- ++Enable Gratuitous ARP Requests ++ ++Valid values: "enable" or "disable" ++ ++dhcp_alt_client_id_en ++--------------------- ++DHCP Use Alternate Client ID ++ ++When dhcp_alt_client_id_en is set to enable, use the Client ID configured in ++dhcp_alt_client_id as its Client ID (DHCP option 61) in outgoing DHCP messages. ++ ++Valid values: "enable" or "disable" ++ ++dhcp_alt_client_id ++------------------ ++DHCP Alternate Client ID ++ ++When dhcp_alt_client_id_en is set to enable, use value set in dhcp_alt_client_id ++for Client ID in DHCP messages. ++ ++Valid values: 11-byte Client ID ++ ++dhcp_req_vendor_id_en ++--------------------- ++DHCP Require Vendor ID ++ ++When dhcp_req_vendor_id_en is set to enable, use value set in dhcp_vendor_id as ++its vendor ID (DHCP option 60) in outgoing DHCP messages. ++ ++Valid values: "enable" or "disable" ++ ++dhcp_use_vendor_id_en ++--------------------- ++DHCP Use Vendor ID ++ ++When dhcp_use_vendor_id_en is set to enable, use value set in dhcp_vendor_id as ++its vendor ID (DHCP option 60) in outgoing DHCP messages. ++ ++Valid values: "enable" or "disable" ++ ++dhcp_vendor_id ++-------------- ++DHCP Vendor ID ++ ++When dhcp_req_vendor_id_en or dhcp_use_vendor_id_en is set to enable, ++use value set in dhcp_vendor_id for Vendor ID in DHCP messages. ++ ++Valid values: 11-byte Client ID ++ ++dhcp_learn_iqn_en ++----------------- ++DHCP Learn IQN ++ ++When dhcp_learn_iqn_en is set to enable, iSCSI initiator attempts to use DHCP ++to learn its (IQN) iSCSI name. ++ ++Valid values: "enable" or "disable" ++ ++fragment_disable ++---------------- ++Fragmentation Disable. ++ ++When fragment_disable is set to disable, iSCSI initiator cannot fragment IP ++datagrams. ++ ++Valid values: "enable" or "disable" ++ ++incoming_forwarding_en ++---------------------- ++When incoming_forwarding_en is set to enable, iSCSI initiator forwards all ++incoming network traffic to the network driver, except for iSCSI TCP packets ++destined to the iSCSI initiator. ++ ++Valid values: "enable" or "disable" ++ ++ttl ++--- ++IPv4 Time to Live (TTL) ++ ++This attribute contain TTL value sent in IPv4 TCP packets transmitted on ++iSCSI connections. ++ ++Valid range: 8-bit value. [0-255] ++ ++== IPv6 attributes == ++ ++ipaddress ++--------- ++IP address in IPv6 format. ++ ++link_local_addr ++--------------- ++Link local address in IPv6 format. ++ ++router_addr ++----------- ++Router address in IPv6 format. ++ ++ipaddr_autocfg ++-------------- ++Autoconfigure IPv6 Address. ++ ++Valid values: nd, dhcpv6 or disable ++qla4xxx don't support dhcpv6. ++ ++link_local_autocfg ++------------------ ++Autoconfigure IPv6 Link Local Address. ++ ++IPv6 neighbor discovery protocol to discover Link Local Address. ++ ++Valid values: auto or disable ++ ++ ++router_autocfg ++-------------- ++Autoconfigure IPv6 Router address. ++ ++IPv6 neighbor discovery protocol to discover a default router address. ++ ++Valid values: auto or disable ++ ++link_local_state ++---------------- ++This Read-only attribute show Link Local IP address state in sysfs. ++ ++Valid values: Unconfigured, Acquiring, Tentative, Valid, Disabling, Invalid, ++ Deprecated. ++ ++ ++router_state ++------------ ++This Read-only attribute shows router state. ++ ++Valid values: Unknown, Advertised, Manual, Stale. ++ ++ ++grat_neighbor_adv_en ++-------------------- ++Enable Gratuitious Neighbor Advertisement ++ ++Valid values: "enable" or "disable" ++ ++mld_en ++------ ++Enable IPv6 Multicast Listener Discovery ++ ++Valid values: "enable" or "disable" ++ ++flow_label ++---------- ++This attribute specifies the default value of the Flow Label field in the ++IPv6 header of TCP packets transmitted on iSCSI connections ++ ++Valid range: 20-bit value. [0-1048575] ++Value zero indicates that the traffic is not assigned to a labelled flow. ++ ++traffic_class ++------------- ++This attribute specifies the IPv6 traffic class value to be used in IPv6 ++TCP packets transmitted from the firmware on iSCSI connections. ++ ++Valid range: 8-bit value. [0-255] ++ ++hop_limit ++--------- ++This attribute specifies the IPv6 hop limit value to be used in IPv6 TCP ++packets transmitted from the firmware on iSCSI connections ++ ++Valid range: 8-bit value. [0-255] ++ ++nd_reachable_tmo ++---------------- ++This attribute specifies the time (in milliseconds) that a node assumes ++that the neighbor is reachable after confirmation. ++ ++Valid range: 4-byte value. [0-4294967295] ++ ++nd_rexmit_time ++-------------- ++This attribute specifies the time (in milliseconds) between retransmitted ++neighbor solicitation messages. ++ ++Valid range: 4-byte value. [0-4294967295] ++ ++nd_stale_tmo ++------------ ++This attribute specifies the time (in milliseconds) after which a stale ++neighbor or destination cache entry is discarded. ++ ++Valid range: 4-byte value. [0-4294967295] ++ ++dup_addr_detect_cnt ++------------------- ++This attribute specifies the IPv6 duplicate address detection count ++ ++Valid range: 8-bit value. [0-255] ++ 0 - Disable ++ 1 - TryOnce ++ 2 - TryTwice, and so on ++ ++router_adv_link_mtu ++------------------- ++IPv6 Router Advertised Link MTU Size. ++ ++Valid range: 1280 bytes to 1500 bytes ++ ++== Common == ++enabled ++------- ++This attribute is used to enable or disable IPv4 or IPv6 protocol. ++ ++Valid values: "enable" or "disable" ++ ++vlan_id ++------- ++This attribute specifies 12-bit VLAN identifier (VID) ++ ++Valid range: 12-bit value. [1-4094] ++ ++vlan_priority ++------------- ++This attribute specifies Priority to outbound packets containing the ++specified VLAN-ID (VID) ++ ++Valid range: 3-bit value. [0-7] ++ ++vlan_enabled ++------------ ++VLAN Tagging Enable. ++ ++When this attribute is set to enable, use value set in vlan_id and ++vlan_priority to transmit IP packets, and discards IP packets that were ++received without a matching VLAN ID ++ ++Valid values: "enable" or "disable" ++ ++mtu ++--- ++Ethernet MTU Size. ++ ++This field specifies the maximum payload length in byte of an ++Ethernet frame supported by iSCSI initiator. ++ ++Valid values: 576 bytes to 9000 bytes ++ ++port ++---- ++This attribute shows the initiator iSCSI port number. ++ ++ipaddress_state ++--------------- ++This Read-only attribute show IP address state. ++ ++Valid values: Unconfigured, Acquiring, Tentative, Valid, Disabling, Invalid, ++ Deprecated. ++ ++delayed_ack_en ++-------------- ++When this attribute is set to enable, TCP delayed ACK is enabled. ++ ++Valid values: "enable" or "disable" ++ ++tcp_nagle_disable ++----------------- ++When this attribute is set to disable, TCP Nagle algorithm is disabled. ++ ++Valid values: "enable" or "disable" ++ ++tcp_wsf_disable ++--------------- ++When this attribute is set to disable, TCP window scale is disabled. ++ ++Valid values: "enable" or "disable" ++ ++tcp_wsf ++------- ++This attribute specifies the TCP window scale factor to be negotiated ++on TCP connections. ++ ++Valid range: 8-bit value. [0-255] ++ ++tcp_timer_scale ++--------------- ++The TCP Timer Scale is scale factor that adjusts the time interval between ++timer ticks on a TCP connection. The scale factor allows for faster time-outs ++for connections running on a very small network, versus connections running ++on a very large network. ++ ++Valid range: 3-bit value. [0-7] ++ ++tcp_timestamp_en ++---------------- ++When this attribute is set to enable, iSCSI initiator negotiates to use time ++stamps in TCP headers ++ ++Valid values: "enable" or "disable" ++ ++cache_id ++-------- ++This Read-only attribute is used to find the valid cache entries for the ++interface. ++ ++For IPv4, ARP cache entry ++For IPv6, Neighbor cache entry ++ ++redirect_en ++----------- ++For IPv4: ++When this attribute is set to enable, an ARP redirect can modify the address ++resolution protocol (ARP) table and any active connections. ++ ++For IPv6: ++When this attribute is set to enable and neighbor advertisements are received, ++the connection table is examined and updated if any active connections match ++the IP address on the neighbor advertisement. This action is required for ++failover and redirect. ++ ++Valid values: "enable" or "disable" ++ ++def_taskmgmt_tmo ++---------------- ++This attribute specifies timeout interval in seconds that iSCSI uses for ++timing out task-management commands. ++ ++Valid range: 16-bit value [0-65535]. ++ ++header_digest ++------------- ++When this attribute is set to enable iSCSI initiator negotiates for ++HeaderDigest=CRC32 and when set to disable negotiates HeaderDigest=none. ++ ++Valid values: "enable" or "disable" ++ ++data_digest ++----------- ++When this attribute is set to enable iSCSI initiator negotiates for ++DataDigest=CRC32 and when set to disable negotiates DataDigest=none. ++ ++Valid values: "enable" or "disable" ++ ++immediate_data ++-------------- ++When this attribute is set to enable iSCSI initiator negotiates for ++ImmediateData=yes and When set to disable negotiates ImmediateData=none ++ ++Valid values: "enable" or "disable" ++ ++initial_r2t ++----------- ++When this attribute is set to enable iSCSI initiator negotiates for ++InitialR2T=yes. When set to disable negotiates InitialR2T=no. ++ ++Valid values: "enable" or "disable" ++ ++data_seq_in_order ++----------------- ++When this attribute is set to enable iSCSI initiator set data sequences ++in order ++ ++Valid values: "enable" or "disable" ++qla4xxx does not support out-of-order data sequences ++ ++data_pdu_in_order ++----------------- ++When this attribute is set to enable iSCSI initiator set Data PDU ++in order ++ ++Valid values: "enable" or "disable" ++qla4xxx does not support out-of-order Data PDUs. ++ ++erl ++--- ++Error Recovery Level ++ ++This attribute specifies error recovery level (ERL) supported by the ++connection. ++ ++Valid values: 2-bit value [0-2] ++ ++max_recv_dlength ++---------------- ++iSCSI Maximum Receive Data Segment Length. ++ ++This attribute specifies Maximum data segment length in bytes, that receive ++in an iSCSI PDU. ++ ++first_burst_len ++--------------- ++iSCSI First Burst Length ++ ++This attribute Specifies the maximum amount of unsolicited data an iSCSI ++initiator can send to the target during the execution of a single SCSI command, ++in bytes. ++ ++max_outstanding_r2t ++------------------- ++iSCSI Maximum Outstanding R2T ++ ++This attribute Specifies how many R2T PDUs per command can be outstanding ++during an iSCSI session. ++ ++max_burst_len ++------------- ++This attribute Specifies the maximum length for unsolicited or immediate data ++iSCSI session can send or receive. ++ ++chap_auth ++--------- ++When this attribute is set to enable iSCSI session performs authentication ++during the security state of login phase. ++ ++Valid values: "enable" or "disable" ++ ++bidi_chap ++--------- ++When this attribute is set to enable iSCSI session generates a CHAP challenge ++to any target that has issued a CHAP challenge to the iSCSI session. ++iSCSI session issues the challenge to the target after responding to the ++targets challenge. This attribute is ignored if chap_auth is set to disable. ++ ++Valid values: "enable" or "disable" ++ ++discovery_auth_optional ++----------------------- ++When this attribute is set to enable and the chap_auth is set to enable, ++iSCSI session does not require authentication on discovery sessions unless ++requested by the peer. When this attribute is set to disable iSCSI session ++requires CHAP authentication for a discovery session. ++ ++Valid values: "enable" or "disable" ++ ++discovery_logout ++---------------- ++When this attribute is set to enable, iSCSI initiator initiates an iSCSI logout ++on a discovery session when discovery is complete (before closing the connection). ++When this attribute is set to disable, iSCSI initiator closes the connection when ++discovery is complete. ++ ++Valid values: "enable" or "disable" ++ ++strict_login_comp_en ++-------------------- ++When this attribute is set to enable, iSCSI initiator enforces the iSCSI login ++negotiation rules. When this attribute is set to disable, iSCSI initiator does ++not enforce iSCSI login negotiation. ++ ++Valid values: "enable" or "disable" ++ ++initiator_name ++-------------- ++This Read-only attribute contains the iSCSI Name string used by the firmware. +diff --git a/usr/Makefile b/usr/Makefile +index 673b7f1..e23fee1 100644 +--- a/usr/Makefile ++++ b/usr/Makefile +@@ -28,9 +28,9 @@ IPC_OBJ=ioctl.o + endif + endif + +-OPTFLAGS ?= -O2 -g ++CFLAGS ?= -O2 -g + WARNFLAGS ?= -Wall -Wstrict-prototypes +-CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../include -I. -I../utils/open-isns \ ++CFLAGS += $(WARNFLAGS) -I../include -I. -I../utils/open-isns \ + -D$(OSNAME) $(IPC_CFLAGS) + PROGRAMS = iscsid iscsiadm iscsistart + +@@ -40,7 +40,8 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o) + ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \ + sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \ + iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \ +- initiator_common.o iscsi_err.o $(IPC_OBJ) $(SYSDEPS_SRCS) ++ initiator_common.o iscsi_err.o flashnode.o uip_mgmt_ipc.o \ ++ $(IPC_OBJ) $(SYSDEPS_SRCS) + # core initiator files + INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o + +@@ -54,14 +55,14 @@ all: $(PROGRAMS) + + iscsid: $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(DISCOVERY_SRCS) \ + iscsid.o session_mgmt.o discoveryd.o +- $(CC) $(CFLAGS) $^ -o $@ -L../utils/open-isns -lisns ++ $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ -L../utils/open-isns -lisns -lrt -lmount + + iscsiadm: $(ISCSI_LIB_SRCS) $(DISCOVERY_SRCS) iscsiadm.o session_mgmt.o +- $(CC) $(CFLAGS) $^ -o $@ -L../utils/open-isns -lisns ++ $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ -L../utils/open-isns -lisns + + iscsistart: $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(FW_BOOT_SRCS) \ + iscsistart.o statics.o +- $(CC) $(CFLAGS) -static $^ -o $@ ++ $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ -lrt -lmount + clean: + rm -f *.o $(PROGRAMS) .depend $(LIBSYS) + +diff --git a/usr/actor.c b/usr/actor.c +index b8f8e61..b4f9e95 100644 +--- a/usr/actor.c ++++ b/usr/actor.c +@@ -1,7 +1,8 @@ + /* +- * iSCSI usermode single-threaded scheduler ++ * iSCSI timeout & deferred work handling + * + * Copyright (C) 2004 Dmitry Yusupov, Alex Aizman ++ * Copyright (C) 2014 Red Hat Inc. + * maintained by open-iscsi@googlegroups.com + * + * This program is free software; you can redistribute it and/or modify +@@ -17,53 +18,32 @@ + * See the file COPYING included with this distribution for more details. + */ + #include ++#include ++#include ++#include ++#include + #include "actor.h" + #include "log.h" + #include "list.h" + + static LIST_HEAD(pend_list); +-static LIST_HEAD(poll_list); +-static LIST_HEAD(actor_list); +-static volatile uint64_t previous_time; +-static volatile uint32_t scheduler_loops; ++static LIST_HEAD(ready_list); + static volatile int poll_in_progress; +-static volatile uint64_t actor_jiffies = 0; +- +-#define actor_diff(_time1, _time2) ({ \ +- uint64_t __ret; \ +- if ((_time2) >= (_time1)) \ +- __ret = (_time2) - (_time1); \ +- else \ +- __ret = ((~0ULL) - (_time1)) + (_time2); \ +- __ret; \ +-}) +- +-#define ACTOR_TICKS actor_jiffies +-#define ACTOR_TICKS_10MS(_a) (_a) +-#define ACTOR_MS_TO_TICKS(_a) ((_a)/ACTOR_RESOLUTION) + + static uint64_t +-actor_diff_time(actor_t *thread, uint64_t current_time) ++actor_time_left(actor_t *thread, uint64_t current_time) + { +- uint64_t diff_time = actor_diff(thread->scheduled_at, current_time); +- if(diff_time >= thread->ttschedule) ++ if (current_time > thread->ttschedule) + return 0; +- return (thread->ttschedule - diff_time); ++ else ++ return (thread->ttschedule - current_time); + } + + #define time_after(a,b) \ + ((int64_t)(b) - (int64_t)(a) < 0) + + void +-actor_init(void) +-{ +- poll_in_progress = 0; +- previous_time = 0; +- scheduler_loops = 0; +-} +- +-void +-actor_new(actor_t *thread, void (*callback)(void *), void *data) ++actor_init(actor_t *thread, void (*callback)(void *), void *data) + { + INIT_LIST_HEAD(&thread->list); + thread->state = ACTOR_NOTSCHEDULED; +@@ -77,11 +57,18 @@ actor_delete(actor_t *thread) + log_debug(7, "thread %08lx delete: state %d", (long)thread, + thread->state); + switch(thread->state) { +- case ACTOR_SCHEDULED: + case ACTOR_WAITING: +- case ACTOR_POLL_WAITING: ++ /* TODO: remove/reset alarm if we were 1st entry in pend_list */ ++ /* priority: low */ ++ /* fallthrough */ ++ case ACTOR_SCHEDULED: + log_debug(1, "deleting a scheduled/waiting thread!"); + list_del_init(&thread->list); ++ if (list_empty(&pend_list)) { ++ log_debug(7, "nothing left on pend_list, deactivating alarm"); ++ alarm(0); ++ } ++ + break; + default: + break; +@@ -89,73 +76,94 @@ actor_delete(actor_t *thread) + thread->state = ACTOR_NOTSCHEDULED; + } + ++/* ++ * Inserts actor on pend list and sets alarm if new item is ++ * sooner than previous entries. ++ */ + static void +-actor_schedule_private(actor_t *thread, uint32_t ttschedule, int head) ++actor_insert_on_pend_list(actor_t *thread, uint32_t delay_secs) + { +- uint64_t delay_time, current_time; +- actor_t *next_thread; ++ struct actor *orig_head; ++ struct actor *new_head; ++ struct actor *next_thread; + +- delay_time = ACTOR_MS_TO_TICKS(ttschedule); +- current_time = ACTOR_TICKS; ++ orig_head = list_first_entry_or_null(&pend_list, ++ struct actor, list); + +- log_debug(7, "thread %p schedule: delay %" PRIu64 " state %d", +- thread, delay_time, thread->state); ++ /* insert new entry in sort order */ ++ list_for_each_entry(next_thread, &pend_list, list) { ++ if (time_after(next_thread->ttschedule, thread->ttschedule)) { ++ log_debug(7, "next thread %p due %lld", next_thread, ++ (long long)next_thread->ttschedule); ++ log_debug(7, "new thread %p is before (%lld), inserting", thread, ++ (long long)thread->ttschedule); ++ ++ /* insert new thread before the next thread */ ++ __list_add(&thread->list, next_thread->list.prev, &next_thread->list); ++ goto inserted; ++ } ++ } ++ ++ if (orig_head) { ++ log_debug(7, "last thread %p due %lld", next_thread, ++ (long long)next_thread->ttschedule); ++ log_debug(7, "new thread %p is after (%lld), inserting at tail", thread, ++ (long long)thread->ttschedule); ++ } ++ else ++ log_debug(7, "new thread %p due %lld is first item on pend_list", thread, ++ (long long)thread->ttschedule); ++ ++ /* Not before any existing entries */ ++ list_add_tail(&thread->list, &pend_list); ++ ++inserted: ++ new_head = list_first_entry(&pend_list, struct actor, list); ++ if (orig_head != new_head) { ++ int result = alarm(delay_secs); ++ log_debug(7, "new alarm set for %d seconds, old alarm %d", ++ delay_secs, result); ++ } ++} ++ ++static void ++actor_schedule_private(actor_t *thread, uint32_t delay_secs, int head) ++{ ++ time_t current_time; ++ ++ struct timespec tv; ++ ++ if (clock_gettime(CLOCK_MONOTONIC_COARSE, &tv)) { ++ log_error("clock_getime failed, can't schedule!"); ++ return; ++ } ++ ++ current_time = tv.tv_sec; ++ ++ log_debug(7, "thread %p schedule: delay %u state %d", ++ thread, delay_secs, thread->state); + +- /* convert ttscheduled msecs in 10s of msecs by dividing for now. +- * later we will change param to 10s of msecs */ + switch(thread->state) { + case ACTOR_WAITING: + log_error("rescheduling a waiting thread!"); + list_del(&thread->list); ++ /* fall-through */ + case ACTOR_NOTSCHEDULED: + INIT_LIST_HEAD(&thread->list); +- /* if ttschedule is 0, put in scheduled queue and change +- * state to scheduled, else add current time to ttschedule and +- * insert in the queue at the correct point */ +- if (delay_time == 0) { +- /* For head addition, it must go onto the head of the +- actor_list regardless if poll is in progress or not +- */ +- if (poll_in_progress && !head) { +- thread->state = ACTOR_POLL_WAITING; +- list_add_tail(&thread->list, +- &poll_list); +- } else { +- thread->state = ACTOR_SCHEDULED; +- if (head) +- list_add(&thread->list, +- &actor_list); +- else +- list_add_tail(&thread->list, +- &actor_list); +- } ++ ++ if (delay_secs == 0) { ++ thread->state = ACTOR_SCHEDULED; ++ if (head) ++ list_add(&thread->list, &ready_list); ++ else ++ list_add_tail(&thread->list, &ready_list); + } else { + thread->state = ACTOR_WAITING; +- thread->ttschedule = delay_time; +- thread->scheduled_at = current_time; ++ thread->ttschedule = current_time + delay_secs; + +- /* insert new entry in sort order */ +- list_for_each_entry(next_thread, &pend_list, list) { +- log_debug(7, "thread %p %" PRIu64 " %"PRIu64, +- next_thread, +- next_thread->scheduled_at + +- next_thread->ttschedule, +- current_time + delay_time); +- +- if (time_after(next_thread->scheduled_at + +- next_thread->ttschedule, +- current_time + delay_time)) { +- list_add(&thread->list, +- &next_thread->list); +- goto done; +- } +- } +- +- list_add_tail(&thread->list, &pend_list); ++ actor_insert_on_pend_list(thread, delay_secs); + } +-done: + break; +- case ACTOR_POLL_WAITING: + case ACTOR_SCHEDULED: + // don't do anything + break; +@@ -180,117 +188,90 @@ actor_schedule(actor_t *thread) + } + + void +-actor_timer(actor_t *thread, uint32_t timeout, void (*callback)(void *), ++actor_timer(actor_t *thread, uint32_t timeout_secs, void (*callback)(void *), + void *data) + { +- actor_new(thread, callback, data); +- actor_schedule_private(thread, timeout, 0); +-} +- +-int +-actor_timer_mod(actor_t *thread, uint32_t timeout, void *data) +-{ +- if (thread->state == ACTOR_WAITING) { +- list_del_init(&thread->list); +- thread->data = data; +- actor_schedule_private(thread, timeout, 0); +- return 1; +- } +- return 0; +-} +- +-void +-actor_check(uint64_t current_time) +-{ +- struct actor *thread, *tmp; +- +- list_for_each_entry_safe(thread, tmp, &pend_list, list) { +- if (actor_diff_time(thread, current_time)) { +- log_debug(7, "thread %08lx wait some more", +- (long)thread); +- /* wait some more */ +- break; +- } +- +- /* it is time to schedule this entry */ +- list_del_init(&thread->list); +- +- log_debug(2, "thread %08lx was scheduled at %" PRIu64 ":" +- "%" PRIu64 ", curtime %" PRIu64 " q_forw %p " +- "&pend_list %p", +- (long)thread, thread->scheduled_at, thread->ttschedule, +- current_time, pend_list.next, &pend_list); +- +- if (poll_in_progress) { +- thread->state = ACTOR_POLL_WAITING; +- list_add_tail(&thread->list, &poll_list); +- log_debug(7, "thread %08lx now in poll_list", +- (long)thread); +- } else { +- thread->state = ACTOR_SCHEDULED; +- list_add_tail(&thread->list, &actor_list); +- log_debug(7, "thread %08lx now in actor_list", +- (long)thread); +- } +- } ++ actor_init(thread, callback, data); ++ actor_schedule_private(thread, timeout_secs, 0); + } + ++/* ++ * Execute all items that have expired. ++ * ++ * Set an alarm if items remain. Caller must catch SIGALRM and ++ * then re-invoke this function. ++ */ + void + actor_poll(void) + { ++ struct actor *thread, *tmp; + uint64_t current_time; +- struct actor *thread; ++ struct timespec tv; + +- /* check that there are no any concurrency */ + if (poll_in_progress) { +- log_error("concurrent actor_poll() is not allowed"); ++ log_error("recursive actor_poll() is not allowed"); ++ return; + } + +- /* don't check wait list every single poll. +- * get new time. Shift it to make 10s of msecs approx +- * if new time is not same as old time */ +- if (scheduler_loops++ > ACTOR_MAX_LOOPS) { +- /* try coming in about every 100 msecs */ +- current_time = ACTOR_TICKS; +- scheduler_loops = 0; +- /* checking whether we are in the same tick... */ +- if ( ACTOR_TICKS_10MS(current_time) != +- ACTOR_TICKS_10MS(previous_time)) { +- previous_time = current_time; +- actor_check(current_time); ++ if (clock_gettime(CLOCK_MONOTONIC_COARSE, &tv)) { ++ log_error("clock_gettime failed, can't schedule!"); ++ return; ++ } ++ ++ current_time = tv.tv_sec; ++ ++ /* ++ * Move items that are ripe from pend_list to ready_list. ++ * Actors are in sorted order of ascending run time, so ++ * stop at the first unripe entry. ++ */ ++ log_debug(7, "current time %" PRIu64, current_time); ++ ++ list_for_each_entry_safe(thread, tmp, &pend_list, list) { ++ uint64_t time_left = actor_time_left(thread, current_time); ++ if (time_left) { ++ log_debug(7, "thread %08lx due %" PRIu64 ", wait %" PRIu64 " more", ++ (long)thread, thread->ttschedule, time_left); ++ ++ alarm(time_left); ++ break; + } ++ ++ /* This entry can be run now */ ++ list_del_init(&thread->list); ++ ++ log_debug(2, "thread %08lx was scheduled for " ++ "%" PRIu64 ", curtime %" PRIu64 " q_forw %p " ++ "&pend_list %p", ++ (long)thread, thread->ttschedule, ++ current_time, pend_list.next, &pend_list); ++ ++ list_add_tail(&thread->list, &ready_list); ++ assert(thread->state == ACTOR_WAITING); ++ thread->state = ACTOR_SCHEDULED; ++ log_debug(7, "thread %08lx now in ready_list", ++ (long)thread); ++ } ++ ++ /* Disable alarm if nothing else pending */ ++ if (list_empty(&pend_list)) { ++ log_debug(7, "nothing on pend_list, deactivating alarm"); ++ alarm(0); + } + +- /* the following code to check in the main data path */ + poll_in_progress = 1; +- while (!list_empty(&actor_list)) { +- thread = list_entry(actor_list.next, struct actor, list); ++ while (!list_empty(&ready_list)) { ++ thread = list_first_entry(&ready_list, struct actor, list); + list_del_init(&thread->list); + + if (thread->state != ACTOR_SCHEDULED) +- log_error("actor_list: thread state corrupted! " ++ log_error("ready_list: thread state corrupted! " + "Thread with state %d in actor list.", + thread->state); + thread->state = ACTOR_NOTSCHEDULED; + log_debug(7, "exec thread %08lx callback", (long)thread); + thread->callback(thread->data); +- log_debug(7, "thread removed\n"); ++ log_debug(7, "thread %08lx done", (long)thread); + } + poll_in_progress = 0; +- +- while (!list_empty(&poll_list)) { +- thread = list_entry(poll_list.next, struct actor, list); +- list_del_init(&thread->list); +- +- if (thread->state != ACTOR_POLL_WAITING) +- log_error("poll_list: thread state corrupted!" +- "Thread with state %d in poll list.", +- thread->state); +- thread->state = ACTOR_SCHEDULED; +- list_add_tail(&thread->list, &actor_list); +- log_debug(7, "thread %08lx removed from poll_list", +- (long)thread); +- } +- +- ACTOR_TICKS++; + } +diff --git a/usr/actor.h b/usr/actor.h +index 704224d..7283dce 100644 +--- a/usr/actor.h ++++ b/usr/actor.h +@@ -22,15 +22,11 @@ + #include "types.h" + #include "list.h" + +-#define ACTOR_RESOLUTION 250 /* in millis */ +-#define ACTOR_MAX_LOOPS 1 +- + typedef enum actor_state_e { + ACTOR_INVALID, + ACTOR_WAITING, + ACTOR_SCHEDULED, + ACTOR_NOTSCHEDULED, +- ACTOR_POLL_WAITING + } actor_state_e; + + typedef struct actor { +@@ -38,18 +34,16 @@ typedef struct actor { + actor_state_e state; + void *data; + void (*callback)(void * ); +- uint64_t scheduled_at; +- uint64_t ttschedule; ++ time_t ttschedule; + } actor_t; + +-extern void actor_new(actor_t *thread, void (*callback)(void *), void * data); ++extern void actor_init(actor_t *thread, void (*callback)(void *), void * data); + extern void actor_delete(actor_t *thread); + extern void actor_schedule_head(actor_t *thread); + extern void actor_schedule(actor_t *thread); +-extern void actor_timer(actor_t *thread, uint32_t timeout, ++extern void actor_timer(actor_t *thread, uint32_t delay_secs, + void (*callback)(void *), void *data); +-extern int actor_timer_mod(actor_t *thread, uint32_t new_timeout, void *data); ++extern int actor_timer_mod(actor_t *thread, uint32_t new_delay_secs, void *data); + extern void actor_poll(void); +-extern void actor_init(void); + + #endif /* ACTOR_H */ +diff --git a/usr/auth.c b/usr/auth.c +index c924545..00b4388 100644 +--- a/usr/auth.c ++++ b/usr/auth.c +@@ -109,13 +109,13 @@ acl_chap_auth_request(struct iscsi_acl *client, char *username, unsigned int id, + /* the expected credentials are in the session */ + if (session->username_in == NULL) { + log_error("failing authentication, no incoming username " +- "configured to authenticate target %s\n", ++ "configured to authenticate target %s", + session->target_name); + return AUTH_STATUS_FAIL; + } + if (strcmp(username, session->username_in) != 0) { + log_error("failing authentication, received incorrect " +- "username from target %s\n", session->target_name); ++ "username from target %s", session->target_name); + return AUTH_STATUS_FAIL; + } + +@@ -123,7 +123,7 @@ acl_chap_auth_request(struct iscsi_acl *client, char *username, unsigned int id, + (session->password_in == NULL) || + (session->password_in[0] == '\0')) { + log_error("failing authentication, no incoming password " +- "configured to authenticate target %s\n", ++ "configured to authenticate target %s", + session->target_name); + return AUTH_STATUS_FAIL; + } +@@ -132,7 +132,7 @@ acl_chap_auth_request(struct iscsi_acl *client, char *username, unsigned int id, + + if (rsp_length != sizeof(verify_data)) { + log_error("failing authentication, received incorrect " +- "CHAP response length %u from target %s\n", ++ "CHAP response length %u from target %s", + rsp_length, session->target_name); + return AUTH_STATUS_FAIL; + } +@@ -154,13 +154,13 @@ acl_chap_auth_request(struct iscsi_acl *client, char *username, unsigned int id, + auth_md5_final(verify_data, &context); + + if (memcmp(response_data, verify_data, sizeof(verify_data)) == 0) { +- log_debug(1, "initiator authenticated target %s\n", ++ log_debug(1, "initiator authenticated target %s", + session->target_name); + return AUTH_STATUS_PASS; + } + + log_error("failing authentication, received incorrect CHAP " +- "response from target %s\n", session->target_name); ++ "response from target %s", session->target_name); + return AUTH_STATUS_FAIL; + } + +@@ -189,24 +189,24 @@ get_random_bytes(unsigned char *data, unsigned int length) + + long r; + unsigned n; +- int fd; ++ int fd, r_size = sizeof(r); + + fd = open("/dev/urandom", O_RDONLY); + while (length > 0) { + +- if (!fd || read(fd, &r, sizeof(long)) != -1) ++ if (fd == -1 || read(fd, &r, r_size) != r_size) + r = rand(); + r = r ^ (r >> 8); + r = r ^ (r >> 4); + n = r & 0x7; + +- if (!fd || read(fd, &r, sizeof(long)) != -1) ++ if (fd == -1 || read(fd, &r, r_size) != r_size) + r = rand(); + r = r ^ (r >> 8); + r = r ^ (r >> 5); + n = (n << 3) | (r & 0x7); + +- if (!fd || read(fd, &r, sizeof(long)) != -1) ++ if (fd == -1 || read(fd, &r, r_size) != r_size) + r = rand(); + r = r ^ (r >> 8); + r = r ^ (r >> 5); +@@ -2002,7 +2002,7 @@ acl_dbg_status_to_text(int dbg_status) + "AuthMethod negotiation failed", + "AuthMethod negotiated to none", + "CHAP algorithm negotiation failed", +- "CHAP challange reflected", ++ "CHAP challenge reflected", + "Local password same as remote", + "Local password not set", + "CHAP identifier bad", +diff --git a/usr/be2iscsi.c b/usr/be2iscsi.c +index ce8b719..8a346a5 100644 +--- a/usr/be2iscsi.c ++++ b/usr/be2iscsi.c +@@ -19,7 +19,6 @@ + void be2iscsi_create_conn(struct iscsi_conn *conn) + { + struct iscsi_session *session = conn->session; +- conn_rec_t *conn_rec = &session->nrec.conn[conn->id]; + + if (conn->max_recv_dlength > 65536) + conn->max_recv_dlength = 65536; +@@ -33,10 +32,6 @@ void be2iscsi_create_conn(struct iscsi_conn *conn) + if (conn->max_xmit_dlength > 65536) + conn->max_xmit_dlength = 65536; + +- if (!conn_rec->iscsi.MaxXmitDataSegmentLength || +- conn_rec->iscsi.MaxXmitDataSegmentLength > 65536) +- conn_rec->iscsi.MaxXmitDataSegmentLength = 65536; +- + session->erl = 0; + session->initial_r2t_en = 1; + } +diff --git a/usr/config.h b/usr/config.h +index 998caff..fd31a54 100644 +--- a/usr/config.h ++++ b/usr/config.h +@@ -201,6 +201,9 @@ typedef struct session_rec { + * allowed to be initiated on this record + */ + unsigned char multiple; ++ char boot_root[BOOT_NAME_MAXLEN]; ++ char boot_nic[BOOT_NAME_MAXLEN]; ++ char boot_target[BOOT_NAME_MAXLEN]; + } session_rec_t; + + #define ISCSI_TRANSPORT_NAME_MAXLEN 16 +@@ -229,11 +232,59 @@ typedef struct iface_rec { + * 1 = enable */ + uint16_t mtu; + uint16_t port; ++ char delayed_ack[ISCSI_MAX_STR_LEN]; ++ char nagle[ISCSI_MAX_STR_LEN]; ++ char tcp_wsf_state[ISCSI_MAX_STR_LEN]; ++ uint8_t tcp_wsf; ++ uint8_t tcp_timer_scale; ++ char tcp_timestamp[ISCSI_MAX_STR_LEN]; ++ char dhcp_dns[ISCSI_MAX_STR_LEN]; ++ char dhcp_slp_da[ISCSI_MAX_STR_LEN]; ++ char tos_state[ISCSI_MAX_STR_LEN]; ++ uint8_t tos; ++ char gratuitous_arp[ISCSI_MAX_STR_LEN]; ++ char dhcp_alt_client_id_state[ISCSI_MAX_STR_LEN]; ++ char dhcp_alt_client_id[ISCSI_MAX_STR_LEN]; ++ char dhcp_req_vendor_id_state[ISCSI_MAX_STR_LEN]; ++ char dhcp_vendor_id_state[ISCSI_MAX_STR_LEN]; ++ char dhcp_vendor_id[ISCSI_MAX_STR_LEN]; ++ char dhcp_learn_iqn[ISCSI_MAX_STR_LEN]; ++ char fragmentation[ISCSI_MAX_STR_LEN]; ++ char incoming_forwarding[ISCSI_MAX_STR_LEN]; ++ uint8_t ttl; ++ char gratuitous_neighbor_adv[ISCSI_MAX_STR_LEN]; ++ char redirect[ISCSI_MAX_STR_LEN]; ++ char mld[ISCSI_MAX_STR_LEN]; ++ uint32_t flow_label; ++ uint32_t traffic_class; ++ uint8_t hop_limit; ++ uint32_t nd_reachable_tmo; ++ uint32_t nd_rexmit_time; ++ uint32_t nd_stale_tmo; ++ uint8_t dup_addr_detect_cnt; ++ uint32_t router_adv_link_mtu; ++ uint16_t def_task_mgmt_tmo; ++ char header_digest[ISCSI_MAX_STR_LEN]; ++ char data_digest[ISCSI_MAX_STR_LEN]; ++ char immediate_data[ISCSI_MAX_STR_LEN]; ++ char initial_r2t[ISCSI_MAX_STR_LEN]; ++ char data_seq_inorder[ISCSI_MAX_STR_LEN]; ++ char data_pdu_inorder[ISCSI_MAX_STR_LEN]; ++ uint8_t erl; ++ uint32_t max_recv_dlength; ++ uint32_t first_burst_len; ++ uint16_t max_out_r2t; ++ uint32_t max_burst_len; ++ char chap_auth[ISCSI_MAX_STR_LEN]; ++ char bidi_chap[ISCSI_MAX_STR_LEN]; ++ char strict_login_comp[ISCSI_MAX_STR_LEN]; ++ char discovery_auth[ISCSI_MAX_STR_LEN]; ++ char discovery_logout[ISCSI_MAX_STR_LEN]; + char port_state[ISCSI_MAX_STR_LEN]; + char port_speed[ISCSI_MAX_STR_LEN]; + /* + * TODO: we may have to make this bigger and interconnect +- * specific for infinniband ++ * specific for infiniband + */ + char hwaddress[ISCSI_HWADDRESS_BUF_SIZE]; + char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; +diff --git a/usr/discovery.c b/usr/discovery.c +index afce6c0..38968ca 100644 +--- a/usr/discovery.c ++++ b/usr/discovery.c +@@ -111,7 +111,7 @@ int discovery_isns_set_servername(char *address, int port) + int len; + + if (port > USHRT_MAX) { +- log_error("Invalid port %d\n", port); ++ log_error("Invalid port %d", port); + return ISCSI_ERR_INVAL; + } + +@@ -193,7 +193,7 @@ int discovery_isns_query(struct discovery_rec *drec, const char *iname, + status = isns_query_response_get_objects(qry, &objects); + if (status) { + log_error("Unable to extract object list from query " +- "response: %s\n", isns_strerror(status)); ++ "response: %s", isns_strerror(status)); + rc = ISCSI_ERR; + goto free_query; + } +@@ -391,7 +391,7 @@ int discovery_fw(void *data, struct iface_rec *iface, + rc = fw_get_targets(&targets); + if (rc) { + log_error("Could not get list of targets from firmware. " +- "(err %d)\n", rc); ++ "(err %d)", rc); + return rc; + } + if (list_empty(&targets)) +@@ -406,7 +406,7 @@ int discovery_fw(void *data, struct iface_rec *iface, + rec = idbm_create_rec_from_boot_context(bcontext); + if (!rec) { + log_error("Could not convert firmware info to " +- "node record.\n"); ++ "node record."); + rc = ISCSI_ERR_NOMEM; + goto free_targets; + } +@@ -456,7 +456,7 @@ int discovery_offload_sendtargets(int host_no, int do_login, + */ + rc = iscsid_exec_req(&req, &rsp, 1); + if (rc) { +- log_error("Could not offload sendtargets to %s.\n", ++ log_error("Could not offload sendtargets to %s.", + drec->address); + iscsi_err_print_msg(rc); + return rc; +@@ -817,7 +817,7 @@ iscsi_alloc_session(struct iscsi_sendtargets_config *config, + session->t = iscsi_sysfs_get_transport_by_name(iface->transport_name); + if (!session->t) { + log_error("iSCSI driver %s is not loaded. Load the module " +- "then retry the command.\n", iface->transport_name); ++ "then retry the command.", iface->transport_name); + *rc = ISCSI_ERR_TRANS_NOT_FOUND; + goto fail; + } +@@ -1036,7 +1036,7 @@ static void iscsi_destroy_session(struct iscsi_session *session) + rc = ipc->stop_conn(session->t->handle, session->id, + conn->id, STOP_CONN_TERM); + if (rc) { +- log_error("Could not stop conn %d:%d cleanly (err %d)\n", ++ log_error("Could not stop conn %d:%d cleanly (err %d)", + session->id, conn->id, rc); + goto done; + } +@@ -1091,7 +1091,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session) + */ + conn->socket_fd = ipc->ctldev_open(); + if (conn->socket_fd < 0) { +- log_error("Could not open netlink interface (err %d)\n", ++ log_error("Could not open netlink interface (err %d)", + errno); + return ISCSI_ERR_INTERNAL; + } +@@ -1109,14 +1109,15 @@ static int iscsi_create_leading_conn(struct iscsi_session *session) + + rc = iscsi_host_set_net_params(iface, session); + if (rc) { +- log_error("Could not set host net params (err %d)\n", ++ log_error("Could not set host net params (err %d)", + rc); +- rc = ISCSI_ERR_INTERNAL; ++ if (rc != ISCSI_ERR_AGAIN) ++ rc = ISCSI_ERR_INTERNAL; + goto close_ipc; + } + + /* create interconnect endpoint */ +- log_debug(2, "%s discovery ep connect\n", __FUNCTION__); ++ log_debug(2, "%s discovery ep connect", __FUNCTION__); + rc = t->template->ep_connect(conn, 1); + if (rc < 0) { + rc = ISCSI_ERR_TRANS; +@@ -1139,21 +1140,21 @@ static int iscsi_create_leading_conn(struct iscsi_session *session) + break; + } while (1); + +- log_debug(2, "%s discovery create session\n", __FUNCTION__); ++ log_debug(2, "%s discovery create session", __FUNCTION__); + /* create kernel structs */ + rc = ipc->create_session(session->t->handle, + conn->transport_ep_handle, 1, 32, 1, + &session->id, &host_no); + if (rc) { +- log_error("Could not create kernel session (err %d).\n", rc); ++ log_error("Could not create kernel session (err %d).", rc); + rc = ISCSI_ERR_INTERNAL; + goto disconnect; + } +- log_debug(2, "%s discovery created session %u\n", __FUNCTION__, ++ log_debug(2, "%s discovery created session %u", __FUNCTION__, + session->id); + session->isid[3] = session->id; + +- log_debug(2, "%s discovery create conn\n", __FUNCTION__); ++ log_debug(2, "%s discovery create conn", __FUNCTION__); + rc = ipc->create_conn(t->handle, session->id, conn->id, &conn->id); + if (rc) { + log_error("Could not create connection (err %d)", rc); +@@ -1161,7 +1162,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session) + goto disconnect; + } + +- log_debug(2, "%s discovery bind conn\n", __FUNCTION__); ++ log_debug(2, "%s discovery bind conn", __FUNCTION__); + if (ipc->bind_conn(t->handle, session->id, conn->id, + conn->transport_ep_handle, (conn->id == 0), &rc) || + rc) { +@@ -1207,7 +1208,7 @@ close_ipc: + static struct iscsi_ev_context * + iscsi_ev_context_get(struct iscsi_conn *conn, int ev_size) + { +- log_debug(2, "%s: ev_size %d\n", __FUNCTION__, ev_size); ++ log_debug(2, "%s: ev_size %d", __FUNCTION__, ev_size); + + ipc_ev_context.data = calloc(1, ev_size); + if (!ipc_ev_context.data) +@@ -1403,6 +1404,17 @@ redirect_reconnect: + iscsi_copy_operational_params(&session->conn[0], &config->session_conf, + &config->conn_conf); + ++ if (t->caps & CAP_TEXT_NEGO) { ++ log_debug(2, "%s discovery set params", __FUNCTION__); ++ rc = iscsi_session_set_params(conn); ++ if (rc) { ++ log_error("Could not set iscsi params for conn %d:%d " ++ "(err %d)", session->id, conn->id, rc); ++ rc = ISCSI_ERR_INTERNAL; ++ goto login_failed; ++ } ++ } ++ + if ((session->t->caps & CAP_LOGIN_OFFLOAD)) + goto start_conn; + +@@ -1477,7 +1489,7 @@ redirect_reconnect: + case ISCSI_LOGIN_STATUS_AUTH_FAILED: + case ISCSI_LOGIN_STATUS_TGT_FORBIDDEN: + log_error("discovery login to %s rejected: " +- "initiator failed authorization\n", ++ "initiator failed authorization", + conn->host); + rc = ISCSI_ERR_LOGIN_AUTH_FAILED; + goto login_failed; +@@ -1509,16 +1521,16 @@ redirect_reconnect: + return 0; + + start_conn: +- log_debug(2, "%s discovery set params\n", __FUNCTION__); +- rc = iscsi_session_set_params(conn); ++ log_debug(2, "%s discovery set neg params", __FUNCTION__); ++ rc = iscsi_session_set_neg_params(conn); + if (rc) { + log_error("Could not set iscsi params for conn %d:%d (err " +- "%d)\n", session->id, conn->id, rc); ++ "%d)", session->id, conn->id, rc); + rc = ISCSI_ERR_INTERNAL; + goto login_failed; + } + +- log_debug(2, "%s discovery start conn\n", __FUNCTION__); ++ log_debug(2, "%s discovery start conn", __FUNCTION__); + if (ipc->start_conn(t->handle, session->id, conn->id, &rc) || rc) { + log_error("Cannot start conn %d:%d (err %d)", + session->id, conn->id, rc); +diff --git a/usr/discoveryd.c b/usr/discoveryd.c +index de080ea..1e14977 100644 +--- a/usr/discoveryd.c ++++ b/usr/discoveryd.c +@@ -211,7 +211,7 @@ static void fork_disc(const char *def_iname, struct discovery_rec *drec, + exit(0); + } else if (pid < 0) + log_error("Fork failed (err %d - %s). Will not be able " +- "to perform discovery to %s.\n", ++ "to perform discovery to %s.", + errno, strerror(errno), drec->address); + else { + shutdown_callback(pid); +@@ -254,7 +254,7 @@ static int isns_build_objs(isns_portal_info_t *portal_info, + nportals = isns_enumerate_portals(iflist, nportals); + if (nportals == 0) { + log_error("Unable to enumerate portals - " +- "no usable interfaces found\n"); ++ "no usable interfaces found"); + free(iflist); + return ISCSI_ERR_NO_OBJS_FOUND; + } +@@ -557,7 +557,7 @@ static int isns_setup_registration_refresh(isns_simple_t *rsp, int poll_inval) + status = isns_query_response_get_objects(rsp, &objs); + if (status) { + log_error("Unable to extract object list from " +- "registration response: %s\n", ++ "registration response: %s", + isns_strerror(status)); + return ISCSI_ERR; + } +@@ -693,7 +693,7 @@ static int isns_register_objs(isns_client_t *clnt, isns_object_list_t *objs, + + status = isns_simple_call(clnt->ic_socket, ®); + if (status != ISNS_SUCCESS) { +- log_error("SCN registration for node %s failed: %s\n", ++ log_error("SCN registration for node %s failed: %s", + isns_source_name(node->source), + isns_strerror(status)); + /* +@@ -907,7 +907,7 @@ static int isns_scn_recv(isns_server_t *svr, isns_socket_t *svr_sock, + + function = isns_message_function(msg); + if (function != ISNS_STATE_CHANGE_NOTIFICATION) { +- log_warning("Discarding unexpected %s message\n", ++ log_warning("Discarding unexpected %s message", + isns_function_name(function)); + isns_message_release(msg); + continue; +diff --git a/usr/event_poll.c b/usr/event_poll.c +index f36fec1..209ee02 100644 +--- a/usr/event_poll.c ++++ b/usr/event_poll.c +@@ -26,6 +26,8 @@ + #include + #include + #include ++#include ++#include + + #include "mgmt_ipc.h" + #include "iscsi_ipc.h" +@@ -37,7 +39,9 @@ + #include "initiator.h" + #include "iscsi_err.h" + +-static int reap_count; ++static unsigned int reap_count; ++ ++#define REAP_WAKEUP 1000 /* in millisecs */ + + void reap_inc(void) + { +@@ -50,7 +54,7 @@ void reap_proc(void) + + /* + * We don't really need reap_count, but calling wait() all the +- * time seems execessive. ++ * time seems excessive. + */ + max_reaps = reap_count; + for (i = 0; i < max_reaps; i++) { +@@ -80,7 +84,7 @@ int shutdown_callback(pid_t pid) + + INIT_LIST_HEAD(&cb->list); + cb->pid = pid; +- log_debug(1, "adding %d for shutdown cb\n", pid); ++ log_debug(1, "adding %d for shutdown cb", pid); + list_add_tail(&cb->list, &shutdown_callbacks); + return 0; + } +@@ -90,7 +94,7 @@ static void shutdown_notify_pids(void) + struct shutdown_callback *cb; + + list_for_each_entry(cb, &shutdown_callbacks, list) { +- log_debug(1, "Killing %d\n", cb->pid); ++ log_debug(1, "Killing %d", cb->pid); + kill(cb->pid, SIGTERM); + } + } +@@ -105,7 +109,7 @@ static int shutdown_wait_pids(void) + * sign that it is gone. + */ + if (waitpid(cb->pid, NULL, WNOHANG)) { +- log_debug(1, "%d done\n", cb->pid); ++ log_debug(1, "%d done", cb->pid); + list_del(&cb->list); + free(cb); + } +@@ -116,12 +120,12 @@ static int shutdown_wait_pids(void) + + #define POLL_CTRL 0 + #define POLL_IPC 1 +-#define POLL_MAX 2 ++#define POLL_ALARM 2 ++#define POLL_MAX 3 + + static int event_loop_stop; + static queue_task_t *shutdown_qtask; + +- + void event_loop_exit(queue_task_t *qtask) + { + shutdown_qtask = qtask; +@@ -132,11 +136,26 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + { + struct pollfd poll_array[POLL_MAX]; + int res, has_shutdown_children = 0; ++ sigset_t sigset; ++ int sig_fd; ++ ++ /* Mask off SIGALRM so we can recv it via signalfd */ ++ sigemptyset(&sigset); ++ sigaddset(&sigset, SIGALRM); ++ sigprocmask(SIG_SETMASK, &sigset, NULL); ++ ++ sig_fd = signalfd(-1, &sigset, SFD_NONBLOCK); ++ if (sig_fd == -1) { ++ log_error("signalfd failed: %m"); ++ return; ++ } + + poll_array[POLL_CTRL].fd = control_fd; + poll_array[POLL_CTRL].events = POLLIN; + poll_array[POLL_IPC].fd = mgmt_ipc_fd; + poll_array[POLL_IPC].events = POLLIN; ++ poll_array[POLL_ALARM].fd = sig_fd; ++ poll_array[POLL_ALARM].events = POLLIN; + + event_loop_stop = 0; + while (1) { +@@ -149,7 +168,11 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + break; + } + +- res = poll(poll_array, POLL_MAX, ACTOR_RESOLUTION); ++ /* Runs actors and may set alarm for future actors */ ++ actor_poll(); ++ ++ res = poll(poll_array, POLL_MAX, reap_count ? REAP_WAKEUP : -1); ++ + if (res > 0) { + log_debug(6, "poll result %d", res); + if (poll_array[POLL_CTRL].revents) +@@ -157,6 +180,18 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + + if (poll_array[POLL_IPC].revents) + mgmt_ipc_handle(mgmt_ipc_fd); ++ ++ if (poll_array[POLL_ALARM].revents) { ++ struct signalfd_siginfo si; ++ ++ if (read(sig_fd, &si, sizeof(si)) == -1) { ++ log_error("got sigfd read() error, errno (%d), " ++ "exiting", errno); ++ break; ++ } else { ++ log_debug(1, "Poll was woken by an alarm"); ++ } ++ } + } else if (res < 0) { + if (errno == EINTR) { + log_debug(1, "event_loop interrupted"); +@@ -165,15 +200,20 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + "exiting", res, errno); + break; + } +- } else +- actor_poll(); ++ } ++ + reap_proc(); ++ + /* + * flush sysfs cache since kernel objs may + * have changed as a result of handling op + */ + sysfs_cleanup(); + } ++ + if (shutdown_qtask) + mgmt_ipc_write_rsp(shutdown_qtask, ISCSI_SUCCESS); ++ ++ close(sig_fd); ++ sigprocmask(SIG_UNBLOCK, &sigset, NULL); + } +diff --git a/usr/flashnode.c b/usr/flashnode.c +new file mode 100644 +index 0000000..fe5ab57 +--- /dev/null ++++ b/usr/flashnode.c +@@ -0,0 +1,615 @@ ++/* ++ * iSCSI flashnode helpers ++ * ++ * Copyright (C) 2013 QLogic Corporation. ++ * Maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "log.h" ++#include "idbm.h" ++#include "iscsi_util.h" ++#include "transport.h" ++#include "iscsi_sysfs.h" ++#include "list.h" ++#include "sysdeps.h" ++#include "idbm_fields.h" ++#include "iscsi_err.h" ++#include "iscsi_ipc.h" ++#include "iscsi_netlink.h" ++#include "flashnode.h" ++#include "iscsi_settings.h" ++ ++char key[NAME_MAXVAL]; ++ ++char *to_key(const char *fmt) ++{ ++ int i = 0; ++ memset(key, 0, sizeof(key)); ++ sprintf(key, fmt, i); ++ return key; ++} ++ ++int flashnode_info_print_flat(void *data, struct flashnode_rec *fnode, ++ uint32_t host_no, uint32_t flashnode_idx) ++{ ++ printf("%s: [%d] ", fnode->transport_name, flashnode_idx); ++ if (!strlen((char *)fnode->conn[0].ipaddress)) ++ printf("%s:", UNKNOWN_VALUE); ++ else if (strchr((char *)fnode->conn[0].ipaddress, '.')) ++ printf("%s:", fnode->conn[0].ipaddress); ++ else ++ printf("[%s]:", fnode->conn[0].ipaddress); ++ ++ if (!fnode->conn[0].port) ++ printf("%s,", UNKNOWN_VALUE); ++ else ++ printf("%u,", fnode->conn[0].port); ++ ++ printf("%u ", fnode->sess.tpgt); ++ ++ if (!strlen(fnode->sess.targetname)) ++ printf("%s\n", UNKNOWN_VALUE); ++ else ++ printf("%s\n", fnode->sess.targetname); ++ ++ return 0; ++} ++ ++static int flashnode_fill_isid(struct flashnode_rec *fnode, struct iovec *iov) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ uint8_t isid[6]; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + 6; ++ iov->iov_base = iscsi_nla_alloc(ISCSI_FLASHNODE_ISID, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = ISCSI_FLASHNODE_ISID; ++ fnode_param->len = 6; ++ ++ sscanf(fnode->sess.isid, "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx", ++ &isid[0], &isid[1], &isid[2], &isid[3], &isid[4], &isid[5]); ++ ++ memcpy(fnode_param->value, isid, fnode_param->len); ++ return 0; ++} ++ ++static int flashnode_fill_ipv4_addr(struct flashnode_rec *fnode, ++ struct iovec *iov, int param_type) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ int rc; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + 4; ++ iov->iov_base = iscsi_nla_alloc(param_type, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = param_type; ++ fnode_param->len = 4; ++ ++ switch (param_type) { ++ case ISCSI_FLASHNODE_IPADDR: ++ rc = inet_pton(AF_INET, (char *)fnode->conn[0].ipaddress, ++ fnode_param->value); ++ break; ++ case ISCSI_FLASHNODE_REDIRECT_IPADDR: ++ rc = inet_pton(AF_INET, (char *)fnode->conn[0].redirect_ipaddr, ++ fnode_param->value); ++ break; ++ default: ++ goto free; ++ } ++ ++ if (rc <= 0) ++ goto free; ++ ++ return 0; ++ ++free: ++ free(iov->iov_base); ++ iov->iov_base = NULL; ++ iov->iov_len = 0; ++ return 1; ++} ++ ++static int flashnode_fill_ipv6_addr(struct flashnode_rec *fnode, ++ struct iovec *iov, int param_type) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ int rc; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + 16; ++ iov->iov_base = iscsi_nla_alloc(param_type, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = param_type; ++ fnode_param->len = 16; ++ ++ switch (param_type) { ++ case ISCSI_FLASHNODE_IPADDR: ++ rc = inet_pton(AF_INET6, (char *)fnode->conn[0].ipaddress, ++ fnode_param->value); ++ break; ++ case ISCSI_FLASHNODE_REDIRECT_IPADDR: ++ rc = inet_pton(AF_INET6, (char *)fnode->conn[0].redirect_ipaddr, ++ fnode_param->value); ++ break; ++ case ISCSI_FLASHNODE_LINK_LOCAL_IPV6: ++ rc = inet_pton(AF_INET6, (char *)fnode->conn[0].link_local_ipv6, ++ fnode_param->value); ++ break; ++ default: ++ goto free; ++ } ++ ++ if (rc <= 0) ++ goto free; ++ ++ return 0; ++ ++free: ++ free(iov->iov_base); ++ iov->iov_base = NULL; ++ iov->iov_len = 0; ++ return 1; ++} ++ ++static int flashnode_fill_ipaddr(struct flashnode_rec *fnode, struct iovec *iov, ++ int param_type) ++{ ++ int rc = 0; ++ ++ if (!strncmp(fnode->sess.portal_type, "ipv4", 4)) ++ rc = flashnode_fill_ipv4_addr(fnode, iov, param_type); ++ else ++ rc = flashnode_fill_ipv6_addr(fnode, iov, param_type); ++ ++ return rc; ++} ++ ++static int flashnode_fill_uint8(struct flashnode_rec *fnode, struct iovec *iov, ++ int param_type, uint8_t val) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + 1; ++ iov->iov_base = iscsi_nla_alloc(param_type, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = param_type; ++ fnode_param->len = 1; ++ fnode_param->value[0] = val; ++ return 0; ++} ++ ++static int flashnode_fill_uint16(struct flashnode_rec *fnode, struct iovec *iov, ++ int param_type, uint16_t val) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + 2; ++ iov->iov_base = iscsi_nla_alloc(param_type, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = param_type; ++ fnode_param->len = 2; ++ memcpy(fnode_param->value, &val, fnode_param->len); ++ return 0; ++} ++ ++static int flashnode_fill_uint32(struct flashnode_rec *fnode, struct iovec *iov, ++ int param_type, uint32_t val) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + 4; ++ iov->iov_base = iscsi_nla_alloc(param_type, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = param_type; ++ fnode_param->len = 4; ++ memcpy(fnode_param->value, &val, fnode_param->len); ++ return 0; ++} ++ ++static int flashnode_fill_str(struct flashnode_rec *fnode, struct iovec *iov, ++ int param_type, char *buf, int buflen) ++{ ++ struct iscsi_flashnode_param_info *fnode_param; ++ struct nlattr *attr; ++ int len; ++ ++ len = sizeof(struct iscsi_flashnode_param_info) + buflen; ++ iov->iov_base = iscsi_nla_alloc(param_type, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); ++ fnode_param->param = param_type; ++ fnode_param->len = buflen; ++ memcpy(fnode_param->value, buf, fnode_param->len); ++ return 0; ++} ++ ++int flashnode_build_config(struct list_head *params, ++ struct flashnode_rec *fnode, struct iovec *iovs) ++{ ++ struct user_param *param; ++ struct iovec *iov = NULL; ++ int count = 0; ++ int port = 3260; ++ ++ /* start at 2, because 0 is for nlmsghdr and 1 for event */ ++ iov = iovs + 2; ++ ++ list_for_each_entry(param, params, list) { ++ if (!strcmp(param->name, FLASHNODE_SESS_AUTO_SND_TGT_DISABLE)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE, ++ fnode->sess.auto_snd_tgt_disable)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DISCOVERY_SESS)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_DISCOVERY_SESS, ++ fnode->sess.discovery_session)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_ENTRY_EN)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_ENTRY_EN, ++ fnode->sess.entry_enable)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_IMM_DATA_EN)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_IMM_DATA_EN, ++ fnode->sess.immediate_data)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_INITIAL_R2T_EN)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_INITIAL_R2T_EN, ++ fnode->sess.initial_r2t)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DATASEQ_INORDER)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_DATASEQ_INORDER, ++ fnode->sess.data_seq_in_order)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_PDU_INORDER)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_PDU_INORDER, ++ fnode->sess.data_pdu_in_order)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_CHAP_AUTH_EN)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_CHAP_AUTH_EN, ++ fnode->sess.chap_auth_en)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DISCOVERY_LOGOUT_EN)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN, ++ fnode->sess.discovery_logout_en)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_BIDI_CHAP_EN )) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_BIDI_CHAP_EN, ++ fnode->sess.bidi_chap_en)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL, ++ fnode->sess.discovery_auth_optional)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_ERL)) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_ERL, ++ fnode->sess.erl)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DEF_TIME2WAIT)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_DEF_TIME2WAIT, ++ fnode->sess.def_time2wait)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DEF_TIME2RETAIN)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_DEF_TIME2RETAIN, ++ fnode->sess.def_time2retain)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_MAX_R2T)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_MAX_R2T, ++ fnode->sess.max_outstanding_r2t)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_TSID)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_TSID, ++ fnode->sess.tsid)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_MAX_BURST)) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_MAX_BURST, ++ fnode->sess.max_burst_len)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DEF_TASKMGMT_TMO)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_DEF_TASKMGMT_TMO, ++ fnode->sess.def_taskmgmt_tmo)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_NAME)) { ++ if (!flashnode_fill_str(fnode, &iov[count], ++ ISCSI_FLASHNODE_NAME, ++ fnode->sess.targetname, ++ sizeof(fnode->sess.targetname))) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_FIRST_BURST)) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_FIRST_BURST, ++ fnode->sess.first_burst_len)) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_ISID)) { ++ if (!flashnode_fill_isid(fnode, &iov[count])) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_ALIAS)) { ++ if (!flashnode_fill_str(fnode, &iov[count], ++ ISCSI_FLASHNODE_ALIAS, ++ fnode->sess.targetalias, ++ sizeof(fnode->sess.targetalias))) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_TPGT)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_TPGT, ++ fnode->sess.tpgt)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DISCOVERY_PARENT_IDX)) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX, ++ fnode->sess.discovery_parent_idx)) ++ count++; ++ } else if (!strcmp(param->name, ++ FLASHNODE_SESS_DISCOVERY_PARENT_TYPE)) { ++ if (!flashnode_fill_str(fnode, &iov[count], ++ ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE, ++ fnode->sess.discovery_parent_type, ++ sizeof(fnode->sess.discovery_parent_type))) ++ count++; ++ } else if (!strcmp(param->name, FLASHNODE_SESS_PORTAL_TYPE)) { ++ if (!flashnode_fill_str(fnode, &iov[count], ++ ISCSI_FLASHNODE_PORTAL_TYPE, ++ fnode->sess.portal_type, ++ sizeof(fnode->sess.portal_type))) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_SESS_CHAP_OUT_IDX))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_CHAP_OUT_IDX, ++ fnode->sess.chap_out_idx)) ++ count++; ++ } else if (!strcmp(param->name, to_key(FLASHNODE_CONN_PORT))) { ++ if (fnode->conn[0].port) ++ port = fnode->conn[0].port; ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_PORT, port)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_IPADDR))) { ++ if (!flashnode_fill_ipaddr(fnode, &iov[count], ++ ISCSI_FLASHNODE_IPADDR)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_MAX_RECV_DLENGTH))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_MAX_RECV_DLENGTH, ++ fnode->conn[0].max_recv_dlength)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6, ++ fnode->conn[0].is_fw_assigned_ipv6)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_HDR_DGST_EN))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_HDR_DGST_EN, ++ fnode->conn[0].header_digest_en)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_DATA_DGST_EN))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_DATA_DGST_EN, ++ fnode->conn[0].data_digest_en)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_SNACK_REQ_EN))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_SNACK_REQ_EN, ++ fnode->conn[0].snack_req_en)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_TIMESTAMP_STAT))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT, ++ fnode->conn[0].tcp_timestamp_stat)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_NAGLE_DISABLE))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_NAGLE_DISABLE, ++ fnode->conn[0].tcp_nagle_disable)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_WSF_DISABLE))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_WSF_DISABLE, ++ fnode->conn[0].tcp_wsf_disable)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_TIMER_SCALE))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_TIMER_SCALE, ++ fnode->conn[0].tcp_timer_scale)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_TIMESTAMP_EN))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_TIMESTAMP_EN, ++ fnode->conn[0].tcp_timestamp_en)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_IP_FRAG_DISABLE))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_IP_FRAG_DISABLE, ++ fnode->conn[0].fragment_disable)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_MAX_XMIT_DLENGTH))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_MAX_XMIT_DLENGTH, ++ fnode->conn[0].max_xmit_dlength)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_KEEPALIVE_TMO))) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_KEEPALIVE_TMO, ++ fnode->conn[0].keepalive_tmo)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_REDIRECT_IPADDR))) { ++ if (!flashnode_fill_ipaddr(fnode, &iov[count], ++ ISCSI_FLASHNODE_REDIRECT_IPADDR)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_MAX_SEGMENT_SIZE))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_MAX_SEGMENT_SIZE, ++ fnode->conn[0].max_segment_size)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_LOCAL_PORT))) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_LOCAL_PORT, ++ fnode->conn[0].local_port)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_IPV4_TOS))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_IPV4_TOS, ++ fnode->conn[0].ipv4_tos)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_IPV6_TC))) { ++ if (!flashnode_fill_uint8(fnode, &iov[count], ++ ISCSI_FLASHNODE_IPV6_TC, ++ fnode->conn[0].ipv6_traffic_class)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_IPV6_FLOW_LABEL))) { ++ if (!flashnode_fill_uint16(fnode, &iov[count], ++ ISCSI_FLASHNODE_IPV6_FLOW_LABEL, ++ fnode->conn[0].ipv6_flow_lbl)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_LINK_LOCAL_IPV6))) { ++ if (!flashnode_fill_ipv6_addr(fnode, &iov[count], ++ ISCSI_FLASHNODE_LINK_LOCAL_IPV6)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_XMIT_WSF))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_XMIT_WSF, ++ fnode->conn[0].tcp_xmit_wsf)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_TCP_RECV_WSF))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_TCP_RECV_WSF, ++ fnode->conn[0].tcp_recv_wsf)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_STATSN))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_STATSN, ++ fnode->conn[0].stat_sn)) ++ count++; ++ } else if (!strcmp(param->name, ++ to_key(FLASHNODE_CONN_EXP_STATSN))) { ++ if (!flashnode_fill_uint32(fnode, &iov[count], ++ ISCSI_FLASHNODE_EXP_STATSN, ++ fnode->conn[0].exp_stat_sn)) ++ count++; ++ } ++ } ++ ++ return count; ++} +diff --git a/usr/flashnode.h b/usr/flashnode.h +new file mode 100644 +index 0000000..2950fb5 +--- /dev/null ++++ b/usr/flashnode.h +@@ -0,0 +1,129 @@ ++/* ++ * iSCSI flashnode helpers ++ * ++ * Copyright (C) 2013 QLogic Corporation. ++ * Maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++#ifndef FLASHNODE_H ++#define FLASHNODE_H ++#include ++#include ++#include ++ ++#include "types.h" ++#include "config.h" ++#include "auth.h" ++ ++#define MAX_FLASHNODE_IDX UINT_MAX ++ ++typedef enum portal_type { ++ IPV4, ++ IPV6, ++} portal_type_e; ++ ++typedef struct flashnode_sess_rec { ++ char targetname[TARGET_NAME_MAXLEN]; ++ char targetalias[TARGET_NAME_MAXLEN]; ++ char username[AUTH_STR_MAX_LEN]; ++ char username_in[AUTH_STR_MAX_LEN]; ++ char password[AUTH_STR_MAX_LEN]; ++ char password_in[AUTH_STR_MAX_LEN]; ++ /* indicates if discovery was done through iSNS discovery service ++ * or through sendTarget */ ++ char discovery_parent_type[ISCSI_MAX_STR_LEN]; ++ char isid[16]; ++ char portal_type[5]; /* ipv4 or ipv6 */ ++ unsigned first_burst_len; ++ unsigned max_burst_len; ++ uint16_t def_time2wait; ++ uint16_t def_time2retain; ++ uint16_t max_outstanding_r2t; ++ uint16_t tsid; ++ uint16_t def_taskmgmt_tmo; ++ uint16_t tpgt; ++ uint16_t chap_out_idx; ++ uint16_t chap_in_idx; ++ /* index of iSCSI discovery session if the entry is ++ * discovered by iSCSI discovery session ++ */ ++ uint16_t discovery_parent_idx; ++ /* Firmware auto sendtarget discovery disable */ ++ uint8_t auto_snd_tgt_disable; ++ uint8_t discovery_session; ++ /* indicates if this flashnode entry is enabled or disabled */ ++ uint8_t entry_enable; ++ uint8_t immediate_data; ++ uint8_t initial_r2t; ++ uint8_t data_seq_in_order; ++ uint8_t data_pdu_in_order; ++ uint8_t chap_auth_en; ++ /* enables firmware to auto logout the discovery session on discovery ++ * completion ++ */ ++ uint8_t discovery_logout_en; ++ uint8_t bidi_chap_en; ++ /* makes authentication for discovery session optional */ ++ uint8_t discovery_auth_optional; ++ uint8_t erl; ++ uint8_t is_boot_target; ++} flashnode_sess_rec_t; ++ ++typedef struct flashnode_conn_rec { ++ char ipaddress[NI_MAXHOST]; ++ char redirect_ipaddr[NI_MAXHOST]; ++ char link_local_ipv6[NI_MAXHOST]; ++ unsigned max_recv_dlength; ++ unsigned max_xmit_dlength; ++ unsigned max_segment_size; ++ unsigned tcp_xmit_wsf; ++ unsigned tcp_recv_wsf; ++ uint32_t stat_sn; ++ uint32_t exp_stat_sn; ++ uint16_t keepalive_tmo; ++ uint16_t port; ++ uint16_t local_port; ++ uint16_t ipv6_flow_lbl; ++ /* Link local IPv6 address is assigned by firmware or driver */ ++ uint8_t is_fw_assigned_ipv6; ++ uint8_t header_digest_en; ++ uint8_t data_digest_en; ++ uint8_t snack_req_en; ++ /* tcp timestamp negotiation status */ ++ uint8_t tcp_timestamp_stat; ++ uint8_t tcp_nagle_disable; ++ /* tcp window scale factor */ ++ uint8_t tcp_wsf_disable; ++ uint8_t tcp_timer_scale; ++ uint8_t tcp_timestamp_en; ++ uint8_t fragment_disable; ++ uint8_t ipv4_tos; ++ uint8_t ipv6_traffic_class; ++} flashnode_conn_rec_t; ++ ++struct flashnode_rec { ++ struct list_head list; ++ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; ++ flashnode_sess_rec_t sess; ++ flashnode_conn_rec_t conn[ISCSI_CONN_MAX]; ++}; ++ ++extern int flashnode_info_print_flat(void *data, struct flashnode_rec *tgt, ++ uint32_t host_no, uint32_t flashnode_idx); ++extern int iscsi_logout_flashnode_sid(struct iscsi_transport *t, ++ uint32_t host_no, uint32_t sid); ++extern int flashnode_build_config(struct list_head *params, ++ struct flashnode_rec *flashnode, ++ struct iovec *iovs); ++#endif +diff --git a/usr/host.c b/usr/host.c +index b03e50f..f2052d3 100644 +--- a/usr/host.c ++++ b/usr/host.c +@@ -34,6 +34,7 @@ + #include "initiator.h" + #include "iface.h" + #include "iscsi_err.h" ++#include "iscsi_netlink.h" + + static int match_host_to_session(void *data, struct session_info *info) + { +@@ -242,7 +243,7 @@ static int host_info_print_tree(void *data, struct host_info *hinfo) + link_info.data = &hinfo->host_no; + + err = iscsi_sysfs_for_each_session(&link_info, &num_found, +- session_info_create_list); ++ session_info_create_list, 0); + if (err || !num_found) + return 0; + +@@ -314,3 +315,112 @@ int host_info_print(int info_level, uint32_t host_no) + } + return 0; + } ++ ++static int chap_fill_param_uint(struct iovec *iov, int param, ++ uint32_t param_val, int param_len) ++{ ++ struct iscsi_param_info *param_info; ++ struct nlattr *attr; ++ int len; ++ uint8_t val8 = 0; ++ uint16_t val16 = 0; ++ uint32_t val32 = 0; ++ char *val = NULL; ++ ++ len = sizeof(struct iscsi_param_info) + param_len; ++ iov->iov_base = iscsi_nla_alloc(param, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ param_info = (struct iscsi_param_info *)ISCSI_NLA_DATA(attr); ++ param_info->param = param; ++ param_info->len = param_len; ++ ++ switch (param_len) { ++ case 1: ++ val8 = (uint8_t)param_val; ++ val = (char *)&val8; ++ break; ++ ++ case 2: ++ val16 = (uint16_t)param_val; ++ val = (char *)&val16; ++ break; ++ ++ case 4: ++ val32 = (uint32_t)param_val; ++ val = (char *)&val32; ++ break; ++ ++ default: ++ goto free; ++ } ++ memcpy(param_info->value, val, param_len); ++ ++ return 0; ++ ++free: ++ free(iov->iov_base); ++ iov->iov_base = NULL; ++ iov->iov_len = 0; ++ return 1; ++} ++ ++static int chap_fill_param_str(struct iovec *iov, int param, char *param_val, ++ int param_len) ++{ ++ struct iscsi_param_info *param_info; ++ struct nlattr *attr; ++ int len; ++ ++ len = sizeof(struct iscsi_param_info) + param_len; ++ iov->iov_base = iscsi_nla_alloc(param, len); ++ if (!iov->iov_base) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ ++ param_info = (struct iscsi_param_info *)ISCSI_NLA_DATA(attr); ++ param_info->param = param; ++ param_info->len = param_len; ++ memcpy(param_info->value, param_val, param_len); ++ return 0; ++} ++ ++int chap_build_config(struct iscsi_chap_rec *crec, struct iovec *iovs) ++{ ++ struct iovec *iov = NULL; ++ int count = 0; ++ ++ /* start at 2, because 0 is for nlmsghdr and 1 for event */ ++ iov = iovs + 2; ++ ++ if (!chap_fill_param_uint(&iov[count], ISCSI_CHAP_PARAM_INDEX, ++ crec->chap_tbl_idx, ++ sizeof(crec->chap_tbl_idx))) ++ count++; ++ ++ if (!chap_fill_param_uint(&iov[count], ISCSI_CHAP_PARAM_CHAP_TYPE, ++ crec->chap_type, sizeof(crec->chap_type))) ++ count++; ++ ++ if (!chap_fill_param_str(&iov[count], ISCSI_CHAP_PARAM_USERNAME, ++ crec->username, strlen(crec->username))) ++ count++; ++ ++ if (!chap_fill_param_str(&iov[count], ISCSI_CHAP_PARAM_PASSWORD, ++ (char *)crec->password, ++ strlen((char *)crec->password))) ++ count++; ++ ++ if (!chap_fill_param_uint(&iov[count], ISCSI_CHAP_PARAM_PASSWORD_LEN, ++ crec->password_length, ++ sizeof(crec->password_length))) ++ count++; ++ ++ return count; ++} +diff --git a/usr/host.h b/usr/host.h +index 894ab91..149aa0d 100644 +--- a/usr/host.h ++++ b/usr/host.h +@@ -5,6 +5,9 @@ + #include "types.h" + #include "config.h" + ++#define MAX_HOST_NO UINT_MAX ++ ++#define MAX_CHAP_ENTRIES 2048 + #define MAX_CHAP_BUF_SZ 4096 + #define REQ_CHAP_BUF_SZ (MAX_CHAP_BUF_SZ + sizeof(struct iscsi_uevent)) + +@@ -14,5 +17,6 @@ struct host_info { + }; + + extern int host_info_print(int info_level, uint32_t host_no); ++extern int chap_build_config(struct iscsi_chap_rec *crec, struct iovec *iovs); + + #endif +diff --git a/usr/idbm.c b/usr/idbm.c +index 4d30aa9..198a5ef 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -94,6 +94,17 @@ static struct idbm *db; + _n++; \ + } while (0) + ++#define __recinfo_uint32(_key, _info, _rec, _name, _show, _n, _mod) do { \ ++ _info[_n].type = TYPE_UINT32; \ ++ strlcpy(_info[_n].name, _key, NAME_MAXVAL); \ ++ snprintf(_info[_n].value, VALUE_MAXVAL, "%d", _rec->_name); \ ++ _info[_n].data = &_rec->_name; \ ++ _info[_n].data_len = sizeof(_rec->_name); \ ++ _info[_n].visible = _show; \ ++ _info[_n].can_modify = _mod; \ ++ _n++; \ ++} while (0) ++ + #define __recinfo_int_o2(_key,_info,_rec,_name,_show,_op0,_op1,_n, _mod) do { \ + _info[_n].type = TYPE_INT_O; \ + strlcpy(_info[_n].name, _key, NAME_MAXVAL); \ +@@ -226,6 +237,9 @@ void + idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) + { + int num = 0, i; ++ int iface_type; ++ ++ iface_type = iface_get_iptype(&r->iface); + + __recinfo_str(NODE_NAME, ri, r, name, IDBM_SHOW, num, 0); + __recinfo_int(NODE_TPGT, ri, r, tpgt, IDBM_SHOW, num, 0); +@@ -248,6 +262,8 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) + __recinfo_str(IFACE_IPADDR, ri, r, iface.ipaddress, IDBM_SHOW, num, 1); + __recinfo_str(IFACE_ISCSINAME, ri, r, iface.name, IDBM_SHOW, num, 1); + __recinfo_str(IFACE_NETNAME, ri, r, iface.netdev, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask, IDBM_SHOW, num, 1); + /* + * svn 780 compat: older versions used node.transport_name and + * rec->transport_name +@@ -255,21 +271,6 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) + __recinfo_str(IFACE_TRANSPORTNAME, ri, r, iface.transport_name, + IDBM_SHOW, num, 1); + __recinfo_str(IFACE_INAME, ri, r, iface.iname, IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto, IDBM_SHOW, +- num, 1); +- __recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, iface.linklocal_autocfg, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router, IDBM_SHOW, num, +- 1); + __recinfo_str(IFACE_STATE, ri, r, iface.state, IDBM_SHOW, num, 1); + __recinfo_uint16(IFACE_VLAN_ID, ri, r, iface.vlan_id, IDBM_SHOW, num, + 1); +@@ -281,6 +282,115 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) + __recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1); + __recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1); + ++ if (iface_type == ISCSI_IFACE_TYPE_IPV4) { ++ __recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, ++ iface.dhcp_alt_client_id_state, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, ++ iface.dhcp_alt_client_id, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, ++ iface.dhcp_learn_iqn, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, ++ iface.dhcp_req_vendor_id_state, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_IN_FORWARD, ri, r, ++ iface.incoming_forwarding, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1); ++ } else if (iface_type == ISCSI_IFACE_TYPE_IPV6) { ++ __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, ++ iface.linklocal_autocfg, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, ++ iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, ++ iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, ++ iface.nd_reachable_tmo, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, ++ iface.nd_rexmit_time, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, ++ iface.router_adv_link_mtu, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class, ++ IDBM_SHOW, num, 1); ++ } ++ ++ __recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, iface.tcp_wsf_state, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TCP_WSF, ri, r, iface.tcp_wsf, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, iface.tcp_timer_scale, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, iface.tcp_timestamp, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_REDIRECT, ri, r, iface.redirect, IDBM_SHOW, num, 1); ++ __recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, iface.def_task_mgmt_tmo, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_HDRDGST, ri, r, iface.header_digest, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DATADGST, ri, r, iface.data_digest, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_IMM_DATA, ri, r, iface.immediate_data, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_INITIAL_R2T, ri, r, iface.initial_r2t, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DSEQ_INORDER, ri, r, iface.data_seq_inorder, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DPDU_INORDER, ri, r, iface.data_pdu_inorder, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_ERL, ri, r, iface.erl, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, iface.max_recv_dlength, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_FIRST_BURST, ri, r, iface.first_burst_len, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint16(IFACE_MAX_R2T, ri, r, iface.max_out_r2t, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint32(IFACE_MAX_BURST, ri, r, iface.max_burst_len, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_CHAP_AUTH, ri, r, iface.chap_auth, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_BIDI_CHAP, ri, r, iface.bidi_chap, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, iface.strict_login_comp, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, iface.discovery_auth, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, iface.discovery_logout, ++ IDBM_SHOW, num, 1); ++ ++ + __recinfo_str(NODE_DISC_ADDR, ri, r, disc_address, IDBM_SHOW, + num, 0); + __recinfo_int(NODE_DISC_PORT, ri, r, disc_port, IDBM_SHOW, +@@ -414,6 +524,9 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) + void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) + { + int num = 0; ++ int iface_type; ++ ++ iface_type = iface_get_iptype(r); + + __recinfo_str(IFACE_ISCSINAME, ri, r, name, IDBM_SHOW, num, 0); + __recinfo_str(IFACE_NETNAME, ri, r, netdev, IDBM_SHOW, num, 1); +@@ -422,19 +535,6 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) + __recinfo_str(IFACE_TRANSPORTNAME, ri, r, transport_name, + IDBM_SHOW, num, 1); + __recinfo_str(IFACE_INAME, ri, r, iname, IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, +- IDBM_SHOW, num, 1); +- __recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW, num, 1); + __recinfo_str(IFACE_STATE, ri, r, state, IDBM_SHOW, num, 1); + __recinfo_uint16(IFACE_VLAN_ID, ri, r, vlan_id, IDBM_SHOW, num, 1); + __recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, vlan_priority, +@@ -443,9 +543,110 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) + __recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1); + __recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1); + __recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1); ++ ++ if (iface_type == ISCSI_IFACE_TYPE_IPV4) { ++ __recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, ++ dhcp_alt_client_id_state, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, ++ dhcp_req_vendor_id_state, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1); ++ } else if (iface_type == ISCSI_IFACE_TYPE_IPV6) { ++ __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, ++ dup_addr_detect_cnt, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, ++ gratuitous_neighbor_adv, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, ++ nd_reachable_tmo, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, ++ router_adv_link_mtu, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class, ++ IDBM_SHOW, num, 1); ++ } ++ ++ __recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint8(IFACE_TCP_WSF, ri, r, tcp_wsf, IDBM_SHOW, num, 1); ++ __recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, tcp_timer_scale, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, tcp_timestamp, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_REDIRECT, ri, r, redirect, IDBM_SHOW, num, 1); ++ __recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, def_task_mgmt_tmo, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_HDRDGST, ri, r, header_digest, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DATADGST, ri, r, data_digest, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_IMM_DATA, ri, r, immediate_data, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_INITIAL_R2T, ri, r, initial_r2t, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DSEQ_INORDER, ri, r, data_seq_inorder, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DPDU_INORDER, ri, r, data_pdu_inorder, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint8(IFACE_ERL, ri, r, erl, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, max_recv_dlength, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_FIRST_BURST, ri, r, first_burst_len, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint16(IFACE_MAX_R2T, ri, r, max_out_r2t, IDBM_SHOW, num, 1); ++ __recinfo_uint32(IFACE_MAX_BURST, ri, r, max_burst_len, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_CHAP_AUTH, ri, r, chap_auth, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_BIDI_CHAP, ri, r, bidi_chap, IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, strict_login_comp, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, discovery_auth, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, discovery_logout, ++ IDBM_SHOW, num, 1); + } + +-static void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) ++void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) + { + int num = 0; + +@@ -454,14 +655,14 @@ static void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) + + if (r->chap_type == CHAP_TYPE_OUT) { + __recinfo_str(HOST_AUTH_USERNAME, ri, r, username, IDBM_SHOW, +- num, 0); ++ num, 1); + __recinfo_str(HOST_AUTH_PASSWORD, ri, r, password, IDBM_MASKED, + num, 1); + __recinfo_int(HOST_AUTH_PASSWORD_LEN, ri, r, password_length, + IDBM_HIDE, num, 1); + } else { + __recinfo_str(HOST_AUTH_USERNAME_IN, ri, r, username, IDBM_SHOW, +- num, 0); ++ num, 1); + __recinfo_str(HOST_AUTH_PASSWORD_IN, ri, r, password, + IDBM_MASKED, num, 1); + __recinfo_int(HOST_AUTH_PASSWORD_IN_LEN, ri, r, password_length, +@@ -469,6 +670,158 @@ static void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) + } + } + ++void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri) ++{ ++ int num = 0; ++ int i; ++ ++ __recinfo_uint8(FLASHNODE_SESS_AUTO_SND_TGT_DISABLE, ri, r, ++ sess.auto_snd_tgt_disable, IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_DISCOVERY_SESS, ri, r, ++ sess.discovery_session, IDBM_SHOW, num, 1); ++ __recinfo_str(FLASHNODE_SESS_PORTAL_TYPE, ri, r, sess.portal_type, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_ENTRY_EN, ri, r, ++ sess.entry_enable, IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_IMM_DATA_EN, ri, r, sess.immediate_data, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_INITIAL_R2T_EN, ri, r, sess.initial_r2t, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_DATASEQ_INORDER, ri, r, ++ sess.data_seq_in_order, IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_PDU_INORDER, ri, r, ++ sess.data_pdu_in_order, IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_CHAP_AUTH_EN, ri, r, sess.chap_auth_en, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_DISCOVERY_LOGOUT_EN, ri, r, ++ sess.discovery_logout_en, IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_BIDI_CHAP_EN, ri, r, sess.bidi_chap_en, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL, ri, r, ++ sess.discovery_auth_optional, IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_ERL, ri, r, sess.erl, IDBM_SHOW, num, 1); ++ __recinfo_uint32(FLASHNODE_SESS_FIRST_BURST, ri, r, ++ sess.first_burst_len, IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_DEF_TIME2WAIT, ri, r, ++ sess.def_time2wait, IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_DEF_TIME2RETAIN, ri, r, ++ sess.def_time2retain, IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_MAX_R2T, ri, r, ++ sess.max_outstanding_r2t, IDBM_SHOW, num, 1); ++ __recinfo_str(FLASHNODE_SESS_ISID, ri, r, sess.isid, IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_TSID, ri, r, sess.tsid, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint32(FLASHNODE_SESS_MAX_BURST, ri, r, sess.max_burst_len, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_DEF_TASKMGMT_TMO, ri, r, ++ sess.def_taskmgmt_tmo, IDBM_SHOW, num, 1); ++ __recinfo_str(FLASHNODE_SESS_ALIAS, ri, r, sess.targetalias, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(FLASHNODE_SESS_NAME, ri, r, sess.targetname, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_DISCOVERY_PARENT_IDX, ri, r, ++ sess.discovery_parent_idx, IDBM_SHOW, num, 1); ++ __recinfo_str(FLASHNODE_SESS_DISCOVERY_PARENT_TYPE, ri, r, ++ sess.discovery_parent_type, IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_TPGT, ri, r, sess.tpgt, IDBM_SHOW, ++ num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_CHAP_OUT_IDX, ri, r, sess.chap_out_idx, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint16(FLASHNODE_SESS_CHAP_IN_IDX, ri, r, sess.chap_in_idx, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(FLASHNODE_SESS_USERNAME, ri, r, sess.username, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(FLASHNODE_SESS_USERNAME_IN, ri, r, sess.username_in, ++ IDBM_SHOW, num, 1); ++ __recinfo_str(FLASHNODE_SESS_PASSWORD, ri, r, sess.password, IDBM_SHOW, ++ num, 1); ++ __recinfo_str(FLASHNODE_SESS_PASSWORD_IN, ri, r, sess.password_in, ++ IDBM_SHOW, num, 1); ++ __recinfo_uint8(FLASHNODE_SESS_IS_BOOT_TGT, ri, r, sess.is_boot_target, ++ IDBM_SHOW, num, 1); ++ ++ for (i = 0; i < ISCSI_CONN_MAX; i++) { ++ char key[NAME_MAXVAL]; ++ ++ sprintf(key, FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6, i); ++ __recinfo_uint8(key, ri, r, conn[i].is_fw_assigned_ipv6, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_HDR_DGST_EN, i); ++ __recinfo_uint8(key, ri, r, conn[i].header_digest_en, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_DATA_DGST_EN, i); ++ __recinfo_uint8(key, ri, r, conn[i].data_digest_en, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_SNACK_REQ_EN, i); ++ __recinfo_uint8(key, ri, r, conn[i].snack_req_en, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_STAT, i); ++ __recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_stat, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_NAGLE_DISABLE, i); ++ __recinfo_uint8(key, ri, r, conn[i].tcp_nagle_disable, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_WSF_DISABLE, i); ++ __recinfo_uint8(key, ri, r, conn[i].tcp_wsf_disable, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_TIMER_SCALE, i); ++ __recinfo_uint8(key, ri, r, conn[i].tcp_timer_scale, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_EN, i); ++ __recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_en, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_IP_FRAG_DISABLE, i); ++ __recinfo_uint8(key, ri, r, conn[i].fragment_disable, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_MAX_XMIT_DLENGTH, i); ++ __recinfo_uint32(key, ri, r, conn[i].max_xmit_dlength, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_MAX_RECV_DLENGTH, i); ++ __recinfo_uint32(key, ri, r, conn[i].max_recv_dlength, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_KEEPALIVE_TMO, i); ++ __recinfo_uint16(key, ri, r, conn[i].keepalive_tmo, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_PORT, i); ++ __recinfo_uint16(key, ri, r, conn[i].port, IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_IPADDR, i); ++ __recinfo_str(key, ri, r, conn[i].ipaddress, IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_REDIRECT_IPADDR, i); ++ __recinfo_str(key, ri, r, conn[i].redirect_ipaddr, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_MAX_SEGMENT_SIZE, i); ++ __recinfo_uint32(key, ri, r, conn[i].max_segment_size, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_LOCAL_PORT, i); ++ __recinfo_uint16(key, ri, r, conn[i].local_port, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_IPV4_TOS, i); ++ __recinfo_uint8(key, ri, r, conn[i].ipv4_tos, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_IPV6_TC, i); ++ __recinfo_uint8(key, ri, r, conn[i].ipv6_traffic_class, ++ IDBM_SHOW, num, 1); ++ sprintf(key, FLASHNODE_CONN_IPV6_FLOW_LABEL, i); ++ __recinfo_uint16(key, ri, r, conn[i].ipv6_flow_lbl, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_LINK_LOCAL_IPV6, i); ++ __recinfo_str(key, ri, r, conn[i].link_local_ipv6, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_XMIT_WSF, i); ++ __recinfo_uint32(key, ri, r, conn[i].tcp_xmit_wsf, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_TCP_RECV_WSF, i); ++ __recinfo_uint32(key, ri, r, conn[i].tcp_recv_wsf, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_STATSN, i); ++ __recinfo_uint32(key, ri, r, conn[i].stat_sn, IDBM_SHOW, ++ num, 1); ++ sprintf(key, FLASHNODE_CONN_EXP_STATSN, i); ++ __recinfo_uint32(key, ri, r, conn[i].exp_stat_sn, IDBM_SHOW, ++ num, 1); ++ } ++} ++ + recinfo_t *idbm_recinfo_alloc(int max_keys) + { + recinfo_t *info; +@@ -502,6 +855,9 @@ void idbm_print(int type, void *rec, int show, FILE *f) + case IDBM_PRINT_TYPE_HOST_CHAP: + idbm_recinfo_host_chap((struct iscsi_chap_rec *)rec, info); + break; ++ case IDBM_PRINT_TYPE_FLASHNODE: ++ idbm_recinfo_flashnode((struct flashnode_rec *)rec, info); ++ break; + } + + fprintf(f, "%s\n", ISCSI_BEGIN_REC); +@@ -629,6 +985,13 @@ setup_passwd_len: + *(uint16_t *)info[i].data = + strtoul(value, NULL, 10); + goto updated; ++ } else if (info[i].type == TYPE_UINT32) { ++ if (!info[i].data) ++ continue; ++ ++ *(uint32_t *)info[i].data = ++ strtoul(value, NULL, 10); ++ goto updated; + } else if (info[i].type == TYPE_STR) { + if (!info[i].data) + continue; +@@ -679,6 +1042,8 @@ updated: + check_password_param(discovery.sendtargets.auth.password_in); + check_password_param(discovery.slp.auth.password); + check_password_param(discovery.slp.auth.password_in); ++ check_password_param(host.auth.password); ++ check_password_param(host.auth.password_in); + + return 0; + } +@@ -694,7 +1059,7 @@ int idbm_verify_param(recinfo_t *info, char *name) + if (strcmp(name, info[i].name)) + continue; + +- log_debug(7, "verify %s %d\n", name, info[i].can_modify); ++ log_debug(7, "verify %s %d", name, info[i].can_modify); + if (info[i].can_modify) + return 0; + else { +@@ -797,20 +1162,20 @@ static void idbm_sync_config(void) + idbm_recinfo_node(&db->nrec, db->ninfo); + + if (!db->get_config_file) { +- log_debug(1, "Could not get config file. No config file fn\n"); ++ log_debug(1, "Could not get config file. No config file fn"); + return; + } + + config_file = db->get_config_file(); + if (!config_file) { +- log_debug(1, "Could not get config file for sync config\n"); ++ log_debug(1, "Could not get config file for sync config"); + return; + } + + f = fopen(config_file, "r"); + if (!f) { + log_debug(1, "cannot open configuration file %s. " +- "Default location is %s.\n", ++ "Default location is %s.", + config_file, CONFIG_FILE); + return; + } +@@ -880,6 +1245,12 @@ int idbm_print_host_chap_info(struct iscsi_chap_rec *chap) + return 0; + } + ++int idbm_print_flashnode_info(struct flashnode_rec *fnode) ++{ ++ idbm_print(IDBM_PRINT_TYPE_FLASHNODE, fnode, 1, stdout); ++ return 0; ++} ++ + int idbm_print_node_flat(void *data, node_rec_t *rec) + { + if (strchr(rec->conn[0].address, '.')) +@@ -960,7 +1331,7 @@ int idbm_lock(void) + + if (access(LOCK_DIR, F_OK) != 0) { + if (mkdir(LOCK_DIR, 0660) != 0) { +- log_error("Could not open %s: %s\n", LOCK_DIR, ++ log_error("Could not open %s: %s", LOCK_DIR, + strerror(errno)); + return ISCSI_ERR_IDBM; + } +@@ -1040,7 +1411,7 @@ static int __idbm_rec_read(node_rec_t *out_rec, char *conf) + + f = fopen(conf, "r"); + if (!f) { +- log_debug(5, "Could not open %s err %s\n", conf, ++ log_debug(5, "Could not open %s err %s", conf, + strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; +@@ -1182,7 +1553,7 @@ static int idbm_for_each_drec(int type, char *config_root, void *data, + !strcmp(entity_dent->d_name, "..")) + continue; + +- log_debug(5, "found %s\n", entity_dent->d_name); ++ log_debug(5, "found %s", entity_dent->d_name); + + tmp_port = strchr(entity_dent->d_name, ','); + if (!tmp_port) +@@ -1439,7 +1810,7 @@ int idbm_for_each_portal(int *found, void *data, idbm_portal_op_fn *fn, + !strcmp(portal_dent->d_name, "..")) + continue; + +- log_debug(5, "found %s\n", portal_dent->d_name); ++ log_debug(5, "found %s", portal_dent->d_name); + tmp_port = strchr(portal_dent->d_name, ','); + if (!tmp_port) + continue; +@@ -1481,7 +1852,7 @@ int idbm_for_each_node(int *found, void *data, idbm_node_op_fn *fn) + !strcmp(node_dent->d_name, "..")) + continue; + +- log_debug(5, "searching %s\n", node_dent->d_name); ++ log_debug(5, "searching %s", node_dent->d_name); + curr_rc = fn(found, data, node_dent->d_name); + /* less than zero means it was not a match */ + if (curr_rc > 0 && !rc) +@@ -1557,7 +1928,7 @@ idbm_discovery_read(discovery_rec_t *out_rec, int drec_type, + snprintf(portal, PATH_MAX, "%s/%s,%d", + disc_type_to_config_vals[drec_type].config_root, + addr, port); +- log_debug(5, "Looking for config file %s\n", portal); ++ log_debug(5, "Looking for config file %s", portal); + + rc = idbm_lock(); + if (rc) +@@ -1566,7 +1937,7 @@ idbm_discovery_read(discovery_rec_t *out_rec, int drec_type, + f = idbm_open_rec_r(portal, + disc_type_to_config_vals[drec_type].config_name); + if (!f) { +- log_debug(1, "Could not open %s: %s\n", portal, ++ log_debug(1, "Could not open %s: %s", portal, + strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; +@@ -1596,7 +1967,7 @@ static FILE *idbm_open_rec_w(char *portal, char *config) + FILE *f; + int err; + +- log_debug(5, "Looking for config file %s\n", portal); ++ log_debug(5, "Looking for config file %s", portal); + + err = stat(portal, &statb); + if (err) +@@ -1608,14 +1979,14 @@ static FILE *idbm_open_rec_w(char *portal, char *config) + */ + if (unlink(portal)) { + log_error("Could not convert %s to %s/%s. " +- "err %d\n", portal, portal, ++ "err %d", portal, portal, + config, errno); + return NULL; + } + + mkdir_portal: + if (mkdir(portal, 0660) != 0) { +- log_error("Could not make dir %s err %d\n", ++ log_error("Could not make dir %s err %d", + portal, errno); + return NULL; + } +@@ -1625,7 +1996,7 @@ mkdir_portal: + strlcat(portal, config, PATH_MAX); + f = fopen(portal, "w"); + if (!f) +- log_error("Could not open %s err %d\n", portal, errno); ++ log_error("Could not open %s err %d", portal, errno); + return f; + } + +@@ -1638,14 +2009,14 @@ static int idbm_rec_write(node_rec_t *rec) + + portal = malloc(PATH_MAX); + if (!portal) { +- log_error("Could not alloc portal\n"); ++ log_error("Could not alloc portal"); + return ISCSI_ERR_NOMEM; + } + + snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); + if (access(portal, F_OK) != 0) { + if (mkdir(portal, 0660) != 0) { +- log_error("Could not make %s: %s\n", portal, ++ log_error("Could not make %s: %s", portal, + strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto free_portal; +@@ -1655,7 +2026,7 @@ static int idbm_rec_write(node_rec_t *rec) + snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); + if (access(portal, F_OK) != 0) { + if (mkdir(portal, 0660) != 0) { +- log_error("Could not make %s: %s\n", portal, ++ log_error("Could not make %s: %s", portal, + strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto free_portal; +@@ -1698,7 +2069,7 @@ static int idbm_rec_write(node_rec_t *rec) + * Old style portal as a file, but with tpgt. Let's update it. + */ + if (unlink(portal)) { +- log_error("Could not convert %s: %s\n", portal, ++ log_error("Could not convert %s: %s", portal, + strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; +@@ -1713,7 +2084,7 @@ mkdir_portal: + rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt); + if (stat(portal, &statb)) { + if (mkdir(portal, 0660) != 0) { +- log_error("Could not make dir %s: %s\n", ++ log_error("Could not make dir %s: %s", + portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; +@@ -1726,7 +2097,7 @@ mkdir_portal: + open_conf: + f = fopen(portal, "w"); + if (!f) { +- log_error("Could not open %s: %sd\n", portal, strerror(errno)); ++ log_error("Could not open %s: %s", portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; + } +@@ -1752,7 +2123,7 @@ idbm_discovery_write(discovery_rec_t *rec) + + portal = malloc(PATH_MAX); + if (!portal) { +- log_error("Could not alloc portal\n"); ++ log_error("Could not alloc portal"); + return ISCSI_ERR_NOMEM; + } + +@@ -1764,7 +2135,7 @@ idbm_discovery_write(discovery_rec_t *rec) + disc_type_to_config_vals[rec->type].config_root); + if (access(portal, F_OK) != 0) { + if (mkdir(portal, 0660) != 0) { +- log_error("Could not make %s: %s\n", portal, ++ log_error("Could not make %s: %s", portal, + strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; +@@ -1778,7 +2149,7 @@ idbm_discovery_write(discovery_rec_t *rec) + f = idbm_open_rec_w(portal, + disc_type_to_config_vals[rec->type].config_name); + if (!f) { +- log_error("Could not open %s: %s\n", portal, strerror(errno)); ++ log_error("Could not open %s: %s", portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; + } +@@ -2150,10 +2521,10 @@ int idbm_delete_discovery(discovery_rec_t *drec) + snprintf(portal, PATH_MAX, "%s/%s,%d", + disc_type_to_config_vals[drec->type].config_root, + drec->address, drec->port); +- log_debug(5, "Removing config file %s\n", portal); ++ log_debug(5, "Removing config file %s", portal); + + if (stat(portal, &statb)) { +- log_debug(5, "Could not stat %s to delete disc err %d\n", ++ log_debug(5, "Could not stat %s to delete disc err %d", + portal, errno); + goto free_portal; + } +@@ -2166,7 +2537,7 @@ int idbm_delete_discovery(discovery_rec_t *drec) + } + + if (unlink(portal)) +- log_debug(5, "Could not remove %s err %d\n", portal, errno); ++ log_debug(5, "Could not remove %s err %d", portal, errno); + + memset(portal, 0, PATH_MAX); + snprintf(portal, PATH_MAX, "%s/%s,%d", +@@ -2216,7 +2587,7 @@ static int idbm_remove_disc_to_node_link(node_rec_t *rec, + goto done; + } + +- log_debug(7, "found drec %s %d\n", ++ log_debug(7, "found drec %s %d", + tmprec->disc_address, tmprec->disc_port); + /* rm link from discovery source to node */ + memset(portal, 0, PATH_MAX); +@@ -2230,7 +2601,7 @@ static int idbm_remove_disc_to_node_link(node_rec_t *rec, + + if (!stat(portal, &statb)) { + if (unlink(portal)) { +- log_error("Could not remove link %s: %s\n", ++ log_error("Could not remove link %s: %s", + portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; + } else +@@ -2267,7 +2638,7 @@ int idbm_delete_node(node_rec_t *rec) + memset(portal, 0, PATH_MAX); + snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, + rec->name, rec->conn[0].address, rec->conn[0].port); +- log_debug(5, "Removing config file %s iface id %s\n", ++ log_debug(5, "Removing config file %s iface id %s", + portal, rec->iface.name); + + rc = idbm_lock(); +@@ -2285,14 +2656,14 @@ int idbm_delete_node(node_rec_t *rec) + if (!stat(portal, &statb)) + goto rm_conf; + +- log_error("Could not stat %s to delete node: %s\n", ++ log_error("Could not stat %s to delete node: %s", + portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; + + rm_conf: + if (unlink(portal)) { +- log_error("Could not remove %s: %s\n", portal, strerror(errno)); ++ log_error("Could not remove %s: %s", portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; + goto unlock; + } +@@ -2470,7 +2841,7 @@ int idbm_init(idbm_get_config_file_fn *fn) + /* make sure root db dir is there */ + if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) { + if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) { +- log_error("Could not make %s %d\n", ISCSI_CONFIG_ROOT, ++ log_error("Could not make %s %d", ISCSI_CONFIG_ROOT, + errno); + return errno; + } +@@ -2569,6 +2940,12 @@ struct node_rec *idbm_create_rec_from_boot_context(struct boot_context *context) + strlen((char *)context->chap_password); + rec->session.auth.password_in_length = + strlen((char *)context->chap_password_in); ++ strlcpy(rec->session.boot_root, context->boot_root, ++ sizeof(context->boot_root)); ++ strlcpy(rec->session.boot_nic, context->boot_nic, ++ sizeof(context->boot_nic)); ++ strlcpy(rec->session.boot_target, context->boot_target, ++ sizeof(context->boot_target)); + + iface_setup_from_boot_context(&rec->iface, context); + +diff --git a/usr/idbm.h b/usr/idbm.h +index 245f046..b9020fe 100644 +--- a/usr/idbm.h ++++ b/usr/idbm.h +@@ -27,6 +27,7 @@ + #include "initiator.h" + #include "config.h" + #include "list.h" ++#include "flashnode.h" + + #define NODE_CONFIG_DIR ISCSI_CONFIG_ROOT"nodes" + #define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp" +@@ -42,6 +43,7 @@ + #define TYPE_STR 2 + #define TYPE_UINT8 3 + #define TYPE_UINT16 4 ++#define TYPE_UINT32 5 + #define MAX_KEYS 256 /* number of keys total(including CNX_MAX) */ + #define NAME_MAXVAL 128 /* the maximum length of key name */ + #define VALUE_MAXVAL 256 /* the maximum length of 223 bytes in the RFC. */ +@@ -85,6 +87,7 @@ struct user_param { + struct list_head list; + char *name; + char *value; ++ int param; + }; + + typedef int (idbm_iface_op_fn)(void *data, node_rec_t *rec); +@@ -168,6 +171,7 @@ enum { + IDBM_PRINT_TYPE_NODE, + IDBM_PRINT_TYPE_IFACE, + IDBM_PRINT_TYPE_HOST_CHAP, ++ IDBM_PRINT_TYPE_FLASHNODE + }; + + extern void idbm_print(int type, void *rec, int show, FILE *f); +@@ -181,5 +185,9 @@ extern struct node_rec * + idbm_create_rec_from_boot_context(struct boot_context *context); + + extern int idbm_print_host_chap_info(struct iscsi_chap_rec *chap); ++extern void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri); ++ ++extern int idbm_print_flashnode_info(struct flashnode_rec *target); ++extern void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri); + + #endif /* IDBM_H */ +diff --git a/usr/idbm_fields.h b/usr/idbm_fields.h +index 358d014..5790a03 100644 +--- a/usr/idbm_fields.h ++++ b/usr/idbm_fields.h +@@ -89,6 +89,55 @@ + #define IFACE_NUM "iface.iface_num" + #define IFACE_MTU "iface.mtu" + #define IFACE_PORT "iface.port" ++#define IFACE_DELAYED_ACK "iface.delayed_ack" ++#define IFACE_TCP_NAGLE "iface.tcp_nagle" ++#define IFACE_TCP_WSF_STATE "iface.tcp_wsf_state" ++#define IFACE_TCP_WSF "iface.tcp_wsf" ++#define IFACE_TCP_TIMER_SCALE "iface.tcp_timer_scale" ++#define IFACE_TCP_TIMESTAMP "iface.tcp_timestamp" ++#define IFACE_DHCP_DNS "iface.dhcp_dns" ++#define IFACE_DHCP_SLP_DA "iface.dhcp_slp_da" ++#define IFACE_TOS_STATE "iface.tos_state" ++#define IFACE_TOS "iface.tos" ++#define IFACE_GRAT_ARP "iface.gratuitous_arp" ++#define IFACE_DHCP_ALT_CID "iface.dhcp_alt_client_id_state" ++#define IFACE_DHCP_ALT_CID_STR "iface.dhcp_alt_client_id" ++#define IFACE_DHCP_REQ_VID "iface.dhcp_req_vendor_id_state" ++#define IFACE_DHCP_VID "iface.dhcp_vendor_id_state" ++#define IFACE_DHCP_VID_STR "iface.dhcp_vendor_id" ++#define IFACE_DHCP_LEARN_IQN "iface.dhcp_learn_iqn" ++#define IFACE_FRAGMENTATION "iface.fragmentation" ++#define IFACE_IN_FORWARD "iface.incoming_forwarding" ++#define IFACE_TTL "iface.ttl" ++#define IFACE_GRAT_NEIGHBOR_ADV "iface.gratuitous_neighbor_adv" ++#define IFACE_REDIRECT "iface.redirect" ++#define IFACE_IGNORE_ICMP_ECHO_REQ "iface.ignore_icmp_echo_request" ++#define IFACE_MLD "iface.mld" ++#define IFACE_FLOW_LABEL "iface.flow_label" ++#define IFACE_TRAFFIC_CLASS "iface.traffic_class" ++#define IFACE_HOP_LIMIT "iface.hop_limit" ++#define IFACE_ND_REACHABLE_TMO "iface.nd_reachable_tmo" ++#define IFACE_ND_REXMIT_TIME "iface.nd_rexmit_time" ++#define IFACE_ND_STALE_TMO "iface.nd_stale_tmo" ++#define IFACE_DUP_ADDR_DETECT_CNT "iface.dup_addr_detect_cnt" ++#define IFACE_RTR_ADV_LINK_MTU "iface.router_adv_link_mtu" ++#define IFACE_DEF_TMF_TMO "iface.def_task_mgmt_timeout" ++#define IFACE_HDRDGST "iface.header_digest" ++#define IFACE_DATADGST "iface.data_digest" ++#define IFACE_IMM_DATA "iface.immediate_data" ++#define IFACE_INITIAL_R2T "iface.initial_r2t" ++#define IFACE_DSEQ_INORDER "iface.data_seq_inorder" ++#define IFACE_DPDU_INORDER "iface.data_pdu_inorder" ++#define IFACE_ERL "iface.erl" ++#define IFACE_MAX_RECV_DLEN "iface.max_receive_data_len" ++#define IFACE_FIRST_BURST "iface.first_burst_len" ++#define IFACE_MAX_R2T "iface.max_outstanding_r2t" ++#define IFACE_MAX_BURST "iface.max_burst_len" ++#define IFACE_CHAP_AUTH "iface.chap_auth" ++#define IFACE_BIDI_CHAP "iface.bidi_chap" ++#define IFACE_STRICT_LOGIN_COMP "iface.strict_login_compliance" ++#define IFACE_DISCOVERY_AUTH "iface.discovery_auth" ++#define IFACE_DISCOVERY_LOGOUT "iface.discovery_logout" + + /* discovery fields */ + #define DISC_STARTUP "discovery.startup" +@@ -126,4 +175,67 @@ + #define HOST_AUTH_PASSWORD_IN "host.auth.password_in" + #define HOST_AUTH_PASSWORD_IN_LEN "host.auth.password_in_length" + ++/* flash target session fields */ ++#define FLASHNODE_SESS_AUTO_SND_TGT_DISABLE "flashnode.session.auto_snd_tgt_disable" ++#define FLASHNODE_SESS_DISCOVERY_SESS "flashnode.session.discovery_session" ++#define FLASHNODE_SESS_PORTAL_TYPE "flashnode.session.portal_type" ++#define FLASHNODE_SESS_ENTRY_EN "flashnode.session.entry_enable" ++#define FLASHNODE_SESS_IMM_DATA_EN "flashnode.session.immediate_data" ++#define FLASHNODE_SESS_INITIAL_R2T_EN "flashnode.session.initial_r2t" ++#define FLASHNODE_SESS_DATASEQ_INORDER "flashnode.session.data_seq_in_order" ++#define FLASHNODE_SESS_PDU_INORDER "flashnode.session.data_pdu_in_order" ++#define FLASHNODE_SESS_CHAP_AUTH_EN "flashnode.session.chap_auth_en" ++#define FLASHNODE_SESS_DISCOVERY_LOGOUT_EN "flashnode.session.discovery_logout_en" ++#define FLASHNODE_SESS_BIDI_CHAP_EN "flashnode.session.bidi_chap_en" ++#define FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL "flashnode.session.discovery_auth_optional" ++#define FLASHNODE_SESS_ERL "flashnode.session.erl" ++#define FLASHNODE_SESS_FIRST_BURST "flashnode.session.first_burst_len" ++#define FLASHNODE_SESS_DEF_TIME2WAIT "flashnode.session.def_time2wait" ++#define FLASHNODE_SESS_DEF_TIME2RETAIN "flashnode.session.def_time2retain" ++#define FLASHNODE_SESS_MAX_R2T "flashnode.session.max_outstanding_r2t" ++#define FLASHNODE_SESS_ISID "flashnode.session.isid" ++#define FLASHNODE_SESS_TSID "flashnode.session.tsid" ++#define FLASHNODE_SESS_MAX_BURST "flashnode.session.max_burst_len" ++#define FLASHNODE_SESS_DEF_TASKMGMT_TMO "flashnode.session.def_taskmgmt_tmo" ++#define FLASHNODE_SESS_ALIAS "flashnode.session.targetalias" ++#define FLASHNODE_SESS_NAME "flashnode.session.targetname" ++#define FLASHNODE_SESS_TPGT "flashnode.session.tpgt" ++#define FLASHNODE_SESS_DISCOVERY_PARENT_IDX "flashnode.session.discovery_parent_idx" ++#define FLASHNODE_SESS_DISCOVERY_PARENT_TYPE "flashnode.session.discovery_parent_type" ++#define FLASHNODE_SESS_CHAP_OUT_IDX "flashnode.session.chap_out_idx" ++#define FLASHNODE_SESS_CHAP_IN_IDX "flashnode.session.chap_in_idx" ++#define FLASHNODE_SESS_USERNAME "flashnode.session.username" ++#define FLASHNODE_SESS_USERNAME_IN "flashnode.session.username_in" ++#define FLASHNODE_SESS_PASSWORD "flashnode.session.password" ++#define FLASHNODE_SESS_PASSWORD_IN "flashnode.session.password_in" ++#define FLASHNODE_SESS_IS_BOOT_TGT "flashnode.session.is_boot_target" ++ ++/* flash target connection fields */ ++#define FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6 "flashnode.conn[%d].is_fw_assigned_ipv6" ++#define FLASHNODE_CONN_HDR_DGST_EN "flashnode.conn[%d].header_digest_en" ++#define FLASHNODE_CONN_DATA_DGST_EN "flashnode.conn[%d].data_digest_en" ++#define FLASHNODE_CONN_SNACK_REQ_EN "flashnode.conn[%d].snack_req_en" ++#define FLASHNODE_CONN_TCP_TIMESTAMP_STAT "flashnode.conn[%d].tcp_timestamp_stat" ++#define FLASHNODE_CONN_TCP_NAGLE_DISABLE "flashnode.conn[%d].tcp_nagle_disable" ++#define FLASHNODE_CONN_TCP_WSF_DISABLE "flashnode.conn[%d].tcp_wsf_disable" ++#define FLASHNODE_CONN_TCP_TIMER_SCALE "flashnode.conn[%d].tcp_timer_scale" ++#define FLASHNODE_CONN_TCP_TIMESTAMP_EN "flashnode.conn[%d].tcp_timestamp_en" ++#define FLASHNODE_CONN_IP_FRAG_DISABLE "flashnode.conn[%d].fragment_disable" ++#define FLASHNODE_CONN_MAX_RECV_DLENGTH "flashnode.conn[%d].max_recv_dlength" ++#define FLASHNODE_CONN_MAX_XMIT_DLENGTH "flashnode.conn[%d].max_xmit_dlength" ++#define FLASHNODE_CONN_KEEPALIVE_TMO "flashnode.conn[%d].keepalive_tmo" ++#define FLASHNODE_CONN_PORT "flashnode.conn[%d].port" ++#define FLASHNODE_CONN_IPADDR "flashnode.conn[%d].ipaddress" ++#define FLASHNODE_CONN_REDIRECT_IPADDR "flashnode.conn[%d].redirect_ipaddr" ++#define FLASHNODE_CONN_MAX_SEGMENT_SIZE "flashnode.conn[%d].max_segment_size" ++#define FLASHNODE_CONN_LOCAL_PORT "flashnode.conn[%d].local_port" ++#define FLASHNODE_CONN_IPV4_TOS "flashnode.conn[%d].ipv4_tos" ++#define FLASHNODE_CONN_IPV6_TC "flashnode.conn[%d].ipv6_traffic_class" ++#define FLASHNODE_CONN_IPV6_FLOW_LABEL "flashnode.conn[%d].ipv6_flow_label" ++#define FLASHNODE_CONN_LINK_LOCAL_IPV6 "flashnode.conn[%d].link_local_ipv6" ++#define FLASHNODE_CONN_TCP_XMIT_WSF "flashnode.conn[%d].tcp_xmit_wsf" ++#define FLASHNODE_CONN_TCP_RECV_WSF "flashnode.conn[%d].tcp_recv_wsf" ++#define FLASHNODE_CONN_STATSN "flashnode.conn[%d].statsn" ++#define FLASHNODE_CONN_EXP_STATSN "flashnode.conn[%d].exp_statsn" ++ + #endif +diff --git a/usr/iface.c b/usr/iface.c +index 3a9582e..0a7f0bb 100644 +--- a/usr/iface.c ++++ b/usr/iface.c +@@ -227,7 +227,7 @@ int iface_conf_delete(struct iface_rec *iface) + def_iface = iface_match_default(iface); + if (def_iface) { + log_error("iface %s is a special interface and " +- "cannot be deleted.\n", iface->name); ++ "cannot be deleted.", iface->name); + return ISCSI_ERR_INVAL; + } + +@@ -259,7 +259,7 @@ int iface_conf_write(struct iface_rec *iface) + def_iface = iface_match_default(iface); + if (def_iface) { + log_error("iface %s is a special interface and " +- "is not stored in %s.\n", iface->name, ++ "is not stored in %s.", iface->name, + IFACE_CONFIG_DIR); + return ISCSI_ERR_INVAL; + } +@@ -299,7 +299,7 @@ int iface_conf_update(struct list_head *params, struct iface_rec *iface) + def_iface = iface_match_default(iface); + if (def_iface) { + log_error("iface %s is a special interface and " +- "cannot be modified.\n", iface->name); ++ "cannot be modified.", iface->name); + return ISCSI_ERR_INVAL; + } + +@@ -450,8 +450,10 @@ int iface_get_iptype(struct iface_rec *iface) + /* try to figure out by name */ + if (strstr(iface->name, "ipv4")) + return ISCSI_IFACE_TYPE_IPV4; +- else ++ else if (strstr(iface->name, "ipv6")) + return ISCSI_IFACE_TYPE_IPV6; ++ else /* assume ipv4 by default */ ++ return ISCSI_IFACE_TYPE_IPV4; + } else { + if (strcmp(iface->bootproto, "dhcp") && + !strstr(iface->ipaddress, ".")) +@@ -470,17 +472,14 @@ static int iface_setup_binding_from_kern_iface(void *data, + + if (!strlen(hinfo->iface.hwaddress)) { + log_error("Invalid offload iSCSI host %u. Missing " +- "hwaddress. Try upgrading %s driver.\n", ++ "hwaddress. Try upgrading %s driver.", + hinfo->host_no, hinfo->iface.transport_name); + return 0; + } + + memset(&iface, 0, sizeof(struct iface_rec)); +- strcpy(iface.hwaddress, hinfo->iface.hwaddress); +- strcpy(iface.transport_name, hinfo->iface.transport_name); +- + if (kern_iface) { +- iface.iface_num = kern_iface->iface_num; ++ memcpy(&iface, kern_iface, sizeof(iface)); + + snprintf(iface.name, sizeof(iface.name), "%s.%s.%s.%u", + kern_iface->transport_name, +@@ -492,6 +491,9 @@ static int iface_setup_binding_from_kern_iface(void *data, + hinfo->iface.transport_name, hinfo->iface.hwaddress); + } + ++ strcpy(iface.hwaddress, hinfo->iface.hwaddress); ++ strcpy(iface.transport_name, hinfo->iface.transport_name); ++ + memset(iface_path, 0, sizeof(iface_path)); + snprintf(iface_path, PATH_MAX, "%s/%s", IFACE_CONFIG_DIR, + iface.name); +@@ -601,6 +603,105 @@ void iface_copy(struct iface_rec *dst, struct iface_rec *src) + dst->mtu = src->mtu; + if (src->port) + dst->port = src->port; ++ if (strlen(src->delayed_ack)) ++ strcpy(dst->delayed_ack, src->delayed_ack); ++ if (strlen(src->nagle)) ++ strcpy(dst->nagle, src->nagle); ++ if (strlen(src->tcp_wsf_state)) ++ strcpy(dst->tcp_wsf_state, src->tcp_wsf_state); ++ if (src->tcp_wsf) ++ dst->tcp_wsf = src->tcp_wsf; ++ if (src->tcp_timer_scale) ++ dst->tcp_timer_scale = src->tcp_timer_scale; ++ if (strlen(src->tcp_timestamp)) ++ strcpy(dst->tcp_timestamp, src->tcp_timestamp); ++ if (strlen(src->dhcp_dns)) ++ strcpy(dst->dhcp_dns, src->dhcp_dns); ++ if (strlen(src->dhcp_slp_da)) ++ strcpy(dst->dhcp_slp_da, src->dhcp_slp_da); ++ if (strlen(src->tos_state)) ++ strcpy(dst->tos_state, src->tos_state); ++ if (src->tos) ++ dst->tos = src->tos; ++ if (strlen(src->gratuitous_arp)) ++ strcpy(dst->gratuitous_arp, src->gratuitous_arp); ++ if (strlen(src->dhcp_alt_client_id_state)) ++ strcpy(dst->dhcp_alt_client_id_state, ++ src->dhcp_alt_client_id_state); ++ if (strlen(src->dhcp_alt_client_id)) ++ strcpy(dst->dhcp_alt_client_id, src->dhcp_alt_client_id); ++ if (strlen(src->dhcp_req_vendor_id_state)) ++ strcpy(dst->dhcp_req_vendor_id_state, ++ src->dhcp_req_vendor_id_state); ++ if (strlen(src->dhcp_vendor_id_state)) ++ strcpy(dst->dhcp_vendor_id_state, src->dhcp_vendor_id_state); ++ if (strlen(src->dhcp_vendor_id)) ++ strcpy(dst->dhcp_vendor_id, src->dhcp_vendor_id); ++ if (strlen(src->dhcp_learn_iqn)) ++ strcpy(dst->dhcp_learn_iqn, src->dhcp_learn_iqn); ++ if (strlen(src->fragmentation)) ++ strcpy(dst->fragmentation, src->fragmentation); ++ if (strlen(src->incoming_forwarding)) ++ strcpy(dst->incoming_forwarding, src->incoming_forwarding); ++ if (src->ttl) ++ dst->ttl = src->ttl; ++ if (strlen(src->gratuitous_neighbor_adv)) ++ strcpy(dst->gratuitous_neighbor_adv, ++ src->gratuitous_neighbor_adv); ++ if (strlen(src->redirect)) ++ strcpy(dst->redirect, src->redirect); ++ if (strlen(src->mld)) ++ strcpy(dst->mld, src->mld); ++ if (src->flow_label) ++ dst->flow_label = src->flow_label; ++ if (src->traffic_class) ++ dst->traffic_class = src->traffic_class; ++ if (src->hop_limit) ++ dst->hop_limit = src->hop_limit; ++ if (src->nd_reachable_tmo) ++ dst->nd_reachable_tmo = src->nd_reachable_tmo; ++ if (src->nd_rexmit_time) ++ dst->nd_rexmit_time = src->nd_rexmit_time; ++ if (src->nd_stale_tmo) ++ dst->nd_stale_tmo = src->nd_stale_tmo; ++ if (src->dup_addr_detect_cnt) ++ dst->dup_addr_detect_cnt = src->dup_addr_detect_cnt; ++ if (src->router_adv_link_mtu) ++ dst->router_adv_link_mtu = src->router_adv_link_mtu; ++ if (src->def_task_mgmt_tmo) ++ dst->def_task_mgmt_tmo = src->def_task_mgmt_tmo; ++ if (strlen(src->header_digest)) ++ strcpy(dst->header_digest, src->header_digest); ++ if (strlen(src->data_digest)) ++ strcpy(dst->data_digest, src->data_digest); ++ if (strlen(src->immediate_data)) ++ strcpy(dst->immediate_data, src->immediate_data); ++ if (strlen(src->initial_r2t)) ++ strcpy(dst->initial_r2t, src->initial_r2t); ++ if (strlen(src->data_seq_inorder)) ++ strcpy(dst->data_seq_inorder, src->data_seq_inorder); ++ if (strlen(src->data_pdu_inorder)) ++ strcpy(dst->data_pdu_inorder, src->data_pdu_inorder); ++ if (src->erl) ++ dst->erl = src->erl; ++ if (src->max_recv_dlength) ++ dst->max_recv_dlength = src->max_recv_dlength; ++ if (src->first_burst_len) ++ dst->first_burst_len = src->first_burst_len; ++ if (src->max_out_r2t) ++ dst->max_out_r2t = src->max_out_r2t; ++ if (src->max_burst_len) ++ dst->max_burst_len = src->max_burst_len; ++ if (strlen(src->chap_auth)) ++ strcpy(dst->chap_auth, src->chap_auth); ++ if (strlen(src->bidi_chap)) ++ strcpy(dst->bidi_chap, src->bidi_chap); ++ if (strlen(src->strict_login_comp)) ++ strcpy(dst->strict_login_comp, src->strict_login_comp); ++ if (strlen(src->discovery_auth)) ++ strcpy(dst->discovery_auth, src->discovery_auth); ++ if (strlen(src->discovery_logout)) ++ strcpy(dst->discovery_logout, src->discovery_logout); + if (strlen(src->hwaddress)) + strcpy(dst->hwaddress, src->hwaddress); + if (strlen(src->transport_name)) +@@ -894,7 +995,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + struct boot_context *context) + { + struct iscsi_transport *t = NULL; +- char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; + uint32_t hostno; + + if (strlen(context->initiatorname)) +@@ -902,7 +1002,8 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + sizeof(iface->iname)); + + if (strlen(context->scsi_host_name)) { +- if (sscanf(context->scsi_host_name, "iscsi_boot%u", &hostno) != 1) { ++ if (sscanf(context->scsi_host_name, ++ "iscsi_boot%u", &hostno) != 1) { + log_error("Could not parse %s's host no.", + context->scsi_host_name); + return 0; +@@ -910,6 +1011,8 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + } else if (strlen(context->iface)) { + /* this ifdef is only temp until distros and firmwares are updated */ + #ifdef OFFLOAD_BOOT_SUPPORTED ++ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; ++ int rc; + + memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN); + /* make sure offload driver is loaded */ +@@ -917,6 +1020,10 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + transport_name)) + t = iscsi_sysfs_get_transport_by_name(transport_name); + ++ if (net_ifup_netdev(context->iface)) ++ log_warning("Could not bring up netdev %s for boot", ++ context->iface); ++ + hostno = iscsi_sysfs_get_host_no_from_hwaddress(context->mac, + &rc); + if (rc) { +@@ -925,7 +1032,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + * host then the MAC must be for network card, so boot + * is not going to be offloaded. + */ +- log_debug(3, "Could not match %s to host\n", ++ log_debug(3, "Could not match %s to host", + context->mac); + return 0; + } +@@ -957,7 +1064,12 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + sizeof(iface->hwaddress)); + strlcpy(iface->ipaddress, context->ipaddr, + sizeof(iface->ipaddress)); +- log_debug(1, "iface " iface_fmt "\n", iface_str(iface)); ++ iface->vlan_id = atoi(context->vlan); ++ strlcpy(iface->subnet_mask, context->mask, ++ sizeof(iface->subnet_mask)); ++ strlcpy(iface->gateway, context->gateway, ++ sizeof(iface->gateway)); ++ log_debug(1, "iface " iface_fmt "", iface_str(iface)); + return 1; + } + +@@ -982,7 +1094,7 @@ int iface_create_ifaces_from_boot_contexts(struct list_head *ifaces, + /* use dummy name. If valid it will get overwritten below */ + iface = iface_alloc(DEFAULT_IFACENAME, &rc); + if (!iface) { +- log_error("Could not setup iface %s for boot\n", ++ log_error("Could not setup iface %s for boot", + context->iface); + goto fail; + } +@@ -1016,6 +1128,79 @@ struct iface_param_count { + int count; + }; + ++#define IFACE_NET_PARAM_EN_CNT(param_val, cnt) { \ ++ if (!strcmp(param_val, "disable") || \ ++ !strcmp(param_val, "enable")) \ ++ (*cnt)++; \ ++} ++ ++/** ++ * iface_get_common_param_count - Gets common parameters count for given iface ++ * @iface: iface to setup ++ * @count: number of parameters to set ++ */ ++static void iface_get_common_param_count(struct iface_rec *iface, int *count) ++{ ++ if (strcmp(iface->vlan_state, "disable")) { ++ /* vlan_state enabled */ ++ (*count)++; ++ ++ if (iface->vlan_id) ++ /* For vlan value */ ++ (*count)++; ++ } else { ++ /* vlan_state disabled */ ++ (*count)++; ++ } ++ ++ if (iface->mtu) ++ (*count)++; ++ ++ if (iface->port) ++ (*count)++; ++ ++ IFACE_NET_PARAM_EN_CNT(iface->delayed_ack, count); ++ IFACE_NET_PARAM_EN_CNT(iface->nagle, count); ++ IFACE_NET_PARAM_EN_CNT(iface->tcp_wsf_state, count); ++ IFACE_NET_PARAM_EN_CNT(iface->tcp_timestamp, count); ++ IFACE_NET_PARAM_EN_CNT(iface->redirect, count); ++ IFACE_NET_PARAM_EN_CNT(iface->header_digest, count); ++ IFACE_NET_PARAM_EN_CNT(iface->data_digest, count); ++ IFACE_NET_PARAM_EN_CNT(iface->immediate_data, count); ++ IFACE_NET_PARAM_EN_CNT(iface->initial_r2t, count); ++ IFACE_NET_PARAM_EN_CNT(iface->data_seq_inorder, count); ++ IFACE_NET_PARAM_EN_CNT(iface->data_pdu_inorder, count); ++ IFACE_NET_PARAM_EN_CNT(iface->chap_auth, count); ++ IFACE_NET_PARAM_EN_CNT(iface->bidi_chap, count); ++ IFACE_NET_PARAM_EN_CNT(iface->strict_login_comp, count); ++ IFACE_NET_PARAM_EN_CNT(iface->discovery_auth, count); ++ IFACE_NET_PARAM_EN_CNT(iface->discovery_logout, count); ++ ++ if (iface->tcp_wsf) ++ (*count)++; ++ ++ if (iface->tcp_timer_scale) ++ (*count)++; ++ ++ if (iface->def_task_mgmt_tmo) ++ (*count)++; ++ ++ if (iface->erl) ++ (*count)++; ++ ++ if (iface->max_recv_dlength) ++ (*count)++; ++ ++ if (iface->first_burst_len) ++ (*count)++; ++ ++ if (iface->max_burst_len) ++ (*count)++; ++ ++ if (iface->max_out_r2t) ++ (*count)++; ++} ++ + /** + * __iface_get_param_count - Gets netconfig parameter count for given iface + * @data: iface_param_count structure +@@ -1034,10 +1219,10 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) + if (iptype == ISCSI_IFACE_TYPE_IPV4) { + + if (strcmp(iface->state, "disable")) { +- if (strstr(iface->bootproto, "dhcp")) ++ if (strstr(iface->bootproto, "dhcp")) { + /* DHCP enabled */ + count++; +- else { ++ } else { + /* DHCP disabled */ + count++; + +@@ -1052,12 +1237,13 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) + if (strstr(iface->gateway, ".")) + /* User configured Gateway */ + count++; +- } else ++ } else { + /* + * IPv4 Address not valid, decrement + * count of DHCP + */ + count--; ++ } + } + + /* +@@ -1068,37 +1254,68 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) + /* iface state */ + count++; + +- if (strcmp(iface->vlan_state, "disable")) { +- /* vlan_state enabled */ ++ IFACE_NET_PARAM_EN_CNT(iface->dhcp_dns, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT(iface->dhcp_slp_da, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT(iface->tos_state, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT(iface->gratuitous_arp, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT( ++ iface->dhcp_alt_client_id_state, ++ &count); ++ ++ if (iface->dhcp_alt_client_id[0]) + count++; + +- if (iface->vlan_id) +- /* For vlan value */ +- count++; +- } else +- /* vlan_state disabled */ ++ IFACE_NET_PARAM_EN_CNT( ++ iface->dhcp_req_vendor_id_state, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT( ++ iface->dhcp_vendor_id_state, ++ &count); ++ ++ if (iface->dhcp_vendor_id[0]) + count++; + +- if (iface->mtu) ++ IFACE_NET_PARAM_EN_CNT(iface->dhcp_learn_iqn, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT(iface->fragmentation, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT( ++ iface->incoming_forwarding, ++ &count); ++ ++ if (iface->tos) + count++; + +- if (iface->port) ++ if (iface->ttl) + count++; ++ ++ iface_get_common_param_count(iface, &count); + } +- } else ++ } else { + /* IPv4 is disabled, iface state */ + count++; +- ++ } + } else if (iptype == ISCSI_IFACE_TYPE_IPV6) { + + if (strcmp(iface->state, "disable")) { + + /* IPv6 Address */ + if (strstr(iface->ipv6_autocfg, "nd") || +- strstr(iface->ipv6_autocfg, "dhcpv6")) ++ strstr(iface->ipv6_autocfg, "dhcpv6")) { + /* Autocfg enabled */ + count++; +- else { ++ } else { + /* Autocfg disabled */ + count++; + +@@ -1159,26 +1376,42 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) + /* iface state */ + count++; + +- if (strcmp(iface->vlan_state, "disable")) { +- /* vlan_state enabled */ ++ IFACE_NET_PARAM_EN_CNT( ++ iface->gratuitous_neighbor_adv, ++ &count); ++ ++ IFACE_NET_PARAM_EN_CNT(iface->mld, &count); ++ ++ if (iface->flow_label) ++ count++; ++ ++ if (iface->traffic_class) ++ count++; ++ ++ if (iface->hop_limit) + count++; + +- if (iface->vlan_id) +- /* For vlan value */ +- count++; +- } else +- /* vlan_state disabled */ ++ if (iface->nd_reachable_tmo) + count++; + +- if (iface->mtu) ++ if (iface->nd_rexmit_time) + count++; + +- if (iface->port) ++ if (iface->nd_stale_tmo) + count++; ++ ++ if (iface->dup_addr_detect_cnt) ++ count++; ++ ++ if (iface->router_adv_link_mtu) ++ count++; ++ ++ iface_get_common_param_count(iface, &count); + } +- } else ++ } else { + /* IPv6 is disabled, iface state */ + count++; ++ } + } + + iface_params->count += count; +@@ -1197,7 +1430,7 @@ int iface_get_param_count(struct iface_rec *iface, int iface_all) + int num_found = 0, rc; + struct iface_param_count iface_params; + +- log_debug(8, "In iface_get_param_count\n"); ++ log_debug(8, "In iface_get_param_count"); + + iface_params.primary = iface; + iface_params.count = 0; +@@ -1208,63 +1441,73 @@ int iface_get_param_count(struct iface_rec *iface, int iface_all) + else + rc = __iface_get_param_count(&iface_params, iface); + +- log_debug(8, "iface_get_param_count: rc = %d, count = %d\n", ++ log_debug(8, "iface_get_param_count: rc = %d, count = %d", + rc, iface_params.count); + return iface_params.count; + } + +-/* IPv4/IPv6 Port: 3260 or User defined */ +-static int iface_fill_port(struct iovec *iov, struct iface_rec *iface, +- uint32_t iface_type) ++/* write integer parameter value */ ++static int iface_fill_int_param_val(struct iovec *iov, uint32_t iface_num, ++ uint8_t iface_type, uint16_t param, ++ uint8_t param_type, uint32_t param_len, ++ uint32_t param_val) + { + int len; + struct iscsi_iface_param_info *net_param; +- uint16_t port = 3260; + struct nlattr *attr; ++ uint8_t val8 = 0; ++ uint16_t val16 = 0; ++ uint32_t val32 = 0; ++ char *val = NULL; + +- len = sizeof(struct iscsi_iface_param_info) + sizeof(port); +- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_PORT, len); +- if (!iov->iov_base) +- return 1; +- attr = iov->iov_base; +- iov->iov_len = NLA_ALIGN(attr->nla_len); +- +- net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); +- net_param->param = ISCSI_NET_PARAM_PORT; +- net_param->iface_type = iface_type; +- net_param->iface_num = iface->iface_num; +- net_param->param_type = ISCSI_NET_PARAM; +- net_param->len = 2; +- if (iface->port) +- port = iface->port; +- memcpy(net_param->value, &port, net_param->len); +- return 0; +-} +- +-static int iface_fill_mtu(struct iovec *iov, struct iface_rec *iface, +- uint32_t iface_type) +-{ +- int len; +- struct iscsi_iface_param_info *net_param; +- uint16_t mtu = 0; +- struct nlattr *attr; +- +- len = sizeof(struct iscsi_iface_param_info) + 2; +- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_MTU, len); ++ len = sizeof(struct iscsi_iface_param_info) + param_len; ++ iov->iov_base = iscsi_nla_alloc(param, len); + if (!(iov->iov_base)) + return 1; ++ + attr = iov->iov_base; + iov->iov_len = NLA_ALIGN(attr->nla_len); +- + net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); +- net_param->param = ISCSI_NET_PARAM_MTU; ++ net_param->iface_num = iface_num; ++ net_param->len = param_len; ++ net_param->param = param; + net_param->iface_type = iface_type; +- net_param->iface_num = iface->iface_num; +- net_param->param_type = ISCSI_NET_PARAM; +- net_param->len = 2; +- mtu = iface->mtu; +- memcpy(net_param->value, &mtu, net_param->len); ++ net_param->param_type = param_type; ++ switch (param_len) { ++ case 1: ++ val8 = (uint8_t)param_val; ++ val = (char *)&val8; ++ break; ++ ++ case 2: ++ val16 = (uint16_t)param_val; ++ val = (char *)&val16; ++ break; ++ ++ case 4: ++ val32 = (uint32_t)param_val; ++ val = (char *)&val32; ++ break; ++ ++ default: ++ goto free; ++ } ++ memcpy(net_param->value, val, param_len); + return 0; ++free: ++ free(iov->iov_base); ++ iov->iov_base = NULL; ++ iov->iov_len = 0; ++ return 1; ++} ++ ++#define IFACE_SET_PARAM_INTVAL(iov, inum, itype, param, ptype, plen, \ ++ ival, gcnt, lcnt) { \ ++ if (ival && !iface_fill_int_param_val(iov, inum, itype, param, \ ++ ptype, plen, ival)) { \ ++ (*gcnt)++; \ ++ (*lcnt)++; \ ++ } \ + } + + /* IPv4/IPv6 VLAN_ID: decimal value <= 4095 */ +@@ -1301,60 +1544,52 @@ static int iface_fill_vlan_id(struct iovec *iov, struct iface_rec *iface, + return 0; + } + +-/* IPv4/IPv6 VLAN state: disable/enable */ +-static int iface_fill_vlan_state(struct iovec *iov, struct iface_rec *iface, +- uint32_t iface_type) ++/* disable/enable parameters */ ++static int iface_fill_param_state(struct iovec *iov, uint32_t iface_num, ++ uint8_t iface_type, uint16_t param, ++ uint8_t param_type, char *param_val) + { + int len; + struct iscsi_iface_param_info *net_param; + struct nlattr *attr; + ++ if (!param_val[0]) ++ return 1; ++ + len = sizeof(struct iscsi_iface_param_info) + 1; +- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_VLAN_ENABLED, len); ++ iov->iov_base = iscsi_nla_alloc(param, len); + if (!(iov->iov_base)) + return 1; + + attr = iov->iov_base; + iov->iov_len = NLA_ALIGN(attr->nla_len); + net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); +- net_param->param = ISCSI_NET_PARAM_VLAN_ENABLED; +- net_param->iface_type = iface_type; +- net_param->iface_num = iface->iface_num; +- net_param->param_type = ISCSI_NET_PARAM; ++ net_param->iface_num = iface_num; + net_param->len = 1; +- if (strcmp(iface->vlan_state, "disable") && iface->vlan_id) +- net_param->value[0] = ISCSI_VLAN_ENABLE; +- else /* Assume disabled */ +- net_param->value[0] = ISCSI_VLAN_DISABLE; ++ net_param->param = param; ++ net_param->iface_type = iface_type; ++ net_param->param_type = param_type; ++ if (!strcmp(param_val, "disable")) ++ net_param->value[0] = ISCSI_NET_PARAM_DISABLE; ++ else if (!strcmp(param_val, "enable")) ++ net_param->value[0] = ISCSI_NET_PARAM_ENABLE; ++ else ++ goto free; + return 0; ++free: ++ free(iov->iov_base); ++ iov->iov_base = NULL; ++ iov->iov_len = 0; ++ return 1; + } + +-/* IPv4/IPv6 Network state: disable/enable */ +-static int iface_fill_net_state(struct iovec *iov, struct iface_rec *iface, +- uint32_t iface_type) +-{ +- int len; +- struct iscsi_iface_param_info *net_param; +- struct nlattr *attr; +- +- len = sizeof(struct iscsi_iface_param_info) + 1; +- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IFACE_ENABLE, len); +- if (!(iov->iov_base)) +- return 1; +- +- attr = iov->iov_base; +- iov->iov_len = NLA_ALIGN(attr->nla_len); +- net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); +- net_param->param = ISCSI_NET_PARAM_IFACE_ENABLE; +- net_param->iface_type = iface_type; +- net_param->iface_num = iface->iface_num; +- net_param->param_type = ISCSI_NET_PARAM; +- net_param->len = 1; +- if (!strcmp(iface->state, "disable")) +- net_param->value[0] = ISCSI_IFACE_DISABLE; +- else /* Assume enabled */ +- net_param->value[0] = ISCSI_IFACE_ENABLE; +- return 0; ++#define IFACE_SET_PARAM_STATE(iov, inum, itype, param, ptype, ival, \ ++ gcnt, lcnt) { \ ++ if (!iface_fill_param_state(iov, inum, itype, param, ptype, \ ++ ival)) { \ ++ (*gcnt)++; \ ++ (*lcnt)++; \ ++ } \ + } + + /* IPv4 Bootproto: DHCP/static */ +@@ -1474,8 +1709,8 @@ static int iface_fill_router_autocfg(struct iovec *iov, struct iface_rec *iface) + } + + /* IPv4 IPAddress/Subnet Mask/Gateway: 4 bytes */ +-static int iface_fill_net_ipv4_addr(struct iovec *iov, struct iface_rec *iface, +- uint32_t param) ++static int iface_fill_net_ipv4_addr(struct iovec *iov, uint32_t iface_num, ++ uint16_t param, char *param_val) + { + int rc = 1; + int len; +@@ -1492,29 +1727,12 @@ static int iface_fill_net_ipv4_addr(struct iovec *iov, struct iface_rec *iface, + net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); + net_param->param = param; + net_param->iface_type = ISCSI_IFACE_TYPE_IPV4; +- net_param->iface_num = iface->iface_num; ++ net_param->iface_num = iface_num; + net_param->len = 4; + net_param->param_type = ISCSI_NET_PARAM; +- +- switch (param) { +- case ISCSI_NET_PARAM_IPV4_ADDR: +- rc = inet_pton(AF_INET, iface->ipaddress, net_param->value); +- if (rc <= 0) +- goto free; +- break; +- case ISCSI_NET_PARAM_IPV4_SUBNET: +- rc = inet_pton(AF_INET, iface->subnet_mask, net_param->value); +- if (rc <= 0) +- goto free; +- break; +- case ISCSI_NET_PARAM_IPV4_GW: +- rc = inet_pton(AF_INET, iface->gateway, net_param->value); +- if (rc <= 0) +- goto free; +- break; +- default: ++ rc = inet_pton(AF_INET, param_val, net_param->value); ++ if (rc <= 0) + goto free; +- } + + /* validate */ + if (!net_param->value[0] && !net_param->value[1] && +@@ -1529,9 +1747,19 @@ free: + return 1; + } + ++#define IFACE_SET_NET_PARAM_IPV4_ADDR(iov, inum, param, ival, gcnt, \ ++ lcnt) { \ ++ if (strstr(ival, ".")) { \ ++ if (!iface_fill_net_ipv4_addr(iov, inum, param, ival)) {\ ++ (*gcnt)++; \ ++ (*lcnt)++; \ ++ } \ ++ } \ ++} ++ + /* IPv6 IPAddress/LinkLocal/Router: 16 bytes */ +-static int iface_fill_net_ipv6_addr(struct iovec *iov, struct iface_rec *iface, +- uint32_t param) ++static int iface_fill_net_ipv6_addr(struct iovec *iov, uint32_t iface_num, ++ uint16_t param, char *param_val) + { + int rc; + int len; +@@ -1548,30 +1776,12 @@ static int iface_fill_net_ipv6_addr(struct iovec *iov, struct iface_rec *iface, + net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); + net_param->param = param; + net_param->iface_type = ISCSI_IFACE_TYPE_IPV6; +- net_param->iface_num = iface->iface_num; ++ net_param->iface_num = iface_num; + net_param->param_type = ISCSI_NET_PARAM; + net_param->len = 16; +- +- switch (param) { +- case ISCSI_NET_PARAM_IPV6_ADDR: +- rc = inet_pton(AF_INET6, iface->ipaddress, net_param->value); +- if (rc <= 0) +- goto free; +- break; +- case ISCSI_NET_PARAM_IPV6_LINKLOCAL: +- rc = inet_pton(AF_INET6, iface->ipv6_linklocal, +- net_param->value); +- if (rc <= 0) +- goto free; +- break; +- case ISCSI_NET_PARAM_IPV6_ROUTER: +- rc = inet_pton(AF_INET6, iface->ipv6_router, net_param->value); +- if (rc <= 0) +- goto free; +- break; +- default: ++ rc = inet_pton(AF_INET6, param_val, net_param->value); ++ if (rc <= 0) + goto free; +- } + + return 0; + free: +@@ -1581,6 +1791,54 @@ free: + return 1; + } + ++#define IFACE_SET_NET_PARAM_IPV6_ADDR(iov, inum, param, ival, gcnt, \ ++ lcnt) { \ ++ if (strstr(ival, ":")) { \ ++ if (!iface_fill_net_ipv6_addr(iov, inum, param, ival)) {\ ++ (*gcnt)++; \ ++ (*lcnt)++; \ ++ } \ ++ } \ ++} ++ ++/* write string parameter value */ ++static int iface_fill_str_param_val(struct iovec *iov, uint32_t iface_num, ++ uint8_t iface_type, uint16_t param, ++ uint32_t param_len, char *param_val) ++{ ++ int len; ++ struct iscsi_iface_param_info *net_param; ++ struct nlattr *attr; ++ ++ if (!param_val[0]) ++ return 1; ++ ++ len = sizeof(struct iscsi_iface_param_info) + param_len; ++ iov->iov_base = iscsi_nla_alloc(param, len); ++ if (!(iov->iov_base)) ++ return 1; ++ ++ attr = iov->iov_base; ++ iov->iov_len = NLA_ALIGN(attr->nla_len); ++ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); ++ net_param->iface_num = iface_num; ++ net_param->len = param_len; ++ net_param->param = param; ++ net_param->iface_type = iface_type; ++ net_param->param_type = ISCSI_NET_PARAM; ++ memcpy(net_param->value, param_val, param_len); ++ return 0; ++} ++ ++#define IFACE_SET_NET_PARAM_STRVAL(iov, inum, itype, param, plen, \ ++ ival, gcnt, lcnt) { \ ++ if (!iface_fill_str_param_val(iov, inum, itype, param, plen, \ ++ ival)) { \ ++ (*gcnt)++; \ ++ (*lcnt)++; \ ++ } \ ++} ++ + struct iface_net_config { + struct iface_rec *primary; + struct iovec *iovs; +@@ -1600,16 +1858,21 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + /* start at 2, because 0 is for nlmsghdr and 1 for event */ + iov = net_config->iovs + 2; + ++ if (!iface->port) ++ iface->port = 3260; ++ + iptype = iface_get_iptype(iface); +- if (iptype == ISCSI_IFACE_TYPE_IPV4) { ++ switch (iptype) { ++ case ISCSI_IFACE_TYPE_IPV4: + if (!strcmp(iface->state, "disable")) { +- if (!iface_fill_net_state(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV4)) { +- net_config->count++; +- count++; +- } +- ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IFACE_ENABLE, ++ ISCSI_NET_PARAM, ++ iface->state, ++ &net_config->count, ++ &count); + return 0; + } + +@@ -1625,28 +1888,27 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + net_config->count++; + count++; + } +- if (!iface_fill_net_ipv4_addr(&iov[net_config->count], +- iface, +- ISCSI_NET_PARAM_IPV4_ADDR)) { +- net_config->count++; +- count++; +- } +- if (strstr(iface->subnet_mask, ".")) { +- if (!iface_fill_net_ipv4_addr( +- &iov[net_config->count], iface, +- ISCSI_NET_PARAM_IPV4_SUBNET)) { +- net_config->count++; +- count++; +- } +- } +- if (strstr(iface->gateway, ".")) { +- if (!iface_fill_net_ipv4_addr( +- &iov[net_config->count], iface, +- ISCSI_NET_PARAM_IPV4_GW)) { +- net_config->count++; +- count++; +- } +- } ++ ++ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_NET_PARAM_IPV4_ADDR, ++ iface->ipaddress, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_NET_PARAM_IPV4_SUBNET, ++ iface->subnet_mask, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_NET_PARAM_IPV4_GW, ++ iface->gateway, ++ &net_config->count, ++ &count); + } + + /* +@@ -1654,51 +1916,146 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + * fill state and other parameters (if any) + */ + if (count) { +- if (!iface_fill_net_state(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV4)) { +- net_config->count++; +- count++; +- } +- if (!iface_fill_vlan_state(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV4)) { +- net_config->count++; +- count++; +- } +- if (strcmp(iface->vlan_state, "disable") && +- iface->vlan_id) { +- if (!iface_fill_vlan_id(&iov[net_config->count], +- iface, ISCSI_IFACE_TYPE_IPV4)) { +- net_config->count++; +- count++; +- } +- } +- if (iface->mtu) { +- if (!iface_fill_mtu(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV4)) { +- net_config->count++; +- count++; +- } +- } +- if (iface->port) { +- if (!iface_fill_port(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV4)) { +- net_config->count++; +- count++; +- } +- } ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN, ++ ISCSI_NET_PARAM, ++ iface->dhcp_dns, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN, ++ ISCSI_NET_PARAM, ++ iface->dhcp_slp_da, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_TOS_EN, ++ ISCSI_NET_PARAM, ++ iface->tos_state, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_TOS, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->tos, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN, ++ ISCSI_NET_PARAM, ++ iface->gratuitous_arp, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN, ++ ISCSI_NET_PARAM, ++ iface->dhcp_alt_client_id_state, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID, ++ strlen(iface->dhcp_alt_client_id), ++ iface->dhcp_alt_client_id, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN, ++ ISCSI_NET_PARAM, ++ iface->dhcp_req_vendor_id_state, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN, ++ ISCSI_NET_PARAM, ++ iface->dhcp_vendor_id_state, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID, ++ strlen(iface->dhcp_vendor_id), ++ iface->dhcp_vendor_id, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN, ++ ISCSI_NET_PARAM, ++ iface->dhcp_learn_iqn, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE, ++ ISCSI_NET_PARAM, ++ iface->fragmentation, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN, ++ ISCSI_NET_PARAM, ++ iface->incoming_forwarding, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV4, ++ ISCSI_NET_PARAM_IPV4_TTL, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->ttl, ++ &net_config->count, ++ &count); + } +- } else if (iptype == ISCSI_IFACE_TYPE_IPV6) { ++ break; ++ ++ case ISCSI_IFACE_TYPE_IPV6: + if (!strcmp(iface->state, "disable")) { +- if (!iface_fill_net_state(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV6)) { +- net_config->count++; +- count++; +- } ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IFACE_ENABLE, ++ ISCSI_NET_PARAM, ++ iface->state, ++ &net_config->count, ++ &count); + return 0; + } + +@@ -1717,12 +2074,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + count++; + } + /* User provided IPv6 Address */ +- if (!iface_fill_net_ipv6_addr(&iov[net_config->count], +- iface, +- ISCSI_NET_PARAM_IPV6_ADDR)) { +- net_config->count++; +- count++; +- } ++ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_NET_PARAM_IPV6_ADDR, ++ iface->ipaddress, ++ &net_config->count, ++ &count); + } + + /* For LinkLocal Address */ +@@ -1741,12 +2098,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + count++; + } + /* User provided Link Local Address */ +- if (!iface_fill_net_ipv6_addr(&iov[net_config->count], +- iface, +- ISCSI_NET_PARAM_IPV6_LINKLOCAL)) { +- net_config->count++; +- count++; +- } ++ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_NET_PARAM_IPV6_LINKLOCAL, ++ iface->ipv6_linklocal, ++ &net_config->count, ++ &count); + } + + /* For Router Address */ +@@ -1763,12 +2120,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + count++; + } + /* User provided Router Address */ +- if (!iface_fill_net_ipv6_addr(&iov[net_config->count], +- iface, +- ISCSI_NET_PARAM_IPV6_ROUTER)) { +- net_config->count++; +- count++; +- } ++ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_NET_PARAM_IPV6_ROUTER, ++ iface->ipv6_router, ++ &net_config->count, ++ &count); + } + + /* +@@ -1776,44 +2133,378 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) + * fill state and other parameters + */ + if (count) { +- if (!iface_fill_net_state(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV6)) { +- net_config->count++; +- count++; +- } +- if (!iface_fill_vlan_state(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV6)) { ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN, ++ ISCSI_NET_PARAM, ++ iface->gratuitous_neighbor_adv, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_MLD_EN, ++ ISCSI_NET_PARAM, ++ iface->mld, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_FLOW_LABEL, ++ ISCSI_NET_PARAM, ++ 4, ++ iface->flow_label, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->traffic_class, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_HOP_LIMIT, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->hop_limit, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO, ++ ISCSI_NET_PARAM, ++ 4, ++ iface->nd_reachable_tmo, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME, ++ ISCSI_NET_PARAM, ++ 4, ++ iface->nd_rexmit_time, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_ND_STALE_TMO, ++ ISCSI_NET_PARAM, ++ 4, ++ iface->nd_stale_tmo, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->dup_addr_detect_cnt, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ ISCSI_IFACE_TYPE_IPV6, ++ ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU, ++ ISCSI_NET_PARAM, ++ 4, ++ iface->router_adv_link_mtu, ++ &net_config->count, ++ &count); ++ } ++ break; ++ } ++ ++ /* Fill parameters common to IPv4 and IPv6 ifaces */ ++ if (count) { ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_IFACE_ENABLE, ++ ISCSI_NET_PARAM, ++ iface->state, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_VLAN_ENABLED, ++ ISCSI_NET_PARAM, ++ iface->vlan_state, ++ &net_config->count, ++ &count); ++ ++ if (strcmp(iface->vlan_state, "disable") && iface->vlan_id) { ++ if (!iface_fill_vlan_id(&iov[net_config->count], iface, ++ iptype)) { + net_config->count++; + count++; + } +- if (strcmp(iface->vlan_state, "disable") && +- iface->vlan_id) { +- if (!iface_fill_vlan_id(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV6)) { +- net_config->count++; +- count++; +- } +- } +- if (iface->mtu) { +- if (!iface_fill_mtu(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV6)) { +- net_config->count++; +- count++; +- } +- } +- if (iface->port) { +- if (!iface_fill_port(&iov[net_config->count], +- iface, +- ISCSI_IFACE_TYPE_IPV6)) { +- net_config->count++; +- count++; +- } +- } + } ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_MTU, ++ ISCSI_NET_PARAM, ++ 2, ++ iface->mtu, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_PORT, ++ ISCSI_NET_PARAM, ++ 2, ++ iface->port, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_DELAYED_ACK_EN, ++ ISCSI_NET_PARAM, ++ iface->delayed_ack, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_TCP_NAGLE_DISABLE, ++ ISCSI_NET_PARAM, ++ iface->nagle, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_TCP_WSF_DISABLE, ++ ISCSI_NET_PARAM, ++ iface->tcp_wsf_state, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_TCP_WSF, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->tcp_wsf, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_TCP_TIMER_SCALE, ++ ISCSI_NET_PARAM, ++ 1, ++ iface->tcp_timer_scale, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_TCP_TIMESTAMP_EN, ++ ISCSI_NET_PARAM, ++ iface->tcp_timestamp, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_NET_PARAM_REDIRECT_EN, ++ ISCSI_NET_PARAM, ++ iface->redirect, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO, ++ ISCSI_IFACE_PARAM, ++ 2, ++ iface->def_task_mgmt_tmo, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_HDRDGST_EN, ++ ISCSI_IFACE_PARAM, ++ iface->header_digest, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_DATADGST_EN, ++ ISCSI_IFACE_PARAM, ++ iface->data_digest, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_IMM_DATA_EN, ++ ISCSI_IFACE_PARAM, ++ iface->immediate_data, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_INITIAL_R2T_EN, ++ ISCSI_IFACE_PARAM, ++ iface->initial_r2t, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN, ++ ISCSI_IFACE_PARAM, ++ iface->data_seq_inorder, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_PDU_INORDER_EN, ++ ISCSI_IFACE_PARAM, ++ iface->data_pdu_inorder, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_ERL, ++ ISCSI_IFACE_PARAM, ++ 1, ++ iface->erl, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH, ++ ISCSI_IFACE_PARAM, ++ 4, ++ iface->max_recv_dlength, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_FIRST_BURST, ++ ISCSI_IFACE_PARAM, ++ 4, ++ iface->first_burst_len, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_MAX_R2T, ++ ISCSI_IFACE_PARAM, ++ 2, ++ iface->max_out_r2t, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_MAX_BURST, ++ ISCSI_IFACE_PARAM, ++ 4, ++ iface->max_burst_len, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_CHAP_AUTH_EN, ++ ISCSI_IFACE_PARAM, ++ iface->chap_auth, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_BIDI_CHAP_EN, ++ ISCSI_IFACE_PARAM, ++ iface->bidi_chap, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN, ++ ISCSI_IFACE_PARAM, ++ iface->strict_login_comp, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL, ++ ISCSI_IFACE_PARAM, ++ iface->discovery_auth, ++ &net_config->count, ++ &count); ++ ++ IFACE_SET_PARAM_STATE(&iov[net_config->count], ++ iface->iface_num, ++ iptype, ++ ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN, ++ ISCSI_IFACE_PARAM, ++ iface->discovery_logout, ++ &net_config->count, ++ &count); + } + return 0; + } +@@ -1832,7 +2523,7 @@ int iface_build_net_config(struct iface_rec *iface, int iface_all, + int num_found = 0, rc; + struct iface_net_config net_config; + +- log_debug(8, "In iface_build_net_config\n"); ++ log_debug(8, "In iface_build_net_config"); + + net_config.primary = iface; + net_config.iovs = iovs; +@@ -1844,7 +2535,7 @@ int iface_build_net_config(struct iface_rec *iface, int iface_all, + else + rc = __iface_build_net_config(&net_config, iface); + +- log_debug(8, "iface_build_net_config: rc = %d, count = %d\n", ++ log_debug(8, "iface_build_net_config: rc = %d, count = %d", + rc, net_config.count); + return net_config.count; + } +diff --git a/usr/initiator.c b/usr/initiator.c +index 79ca32c..3b39c5d 100644 +--- a/usr/initiator.c ++++ b/usr/initiator.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + + #include "initiator.h" + #include "transport.h" +@@ -45,6 +46,7 @@ + #include "iscsi_sysfs.h" + #include "iscsi_settings.h" + #include "iface.h" ++#include "host.h" + #include "sysdeps.h" + #include "iscsi_err.h" + #include "kern_err_table.h" +@@ -54,10 +56,19 @@ + + #define PROC_DIR "/proc" + ++struct login_task_retry_info { ++ actor_t retry_actor; ++ queue_task_t *qtask; ++ node_rec_t *rec; ++ int retry_count; ++}; ++ + static void iscsi_login_timedout(void *data); + static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + struct iscsi_conn *conn, unsigned long tmo, + int event); ++static int queue_session_login_task_retry(struct login_task_retry_info *info, ++ node_rec_t *rec, queue_task_t *qtask); + + static int iscsi_ev_context_alloc(iscsi_conn_t *conn) + { +@@ -222,7 +233,7 @@ __check_iscsi_status_class(iscsi_session_t *session, int cid, + } + case ISCSI_STATUS_CLS_TARGET_ERR: + log_error("conn %d login rejected: target error " +- "(%02x/%02x)\n", conn->id, status_class, status_detail); ++ "(%02x/%02x)", conn->id, status_class, status_detail); + /* + * We have no idea what the problem is. But spec says initiator + * may retry later. +@@ -230,7 +241,7 @@ __check_iscsi_status_class(iscsi_session_t *session, int cid, + return CONN_LOGIN_RETRY; + default: + log_error("conn %d login response with unknown status " +- "class 0x%x, detail 0x%x\n", conn->id, status_class, ++ "class 0x%x, detail 0x%x", conn->id, status_class, + status_detail); + break; + } +@@ -265,7 +276,7 @@ __session_conn_create(iscsi_session_t *session, int cid) + conn->logout_timeout = conn_rec->timeo.logout_timeout; + if (!conn->logout_timeout) { + log_error("Invalid timeo.logout_timeout. Must be greater " +- "than zero. Using default %d.\n", ++ "than zero. Using default %d.", + DEF_LOGOUT_TIMEO); + conn->logout_timeout = DEF_LOGOUT_TIMEO; + } +@@ -273,7 +284,7 @@ __session_conn_create(iscsi_session_t *session, int cid) + conn->login_timeout = conn_rec->timeo.login_timeout; + if (!conn->login_timeout) { + log_error("Invalid timeo.login_timeout. Must be greater " +- "than zero. Using default %d.\n", ++ "than zero. Using default %d.", + DEF_LOGIN_TIMEO); + conn->login_timeout = DEF_LOGIN_TIMEO; + } +@@ -285,14 +296,14 @@ __session_conn_create(iscsi_session_t *session, int cid) + conn->noop_out_timeout = conn_rec->timeo.noop_out_timeout; + if (conn->noop_out_interval && !conn->noop_out_timeout) { + log_error("Invalid timeo.noop_out_timeout. Must be greater " +- "than zero. Using default %d.\n", ++ "than zero. Using default %d.", + DEF_NOOP_OUT_TIMEO); + conn->noop_out_timeout = DEF_NOOP_OUT_TIMEO; + } + + if (conn->noop_out_timeout && !conn->noop_out_interval) { + log_error("Invalid timeo.noop_out_interval. Must be greater " +- "than zero. Using default %d.\n", ++ "than zero. Using default %d.", + DEF_NOOP_OUT_INTERVAL); + conn->noop_out_interval = DEF_NOOP_OUT_INTERVAL; + } +@@ -323,14 +334,17 @@ session_release(iscsi_session_t *session) + } + + static iscsi_session_t* +-__session_create(node_rec_t *rec, struct iscsi_transport *t) ++__session_create(node_rec_t *rec, struct iscsi_transport *t, int *rc) + { + iscsi_session_t *session; +- int hostno, rc = 0; ++ int hostno; ++ ++ *rc = 0; + + session = calloc(1, sizeof (*session)); + if (session == NULL) { + log_debug(1, "can not allocate memory for session"); ++ *rc = ISCSI_ERR_NOMEM; + return NULL; + } + log_debug(2, "Allocted session %p", session); +@@ -355,8 +369,8 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t) + session->initiator_name = dconfig->initiator_name; + else { + log_error("No initiator name set. Cannot create session."); +- free(session); +- return NULL; ++ *rc = ISCSI_ERR_INVAL; ++ goto free_session; + } + + if (strlen(session->nrec.iface.alias)) +@@ -383,31 +397,31 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t) + /* setup authentication variables for the session*/ + iscsi_setup_authentication(session, &rec->session.auth); + +- session->param_mask = ~0ULL; +- if (!(t->caps & CAP_MULTI_R2T)) +- session->param_mask &= ~ISCSI_MAX_R2T; +- if (!(t->caps & CAP_HDRDGST)) +- session->param_mask &= ~ISCSI_HDRDGST_EN; +- if (!(t->caps & CAP_DATADGST)) +- session->param_mask &= ~ISCSI_DATADGST_EN; +- if (!(t->caps & CAP_MARKERS)) { +- session->param_mask &= ~ISCSI_IFMARKER_EN; +- session->param_mask &= ~ISCSI_OFMARKER_EN; +- } ++ iscsi_session_init_params(session); + +- hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, &rc); +- if (!rc) { +- /* +- * if the netdev or mac was set, then we are going to want +- * to want to bind the all the conns/eps to a specific host +- * if offload is used. +- */ +- session->conn[0].bind_ep = 1; +- session->hostno = hostno; +- } ++ if (t->template->bind_ep_required) { ++ hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, rc); ++ if (!*rc) { ++ /* ++ * if the netdev or mac was set, then we are going to want ++ * to want to bind the all the conns/eps to a specific host ++ * if offload is used. ++ */ ++ session->conn[0].bind_ep = 1; ++ session->hostno = hostno; ++ } else if (*rc == ISCSI_ERR_HOST_NOT_FOUND) { ++ goto free_session; ++ } else { ++ *rc = 0; ++ } ++ } + + list_add_tail(&session->list, &t->sessions); + return session; ++ ++free_session: ++ free(session); ++ return NULL; + } + + static void iscsi_flush_context_pool(struct iscsi_session *session) +@@ -431,7 +445,7 @@ static void iscsi_flush_context_pool(struct iscsi_session *session) + static void + __session_destroy(iscsi_session_t *session) + { +- log_debug(1, "destroying session\n"); ++ log_debug(1, "destroying session"); + list_del(&session->list); + iscsi_flush_context_pool(session); + session_release(session); +@@ -509,14 +523,14 @@ queue_delayed_reopen(queue_task_t *qtask, int delay) + { + iscsi_conn_t *conn = qtask->conn; + +- log_debug(4, "Requeue reopen attempt in %d secs\n", delay); ++ log_debug(4, "Requeue reopen attempt in %d secs", delay); + + /* + * iscsi_login_eh can handle the login resched as + * if it were login time out + */ + actor_delete(&conn->login_timer); +- actor_timer(&conn->login_timer, delay * 1000, ++ actor_timer(&conn->login_timer, delay, + iscsi_login_timedout, qtask); + } + +@@ -552,11 +566,53 @@ static int iscsi_conn_connect(struct iscsi_conn *conn, queue_task_t *qtask) + iscsi_sched_ev_context(ev_context, conn, 0, EV_CONN_POLL); + log_debug(3, "Setting login timer %p timeout %d", &conn->login_timer, + conn->login_timeout); +- actor_timer(&conn->login_timer, conn->login_timeout * 1000, ++ actor_timer(&conn->login_timer, conn->login_timeout, + iscsi_login_timedout, qtask); + return 0; + } + ++static void iscsi_uio_poll_login_timedout(void *data) ++{ ++ struct queue_task *qtask = data; ++ struct iscsi_conn *conn = qtask->conn; ++ iscsi_session_t *session = conn->session; ++ ++ log_debug(3, "timeout waiting for UIO ..."); ++ mgmt_ipc_write_rsp(qtask, ISCSI_ERR_TRANS_TIMEOUT); ++ conn_delete_timers(conn); ++ __session_destroy(session); ++} ++ ++static int iscsi_sched_uio_poll(queue_task_t *qtask) ++{ ++ struct iscsi_conn *conn = qtask->conn; ++ struct iscsi_session *session = conn->session; ++ struct iscsi_transport *t = session->t; ++ struct iscsi_ev_context *ev_context; ++ ++ if (!t->template->set_net_config) ++ return 0; ++ ++ ev_context = iscsi_ev_context_get(conn, 0); ++ if (!ev_context) { ++ /* while reopening the recv pool should be full */ ++ log_error("BUG: __session_conn_reopen could " ++ "not get conn context for recv."); ++ return -ENOMEM; ++ } ++ ++ ev_context->data = qtask; ++ conn->state = ISCSI_CONN_STATE_XPT_WAIT; ++ ++ iscsi_sched_ev_context(ev_context, conn, 0, EV_UIO_POLL); ++ ++ log_debug(3, "Setting login UIO poll timer %p timeout %d", ++ &conn->login_timer, conn->login_timeout); ++ actor_timer(&conn->login_timer, conn->login_timeout, ++ iscsi_uio_poll_login_timedout, qtask); ++ return -EAGAIN; ++} ++ + static void + __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop, + int redirected) +@@ -598,6 +654,11 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop, + if (!redirected) + session->reopen_cnt++; + ++ /* uIP will needs to be re-triggered on the connection re-open */ ++ if (iscsi_set_net_config(conn->session->t, conn->session, ++ &conn->session->nrec.iface) != 0) ++ goto queue_reopen; ++ + if (iscsi_conn_connect(conn, qtask)) { + delay = ISCSI_CONN_ERR_REOPEN_DELAY; + goto queue_reopen; +@@ -605,7 +666,7 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop, + return; + + queue_reopen: +- log_debug(4, "Waiting %u seconds before trying to reconnect.\n", delay); ++ log_debug(4, "Waiting %u seconds before trying to reconnect.", delay); + queue_delayed_reopen(qtask, delay); + } + +@@ -638,7 +699,7 @@ static int iscsi_retry_initial_login(struct iscsi_conn *conn) + timeout.tv_sec = initial_login_retry_max * conn->login_timeout; + if (gettimeofday(&now, NULL)) { + log_error("Could not get time of day. Dropping down to " +- "max retry check.\n"); ++ "max retry check."); + return initial_login_retry_max > conn->session->reopen_cnt; + } + timeradd(&conn->initial_connect_time, &timeout, &fail_time); +@@ -649,7 +710,7 @@ static int iscsi_retry_initial_login(struct iscsi_conn *conn) + */ + if (timercmp(&now, &fail_time, >)) { + log_debug(1, "Giving up on initial login attempt after " +- "%u seconds.\n", ++ "%u seconds.", + initial_login_retry_max * conn->login_timeout); + return 0; + } +@@ -756,7 +817,7 @@ static void iscsi_login_eh(struct iscsi_conn *conn, struct queue_task *qtask, + + break; + default: +- log_error("Ignoring login error %d in conn state %d.\n", ++ log_error("Ignoring login error %d in conn state %d.", + err, conn->state); + break; + } +@@ -830,7 +891,7 @@ __conn_error_handle(iscsi_session_t *session, iscsi_conn_t *conn) + "let connection stop"); + return; + default: +- log_debug(8, "invalid state %d\n", conn->state); ++ log_debug(8, "invalid state %d", conn->state); + return; + } + +@@ -887,7 +948,7 @@ static void iscsi_login_redirect(iscsi_conn_t *conn) + iscsi_session_t *session = conn->session; + iscsi_login_context_t *c = &conn->login_context; + +- log_debug(3, "login redirect ...\n"); ++ log_debug(3, "login redirect ..."); + + if (session->r_stage == R_STAGE_NO_CHANGE) + session->r_stage = R_STAGE_SESSION_REDIRECT; +@@ -954,9 +1015,9 @@ static void conn_send_nop_out(void *data) + + __send_nopout(conn); + +- actor_timer(&conn->nop_out_timer, conn->noop_out_timeout*1000, ++ actor_timer(&conn->nop_out_timer, conn->noop_out_timeout, + conn_nop_out_timeout, conn); +- log_debug(3, "noop out timeout timer %p start, timeout %d\n", ++ log_debug(3, "noop out timeout timer %p start, timeout %d", + &conn->nop_out_timer, conn->noop_out_timeout); + } + +@@ -993,7 +1054,7 @@ static void session_scan_host(struct iscsi_session *session, int hostno, + exit(0); + } else if (pid > 0) { + reap_inc(); +- if (qtask) { ++ if (qtask && qtask->mgmt_ipc_fd >= 0) { + close(qtask->mgmt_ipc_fd); + free(qtask); + } +@@ -1010,12 +1071,7 @@ setup_full_feature_phase(iscsi_conn_t *conn) + + actor_delete(&conn->login_timer); + +- if (iscsi_session_set_params(conn)) { +- iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); +- return; +- } +- +- if (iscsi_host_set_params(session)) { ++ if (iscsi_session_set_neg_params(conn)) { + iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); + return; + } +@@ -1062,9 +1118,9 @@ setup_full_feature_phase(iscsi_conn_t *conn) + + /* noop_out */ + if (conn->userspace_nop && conn->noop_out_interval) { +- actor_timer(&conn->nop_out_timer, conn->noop_out_interval*1000, ++ actor_timer(&conn->nop_out_timer, conn->noop_out_interval, + conn_send_nop_out, conn); +- log_debug(3, "noop out timer %p start\n", ++ log_debug(3, "noop out timer %p start", + &conn->nop_out_timer); + } + } +@@ -1079,7 +1135,7 @@ static void iscsi_logout_timedout(void *data) + * assume we were in ISCSI_CONN_STATE_IN_LOGOUT or there + * was some nasty error + */ +- log_debug(3, "logout timeout, dropping conn...\n"); ++ log_debug(3, "logout timeout, dropping conn..."); + __conn_error_handle(conn->session, conn); + } + +@@ -1110,7 +1166,7 @@ static int iscsi_send_logout(iscsi_conn_t *conn) + iscsi_sched_ev_context(ev_context, conn, + conn->logout_timeout, + EV_CONN_LOGOUT_TIMER); +- log_debug(3, "logout timeout timer %u\n", ++ log_debug(3, "logout timeout timer %u", + conn->logout_timeout * 1000); + } + +@@ -1146,7 +1202,7 @@ static void iscsi_recv_nop_in(iscsi_conn_t *conn, struct iscsi_hdr *hdr) + /* noop out rsp */ + actor_delete(&conn->nop_out_timer); + /* schedule a new ping */ +- actor_timer(&conn->nop_out_timer, conn->noop_out_interval*1000, ++ actor_timer(&conn->nop_out_timer, conn->noop_out_interval, + conn_send_nop_out, conn); + } else /* noop in req */ + if (!__send_nopin_rsp(conn, (struct iscsi_nopin*)hdr, +@@ -1159,7 +1215,7 @@ static void iscsi_recv_logout_rsp(iscsi_conn_t *conn, struct iscsi_hdr *hdr) + { + struct iscsi_logout_rsp *logout_rsp = (struct iscsi_logout_rsp *)hdr; + +- log_debug(3, "Recv: logout response %d\n", logout_rsp->response); ++ log_debug(3, "Recv: logout response %d", logout_rsp->response); + if (logout_rsp->response == 2 || logout_rsp->response == 3) { + conn->session->def_time2wait = ntohs(logout_rsp->t2wait); + log_debug(4, "logout rsp returned time2wait %u", +@@ -1177,7 +1233,7 @@ static void iscsi_recv_async_msg(iscsi_conn_t *conn, struct iscsi_hdr *hdr) + unsigned int senselen; + struct scsi_sense_hdr sshdr; + +- log_debug(3, "Read AEN %d\n", async_hdr->async_event); ++ log_debug(3, "Read AEN %d", async_hdr->async_event); + + switch (async_hdr->async_event) { + case ISCSI_ASYNC_MSG_SCSI_EVENT: +@@ -1195,33 +1251,33 @@ static void iscsi_recv_async_msg(iscsi_conn_t *conn, struct iscsi_hdr *hdr) + break; + case ISCSI_ASYNC_MSG_REQUEST_LOGOUT: + log_warning("Target requests logout within %u seconds for " +- "connection\n", ntohs(async_hdr->param3)); ++ "connection", ntohs(async_hdr->param3)); + if (iscsi_send_logout(conn)) + log_error("Could not send logout in response to" +- "logout request aen\n"); ++ "logout request aen"); + break; + case ISCSI_ASYNC_MSG_DROPPING_CONNECTION: + log_warning("Target dropping connection %u, reconnect min %u " +- "max %u\n", ntohs(async_hdr->param1), ++ "max %u", ntohs(async_hdr->param1), + ntohs(async_hdr->param2), ntohs(async_hdr->param3)); + session->def_time2wait = + (uint32_t)ntohs(async_hdr->param2) & 0x0000FFFFFL; + break; + case ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS: + log_warning("Target dropping all connections, reconnect min %u " +- "max %u\n", ntohs(async_hdr->param2), ++ "max %u", ntohs(async_hdr->param2), + ntohs(async_hdr->param3)); + session->def_time2wait = + (uint32_t)ntohs(async_hdr->param2) & 0x0000FFFFFL; + break; + case ISCSI_ASYNC_MSG_PARAM_NEGOTIATION: + log_warning("Received async event param negotiation, " +- "dropping session\n"); ++ "dropping session"); + __conn_error_handle(session, conn); + break; + case ISCSI_ASYNC_MSG_VENDOR_SPECIFIC: + default: +- log_warning("AEN not supported\n"); ++ log_warning("AEN not supported"); + } + } + +@@ -1336,7 +1392,7 @@ static void session_conn_recv_pdu(void *data) + break; + default: + iscsi_ev_context_put(ev_context); +- log_error("Invalid state. Dropping PDU.\n"); ++ log_error("Invalid state. Dropping PDU."); + } + } + +@@ -1420,7 +1476,7 @@ static void session_increase_wq_priority(struct iscsi_session *session) + fail: + log_error("Could not set session%d priority. " + "READ/WRITE throughout and latency could be " +- "affected.\n", session->id); ++ "affected.", session->id); + } + + static int session_ipc_create(struct iscsi_session *session) +@@ -1469,6 +1525,11 @@ static void setup_offload_login_phase(iscsi_conn_t *conn) + return; + } + ++ if (iscsi_session_set_neg_params(conn)) { ++ iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); ++ return; ++ } ++ + if (iscsi_host_set_params(session)) { + iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); + return; +@@ -1511,7 +1572,6 @@ static void session_conn_poll(void *data) + rc = session->t->template->ep_poll(conn, 1); + if (rc == 0) { + log_debug(4, "poll not connected %d", rc); +- /* timedout: Poll again. */ + ev_context = iscsi_ev_context_get(conn, 0); + if (!ev_context) { + /* while polling the recv pool should be full */ +@@ -1521,7 +1581,8 @@ static void session_conn_poll(void *data) + return; + } + ev_context->data = qtask; +- iscsi_sched_ev_context(ev_context, conn, 0, EV_CONN_POLL); ++ /* not connected yet, check later */ ++ iscsi_sched_ev_context(ev_context, conn, 1, EV_CONN_POLL); + } else if (rc > 0) { + /* connected! */ + memset(c, 0, sizeof(iscsi_login_context_t)); +@@ -1580,6 +1641,16 @@ static void session_conn_poll(void *data) + return; + } + ++ if (iscsi_session_set_params(conn)) { ++ iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); ++ return; ++ } ++ ++ if (iscsi_host_set_params(session)) { ++ iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); ++ return; ++ } ++ + if (iscsi_login_begin(session, c)) { + iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); + return; +@@ -1618,6 +1689,9 @@ static void session_conn_process_login(void *data) + if (state == ISCSI_CONN_STATE_FREE) + goto failed_login; + ++ if (conn->state == ISCSI_CONN_STATE_LOGGED_IN) ++ return; ++ + conn->state = ISCSI_CONN_STATE_LOGGED_IN; + /* + * ok we were in_login and now we got the notification that we are +@@ -1667,6 +1741,53 @@ failed_login: + + } + ++static void session_conn_uio_poll(void *data) ++{ ++ struct iscsi_ev_context *ev_context = data; ++ iscsi_conn_t *conn = ev_context->conn; ++ struct iscsi_session *session = conn->session; ++ queue_task_t *qtask = ev_context->data; ++ int rc; ++ ++ log_debug(4, "retrying uio poll"); ++ rc = iscsi_set_net_config(session->t, session, ++ &conn->session->nrec.iface); ++ if (rc != 0) { ++ if (rc == ISCSI_ERR_AGAIN) { ++ ev_context->data = qtask; ++ iscsi_sched_ev_context(ev_context, conn, 2, ++ EV_UIO_POLL); ++ return; ++ } else { ++ log_error("session_conn_uio_poll() " ++ "connection failure [0x%x]", rc); ++ actor_delete(&conn->login_timer); ++ iscsi_login_eh(conn, qtask, ISCSI_ERR_INTERNAL); ++ iscsi_ev_context_put(ev_context); ++ return; ++ } ++ } ++ ++ iscsi_ev_context_put(ev_context); ++ actor_delete(&conn->login_timer); ++ log_debug(4, "UIO ready trying connect"); ++ ++ /* uIP is ready try to connect */ ++ if (gettimeofday(&conn->initial_connect_time, NULL)) ++ log_error("Could not get initial connect time. If " ++ "login errors iscsid may give up the initial " ++ "login early. You should manually login."); ++ ++ conn->state = ISCSI_CONN_STATE_XPT_WAIT; ++ if (iscsi_conn_connect(conn, qtask)) { ++ int delay = ISCSI_CONN_ERR_REOPEN_DELAY; ++ ++ log_debug(4, "Waiting %u seconds before trying to reconnect.", ++ delay); ++ queue_delayed_reopen(qtask, delay); ++ } ++} ++ + static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + struct iscsi_conn *conn, unsigned long tmo, + int event) +@@ -1679,14 +1800,14 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + ev_context->conn = conn; + switch (event) { + case EV_CONN_RECV_PDU: +- actor_new(&ev_context->actor, session_conn_recv_pdu, ++ actor_init(&ev_context->actor, session_conn_recv_pdu, + ev_context); + actor_schedule(&ev_context->actor); + break; + case EV_CONN_ERROR: + error = *(enum iscsi_err *)ev_context->data; + +- actor_new(&ev_context->actor, session_conn_error, ++ actor_init(&ev_context->actor, session_conn_error, + ev_context); + /* + * We handle invalid host, by killing the session. +@@ -1699,21 +1820,25 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + actor_schedule(&ev_context->actor); + break; + case EV_CONN_LOGIN: +- actor_new(&ev_context->actor, session_conn_process_login, ++ actor_init(&ev_context->actor, session_conn_process_login, + ev_context); + actor_schedule(&ev_context->actor); + break; + case EV_CONN_POLL: +- actor_new(&ev_context->actor, session_conn_poll, ++ actor_timer(&ev_context->actor, tmo, ++ session_conn_poll, ev_context); ++ break; ++ case EV_UIO_POLL: ++ actor_init(&ev_context->actor, session_conn_uio_poll, + ev_context); + actor_schedule(&ev_context->actor); + break; + case EV_CONN_LOGOUT_TIMER: +- actor_timer(&ev_context->actor, tmo * 1000, ++ actor_timer(&ev_context->actor, tmo, + iscsi_logout_timedout, ev_context); + break; + case EV_CONN_STOP: +- actor_new(&ev_context->actor, iscsi_stop, ++ actor_init(&ev_context->actor, iscsi_stop, + ev_context); + actor_schedule(&ev_context->actor); + break; +@@ -1752,14 +1877,14 @@ static int session_is_running(node_rec_t *rec) + if (session_find_by_rec(rec)) + return 1; + +- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session)) ++ if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session, ++ 0)) + return 1; + + return 0; + } + +-int +-session_login_task(node_rec_t *rec, queue_task_t *qtask) ++static int __session_login_task(node_rec_t *rec, queue_task_t *qtask) + { + iscsi_session_t *session; + iscsi_conn_t *conn; +@@ -1782,7 +1907,7 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) + (!(t->caps & CAP_RECOVERY_L1) && + rec->session.iscsi.ERL > 1)) { + log_error("Transport '%s' does not support ERL %d." +- "Setting ERL to ERL0.\n", ++ "Setting ERL to ERL0.", + t->name, rec->session.iscsi.ERL); + rec->session.iscsi.ERL = 0; + } +@@ -1815,19 +1940,21 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) + if (!(t->caps & CAP_MARKERS) && + rec->conn[0].iscsi.IFMarker) { + log_error("Transport '%s' does not support IFMarker. " +- "Disabling IFMarkers.\n", t->name); ++ "Disabling IFMarkers.", t->name); + rec->conn[0].iscsi.IFMarker = 0; + } + + if (!(t->caps & CAP_MARKERS) && + rec->conn[0].iscsi.OFMarker) { + log_error("Transport '%s' does not support OFMarker." +- "Disabling OFMarkers.\n", t->name); ++ "Disabling OFMarkers.", t->name); + rec->conn[0].iscsi.OFMarker = 0; + } + +- session = __session_create(rec, t); +- if (!session) ++ session = __session_create(rec, t, &rc); ++ if (rc == ISCSI_ERR_HOST_NOT_FOUND) ++ return rc; ++ else if (!session) + return ISCSI_ERR_LOGIN; + + /* FIXME: login all connections! marked as "automatic" */ +@@ -1841,7 +1968,17 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) + conn = &session->conn[0]; + qtask->conn = conn; + +- if (iscsi_host_set_net_params(&rec->iface, session)) { ++ rc = iscsi_host_set_net_params(&rec->iface, session); ++ if (rc == ISCSI_ERR_AGAIN) { ++ iscsi_sched_uio_poll(qtask); ++ /* ++ * Cannot block iscsid, so caller is going to internally ++ * retry the operation. ++ */ ++ qtask->rsp.command = MGMT_IPC_SESSION_LOGIN; ++ qtask->rsp.err = ISCSI_SUCCESS; ++ return ISCSI_SUCCESS; ++ } else if (rc) { + __session_destroy(session); + return ISCSI_ERR_LOGIN; + } +@@ -1857,7 +1994,7 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) + + if (iscsi_conn_connect(conn, qtask)) { + log_debug(4, "Initial connect failed. Waiting %u seconds " +- "before trying to reconnect.\n", ++ "before trying to reconnect.", + ISCSI_CONN_ERR_REOPEN_DELAY); + queue_delayed_reopen(qtask, ISCSI_CONN_ERR_REOPEN_DELAY); + } +@@ -1865,6 +2002,74 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) + return ISCSI_SUCCESS; + } + ++int ++session_login_task(node_rec_t *rec, queue_task_t *qtask) ++{ ++ int rc; ++ ++ rc = __session_login_task(rec, qtask); ++ if (rc == ISCSI_ERR_HOST_NOT_FOUND) { ++ rc = queue_session_login_task_retry(NULL, rec, qtask); ++ if (rc) ++ return rc; ++ /* ++ * we are going to internally retry. Will return final rc ++ * when completed ++ */ ++ return ISCSI_SUCCESS; ++ } ++ return rc; ++} ++ ++static void session_login_task_retry(void *data) ++{ ++ struct login_task_retry_info *info = data; ++ int rc; ++ ++ rc = __session_login_task(info->rec, info->qtask); ++ if (rc == ISCSI_ERR_HOST_NOT_FOUND) { ++ if (info->retry_count == 5) { ++ /* give up */ ++ goto write_rsp; ++ } ++ ++ rc = queue_session_login_task_retry(info, info->rec, ++ info->qtask); ++ if (rc) ++ goto write_rsp; ++ /* we are going to internally retry */ ++ return; ++ } else if (rc) { ++ /* hard error - no retry */ ++ goto write_rsp; ++ } else ++ /* successfully started login operation */ ++ goto free; ++write_rsp: ++ mgmt_ipc_write_rsp(info->qtask, rc); ++free: ++ free(info); ++} ++ ++static int queue_session_login_task_retry(struct login_task_retry_info *info, ++ node_rec_t *rec, queue_task_t *qtask) ++{ ++ if (!info) { ++ info = malloc(sizeof(*info)); ++ if (!info) ++ return ISCSI_ERR_NOMEM; ++ memset(info, 0, sizeof(*info)); ++ info->qtask = qtask; ++ info->rec = rec; ++ } ++ ++ info->retry_count++; ++ log_debug(4, "queue session setup attempt in %d secs, retries %d", ++ 3, info->retry_count); ++ actor_timer(&info->retry_actor, 3, session_login_task_retry, info); ++ return 0; ++} ++ + static int + sync_conn(iscsi_session_t *session, uint32_t cid) + { +@@ -1892,14 +2097,14 @@ iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid) + if (!t) + return ISCSI_ERR_TRANS_NOT_FOUND; + +- session = __session_create(rec, t); ++ session = __session_create(rec, t, &err); + if (!session) + return ISCSI_ERR_LOGIN; + + session->id = sid; + session->hostno = iscsi_sysfs_get_host_no_from_sid(sid, &err); + if (err) { +- log_error("Could not get hostno for session %d\n", sid); ++ log_error("Could not get hostno for session %d", sid); + goto destroy_session; + } + +@@ -1920,7 +2125,7 @@ iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid) + + destroy_session: + __session_destroy(session); +- log_error("Could not sync session%d err %d\n", sid, err); ++ log_error("Could not sync session%d err %d", sid, err); + return err; + } + +@@ -1931,10 +2136,199 @@ static int session_unbind(struct iscsi_session *session) + err = ipc->unbind_session(session->t->handle, session->id); + if (err) + /* older kernels did not support unbind */ +- log_debug(2, "Could not unbind session %d.\n", err); ++ log_debug(2, "Could not unbind session %d.", err); + return err; + } + ++static struct libmnt_table *mtab, *swaps; ++ ++static void libmount_cleanup(void) ++{ ++ mnt_free_table(mtab); ++ mnt_free_table(swaps); ++ mtab = swaps = NULL; ++} ++ ++static int libmount_init(void) ++{ ++ mnt_init_debug(0); ++ mtab = mnt_new_table(); ++ swaps = mnt_new_table(); ++ if (!mtab || !swaps) { ++ libmount_cleanup(); ++ return -ENOMEM; ++ } ++ mnt_table_parse_mtab(mtab, NULL); ++ mnt_table_parse_swaps(swaps, NULL); ++ return 0; ++} ++ ++static int trans_filter(const struct dirent *d) ++{ ++ if (!strcmp(".", d->d_name) || !strcmp("..", d->d_name)) ++ return 0; ++ return 1; ++} ++ ++static int subdir_filter(const struct dirent *d) ++{ ++ if (!(d->d_type & DT_DIR)) ++ return 0; ++ return trans_filter(d); ++} ++ ++static int is_partition(const char *path) ++{ ++ char *devtype; ++ int rc = 0; ++ ++ devtype = sysfs_get_uevent_devtype(path); ++ if (!devtype) ++ return 0; ++ if (strcmp(devtype, "partition") == 0) ++ rc = 1; ++ free(devtype); ++ return rc; ++} ++ ++static int blockdev_check_mnts(char *syspath) ++{ ++ struct libmnt_fs *fs; ++ char *devname = NULL; ++ char *_devname = NULL; ++ int rc = 0; ++ ++ devname = sysfs_get_uevent_devname(syspath); ++ if (!devname) ++ goto out; ++ ++ _devname = calloc(1, PATH_MAX); ++ if (!_devname) ++ goto out; ++ snprintf(_devname, PATH_MAX, "/dev/%s", devname); ++ ++ fs = mnt_table_find_source(mtab, _devname, MNT_ITER_FORWARD); ++ if (fs) { ++ rc = 1; ++ goto out; ++ } ++ fs = mnt_table_find_source(swaps, _devname, MNT_ITER_FORWARD); ++ if (fs) ++ rc = 1; ++out: ++ free(devname); ++ free(_devname); ++ return rc; ++} ++ ++static int count_device_users(char *syspath); ++ ++static int blockdev_get_partitions(char *syspath) ++{ ++ struct dirent **parts = NULL; ++ int n, i; ++ int count = 0; ++ ++ n = scandir(syspath, &parts, subdir_filter, alphasort); ++ for (i = 0; i < n; i++) { ++ char *newpath; ++ ++ newpath = calloc(1, PATH_MAX); ++ if (!newpath) ++ continue; ++ snprintf(newpath, PATH_MAX, "%s/%s", syspath, parts[i]->d_name); ++ free(parts[i]); ++ if (is_partition(newpath)) { ++ count += count_device_users(newpath); ++ } ++ free(newpath); ++ } ++ free(parts); ++ return count; ++} ++ ++static int blockdev_get_holders(char *syspath) ++{ ++ char *path = NULL; ++ struct dirent **holds = NULL; ++ int n, i; ++ int count = 0; ++ ++ path = calloc(1, PATH_MAX); ++ if (!path) ++ return 0; ++ snprintf(path, PATH_MAX, "%s/holders", syspath); ++ ++ n = scandir(path, &holds, trans_filter, alphasort); ++ for (i = 0; i < n; i++) { ++ char *newpath; ++ char *rp; ++ ++ newpath = calloc(1, PATH_MAX); ++ if (!newpath) ++ continue; ++ snprintf(newpath, PATH_MAX, "%s/%s", path, holds[i]->d_name); ++ ++ free(holds[i]); ++ rp = realpath(newpath, NULL); ++ if (rp) ++ count += count_device_users(rp); ++ free(newpath); ++ free(rp); ++ } ++ free(path); ++ free(holds); ++ return count; ++} ++ ++static int count_device_users(char *syspath) ++{ ++ int count = 0; ++ count += blockdev_check_mnts(syspath); ++ count += blockdev_get_partitions(syspath); ++ count += blockdev_get_holders(syspath); ++ return count; ++}; ++ ++static void device_in_use(void *data, int host_no, int target, int lun) ++{ ++ char *syspath = NULL; ++ char *devname = NULL; ++ int *count = data; ++ ++ devname = iscsi_sysfs_get_blockdev_from_lun(host_no, target, lun); ++ if (!devname) ++ goto out; ++ syspath = calloc(1, PATH_MAX); ++ if (!syspath) ++ goto out; ++ snprintf(syspath, PATH_MAX, "/sys/class/block/%s", devname); ++ *count += count_device_users(syspath); ++out: ++ free(syspath); ++ free(devname); ++} ++ ++static int session_in_use(int sid) ++{ ++ int host_no = -1, err = 0; ++ int count = 0; ++ ++ if (libmount_init()) { ++ log_error("Failed to initialize libmount, " ++ "not checking for active mounts on session [%d].", ++ sid); ++ return 0; ++ } ++ ++ host_no = iscsi_sysfs_get_host_no_from_sid(sid, &err); ++ if (!err) ++ iscsi_sysfs_for_each_device(&count, host_no, sid, device_in_use); ++ ++ libmount_cleanup(); ++ return count; ++} ++ + int session_logout_task(int sid, queue_task_t *qtask) + { + iscsi_session_t *session; +@@ -1943,7 +2337,7 @@ int session_logout_task(int sid, queue_task_t *qtask) + + session = session_find_by_sid(sid); + if (!session) { +- log_debug(1, "session sid %d not found.\n", sid); ++ log_debug(1, "session sid %d not found.", sid); + return ISCSI_ERR_SESS_NOT_FOUND; + } + conn = &session->conn[0]; +@@ -1958,10 +2352,16 @@ int session_logout_task(int sid, queue_task_t *qtask) + session->r_stage == R_STAGE_SESSION_REDIRECT))) { + invalid_state: + log_error("session in invalid state for logout. " +- "Try again later\n"); ++ "Try again later"); + return ISCSI_ERR_INTERNAL; + } + ++ if (dconfig->safe_logout && session_in_use(sid)) { ++ log_error("Session is actively in use for mounted storage, " ++ "and iscsid.safe_logout is configured."); ++ return ISCSI_ERR_BUSY; ++ } ++ + /* FIXME: logout all active connections */ + conn = &session->conn[0]; + if (conn->logout_qtask) +@@ -1983,7 +2383,7 @@ invalid_state: + return ISCSI_SUCCESS; + } + +- log_error("Could not send logout pdu. Dropping session\n"); ++ log_error("Could not send logout pdu. Dropping session"); + /* fallthrough */ + default: + rc = session_conn_shutdown(conn, qtask, ISCSI_SUCCESS); +@@ -2001,7 +2401,7 @@ iscsi_host_send_targets(queue_task_t *qtask, int host_no, int do_login, + + t = iscsi_sysfs_get_transport_by_hba(host_no); + if (!t) { +- log_error("Invalid host no %d for sendtargets\n", host_no); ++ log_error("Invalid host no %d for sendtargets", host_no); + return ISCSI_ERR_TRANS_NOT_FOUND; + } + if (!(t->caps & CAP_SENDTARGETS_OFFLOAD)) +diff --git a/usr/initiator.h b/usr/initiator.h +index b45caab..c34625b 100644 +--- a/usr/initiator.h ++++ b/usr/initiator.h +@@ -83,6 +83,7 @@ typedef enum iscsi_event_e { + EV_CONN_LOGOUT_TIMER, + EV_CONN_STOP, + EV_CONN_LOGIN, ++ EV_UIO_POLL, + } iscsi_event_e; + + struct queue_task; +@@ -343,6 +344,7 @@ extern void free_initiator(void); + extern void iscsi_initiator_init(void); + + /* initiator code common to discovery and normal sessions */ ++extern int iscsi_session_set_neg_params(struct iscsi_conn *conn); + extern int iscsi_session_set_params(struct iscsi_conn *conn); + extern int iscsi_host_set_params(struct iscsi_session *session); + extern int iscsi_host_set_net_params(struct iface_rec *iface, +@@ -353,5 +355,9 @@ extern void iscsi_copy_operational_params(struct iscsi_conn *conn, + extern int iscsi_setup_authentication(struct iscsi_session *session, + struct iscsi_auth_config *auth_cfg); + extern int iscsi_setup_portal(struct iscsi_conn *conn, char *address, int port); ++extern int iscsi_set_net_config(struct iscsi_transport *t, ++ iscsi_session_t *session, ++ struct iface_rec *iface); ++extern void iscsi_session_init_params(struct iscsi_session *session); + + #endif /* INITIATOR_H */ +diff --git a/usr/initiator_common.c b/usr/initiator_common.c +index ef6820c..ee856b3 100644 +--- a/usr/initiator_common.c ++++ b/usr/initiator_common.c +@@ -51,21 +51,9 @@ struct iscsi_session *session_find_by_sid(uint32_t sid) + return NULL; + } + +-/* +- * calculate parameter's padding +- */ +-static unsigned int +-__padding(unsigned int param) ++const static unsigned int align_32_down(unsigned int param) + { +- int pad; +- +- pad = param & 3; +- if (pad) { +- pad = 4 - pad; +- log_debug(1, "parameter's value %d padded to %d bytes\n", +- param, param + pad); +- } +- return param + pad; ++ return param & ~0x3; + } + + int iscsi_setup_authentication(struct iscsi_session *session, +@@ -77,7 +65,7 @@ int iscsi_setup_authentication(struct iscsi_session *session, + if (auth_cfg->username_in[0] || auth_cfg->password_in_length) { + /* sanity check the config */ + if (auth_cfg->password_length == 0) { +- log_warning("CHAP configuratoin has incoming " ++ log_warning("CHAP configuration has incoming " + "authentication credentials but has no " + "outgoing credentials configured."); + return EINVAL; +@@ -151,11 +139,11 @@ iscsi_copy_operational_params(struct iscsi_conn *conn, + conn->datadgst_en = conn_conf->DataDigest; + + conn->max_recv_dlength = +- __padding(conn_conf->MaxRecvDataSegmentLength); ++ align_32_down(conn_conf->MaxRecvDataSegmentLength); + if (conn->max_recv_dlength < ISCSI_MIN_MAX_RECV_SEG_LEN || + conn->max_recv_dlength > ISCSI_MAX_MAX_RECV_SEG_LEN) { + log_error("Invalid iscsi.MaxRecvDataSegmentLength. Must be " +- "within %u and %u. Setting to %u\n", ++ "within %u and %u. Setting to %u", + ISCSI_MIN_MAX_RECV_SEG_LEN, + ISCSI_MAX_MAX_RECV_SEG_LEN, + DEF_INI_MAX_RECV_SEG_LEN); +@@ -166,13 +154,13 @@ iscsi_copy_operational_params(struct iscsi_conn *conn, + + /* zero indicates to use the target's value */ + conn->max_xmit_dlength = +- __padding(conn_conf->MaxXmitDataSegmentLength); ++ align_32_down(conn_conf->MaxXmitDataSegmentLength); + if (conn->max_xmit_dlength == 0) + conn->max_xmit_dlength = ISCSI_DEF_MAX_RECV_SEG_LEN; + if (conn->max_xmit_dlength < ISCSI_MIN_MAX_RECV_SEG_LEN || + conn->max_xmit_dlength > ISCSI_MAX_MAX_RECV_SEG_LEN) { + log_error("Invalid iscsi.MaxXmitDataSegmentLength. Must be " +- "within %u and %u. Setting to %u\n", ++ "within %u and %u. Setting to %u", + ISCSI_MIN_MAX_RECV_SEG_LEN, + ISCSI_MAX_MAX_RECV_SEG_LEN, + DEF_INI_MAX_RECV_SEG_LEN); +@@ -184,7 +172,7 @@ iscsi_copy_operational_params(struct iscsi_conn *conn, + /* session's operational parameters */ + session->initial_r2t_en = session_conf->InitialR2T; + session->imm_data_en = session_conf->ImmediateData; +- session->first_burst = __padding(session_conf->FirstBurstLength); ++ session->first_burst = align_32_down(session_conf->FirstBurstLength); + /* + * some targets like netapp fail the login if sent bad first_burst + * and max_burst lens, even when immediate data=no and +@@ -193,7 +181,7 @@ iscsi_copy_operational_params(struct iscsi_conn *conn, + if (session->first_burst < ISCSI_MIN_FIRST_BURST_LEN || + session->first_burst > ISCSI_MAX_FIRST_BURST_LEN) { + log_error("Invalid iscsi.FirstBurstLength of %u. Must be " +- "within %u and %u. Setting to %u\n", ++ "within %u and %u. Setting to %u", + session->first_burst, + ISCSI_MIN_FIRST_BURST_LEN, + ISCSI_MAX_FIRST_BURST_LEN, +@@ -202,11 +190,11 @@ iscsi_copy_operational_params(struct iscsi_conn *conn, + session->first_burst = DEF_INI_FIRST_BURST_LEN; + } + +- session->max_burst = __padding(session_conf->MaxBurstLength); ++ session->max_burst = align_32_down(session_conf->MaxBurstLength); + if (session->max_burst < ISCSI_MIN_MAX_BURST_LEN || + session->max_burst > ISCSI_MAX_MAX_BURST_LEN) { + log_error("Invalid iscsi.MaxBurstLength of %u. Must be " +- "within %u and %u. Setting to %u\n", ++ "within %u and %u. Setting to %u", + session->max_burst, ISCSI_MIN_MAX_BURST_LEN, + ISCSI_MAX_MAX_BURST_LEN, DEF_INI_MAX_BURST_LEN); + session_conf->MaxBurstLength = DEF_INI_MAX_BURST_LEN; +@@ -215,7 +203,7 @@ iscsi_copy_operational_params(struct iscsi_conn *conn, + + if (session->first_burst > session->max_burst) { + log_error("Invalid iscsi.FirstBurstLength of %u. Must be " +- "less than iscsi.MaxBurstLength. Setting to %u\n", ++ "less than iscsi.MaxBurstLength. Setting to %u", + session->first_burst, session->max_burst); + session_conf->FirstBurstLength = session->max_burst; + session->first_burst = session->max_burst; +@@ -324,12 +312,32 @@ int iscsi_host_set_params(struct iscsi_session *session) + return 0; + } + +-#define MAX_SESSION_PARAMS 32 ++static inline void iscsi_session_clear_param(struct iscsi_session *session, ++ int param) ++{ ++ session->param_mask &= ~(1ULL << param); ++} + +-int iscsi_session_set_params(struct iscsi_conn *conn) ++void iscsi_session_init_params(struct iscsi_session *session) ++{ ++ session->param_mask = ~0ULL; ++ if (!(session->t->caps & CAP_MULTI_R2T)) ++ iscsi_session_clear_param(session, ISCSI_PARAM_MAX_R2T); ++ if (!(session->t->caps & CAP_HDRDGST)) ++ iscsi_session_clear_param(session, ISCSI_PARAM_HDRDGST_EN); ++ if (!(session->t->caps & CAP_DATADGST)) ++ iscsi_session_clear_param(session, ISCSI_PARAM_DATADGST_EN); ++ if (!(session->t->caps & CAP_MARKERS)) { ++ iscsi_session_clear_param(session, ISCSI_PARAM_IFMARKER_EN); ++ iscsi_session_clear_param(session, ISCSI_PARAM_OFMARKER_EN); ++ } ++} ++ ++#define MAX_SESSION_NEG_PARAMS 16 ++ ++int iscsi_session_set_neg_params(struct iscsi_conn *conn) + { + struct iscsi_session *session = conn->session; +- struct iscsi_transport *t = session->t; + int i, rc; + uint32_t one = 1, zero = 0; + struct connparam { +@@ -337,7 +345,7 @@ int iscsi_session_set_params(struct iscsi_conn *conn) + int type; + void *value; + int conn_only; +- } conntbl[MAX_SESSION_PARAMS] = { ++ } conntbl[MAX_SESSION_NEG_PARAMS] = { + { + .param = ISCSI_PARAM_MAX_RECV_DLENGTH, + .value = &conn->max_recv_dlength, +@@ -411,18 +419,61 @@ int iscsi_session_set_params(struct iscsi_conn *conn) + }, { + .param = ISCSI_PARAM_EXP_STATSN, + .value = &conn->exp_statsn, +- .type = ISCSI_INT, ++ .type = ISCSI_UINT, + .conn_only = 1, + }, { +- .param = ISCSI_PARAM_TARGET_NAME, +- .conn_only = 0, +- .type = ISCSI_STRING, +- .value = session->target_name, +- }, { + .param = ISCSI_PARAM_TPGT, + .value = &session->portal_group_tag, + .type = ISCSI_INT, + .conn_only = 0, ++ }, ++ }; ++ ++ iscsi_session_init_params(session); ++ ++ /* Entered full-feature phase! */ ++ for (i = 0; i < MAX_SESSION_NEG_PARAMS; i++) { ++ if (conn->id != 0 && !conntbl[i].conn_only) ++ continue; ++ ++ if (!(session->param_mask & (1ULL << conntbl[i].param))) ++ continue; ++ ++ rc = ipc->set_param(session->t->handle, session->id, ++ conn->id, conntbl[i].param, conntbl[i].value, ++ conntbl[i].type); ++ if (rc && rc != -ENOSYS) { ++ log_error("can't set operational parameter %d for " ++ "connection %d:%d, retcode %d (%d)", ++ conntbl[i].param, session->id, conn->id, ++ rc, errno); ++ return EPERM; ++ } ++ ++ print_param_value(conntbl[i].param, conntbl[i].value, ++ conntbl[i].type); ++ } ++ ++ return 0; ++} ++ ++#define MAX_SESSION_PARAMS 20 ++ ++int iscsi_session_set_params(struct iscsi_conn *conn) ++{ ++ struct iscsi_session *session = conn->session; ++ int i, rc; ++ struct connparam { ++ int param; ++ int type; ++ void *value; ++ int conn_only; ++ } conntbl[MAX_SESSION_PARAMS] = { ++ { ++ .param = ISCSI_PARAM_TARGET_NAME, ++ .conn_only = 0, ++ .type = ISCSI_STRING, ++ .value = session->target_name, + }, { + .param = ISCSI_PARAM_PERSISTENT_ADDRESS, + .value = session->nrec.conn[conn->id].address, +@@ -492,29 +543,41 @@ int iscsi_session_set_params(struct iscsi_conn *conn) + .param = ISCSI_PARAM_IFACE_NAME, + .value = session->nrec.iface.name, + .type = ISCSI_STRING, ++ .conn_only = 0, + }, { + .param = ISCSI_PARAM_INITIATOR_NAME, + .value = session->initiator_name, + .type = ISCSI_STRING, ++ .conn_only = 0, ++ }, { ++ .param = ISCSI_PARAM_BOOT_ROOT, ++ .value = session->nrec.session.boot_root, ++ .type = ISCSI_STRING, ++ .conn_only = 0, ++ }, { ++ .param = ISCSI_PARAM_BOOT_NIC, ++ .value = session->nrec.session.boot_nic, ++ .type = ISCSI_STRING, ++ .conn_only = 0, ++ }, { ++ .param = ISCSI_PARAM_BOOT_TARGET, ++ .value = session->nrec.session.boot_target, ++ .type = ISCSI_STRING, ++ .conn_only = 0, ++ }, { ++ .param = ISCSI_PARAM_DISCOVERY_SESS, ++ .value = &session->type, ++ .type = ISCSI_INT, ++ .conn_only = 0, + }, + }; + +- session->param_mask = ~0ULL; +- if (!(t->caps & CAP_MULTI_R2T)) +- session->param_mask &= ~ISCSI_MAX_R2T; +- if (!(t->caps & CAP_HDRDGST)) +- session->param_mask &= ~ISCSI_HDRDGST_EN; +- if (!(t->caps & CAP_DATADGST)) +- session->param_mask &= ~ISCSI_DATADGST_EN; +- if (!(t->caps & CAP_MARKERS)) { +- session->param_mask &= ~ISCSI_IFMARKER_EN; +- session->param_mask &= ~ISCSI_OFMARKER_EN; +- } ++ iscsi_session_init_params(session); + + /* some llds will send nops internally */ + if (!iscsi_sysfs_session_supports_nop(session->id)) { +- session->param_mask &= ~ISCSI_PING_TMO; +- session->param_mask &= ~ISCSI_RECV_TMO; ++ iscsi_session_clear_param(session, ISCSI_PARAM_PING_TMO); ++ iscsi_session_clear_param(session, ISCSI_PARAM_RECV_TMO); + } + + /* Entered full-feature phase! */ +@@ -562,6 +625,36 @@ TODO handle this + return 0; + } + ++int iscsi_set_net_config(struct iscsi_transport *t, iscsi_session_t *session, ++ struct iface_rec *iface) ++{ ++ if (t->template->set_net_config) { ++ /* uip needs the netdev name */ ++ struct host_info hinfo; ++ int hostno, rc; ++ ++ /* this assumes that the netdev or hw address is going to be ++ set */ ++ hostno = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc); ++ if (rc) { ++ log_debug(4, "Couldn't get host no."); ++ return rc; ++ } ++ ++ /* uip needs the netdev name */ ++ if (!strlen(iface->netdev)) { ++ memset(&hinfo, 0, sizeof(hinfo)); ++ hinfo.host_no = hostno; ++ iscsi_sysfs_get_hostinfo_by_host_no(&hinfo); ++ strcpy(iface->netdev, hinfo.iface.netdev); ++ } ++ ++ return t->template->set_net_config(t, iface, session); ++ } ++ ++ return 0; ++} ++ + int iscsi_host_set_net_params(struct iface_rec *iface, + struct iscsi_session *session) + { +@@ -571,7 +664,7 @@ int iscsi_host_set_net_params(struct iface_rec *iface, + struct host_info hinfo; + + log_debug(3, "setting iface %s, dev %s, set ip %s, hw %s, " +- "transport %s.\n", ++ "transport %s.", + iface->name, iface->netdev, iface->ipaddress, + iface->hwaddress, iface->transport_name); + +@@ -580,9 +673,18 @@ int iscsi_host_set_net_params(struct iface_rec *iface, + + /* if we need to set the ip addr then set all the iface net settings */ + if (!iface_is_bound_by_ipaddr(iface)) { +- log_warning("Please set the iface.ipaddress for iface %s, " +- "then retry the login command.\n", iface->name); +- return EINVAL; ++ if (t->template->set_host_ip == SET_HOST_IP_REQ) { ++ log_warning("Please set the iface.ipaddress for iface " ++ "%s, then retry the login command.", ++ iface->name); ++ return EINVAL; ++ } else if (t->template->set_host_ip == SET_HOST_IP_OPT) { ++ log_info("Optional iface.ipaddress for iface %s " ++ "not set.", iface->name); ++ return 0; ++ } else { ++ return EINVAL; ++ } + } + + /* these type of drivers need the netdev upd */ +@@ -600,6 +702,10 @@ int iscsi_host_set_net_params(struct iface_rec *iface, + log_warning("Could not brining up netdev %s. Try running " + "'ifup %s' first if login fails.", netdev, netdev); + ++ rc = iscsi_set_net_config(t, session, iface); ++ if (rc != 0) ++ return rc; ++ + rc = host_set_param(t, session->hostno, + ISCSI_HOST_PARAM_IPADDRESS, + iface->ipaddress, ISCSI_STRING); +diff --git a/usr/io.c b/usr/io.c +index 45adea5..f552e1e 100644 +--- a/usr/io.c ++++ b/usr/io.c +@@ -113,14 +113,14 @@ static int get_hwaddress_from_netdev(char *netdev, char *hwaddress) + (void *)&(s4->sin_addr), buf, + INET_ADDRSTRLEN)) + continue; +- log_debug(4, "name %s addr %s\n", ifa->ifa_name, buf); ++ log_debug(4, "name %s addr %s", ifa->ifa_name, buf); + break; + case AF_INET6: + s6 = (struct sockaddr_in6 *)(ifa->ifa_addr); + if (!inet_ntop(ifa->ifa_addr->sa_family, + (void *)&(s6->sin6_addr), buf, INET6_ADDRSTRLEN)) + continue; +- log_debug(4, "name %s addr %s\n", ifa->ifa_name, buf); ++ log_debug(4, "name %s addr %s", ifa->ifa_name, buf); + break; + default: + continue; +@@ -239,7 +239,7 @@ static int bind_conn_to_iface(iscsi_conn_t *conn, struct iface_rec *iface) + if (setsockopt(conn->socket_fd, SOL_SOCKET, SO_BINDTODEVICE, + session->netdev, + strlen(session->netdev) + 1) < 0) { +- log_error("Could not bind connection %d to %s\n", ++ log_error("Could not bind connection %d to %s", + conn->id, session->netdev); + return -1; + } +@@ -357,7 +357,7 @@ iscsi_io_tcp_poll(iscsi_conn_t *conn, int timeout_ms) + len = sizeof(int); + if (getsockopt(conn->socket_fd, SOL_SOCKET, SO_ERROR, + (char *) &rc, &len) < 0) { +- log_error("getsockopt for connect poll failed\n"); ++ log_error("getsockopt for connect poll failed"); + return -1; + } + if (rc) { +@@ -366,7 +366,7 @@ iscsi_io_tcp_poll(iscsi_conn_t *conn, int timeout_ms) + conn->host, sizeof(conn->host), serv, sizeof(serv), + NI_NUMERICHOST|NI_NUMERICSERV); + +- log_error("connect to %s:%s failed (%s)\n", ++ log_error("connect to %s:%s failed (%s)", + conn->host, serv, strerror(rc)); + return -rc; + } +diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c +index 4fe1c53..11e0348 100644 +--- a/usr/iscsi_err.c ++++ b/usr/iscsi_err.c +@@ -51,6 +51,8 @@ static char *iscsi_err_msgs[] = { + /* 26 */ "iSNS registration failed", + /* 27 */ "operation not supported", + /* 28 */ "device or resource in use", ++ /* 29 */ "operation failed but retry may succeed", ++ /* 30 */ "unknown discovery type", + }; + + char *iscsi_err_to_str(int err) +diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h +index db5f1f0..5087b5c 100644 +--- a/usr/iscsi_ipc.h ++++ b/usr/iscsi_ipc.h +@@ -30,6 +30,7 @@ + + enum { + ISCSI_INT, ++ ISCSI_UINT, + ISCSI_STRING, + }; + +@@ -143,8 +144,26 @@ struct iscsi_ipc { + uint16_t chap_tbl_idx, uint32_t num_entries, + char *chap_buf, uint32_t *valid_chap_entries); + ++ int (*set_chap) (uint64_t transport_handle, uint32_t host_no, ++ struct iovec *iovs, uint32_t param_count); ++ + int (*delete_chap) (uint64_t transport_handle, uint32_t host_no, + uint16_t chap_tbl_idx); ++ int (*set_flash_node_params) (uint64_t transport_handle, ++ uint32_t host_no, uint32_t flashnode_idx, ++ struct iovec *iovs, uint32_t param_count); ++ int (*new_flash_node) (uint64_t transport_handle, uint32_t host_no, ++ void *value, uint32_t *flashnode_idx); ++ int (*del_flash_node) (uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx); ++ int (*login_flash_node) (uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx); ++ int (*logout_flash_node) (uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx); ++ int (*logout_flash_node_sid) (uint64_t transport_handle, ++ uint32_t host_no, uint32_t sid); ++ int (*get_host_stats) (uint64_t transport_handle, uint32_t host_no, ++ char *host_stats); + }; + + #endif /* ISCSI_IPC_H */ +diff --git a/usr/iscsi_net_util.c b/usr/iscsi_net_util.c +index 6d0ebf9..848b4c6 100644 +--- a/usr/iscsi_net_util.c ++++ b/usr/iscsi_net_util.c +@@ -188,7 +188,7 @@ int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, + int ret; + + if (!strlen(netdev)) { +- log_error("No netdev name in fw entry.\n"); ++ log_error("No netdev name in fw entry."); + return EINVAL; + } + +@@ -203,13 +203,13 @@ int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, + * has already been handled (2 targets in IBFT may share one NIC) + */ + if (!inet_aton(local_ip, &sk_ipaddr.sin_addr)) { +- log_error("Invalid or missing ipaddr in fw entry\n"); ++ log_error("Invalid or missing ipaddr in fw entry"); + ret = EINVAL; + goto done; + } + + if (!inet_aton(mask, &sk_netmask.sin_addr)) { +- log_error("Invalid or missing netmask in fw entry\n"); ++ log_error("Invalid or missing netmask in fw entry"); + ret = EINVAL; + goto done; + } +@@ -217,7 +217,7 @@ int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, + inet_aton("255.255.255.255", &sk_hostmask.sin_addr); + + if (!inet_aton(remote_ip, &sk_tgt_ipaddr.sin_addr)) { +- log_error("Invalid or missing target ipaddr in fw entry\n"); ++ log_error("Invalid or missing target ipaddr in fw entry"); + ret = EINVAL; + goto done; + } +@@ -317,7 +317,7 @@ int net_ifup_netdev(char *netdev) + int ret = 0; + + if (!strlen(netdev)) { +- log_error("No netdev name in fw entry.\n"); ++ log_error("No netdev name in fw entry."); + return EINVAL; + } + +@@ -338,11 +338,11 @@ int net_ifup_netdev(char *netdev) + } + + if (ifr.ifr_flags & IFF_UP) { +- log_debug(3, "%s up\n", netdev); ++ log_debug(3, "%s up", netdev); + goto done; + } + +- log_debug(3, "bringing %s up\n", netdev); ++ log_debug(3, "bringing %s up", netdev); + + /* Bring up interface */ + memset(&ifr, 0, sizeof(ifr)); +diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c +index 123dde3..3a37a48 100644 +--- a/usr/iscsi_sysfs.c ++++ b/usr/iscsi_sysfs.c +@@ -24,11 +24,13 @@ + #include + #include + #include ++#include + + #include "log.h" + #include "initiator.h" + #include "transport.h" + #include "idbm.h" ++#include "idbm_fields.h" + #include "version.h" + #include "iscsi_sysfs.h" + #include "sysdeps.h" +@@ -37,6 +39,7 @@ + #include "session_info.h" + #include "host.h" + #include "iscsi_err.h" ++#include "flashnode.h" + + /* + * TODO: remove the _DIR defines and search for subsys dirs like +@@ -45,18 +48,22 @@ + #define ISCSI_TRANSPORT_DIR "/sys/class/iscsi_transport" + #define ISCSI_SESSION_DIR "/sys/class/iscsi_session" + #define ISCSI_HOST_DIR "/sys/class/iscsi_host" ++#define ISCSI_FLASHNODE_DIR "/sys/bus/iscsi_flashnode/devices" + + #define ISCSI_SESSION_SUBSYS "iscsi_session" + #define ISCSI_CONN_SUBSYS "iscsi_connection" + #define ISCSI_HOST_SUBSYS "iscsi_host" + #define ISCSI_TRANSPORT_SUBSYS "iscsi_transport" + #define ISCSI_IFACE_SUBSYS "iscsi_iface" ++#define ISCSI_FLASHNODE_SUBSYS "iscsi_flashnode" + #define SCSI_HOST_SUBSYS "scsi_host" + #define SCSI_SUBSYS "scsi" + + #define ISCSI_SESSION_ID "session%d" + #define ISCSI_CONN_ID "connection%d:0" + #define ISCSI_HOST_ID "host%d" ++#define ISCSI_FLASHNODE_SESS "flashnode_sess-%d:%d" ++#define ISCSI_FLASHNODE_CONN "flashnode_conn-%d:%d:0" + + /* + * TODO: make this into a real API and check inputs better and add doc. +@@ -130,7 +137,7 @@ static int read_transports(void) + if (list_empty(&t->list)) + free(t); + else +- log_error("Could not update %s.\n", ++ log_error("Could not update %s.", + t->name); + continue; + } +@@ -140,7 +147,7 @@ static int read_transports(void) + if (list_empty(&t->list)) + free(t); + else +- log_error("Could not update %s.\n", ++ log_error("Could not update %s.", + t->name); + continue; + } +@@ -265,7 +272,7 @@ uint32_t iscsi_sysfs_get_host_no_from_sid(uint32_t sid, int *err) + if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), + ISCSI_SESSION_SUBSYS, id)) { + log_error("Could not lookup devpath for %s. Possible sysfs " +- "incompatibility.\n", id); ++ "incompatibility.", id); + *err = ISCSI_ERR_SYSFS_LOOKUP; + return 0; + } +@@ -273,7 +280,7 @@ uint32_t iscsi_sysfs_get_host_no_from_sid(uint32_t sid, int *err) + session_dev = sysfs_device_get(devpath); + if (!session_dev) { + log_error("Could not get dev for %s. Possible sysfs " +- "incompatibility.\n", id); ++ "incompatibility.", id); + *err = ISCSI_ERR_SYSFS_LOOKUP; + return 0; + } +@@ -298,7 +305,7 @@ uint32_t iscsi_sysfs_get_host_no_from_sid(uint32_t sid, int *err) + + if (!host_dev) { + log_error("Could not get host dev for %s. Possible " +- "sysfs incompatibility.\n", id); ++ "sysfs incompatibility.", id); + *err = ISCSI_ERR_SYSFS_LOOKUP; + return 0; + } +@@ -440,6 +447,271 @@ uint32_t iscsi_sysfs_get_host_no_from_hwinfo(struct iface_rec *iface, int *rc) + } + + /* ++ * Read the flash node attributes based on host and flash node index. ++ */ ++int iscsi_sysfs_get_flashnode_info(struct flashnode_rec *fnode, ++ uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ char sess_id[NAME_SIZE] = {'\0'}; ++ char conn_id[NAME_SIZE] = {'\0'}; ++ char fnode_path[PATH_SIZE] = {'\0'}; ++ struct iscsi_transport *t; ++ int ret = 0; ++ ++ t = iscsi_sysfs_get_transport_by_hba(host_no); ++ if (!t) ++ log_debug(7, "could not get transport name for host%d", ++ host_no); ++ else ++ strncpy(fnode->transport_name, t->name, ++ ISCSI_TRANSPORT_NAME_MAXLEN); ++ ++ snprintf(sess_id, sizeof(sess_id), ISCSI_FLASHNODE_SESS, host_no, ++ flashnode_idx); ++ ++ snprintf(fnode_path, sizeof(fnode_path), ISCSI_FLASHNODE_DIR"/%s", ++ sess_id); ++ if (access(fnode_path, F_OK) != 0) ++ return errno; ++ ++ snprintf(conn_id, sizeof(conn_id), ISCSI_FLASHNODE_CONN, host_no, ++ flashnode_idx); ++ ++ snprintf(fnode_path, sizeof(fnode_path), ISCSI_FLASHNODE_DIR"/%s", ++ conn_id); ++ if (access(fnode_path, F_OK) != 0) ++ return errno; ++ ++ ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "is_fw_assigned_ipv6", ++ &((fnode->conn[0]).is_fw_assigned_ipv6)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "portal_type", ++ (fnode->sess).portal_type, ++ sizeof((fnode->sess).portal_type)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "auto_snd_tgt_disable", ++ &((fnode->sess).auto_snd_tgt_disable)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "discovery_session", ++ &((fnode->sess).discovery_session)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "entry_enable", ++ &((fnode->sess).entry_enable)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "header_digest", ++ &((fnode->conn[0]).header_digest_en)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "data_digest", ++ &((fnode->conn[0]).data_digest_en)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "immediate_data", ++ &((fnode->sess).immediate_data)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "initial_r2t", ++ &((fnode->sess).initial_r2t)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "data_seq_in_order", ++ &((fnode->sess).data_seq_in_order)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "data_pdu_in_order", ++ &((fnode->sess).data_pdu_in_order)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "chap_auth", ++ &((fnode->sess).chap_auth_en)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "snack_req", ++ &((fnode->conn[0]).snack_req_en)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "discovery_logout", ++ &((fnode->sess).discovery_logout_en)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "bidi_chap", ++ &((fnode->sess).bidi_chap_en)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, ++ "discovery_auth_optional", ++ &((fnode->sess).discovery_auth_optional)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "erl", ++ &((fnode->sess).erl)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_timestamp_stat", ++ &((fnode->conn[0]).tcp_timestamp_stat)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_nagle_disable", ++ &((fnode->conn[0]).tcp_nagle_disable)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_wsf_disable", ++ &((fnode->conn[0]).tcp_wsf_disable)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_timer_scale", ++ &((fnode->conn[0]).tcp_timer_scale)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_timestamp_enable", ++ &((fnode->conn[0]).tcp_timestamp_en)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "fragment_disable", ++ &((fnode->conn[0]).fragment_disable)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "max_recv_dlength", ++ &((fnode->conn[0]).max_recv_dlength)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "max_xmit_dlength", ++ &((fnode->conn[0]).max_xmit_dlength)); ++ sysfs_get_uint(sess_id, ISCSI_FLASHNODE_SUBSYS, "first_burst_len", ++ &((fnode->sess).first_burst_len)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "def_time2wait", ++ &((fnode->sess).def_time2wait)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "def_time2retain", ++ &((fnode->sess).def_time2retain)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "max_outstanding_r2t", ++ &((fnode->sess).max_outstanding_r2t)); ++ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "keepalive_tmo", ++ &((fnode->conn[0]).keepalive_tmo)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "isid", ++ (fnode->sess).isid, sizeof((fnode->sess).isid)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "tsid", ++ &((fnode->sess).tsid)); ++ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "port", ++ &((fnode->conn[0]).port)); ++ sysfs_get_uint(sess_id, ISCSI_FLASHNODE_SUBSYS, "max_burst_len", ++ &((fnode->sess).max_burst_len)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "def_taskmgmt_tmo", ++ &((fnode->sess).def_taskmgmt_tmo)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "targetalias", ++ (fnode->sess).targetalias, ++ sizeof((fnode->sess).targetalias)); ++ sysfs_get_str(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipaddress", ++ (fnode->conn[0]).ipaddress, ++ sizeof((fnode->conn[0]).ipaddress)); ++ sysfs_get_str(conn_id, ISCSI_FLASHNODE_SUBSYS, "redirect_ipaddr", ++ (fnode->conn[0]).redirect_ipaddr, ++ sizeof((fnode->conn[0]).redirect_ipaddr)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "max_segment_size", ++ &((fnode->conn[0]).max_segment_size)); ++ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "local_port", ++ &((fnode->conn[0]).local_port)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipv4_tos", ++ &((fnode->conn[0]).ipv4_tos)); ++ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipv6_traffic_class", ++ &((fnode->conn[0]).ipv6_traffic_class)); ++ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipv6_flow_label", ++ &((fnode->conn[0]).ipv6_flow_lbl)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "targetname", ++ (fnode->sess).targetname, ++ sizeof((fnode->sess).targetname)); ++ sysfs_get_str(conn_id, ISCSI_FLASHNODE_SUBSYS, "link_local_ipv6", ++ (fnode->conn[0]).link_local_ipv6, ++ sizeof((fnode->conn[0]).link_local_ipv6)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, ++ "discovery_parent_idx", ++ &((fnode->sess).discovery_parent_idx)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, ++ "discovery_parent_type", ++ (fnode->sess).discovery_parent_type, ++ sizeof((fnode->sess).discovery_parent_type)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "tpgt", ++ &((fnode->sess).tpgt)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_xmit_wsf", ++ &((fnode->conn[0]).tcp_xmit_wsf)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_recv_wsf", ++ &((fnode->conn[0]).tcp_recv_wsf)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "chap_out_idx", ++ &((fnode->sess).chap_out_idx)); ++ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "chap_in_idx", ++ &((fnode->sess).chap_in_idx)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "username", ++ (fnode->sess).username, sizeof((fnode->sess).username)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "username_in", ++ (fnode->sess).username_in, ++ sizeof((fnode->sess).username_in)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "password", ++ (fnode->sess).password, sizeof((fnode->sess).password)); ++ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "password_in", ++ (fnode->sess).password_in, ++ sizeof((fnode->sess).password_in)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "statsn", ++ &((fnode->conn[0]).stat_sn)); ++ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "exp_statsn", ++ &((fnode->conn[0]).exp_stat_sn)); ++ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "is_boot_target", ++ &((fnode->sess).is_boot_target)); ++ return ret; ++} ++ ++/* ++ * For each flash node of the given host, perform operation specified in fn. ++ */ ++int iscsi_sysfs_for_each_flashnode(void *data, uint32_t host_no, int *nr_found, ++ iscsi_sysfs_flashnode_op_fn *fn) ++{ ++ struct dirent **namelist; ++ int rc = 0, i, n; ++ struct flashnode_rec *fnode; ++ uint32_t flashnode_idx; ++ uint32_t hostno; ++ ++ fnode = malloc(sizeof(*fnode)); ++ if (!fnode) ++ return ISCSI_ERR_NOMEM; ++ ++ n = scandir(ISCSI_FLASHNODE_DIR, &namelist, trans_filter, alphasort); ++ if (n <= 0) ++ goto free_fnode; ++ ++ for (i = 0; i < n; i++) { ++ memset(fnode, 0, sizeof(*fnode)); ++ ++ if (!strncmp(namelist[i]->d_name, "flashnode_conn", ++ strlen("flashnode_conn"))) ++ continue; ++ ++ if (sscanf(namelist[i]->d_name, ISCSI_FLASHNODE_SESS, ++ &hostno, &flashnode_idx) != 2) { ++ log_error("Invalid iscsi target dir: %s", ++ namelist[i]->d_name); ++ break; ++ } ++ ++ if (host_no != hostno) ++ continue; ++ ++ rc = iscsi_sysfs_get_flashnode_info(fnode, host_no, ++ flashnode_idx); ++ if (rc) ++ break; ++ ++ rc = fn(data, fnode, host_no, flashnode_idx); ++ if (rc != 0) ++ break; ++ (*nr_found)++; ++ } ++ ++ for (i = 0; i < n; i++) ++ free(namelist[i]); ++ free(namelist); ++ ++free_fnode: ++ free(fnode); ++ return rc; ++} ++ ++static int iscsi_sysfs_read_boot(struct iface_rec *iface, char *session) ++{ ++ char boot_root[BOOT_NAME_MAXLEN], boot_nic[BOOT_NAME_MAXLEN]; ++ char boot_name[BOOT_NAME_MAXLEN], boot_content[BOOT_NAME_MAXLEN]; ++ ++ /* Extract boot info */ ++ strlcpy(boot_name, "boot_target", sizeof(boot_name)); ++ if (sysfs_get_str(session, ISCSI_SESSION_SUBSYS, boot_name, ++ boot_content, BOOT_NAME_MAXLEN)) ++ return -1; ++ strlcpy(boot_name, "boot_nic", sizeof(boot_name)); ++ if (sysfs_get_str(session, ISCSI_SESSION_SUBSYS, boot_name, boot_nic, ++ BOOT_NAME_MAXLEN)) ++ return -1; ++ strlcpy(boot_name, "boot_root", sizeof(boot_name)); ++ if (sysfs_get_str(session, ISCSI_SESSION_SUBSYS, boot_name, boot_root, ++ BOOT_NAME_MAXLEN)) ++ return -1; ++ ++ /* If all boot_root/boot_target/boot_nic exist, then extract the ++ info from the boot nic */ ++ if (sysfs_get_str(boot_nic, boot_root, "vlan", boot_content, ++ BOOT_NAME_MAXLEN)) ++ log_debug(5, "could not read %s/%s/vlan", boot_root, boot_nic); ++ else ++ iface->vlan_id = atoi(boot_content); ++ ++ if (sysfs_get_str(boot_nic, boot_root, "subnet-mask", ++ iface->subnet_mask, NI_MAXHOST)) ++ log_debug(5, "could not read %s/%s/subnet", boot_root, ++ boot_nic); ++ ++ log_debug(5, "sysfs read boot returns %s/%s/ vlan = %d subnet = %s", ++ boot_root, boot_nic, iface->vlan_id, iface->subnet_mask); ++ return 0; ++} ++ ++/* + * Read in iface settings based on host and session values. If + * session is not passed in, then the ifacename will not be set. And + * if the session is not passed in then iname will only be set for +@@ -469,7 +741,7 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + ret = sysfs_get_str(host_id, ISCSI_HOST_SUBSYS, "hwaddress", + iface->hwaddress, sizeof(iface->hwaddress)); + if (ret) +- log_debug(7, "could not read hwaddress for host%d\n", host_no); ++ log_debug(7, "could not read hwaddress for host%d", host_no); + + if (iface_kern_id) + ret = sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, +@@ -480,14 +752,14 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + ret = sysfs_get_str(host_id, ISCSI_HOST_SUBSYS, "ipaddress", + iface->ipaddress, sizeof(iface->ipaddress)); + if (ret) +- log_debug(7, "could not read local address for host%d\n", ++ log_debug(7, "could not read local address for host%d", + host_no); + + /* if not found just print out default */ + ret = sysfs_get_str(host_id, ISCSI_HOST_SUBSYS, "netdev", + iface->netdev, sizeof(iface->netdev)); + if (ret) +- log_debug(7, "could not read netdev for host%d\n", host_no); ++ log_debug(7, "could not read netdev for host%d", host_no); + + /* + * For drivers like qla4xxx we can only set the iname at the +@@ -527,7 +799,7 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + * global iname so we can just fill it in here. + */ + log_debug(7, "Could not read initiatorname for " +- "host%d\n", host_no); ++ "host%d", host_no); + /* optional so do not return error */ + ret = 0; + } +@@ -553,7 +825,7 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + iface->name, sizeof(iface->name)); + if (ret) { + log_debug(7, "could not read iface name for " +- "session %s\n", session); ++ "session %s", session); + /* + * if the ifacename file is not there then we are + * using a older kernel and can try to find the +@@ -562,11 +834,14 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + */ + if (iface_get_by_net_binding(iface, iface)) + log_debug(7, "Could not find iface for session " +- "bound to:" iface_fmt "\n", ++ "bound to:" iface_fmt "", + iface_str(iface)); + } + } + ++ if (session && t->template->use_boot_info) ++ iscsi_sysfs_read_boot(iface, session); ++ + if (!iface_kern_id) + goto done; + +@@ -581,6 +856,71 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + + sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "subnet", + iface->subnet_mask, sizeof(iface->subnet_mask)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_alt_client_id_en", ++ iface->dhcp_alt_client_id_state, ++ sizeof(iface->dhcp_alt_client_id_state)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_alt_client_id", ++ iface->dhcp_alt_client_id, ++ sizeof(iface->dhcp_alt_client_id)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_dns_address_en", ++ iface->dhcp_dns, sizeof(iface->dhcp_dns)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_learn_iqn_en", ++ iface->dhcp_learn_iqn, ++ sizeof(iface->dhcp_learn_iqn)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_req_vendor_id_en", ++ iface->dhcp_req_vendor_id_state, ++ sizeof(iface->dhcp_req_vendor_id_state)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_use_vendor_id_en", ++ iface->dhcp_vendor_id_state, ++ sizeof(iface->dhcp_vendor_id_state)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_vendor_id", ++ iface->dhcp_vendor_id, ++ sizeof(iface->dhcp_vendor_id)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dhcp_slp_da_info_en", ++ iface->dhcp_slp_da, sizeof(iface->dhcp_slp_da)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "fragment_disable", ++ iface->fragmentation, ++ sizeof(iface->fragmentation)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "grat_arp_en", ++ iface->gratuitous_arp, ++ sizeof(iface->gratuitous_arp)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "incoming_forwarding_en", ++ iface->incoming_forwarding, ++ sizeof(iface->incoming_forwarding)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "tos_en", ++ iface->tos_state, sizeof(iface->tos_state)); ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "tos", &iface->tos)) ++ iface->tos = 0; ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "ttl", &iface->ttl)) ++ iface->ttl = 0; + } else { + sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, + "ipaddr_autocfg", +@@ -597,6 +937,53 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "router_addr", + iface->ipv6_router, + sizeof(iface->ipv6_router)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "router_state", ++ iface->router_autocfg, ++ sizeof(iface->router_autocfg)); ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "dup_addr_detect_cnt", ++ &iface->dup_addr_detect_cnt)) ++ iface->dup_addr_detect_cnt = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "flow_label", &iface->flow_label)) ++ iface->flow_label = 0; ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "grat_neighbor_adv_en", ++ iface->gratuitous_neighbor_adv, ++ sizeof(iface->gratuitous_neighbor_adv)); ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "hop_limit", &iface->hop_limit)) ++ iface->hop_limit = 0; ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "mld_en", ++ iface->mld, sizeof(iface->mld)); ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "nd_reachable_tmo", ++ &iface->nd_reachable_tmo)) ++ iface->nd_reachable_tmo = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "nd_rexmit_time", &iface->nd_rexmit_time)) ++ iface->nd_rexmit_time = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "nd_stale_tmo", &iface->nd_stale_tmo)) ++ iface->nd_stale_tmo = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "router_adv_link_mtu", ++ &iface->router_adv_link_mtu)) ++ iface->router_adv_link_mtu = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "traffic_class", &iface->traffic_class)) ++ iface->traffic_class = 0; + } + + if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, "port", +@@ -613,6 +1000,94 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, + &iface->vlan_priority)) + iface->vlan_priority = UINT8_MAX; + ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "vlan_enabled", ++ iface->vlan_state, sizeof(iface->vlan_state)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "enabled", ++ iface->state, sizeof(iface->state)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "delayed_ack_en", ++ iface->delayed_ack, sizeof(iface->delayed_ack)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_nagle_disable", ++ iface->nagle, sizeof(iface->nagle)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_wsf_disable", ++ iface->tcp_wsf_state, sizeof(iface->tcp_wsf_state)); ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_wsf", ++ &iface->tcp_wsf)) ++ iface->tcp_wsf = 0; ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "tcp_timer_scale", &iface->tcp_timer_scale)) ++ iface->tcp_timer_scale = 0; ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_timestamp_en", ++ iface->tcp_timestamp, sizeof(iface->tcp_timestamp)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "redirect_en", ++ iface->redirect, sizeof(iface->redirect)); ++ ++ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "def_taskmgmt_tmo", &iface->def_task_mgmt_tmo)) ++ iface->def_task_mgmt_tmo = 0; ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "header_digest", ++ iface->header_digest, sizeof(iface->header_digest)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_digest", ++ iface->data_digest, sizeof(iface->data_digest)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "immediate_data", ++ iface->immediate_data, sizeof(iface->immediate_data)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "initial_r2t", ++ iface->initial_r2t, sizeof(iface->initial_r2t)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_seq_in_order", ++ iface->data_seq_inorder, sizeof(iface->data_seq_inorder)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_pdu_in_order", ++ iface->data_pdu_inorder, sizeof(iface->data_pdu_inorder)); ++ ++ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "erl", ++ &iface->erl)) ++ iface->erl = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "max_recv_dlength", &iface->max_recv_dlength)) ++ iface->max_recv_dlength = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "first_burst_len", &iface->first_burst_len)) ++ iface->first_burst_len = 0; ++ ++ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "max_outstanding_r2t", &iface->max_out_r2t)) ++ iface->max_out_r2t = 0; ++ ++ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "max_burst_len", &iface->max_burst_len)) ++ iface->max_burst_len = 0; ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "chap_auth", ++ iface->chap_auth, sizeof(iface->chap_auth)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "bidi_chap", ++ iface->bidi_chap, sizeof(iface->bidi_chap)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "strict_login_comp_en", ++ iface->strict_login_comp, ++ sizeof(iface->strict_login_comp)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, ++ "discovery_auth_optional", ++ iface->discovery_auth, sizeof(iface->discovery_auth)); ++ ++ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "discovery_logout", ++ iface->discovery_logout, sizeof(iface->discovery_logout)); ++ + if (sscanf(iface_kern_id, "ipv%d-iface-%u-%u", &iface_type, + &tmp_host_no, &iface_num) == 3) + iface->iface_num = iface_num; +@@ -740,7 +1215,7 @@ int iscsi_sysfs_session_has_leadconn(uint32_t sid) + * /sys/devices/platform/hostH/sessionS/targetH:B:I + * /sys/devices/platform/hostH/sessionS + * +- * return the sid S. If just the sid is passed in it will be covnerted ++ * return the sid S. If just the sid is passed in it will be converted + * to a int. + */ + int iscsi_sysfs_get_sid_from_path(char *session) +@@ -748,15 +1223,16 @@ int iscsi_sysfs_get_sid_from_path(char *session) + struct sysfs_device *dev_parent, *dev; + struct stat statb; + char devpath[PATH_SIZE]; ++ char *end; ++ int sid; ++ ++ sid = strtol(session, &end, 10); ++ if (sid > 0 && *session != '\0' && *end == '\0') ++ return sid; + + if (lstat(session, &statb)) { +- log_debug(1, "Could not stat %s failed with %d", +- session, errno); +- if (index(session, '/')) { +- log_error("%s is an invalid session path\n", session); +- exit(1); +- } +- return atoi(session); ++ log_error("%s is an invalid session ID or path", session); ++ exit(1); + } + + if (!S_ISDIR(statb.st_mode) && !S_ISLNK(statb.st_mode)) { +@@ -772,7 +1248,7 @@ int iscsi_sysfs_get_sid_from_path(char *session) + dev = sysfs_device_get(devpath); + if (!dev) { + log_error("Could not get dev for %s. Possible sysfs " +- "incompatibility.\n", devpath); ++ "incompatibility.", devpath); + return -1; + } + +@@ -932,11 +1408,13 @@ int iscsi_sysfs_get_sessioninfo_by_id(struct session_info *info, char *session) + } + + int iscsi_sysfs_for_each_session(void *data, int *nr_found, +- iscsi_sysfs_session_op_fn *fn) ++ iscsi_sysfs_session_op_fn *fn, ++ int in_parallel) + { + struct dirent **namelist; +- int rc = 0, n, i; ++ int rc = 0, n, i, chldrc = 0; + struct session_info *info; ++ pid_t pid = 0; + + info = calloc(1, sizeof(*info)); + if (!info) +@@ -958,14 +1436,52 @@ int iscsi_sysfs_for_each_session(void *data, int *nr_found, + continue; + } + +- rc = fn(data, info); +- if (rc > 0) +- break; +- else if (rc == 0) +- (*nr_found)++; +- else +- /* if less than zero it means it was not a match */ +- rc = 0; ++ if (in_parallel) { ++ pid = fork(); ++ } ++ if (pid == 0) { ++ rc = fn(data, info); ++ if (in_parallel) { ++ exit(rc); ++ } else { ++ if (rc > 0) { ++ break; ++ } else if (rc == 0) { ++ (*nr_found)++; ++ } else { ++ /* if less than zero it means it was not a match */ ++ rc = 0; ++ } ++ } ++ } else if (pid < 0) { ++ log_error("could not fork() for session %s, err %d", ++ namelist[i]->d_name, errno); ++ } ++ } ++ ++ if (in_parallel) { ++ while (1) { ++ if (wait(&chldrc) < 0) { ++ /* ++ * ECHILD means no more children which is ++ * expected to happen sooner or later. ++ */ ++ if (errno != ECHILD) { ++ rc = errno; ++ } ++ break; ++ } ++ ++ if ((chldrc > 0) && (rc == 0)) { ++ /* ++ * The non-parallel code path returns the first ++ * error so this keeps the same semantics. ++ */ ++ rc = chldrc; ++ } else if (chldrc == 0) { ++ (*nr_found)++; ++ } ++ } + } + + for (i = 0; i < n; i++) +@@ -1006,7 +1522,7 @@ int iscsi_sysfs_get_device_state(char *state, int host_no, int target, int lun) + snprintf(id, sizeof(id), "%d:0:%d:%d", host_no, target, lun); + if (sysfs_get_str(id, SCSI_SUBSYS, "state", state, + SCSI_MAX_STATE_VALUE)) { +- log_debug(3, "Could not read attr state for %s\n", id); ++ log_debug(3, "Could not read attr state for %s", id); + return ISCSI_ERR_SYSFS_LOOKUP; + } + +@@ -1027,7 +1543,7 @@ char *iscsi_sysfs_get_blockdev_from_lun(int host_no, int target, int lun) + snprintf(id, sizeof(id), "%d:0:%d:%d", host_no, target, lun); + if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), + SCSI_SUBSYS, id)) { +- log_debug(3, "Could not lookup devpath for %s %s\n", ++ log_debug(3, "Could not lookup devpath for %s %s", + SCSI_SUBSYS, id); + return NULL; + } +@@ -1055,7 +1571,7 @@ char *iscsi_sysfs_get_blockdev_from_lun(int host_no, int target, int lun) + * 2.6.25 dropped the symlink and now block is a dir. + */ + if (lstat(path_full, &statbuf)) { +- log_error("Could not stat block path %s err %d\n", ++ log_error("Could not stat block path %s err %d", + path_full, errno); + break; + } +@@ -1074,7 +1590,7 @@ char *iscsi_sysfs_get_blockdev_from_lun(int host_no, int target, int lun) + /* it should not be this hard should it? :) */ + blk_dirfd = opendir(path_full); + if (!blk_dirfd) { +- log_debug(3, "Could not open blk path %s\n", ++ log_debug(3, "Could not open blk path %s", + path_full); + break; + } +@@ -1110,7 +1626,7 @@ static uint32_t get_target_no_from_sid(uint32_t sid, int *err) + snprintf(id, sizeof(id), "session%u", sid); + if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), + ISCSI_SESSION_SUBSYS, id)) { +- log_debug(3, "Could not lookup devpath for %s %s\n", ++ log_debug(3, "Could not lookup devpath for %s %s", + ISCSI_SESSION_SUBSYS, id); + return 0; + } +@@ -1283,7 +1799,7 @@ int iscsi_sysfs_for_each_device(void *data, int host_no, uint32_t sid, + snprintf(id, sizeof(id), "session%u", sid); + if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), + ISCSI_SESSION_SUBSYS, id)) { +- log_debug(3, "Could not lookup devpath for %s %s\n", ++ log_debug(3, "Could not lookup devpath for %s %s", + ISCSI_SESSION_SUBSYS, id); + return ISCSI_ERR_SYSFS_LOOKUP; + } +@@ -1367,7 +1883,7 @@ pid_t iscsi_sysfs_scan_host(int hostno, int async) + snprintf(id, sizeof(id), ISCSI_HOST_ID, hostno); + sysfs_set_param(id, SCSI_HOST_SUBSYS, "scan", write_buf, + strlen(write_buf)); +- log_debug(4, "scanning host%d completed\n", hostno); ++ log_debug(4, "scanning host%d completed", hostno); + } else if (pid > 0) { + log_debug(4, "scanning host%d from pid %d", hostno, pid); + } else +diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h +index 2b15d78..9a56105 100644 +--- a/usr/iscsi_sysfs.h ++++ b/usr/iscsi_sysfs.h +@@ -31,6 +31,7 @@ struct iscsi_conn; + struct iscsi_session_operational_config; + struct iscsi_conn_operational_config; + struct iscsi_auth_config; ++struct flashnode_rec; + + #define SCSI_MAX_STATE_VALUE 32 + +@@ -42,13 +43,16 @@ extern int iscsi_sysfs_session_has_leadconn(uint32_t sid); + + typedef int (iscsi_sysfs_session_op_fn)(void *, struct session_info *); + typedef int (iscsi_sysfs_host_op_fn)(void *, struct host_info *); ++typedef int (iscsi_sysfs_flashnode_op_fn)(void *, struct flashnode_rec *, ++ uint32_t, uint32_t); + typedef int (iscsi_sysfs_iface_op_fn)(void *, struct iface_rec *); + + extern int iscsi_sysfs_for_each_iface_on_host(void *data, uint32_t host_no, + int *nr_found, + iscsi_sysfs_iface_op_fn *fn); + extern int iscsi_sysfs_for_each_session(void *data, int *nr_found, +- iscsi_sysfs_session_op_fn *fn); ++ iscsi_sysfs_session_op_fn *fn, ++ int in_parallel); + extern int iscsi_sysfs_for_each_host(void *data, int *nr_found, + iscsi_sysfs_host_op_fn *fn); + extern uint32_t iscsi_sysfs_get_host_no_from_sid(uint32_t sid, int *err); +@@ -56,6 +60,20 @@ extern uint32_t iscsi_sysfs_get_host_no_from_hwinfo(struct iface_rec *iface, + int *rc); + extern uint32_t iscsi_sysfs_get_host_no_from_hwaddress(char *hwaddress, int *rc); + extern int iscsi_sysfs_get_hostinfo_by_host_no(struct host_info *hinfo); ++extern int iscsi_sysfs_for_each_flashnode(void *data, uint32_t host_no, ++ int *nr_found, ++ iscsi_sysfs_flashnode_op_fn *fn); ++extern int iscsi_sysfs_get_flashnode_info(struct flashnode_rec *fnode, ++ uint32_t host_no, ++ uint32_t flashnode_id); ++extern int iscsi_sysfs_update_flashnode_param(uint32_t host_no, ++ uint32_t flashnode_id, ++ char *name, char *val); ++extern int iscsi_sysfs_create_flashnode(uint32_t host_no, char *ipver); ++extern int iscsi_sysfs_del_flashnode(uint32_t host_no, uint32_t flashnode_id); ++extern int iscsi_sysfs_login_flashnode(uint32_t host_no, uint32_t flashnode_id); ++extern int iscsi_sysfs_logout_flashnode(uint32_t host_no, ++ uint32_t flashnode_id); + extern int iscsi_sysfs_get_sid_from_path(char *session); + extern char *iscsi_sysfs_get_blockdev_from_lun(int hostno, int target, int sid); + +diff --git a/usr/iscsi_util.c b/usr/iscsi_util.c +index 5e3420e..a4f33cf 100644 +--- a/usr/iscsi_util.c ++++ b/usr/iscsi_util.c +@@ -25,16 +25,28 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include + ++#include "sysdeps.h" + #include "log.h" + #include "iscsi_settings.h" + #include "iface.h" + #include "session_info.h" + #include "iscsi_util.h" + ++int setup_abstract_addr(struct sockaddr_un *addr, char *unix_sock_name) ++{ ++ memset(addr, 0, sizeof(*addr)); ++ addr->sun_family = AF_LOCAL; ++ strlcpy(addr->sun_path + 1, unix_sock_name, sizeof(addr->sun_path) - 1); ++ return offsetof(struct sockaddr_un, sun_path) + ++ strlen(addr->sun_path + 1) + 1; ++} ++ + void daemon_init(void) + { + int fd; +@@ -60,7 +72,8 @@ int oom_adjust(void) + char path[ISCSI_OOM_PATH_LEN]; + struct stat statb; + +- if (nice(-10) < 0) ++ errno = 0; ++ if (nice(-10) == -1 && errno != 0) + log_debug(1, "Could not increase process priority: %s", + strerror(errno)); + +@@ -135,10 +148,10 @@ int increase_max_files(void) + + err = getrlimit(RLIMIT_NOFILE, &rl); + if (err) { +- log_debug(1, "Could not get file limit (err %d)\n", errno); ++ log_debug(1, "Could not get file limit (err %d)", errno); + return errno; + } +- log_debug(1, "Max file limits %lu %lu\n", rl.rlim_cur, rl.rlim_max); ++ log_debug(1, "Max file limits %lu %lu", rl.rlim_cur, rl.rlim_max); + + if (rl.rlim_cur < ISCSI_MAX_FILES) + rl.rlim_cur = ISCSI_MAX_FILES; +@@ -147,7 +160,7 @@ int increase_max_files(void) + + err = setrlimit(RLIMIT_NOFILE, &rl); + if (err) { +- log_debug(1, "Could not set file limit to %lu/%lu (err %d)\n", ++ log_debug(1, "Could not set file limit to %lu/%lu (err %d)", + rl.rlim_cur, rl.rlim_max, errno); + return errno; + } +@@ -306,7 +319,7 @@ int __iscsi_match_session(node_rec_t *rec, char *targetname, + unsigned sid) + { + if (!rec) { +- log_debug(6, "no rec info to match\n"); ++ log_debug(6, "no rec info to match"); + return 1; + } + +diff --git a/usr/iscsi_util.h b/usr/iscsi_util.h +index 110dfa8..ff725eb 100644 +--- a/usr/iscsi_util.h ++++ b/usr/iscsi_util.h +@@ -26,4 +26,7 @@ extern int __iscsi_match_session(struct node_rec *rec, char *targetname, + extern char *strstrip(char *s); + extern char *cfg_get_string_param(char *pathname, const char *key); + ++struct sockaddr_un; ++extern int setup_abstract_addr(struct sockaddr_un *addr, char *unix_sock_name); ++ + #endif +diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c +index 8f9de05..aa7cf07 100644 +--- a/usr/iscsiadm.c ++++ b/usr/iscsiadm.c +@@ -53,6 +53,7 @@ + #include "iscsi_err.h" + #include "iscsi_ipc.h" + #include "iscsi_timer.h" ++#include "flashnode.h" + + static char program_name[] = "iscsiadm"; + static char config_file[TARGET_NAME_MAXLEN]; +@@ -67,7 +68,9 @@ enum iscsiadm_mode { + MODE_IFACE, + MODE_FW, + MODE_PING, +- MODE_CHAP ++ MODE_CHAP, ++ MODE_FLASHNODE, ++ MODE_HOST_STATS + }; + + enum iscsiadm_op { +@@ -78,7 +81,9 @@ enum iscsiadm_op { + OP_SHOW = 0x8, + OP_NONPERSISTENT = 0x10, + OP_APPLY = 0x20, +- OP_APPLY_ALL = 0x40 ++ OP_APPLY_ALL = 0x40, ++ OP_LOGIN = 0x80, ++ OP_LOGOUT = 0x100 + }; + + static struct option const long_options[] = +@@ -111,9 +116,11 @@ static struct option const long_options[] = + {"packetsize", required_argument, NULL, 'b'}, + {"count", required_argument, NULL, 'c'}, + {"interval", required_argument, NULL, 'i'}, ++ {"index", required_argument, NULL, 'x'}, ++ {"portal_type", optional_argument, NULL, 'A'}, + {NULL, 0, NULL, 0}, + }; +-static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u"; ++static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:ux:A:"; + + static void usage(int status) + { +@@ -129,8 +136,8 @@ iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,au + [ [ -o operation ] [ -n name ] [ -v value ] ]\n\ + iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ + iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ +-iscsiadm -m fw [ -l ]\n\ +-iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ]\n\ ++iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ ++iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -x chap_tbl_idx ] ] | [ -C flashnode [ -A portal_type ] [ -x flashnode_idx ] ] | [ -C stats ] ] [ [ -o operation ] [ -n name ] [ -v value ] ] \n\ + iscsiadm -k priority\n"); + } + exit(status); +@@ -155,6 +162,10 @@ str_to_op(char *str) + op = OP_APPLY; + else if (!strcmp("applyall", str)) + op = OP_APPLY_ALL; ++ else if (!strcmp("login", str)) ++ op = OP_LOGIN; ++ else if (!strcmp("logout", str)) ++ op = OP_LOGOUT; + else + op = OP_NOOP; + +@@ -195,6 +206,11 @@ str_to_submode(char *str) + sub_mode = MODE_PING; + else if (!strcmp("chap", str)) + sub_mode = MODE_CHAP; ++ else if (!strcmp("flashnode", str)) ++ sub_mode = MODE_FLASHNODE; ++ else if (!strcmp("stats", str)) ++ sub_mode = MODE_HOST_STATS; ++ + else + sub_mode = -1; + +@@ -221,6 +237,21 @@ str_to_type(char *str) + return type; + } + ++static int ++str_to_portal_type(char *str) ++{ ++ int ptype; ++ ++ if (!strcmp("ipv4", str)) ++ ptype = IPV4; ++ else if (!strcmp("ipv6", str)) ++ ptype = IPV6; ++ else ++ ptype = -1; ++ ++ return ptype; ++} ++ + static void kill_iscsid(int priority) + { + iscsiadm_req_t req; +@@ -247,7 +278,7 @@ static void kill_iscsid(int priority) + if (rc) { + iscsi_err_print_msg(rc); + log_error("Could not stop iscsid. Trying sending iscsid " +- "SIGTERM or SIGKILL signals manually\n"); ++ "SIGTERM or SIGKILL signals manually"); + } + } + +@@ -272,7 +303,7 @@ static int print_ifaces(struct iface_rec *iface, int info_level) + if (iface) { + err = iface_conf_read(iface); + if (err) { +- log_error("Could not read iface %s.\n", ++ log_error("Could not read iface %s.", + iface->name); + return err; + } +@@ -320,7 +351,8 @@ match_startup_mode(node_rec_t *rec, char *mode) + } + + static int +-for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn) ++for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn, ++ int in_parallel) + { + int err, num_found = 0; + +@@ -328,7 +360,8 @@ for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn) + num_found = 1; + err = fn(rec, rec->session.info); + } else { +- err = iscsi_sysfs_for_each_session(rec, &num_found, fn); ++ err = iscsi_sysfs_for_each_session(rec, &num_found, fn, ++ in_parallel); + } + if (err) + log_error("Could not execute operation on all sessions: %s", +@@ -370,7 +403,7 @@ __logout_by_startup(void *data, struct list_head *list, + * this is due to a HW driver or some other driver + * not hooked in + */ +- log_debug(7, "could not read data for [%s,%s.%d]\n", ++ log_debug(7, "could not read data for [%s,%s.%d]", + info->targetname, info->persistent_address, + info->persistent_port); + return -1; +@@ -408,7 +441,7 @@ logout_by_startup(char *mode) + rc = iscsi_logout_portals(mode, &nr_found, 1, __logout_by_startup); + if (rc == ISCSI_ERR_NO_OBJS_FOUND) + log_error("No matching sessions found"); +- return rc; ++ return rc; + } + + struct startup_data { +@@ -452,7 +485,7 @@ __do_leading_login(void *data, struct list_head *list, struct node_rec *rec) + * If there is an existing session that matcthes the target, + * the leading login is complete. + */ +- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_target)) { ++ if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_target, 0)) { + log_debug(1, "Skipping %s: Already a session for that target", + rec->name); + return -1; +@@ -552,7 +585,7 @@ login_by_startup(char *mode) + list_for_each_entry_safe(rec, tmp_rec, &startup.leading_logins, + list) { + if (!iscsi_sysfs_for_each_session(rec, &nr_found, +- iscsi_match_target)) ++ iscsi_match_target, 0)) + missed_leading_login++; + /* + * Cleanup the list, since 'iscsi_login_portals_safe' +@@ -582,6 +615,8 @@ static int iscsi_logout_matched_portal(void *data, struct list_head *list, + { + struct node_rec *pattern_rec = data; + struct iscsi_transport *t; ++ uint32_t host_no; ++ int rc = 0; + + t = iscsi_sysfs_get_transport_by_sid(info->sid); + if (!t) +@@ -590,7 +625,19 @@ static int iscsi_logout_matched_portal(void *data, struct list_head *list, + if (!iscsi_match_session(pattern_rec, info)) + return -1; + +- return iscsi_logout_portal(info, list); ++ host_no = iscsi_sysfs_get_host_no_from_sid(info->sid, &rc); ++ if (rc) { ++ log_error("could not get host_no for session%d: %s.", ++ info->sid, iscsi_err_to_str(rc)); ++ return -1; ++ } ++ ++ if (!iscsi_sysfs_session_user_created(info->sid)) ++ rc = iscsi_logout_flashnode_sid(t, host_no, info->sid); ++ else ++ rc = iscsi_logout_portal(info, list); ++ ++ return rc; + } + + static int rec_match_fn(void *data, node_rec_t *rec) +@@ -1092,17 +1139,55 @@ do_software_sendtargets(discovery_rec_t *drec, struct list_head *ifaces, + return rc; + } + ++static int do_isns(discovery_rec_t *drec, struct list_head *ifaces, ++ int info_level, int do_login, int op) ++{ ++ struct list_head rec_list; ++ struct node_rec *rec, *tmp; ++ int rc; ++ ++ INIT_LIST_HEAD(&rec_list); ++ /* ++ * compat: if the user did not pass any op then we do all ++ * ops for them ++ */ ++ if (!op) ++ op = OP_NEW | OP_DELETE | OP_UPDATE; ++ ++ ++ rc = idbm_bind_ifaces_to_nodes(discovery_isns, drec, ifaces, ++ &rec_list); ++ if (rc) { ++ log_error("Could not perform iSNS discovery: %s", ++ iscsi_err_to_str(rc)); ++ return rc; ++ } else if (list_empty(&rec_list)) { ++ log_error("No portals found"); ++ return ISCSI_ERR_NO_OBJS_FOUND; ++ } ++ ++ rc = exec_disc_op_on_recs(drec, &rec_list, info_level, do_login, op); ++ ++ list_for_each_entry_safe(rec, tmp, &rec_list, list) { ++ list_del(&rec->list); ++ free(rec); ++ } ++ ++ return rc; ++} ++ + static int +-do_sendtargets(discovery_rec_t *drec, struct list_head *ifaces, +- int info_level, int do_login, int op, int sync_drec) ++do_target_discovery(discovery_rec_t *drec, struct list_head *ifaces, ++ int info_level, int do_login, int op, int sync_drec) + { ++ + struct iface_rec *tmp, *iface; + int rc, host_no; + struct iscsi_transport *t; + + if (list_empty(ifaces)) { + ifaces = NULL; +- goto sw_st; ++ goto sw_discovery; + } + + /* we allow users to mix hw and sw iscsi so we have to sort it out */ +@@ -1131,64 +1216,36 @@ do_sendtargets(discovery_rec_t *drec, struct list_head *ifaces, + host_no = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc); + if (rc || host_no == -1) { + log_debug(1, "Could not match iface" iface_fmt " to " +- "host.", iface_str(iface)); ++ "host.", iface_str(iface)); + /* try software iscsi */ + continue; + } + +- if (t->caps & CAP_SENDTARGETS_OFFLOAD) { +- do_offload_sendtargets(drec, host_no, do_login); +- list_del(&iface->list); +- free(iface); +- } ++ if (drec->type == DISCOVERY_TYPE_SENDTARGETS) ++ if (t->caps & CAP_SENDTARGETS_OFFLOAD) { ++ do_offload_sendtargets(drec, host_no, do_login); ++ list_del(&iface->list); ++ free(iface); ++ } + } + + if (list_empty(ifaces)) + return ISCSI_ERR_NO_OBJS_FOUND; + +-sw_st: +- return do_software_sendtargets(drec, ifaces, info_level, do_login, +- op, sync_drec); +-} +- +-static int do_isns(discovery_rec_t *drec, struct list_head *ifaces, +- int info_level, int do_login, int op) +-{ +- struct list_head rec_list; +- struct node_rec *rec, *tmp; +- int rc; +- +- INIT_LIST_HEAD(&rec_list); +- /* +- * compat: if the user did not pass any op then we do all +- * ops for them +- */ +- if (!op) +- op = OP_NEW | OP_DELETE | OP_UPDATE; +- +- drec->type = DISCOVERY_TYPE_ISNS; +- +- rc = idbm_bind_ifaces_to_nodes(discovery_isns, drec, ifaces, +- &rec_list); +- if (rc) { +- log_error("Could not perform iSNS discovery: %s", +- iscsi_err_to_str(rc)); +- return rc; +- } else if (list_empty(&rec_list)) { +- log_error("No portals found"); +- return ISCSI_ERR_NO_OBJS_FOUND; ++sw_discovery: ++ switch (drec->type) { ++ case DISCOVERY_TYPE_SENDTARGETS: ++ return do_software_sendtargets(drec, ifaces, info_level, ++ do_login, op, sync_drec); ++ case DISCOVERY_TYPE_ISNS: ++ return do_isns(drec, ifaces, info_level, do_login, op); ++ default: ++ log_debug(1, "Unknown Discovery Type : %d", drec->type); ++ return ISCSI_ERR_UNKNOWN_DISCOVERY_TYPE; + } +- +- rc = exec_disc_op_on_recs(drec, &rec_list, info_level, do_login, op); +- +- list_for_each_entry_safe(rec, tmp, &rec_list, list) { +- list_del(&rec->list); +- free(rec); +- } +- +- return rc; + } + ++ + static int + verify_mode_params(int argc, char **argv, char *allowed, int skip_m) + { +@@ -1229,7 +1286,7 @@ static int iface_apply_net_config(struct iface_rec *iface, int op) + int fd; + + log_debug(8, "Calling iscsid, to apply net config for" +- "iface.name = %s\n", iface->name); ++ "iface.name = %s", iface->name); + + if (op == OP_APPLY_ALL) + iface_all = 1; +@@ -1373,19 +1430,193 @@ exit_chap_info: + return rc; + } + +-static int delete_host_chap_info(uint32_t host_no, char *value) ++static int fill_host_chap_rec(struct list_head *params, ++ struct iscsi_chap_rec *crec, recinfo_t *cinfo, ++ uint16_t chap_tbl_idx, int type, int *param_count) ++{ ++ struct user_param *param; ++ int rc = 0; ++ ++ crec->chap_tbl_idx = chap_tbl_idx; ++ crec->chap_type = type; ++ ++ idbm_recinfo_host_chap(crec, cinfo); ++ ++ list_for_each_entry(param, params, list) { ++ rc = idbm_rec_update_param(cinfo, param->name, param->value, 0); ++ if (rc) ++ break; ++ } ++ ++ if (!rc) ++ *param_count += 3; /* index, type and password_length */ ++ ++ return rc; ++} ++ ++static int verify_host_chap_params(struct list_head *params, int *type, ++ int *param_count) ++{ ++ struct user_param *param; ++ int username = -1; ++ int password = -1; ++ int rc = 0; ++ ++ list_for_each_entry(param, params, list) { ++ *param_count += 1; ++ ++ if (!strcmp(param->name, HOST_AUTH_USERNAME)) ++ username = CHAP_TYPE_OUT; ++ else if (!strcmp(param->name, HOST_AUTH_PASSWORD)) ++ password = CHAP_TYPE_OUT; ++ else if (!strcmp(param->name, HOST_AUTH_USERNAME_IN)) ++ username = CHAP_TYPE_IN; ++ else if (!strcmp(param->name, HOST_AUTH_PASSWORD_IN)) ++ password = CHAP_TYPE_IN; ++ else ++ continue; ++ } ++ ++ if ((username == CHAP_TYPE_OUT) && (password == CHAP_TYPE_OUT)) { ++ if (type) ++ *type = CHAP_TYPE_OUT; ++ ++ rc = ISCSI_SUCCESS; ++ } else if ((username == CHAP_TYPE_IN) && (password == CHAP_TYPE_IN)) { ++ if (type) ++ *type = CHAP_TYPE_IN; ++ ++ rc = ISCSI_SUCCESS; ++ } else { ++ rc = ISCSI_ERR; ++ } ++ ++ return rc; ++} ++ ++static int set_host_chap_info(uint32_t host_no, uint64_t chap_index, ++ struct list_head *params) ++{ ++ struct iscsi_transport *t = NULL; ++ struct iscsi_chap_rec crec; ++ recinfo_t *chap_info = NULL; ++ struct iovec *iovs = NULL; ++ struct iovec *iov = NULL; ++ int type; ++ int param_count = 0; ++ int param_used; ++ int rc = 0; ++ int fd, i = 0; ++ ++ if (list_empty(params)) { ++ log_error("Chap username/password not provided."); ++ goto exit_set_chap; ++ } ++ ++ chap_info = idbm_recinfo_alloc(MAX_KEYS); ++ if (!chap_info) { ++ log_error("Out of Memory."); ++ rc = ISCSI_ERR_NOMEM; ++ goto exit_set_chap; ++ } ++ ++ t = iscsi_sysfs_get_transport_by_hba(host_no); ++ if (!t) { ++ log_error("Could not match hostno %d to transport.", host_no); ++ rc = ISCSI_ERR_TRANS_NOT_FOUND; ++ goto free_info_rec; ++ } ++ ++ rc = verify_host_chap_params(params, &type, ¶m_count); ++ if (rc) { ++ log_error("Invalid username/password pair passed. Unable to determine the type of chap entry"); ++ rc = ISCSI_ERR_INVAL; ++ goto free_info_rec; ++ } ++ ++ if (param_count > 2) { ++ log_error("Only one pair of username/password can be passed."); ++ rc = ISCSI_ERR; ++ goto free_info_rec; ++ } ++ ++ memset(&crec, 0, sizeof(crec)); ++ rc = fill_host_chap_rec(params, &crec, chap_info, chap_index, type, ++ ¶m_count); ++ if (rc) { ++ log_error("Unable to fill CHAP record"); ++ goto free_info_rec; ++ } ++ ++ /* +2 for event and nlmsghdr */ ++ param_count += 2; ++ iovs = calloc((param_count * sizeof(struct iovec)), ++ sizeof(char)); ++ if (!iovs) { ++ log_error("Out of Memory."); ++ rc = ISCSI_ERR_NOMEM; ++ goto free_info_rec; ++ } ++ ++ /* param_used gives actual number of iovecs used for chap */ ++ param_used = chap_build_config(&crec, iovs); ++ if (!param_used) { ++ log_error("Build chap config failed."); ++ rc = ISCSI_ERR; ++ goto free_iovec; ++ } ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ rc = ISCSI_ERR_INTERNAL; ++ log_error("Netlink open failed."); ++ goto free_iovec; ++ } ++ ++ rc = ipc->set_chap(t->handle, host_no, iovs, param_count); ++ if (rc < 0) { ++ log_error("CHAP setting failed"); ++ if (rc == -EBUSY) { ++ rc = ISCSI_ERR_BUSY; ++ log_error("CHAP index %d is in use.", ++ crec.chap_tbl_idx); ++ } else { ++ rc = ISCSI_ERR; ++ } ++ ++ goto exit_set_chap; ++ } ++ ++ ipc->ctldev_close(); ++ ++free_iovec: ++ /* start at 2, because 0 is for nlmsghdr and 1 for event */ ++ iov = iovs + 2; ++ for (i = 0; i < param_used; i++, iov++) { ++ if (iov->iov_base) ++ free(iov->iov_base); ++ } ++ ++ free(iovs); ++ ++free_info_rec: ++ if (chap_info) ++ free(chap_info); ++ ++exit_set_chap: ++ return rc; ++} ++ ++static int delete_host_chap_info(uint32_t host_no, uint16_t chap_tbl_idx) + { + struct iscsi_transport *t = NULL; + int fd, rc = 0; +- uint16_t chap_tbl_idx; + +- if (!value) { +- log_error("CHAP deletion requires --value=table_index."); +- return ISCSI_ERR_INVAL; ++ if (chap_tbl_idx > MAX_CHAP_ENTRIES) { ++ log_error("Invalid chap table index."); ++ goto exit_delete_chap; + } + +- chap_tbl_idx = (uint16_t)atoi(value); +- + t = iscsi_sysfs_get_transport_by_hba(host_no); + if (!t) { + log_error("Could not match hostno %d to " +@@ -1401,7 +1632,7 @@ static int delete_host_chap_info(uint32_t host_no, char *value) + goto exit_delete_chap; + } + +- log_info("Deleteing CHAP index: %d\n", chap_tbl_idx); ++ log_info("Deleteing CHAP index: %d", chap_tbl_idx); + rc = ipc->delete_chap(t->handle, host_no, chap_tbl_idx); + if (rc < 0) { + log_error("CHAP Delete failed."); +@@ -1419,7 +1650,7 @@ exit_delete_chap: + } + + static int exec_host_chap_op(int op, int info_level, uint32_t host_no, +- char *value) ++ uint64_t chap_index, struct list_head *params) + { + int rc = ISCSI_ERR_INVAL; + +@@ -1427,8 +1658,12 @@ static int exec_host_chap_op(int op, int info_level, uint32_t host_no, + case OP_SHOW: + rc = get_host_chap_info(host_no); + break; ++ case OP_NEW: ++ case OP_UPDATE: ++ rc = set_host_chap_info(host_no, chap_index, params); ++ break; + case OP_DELETE: +- rc = delete_host_chap_info(host_no, value); ++ rc = delete_host_chap_info(host_no, chap_index); + break; + default: + log_error("Invalid operation."); +@@ -1438,6 +1673,588 @@ static int exec_host_chap_op(int op, int info_level, uint32_t host_no, + return rc; + } + ++static int get_flashnode_info(uint32_t host_no, uint32_t flashnode_idx) ++{ ++ struct flashnode_rec fnode; ++ int rc = 0; ++ ++ memset(&fnode, 0, sizeof(fnode)); ++ rc = iscsi_sysfs_get_flashnode_info(&fnode, host_no, flashnode_idx); ++ if (rc) { ++ log_error("Could not read info for flashnode %u of host %u, %s", ++ flashnode_idx, host_no, strerror(rc)); ++ return rc; ++ } ++ ++ idbm_print_flashnode_info(&fnode); ++ return rc; ++} ++ ++static int list_flashnodes(int info_level, uint32_t host_no) ++{ ++ int rc = 0; ++ int num_found = 0; ++ ++ rc = iscsi_sysfs_for_each_flashnode(NULL, host_no, &num_found, ++ flashnode_info_print_flat); ++ ++ if (!num_found) { ++ log_error("No flashnodes attached to host %u.", host_no); ++ rc = ISCSI_ERR_NO_OBJS_FOUND; ++ } ++ ++ return rc; ++} ++ ++int iscsi_set_flashnode_params(struct iscsi_transport *t, uint32_t host_no, ++ uint32_t flashnode_idx, struct list_head *params) ++{ ++ struct flashnode_rec fnode; ++ recinfo_t *flashnode_info; ++ struct user_param *param; ++ struct iovec *iovs = NULL; ++ struct iovec *iov = NULL; ++ int fd, rc = 0; ++ int param_count = 0; ++ int param_used = 0; ++ int i; ++ ++ flashnode_info = idbm_recinfo_alloc(MAX_KEYS); ++ if (!flashnode_info) { ++ log_error("Out of Memory."); ++ rc = ISCSI_ERR_NOMEM; ++ goto free_info_rec; ++ } ++ ++ memset(&fnode, 0, sizeof(fnode)); ++ rc = iscsi_sysfs_get_flashnode_info(&fnode, host_no, flashnode_idx); ++ if (rc) { ++ log_error("Could not read info for flashnode %u, %s", ++ flashnode_idx, strerror(rc)); ++ goto free_info_rec; ++ } ++ ++ idbm_recinfo_flashnode(&fnode, flashnode_info); ++ ++ i = 0; ++ list_for_each_entry(param, params, list) { ++ param_count++; ++ rc = idbm_verify_param(flashnode_info, param->name); ++ if (rc) ++ goto free_info_rec; ++ } ++ ++ list_for_each_entry(param, params, list) { ++ rc = idbm_rec_update_param(flashnode_info, param->name, ++ param->value, 0); ++ if (rc) ++ goto free_info_rec; ++ } ++ ++ /* +2 for event and nlmsghdr */ ++ param_count += 2; ++ iovs = calloc((param_count * sizeof(struct iovec)), ++ sizeof(char)); ++ if (!iovs) { ++ log_error("Out of Memory."); ++ rc = ISCSI_ERR_NOMEM; ++ goto free_info_rec; ++ } ++ ++ /* param_used gives actual number of iovecs used for flashnode */ ++ param_used = flashnode_build_config(params, &fnode, iovs); ++ if (!param_used) { ++ log_error("Build flashnode config failed."); ++ rc = ISCSI_ERR; ++ goto free_iovec; ++ } ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ log_error("Netlink open failed."); ++ rc = ISCSI_ERR_INTERNAL; ++ goto free_iovec; ++ } ++ ++ log_info("Update flashnode %u.", flashnode_idx); ++ rc = ipc->set_flash_node_params(t->handle, host_no, flashnode_idx, ++ iovs, param_count); ++ if (rc < 0) ++ rc = ISCSI_ERR; ++ ++ ++ ipc->ctldev_close(); ++ ++free_iovec: ++ /* start at 2, because 0 is for nlmsghdr and 1 for event */ ++ iov = iovs + 2; ++ for (i = 0; i < param_used; i++, iov++) { ++ if (iov->iov_base) ++ free(iov->iov_base); ++ } ++ ++ free(iovs); ++ ++free_info_rec: ++ if (flashnode_info) ++ free(flashnode_info); ++ ++ return rc; ++} ++ ++int iscsi_new_flashnode(struct iscsi_transport *t, uint32_t host_no, char *val, ++ uint32_t *flashnode_idx) ++{ ++ int fd, rc = 0; ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ log_error("Netlink open failed."); ++ rc = ISCSI_ERR_INTERNAL; ++ goto exit_new_flashnode; ++ } ++ ++ log_info("Create new flashnode for host %u.", host_no); ++ rc = ipc->new_flash_node(t->handle, host_no, val, flashnode_idx); ++ if (rc < 0) ++ rc = ISCSI_ERR; ++ ++ ipc->ctldev_close(); ++ ++exit_new_flashnode: ++ return rc; ++} ++ ++int iscsi_del_flashnode(struct iscsi_transport *t, uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ int fd, rc = 0; ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ log_error("Netlink open failed."); ++ rc = ISCSI_ERR_INTERNAL; ++ goto exit_del_flashnode; ++ } ++ ++ log_info("Delete flashnode %u.", flashnode_idx); ++ rc = ipc->del_flash_node(t->handle, host_no, flashnode_idx); ++ if (rc < 0) ++ rc = ISCSI_ERR; ++ ++ ipc->ctldev_close(); ++ ++exit_del_flashnode: ++ return rc; ++} ++ ++int iscsi_login_flashnode(struct iscsi_transport *t, uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ int fd, rc = 0; ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ log_error("Netlink open failed."); ++ rc = ISCSI_ERR_INTERNAL; ++ goto exit_login_flashnode; ++ } ++ ++ log_info("Login to flashnode %u.", flashnode_idx); ++ rc = ipc->login_flash_node(t->handle, host_no, flashnode_idx); ++ if (rc == -EPERM) ++ rc = ISCSI_ERR_SESS_EXISTS; ++ else if (rc < 0) ++ rc = ISCSI_ERR_LOGIN; ++ ++ ipc->ctldev_close(); ++ ++exit_login_flashnode: ++ return rc; ++} ++ ++int iscsi_logout_flashnode(struct iscsi_transport *t, uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ int fd, rc = 0; ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ log_error("Netlink open failed."); ++ rc = ISCSI_ERR_INTERNAL; ++ goto exit_logout; ++ } ++ ++ log_info("Logout flashnode %u.", flashnode_idx); ++ rc = ipc->logout_flash_node(t->handle, host_no, flashnode_idx); ++ if (rc == -ESRCH) ++ rc = ISCSI_ERR_SESS_NOT_FOUND; ++ else if (rc < 0) ++ rc = ISCSI_ERR_LOGOUT; ++ ++ ipc->ctldev_close(); ++ ++exit_logout: ++ return rc; ++} ++ ++int iscsi_logout_flashnode_sid(struct iscsi_transport *t, uint32_t host_no, ++ uint32_t sid) ++{ ++ int fd, rc = 0; ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ log_error("Netlink open failed."); ++ rc = ISCSI_ERR_INTERNAL; ++ goto exit_logout_sid; ++ } ++ ++ log_info("Logout sid %u.", sid); ++ rc = ipc->logout_flash_node_sid(t->handle, host_no, sid); ++ if (rc < 0) { ++ log_error("Logout of sid %u failed.", sid); ++ rc = ISCSI_ERR_LOGOUT; ++ } else { ++ log_info("Logout of sid %u successful.", sid); ++ } ++ ++ ipc->ctldev_close(); ++ ++exit_logout_sid: ++ return rc; ++} ++ ++static int exec_flashnode_op(int op, int info_level, uint32_t host_no, ++ uint64_t fnode_idx, int type, ++ struct list_head *params) ++{ ++ struct iscsi_transport *t = NULL; ++ int rc = ISCSI_SUCCESS; ++ char *portal_type; ++ uint32_t flashnode_idx; ++ ++ if (op != OP_SHOW && op != OP_NOOP && op != OP_NEW && ++ fnode_idx > MAX_FLASHNODE_IDX) { ++ log_error("Invalid flashnode index"); ++ rc = ISCSI_ERR_INVAL; ++ goto exit_flashnode_op; ++ } ++ ++ flashnode_idx = (uint32_t)fnode_idx; ++ t = iscsi_sysfs_get_transport_by_hba(host_no); ++ if (!t) { ++ log_error("Could not match hostno %u to transport.", host_no); ++ rc = ISCSI_ERR_TRANS_NOT_FOUND; ++ goto exit_flashnode_op; ++ } ++ ++ switch (op) { ++ case OP_NOOP: ++ case OP_SHOW: ++ if (fnode_idx > MAX_FLASHNODE_IDX) ++ rc = list_flashnodes(info_level, host_no); ++ else ++ rc = get_flashnode_info(host_no, flashnode_idx); ++ break; ++ case OP_NEW: ++ if (type == IPV4) { ++ portal_type = "ipv4"; ++ } else if (type == IPV6) { ++ portal_type = "ipv6"; ++ } else { ++ log_error("Invalid type mentioned for flashnode"); ++ rc = ISCSI_ERR_INVAL; ++ goto exit_flashnode_op; ++ } ++ rc = iscsi_new_flashnode(t, host_no, portal_type, ++ &flashnode_idx); ++ if (!rc) ++ log_info("New flashnode for host %u added at index %u.", ++ host_no, flashnode_idx); ++ else ++ log_error("Creation of flashnode for host %u failed.", ++ host_no); ++ break; ++ case OP_DELETE: ++ rc = iscsi_del_flashnode(t, host_no, flashnode_idx); ++ if (!rc) ++ log_info("Flashnode %u of host %u deleted.", ++ flashnode_idx, host_no); ++ else ++ log_error("Deletion of flashnode %u of host %u failed.", ++ flashnode_idx, host_no); ++ break; ++ case OP_UPDATE: ++ rc = iscsi_set_flashnode_params(t, host_no, flashnode_idx, ++ params); ++ if (!rc) ++ log_info("Update for flashnode %u of host %u successful.", ++ flashnode_idx, host_no); ++ else ++ log_error("Update for flashnode %u of host %u failed.", ++ flashnode_idx, host_no); ++ break; ++ case OP_LOGIN: ++ rc = iscsi_login_flashnode(t, host_no, flashnode_idx); ++ if (!rc) ++ log_info("Login to flashnode %u of host %u successful.", ++ flashnode_idx, host_no); ++ else if (rc == ISCSI_ERR_SESS_EXISTS) ++ log_info("Flashnode %u of host %u already logged in.", ++ flashnode_idx, host_no); ++ else ++ log_error("Login to flashnode %u of host %u failed.", ++ flashnode_idx, host_no); ++ break; ++ case OP_LOGOUT: ++ rc = iscsi_logout_flashnode(t, host_no, flashnode_idx); ++ if (!rc) ++ log_info("Logout of flashnode %u of host %u successful.", ++ flashnode_idx, host_no); ++ else if (rc == ISCSI_ERR_SESS_NOT_FOUND) ++ log_info("Flashnode %u of host %u not logged in.", ++ flashnode_idx, host_no); ++ else ++ log_error("Logout of flashnode %u of host %u failed.", ++ flashnode_idx, host_no); ++ break; ++ default: ++ log_error("Invalid operation"); ++ rc = ISCSI_ERR_INVAL; ++ break; ++ } ++ ++exit_flashnode_op: ++ return rc; ++} ++ ++static void print_host_stats(struct iscsi_offload_host_stats *host_stats) ++{ ++ /* MAC */ ++ printf("Host Statistics:\n" ++ "\tmactx_frames: %lld\n" ++ "\tmactx_bytes: %lld\n" ++ "\tmactx_multicast_frames: %lld\n" ++ "\tmactx_broadcast_frames: %lld\n" ++ "\tmactx_pause_frames: %lld\n" ++ "\tmactx_control_frames: %lld\n" ++ "\tmactx_deferral: %lld\n" ++ "\tmactx_excess_deferral: %lld\n" ++ "\tmactx_late_collision: %lld\n" ++ "\tmactx_abort: %lld\n" ++ "\tmactx_single_collision: %lld\n" ++ "\tmactx_multiple_collision: %lld\n" ++ "\tmactx_collision: %lld\n" ++ "\tmactx_frames_dropped: %lld\n" ++ "\tmactx_jumbo_frames: %lld\n" ++ "\tmacrx_frames: %lld\n" ++ "\tmacrx_bytes: %lld\n" ++ "\tmacrx_unknown_control_frames: %lld\n" ++ "\tmacrx_pause_frames: %lld\n" ++ "\tmacrx_control_frames: %lld\n" ++ "\tmacrx_dribble: %lld\n" ++ "\tmacrx_frame_length_error: %lld\n" ++ "\tmacrx_jabber: %lld\n" ++ "\tmacrx_carrier_sense_error: %lld\n" ++ "\tmacrx_frame_discarded: %lld\n" ++ "\tmacrx_frames_dropped: %lld\n" ++ "\tmac_crc_error: %lld\n" ++ "\tmac_encoding_error: %lld\n" ++ "\tmacrx_length_error_large: %lld\n" ++ "\tmacrx_length_error_small: %lld\n" ++ "\tmacrx_multicast_frames: %lld\n" ++ "\tmacrx_broadcast_frames: %lld\n" ++ /* IP */ ++ "\tiptx_packets: %lld\n" ++ "\tiptx_bytes: %lld\n" ++ "\tiptx_fragments: %lld\n" ++ "\tiprx_packets: %lld\n" ++ "\tiprx_bytes: %lld\n" ++ "\tiprx_fragments: %lld\n" ++ "\tip_datagram_reassembly: %lld\n" ++ "\tip_invalid_address_error: %lld\n" ++ "\tip_error_packets: %lld\n" ++ "\tip_fragrx_overlap: %lld\n" ++ "\tip_fragrx_outoforder: %lld\n" ++ "\tip_datagram_reassembly_timeout: %lld\n" ++ "\tipv6tx_packets: %lld\n" ++ "\tipv6tx_bytes: %lld\n" ++ "\tipv6tx_fragments: %lld\n" ++ "\tipv6rx_packets: %lld\n" ++ "\tipv6rx_bytes: %lld\n" ++ "\tipv6rx_fragments: %lld\n" ++ "\tipv6_datagram_reassembly: %lld\n" ++ "\tipv6_invalid_address_error: %lld\n" ++ "\tipv6_error_packets: %lld\n" ++ "\tipv6_fragrx_overlap: %lld\n" ++ "\tipv6_fragrx_outoforder: %lld\n" ++ "\tipv6_datagram_reassembly_timeout: %lld\n" ++ /* TCP */ ++ "\ttcptx_segments: %lld\n" ++ "\ttcptx_bytes: %lld\n" ++ "\ttcprx_segments: %lld\n" ++ "\ttcprx_byte: %lld\n" ++ "\ttcp_duplicate_ack_retx: %lld\n" ++ "\ttcp_retx_timer_expired: %lld\n" ++ "\ttcprx_duplicate_ack: %lld\n" ++ "\ttcprx_pure_ackr: %lld\n" ++ "\ttcptx_delayed_ack: %lld\n" ++ "\ttcptx_pure_ack: %lld\n" ++ "\ttcprx_segment_error: %lld\n" ++ "\ttcprx_segment_outoforder: %lld\n" ++ "\ttcprx_window_probe: %lld\n" ++ "\ttcprx_window_update: %lld\n" ++ "\ttcptx_window_probe_persist: %lld\n" ++ /* ECC */ ++ "\tecc_error_correction: %lld\n" ++ /* iSCSI */ ++ "\tiscsi_pdu_tx: %lld\n" ++ "\tiscsi_data_bytes_tx: %lld\n" ++ "\tiscsi_pdu_rx: %lld\n" ++ "\tiscsi_data_bytes_rx: %lld\n" ++ "\tiscsi_io_completed: %lld\n" ++ "\tiscsi_unexpected_io_rx: %lld\n" ++ "\tiscsi_format_error: %lld\n" ++ "\tiscsi_hdr_digest_error: %lld\n" ++ "\tiscsi_data_digest_error: %lld\n" ++ "\tiscsi_sequence_error: %lld\n", ++ /* MAC */ ++ (unsigned long long)host_stats->mactx_frames, ++ (unsigned long long)host_stats->mactx_bytes, ++ (unsigned long long)host_stats->mactx_multicast_frames, ++ (unsigned long long)host_stats->mactx_broadcast_frames, ++ (unsigned long long)host_stats->mactx_pause_frames, ++ (unsigned long long)host_stats->mactx_control_frames, ++ (unsigned long long)host_stats->mactx_deferral, ++ (unsigned long long)host_stats->mactx_excess_deferral, ++ (unsigned long long)host_stats->mactx_late_collision, ++ (unsigned long long)host_stats->mactx_abort, ++ (unsigned long long)host_stats->mactx_single_collision, ++ (unsigned long long)host_stats->mactx_multiple_collision, ++ (unsigned long long)host_stats->mactx_collision, ++ (unsigned long long)host_stats->mactx_frames_dropped, ++ (unsigned long long)host_stats->mactx_jumbo_frames, ++ (unsigned long long)host_stats->macrx_frames, ++ (unsigned long long)host_stats->macrx_bytes, ++ (unsigned long long)host_stats->macrx_unknown_control_frames, ++ (unsigned long long)host_stats->macrx_pause_frames, ++ (unsigned long long)host_stats->macrx_control_frames, ++ (unsigned long long)host_stats->macrx_dribble, ++ (unsigned long long)host_stats->macrx_frame_length_error, ++ (unsigned long long)host_stats->macrx_jabber, ++ (unsigned long long)host_stats->macrx_carrier_sense_error, ++ (unsigned long long)host_stats->macrx_frame_discarded, ++ (unsigned long long)host_stats->macrx_frames_dropped, ++ (unsigned long long)host_stats->mac_crc_error, ++ (unsigned long long)host_stats->mac_encoding_error, ++ (unsigned long long)host_stats->macrx_length_error_large, ++ (unsigned long long)host_stats->macrx_length_error_small, ++ (unsigned long long)host_stats->macrx_multicast_frames, ++ (unsigned long long)host_stats->macrx_broadcast_frames, ++ /* IP */ ++ (unsigned long long)host_stats->iptx_packets, ++ (unsigned long long)host_stats->iptx_bytes, ++ (unsigned long long)host_stats->iptx_fragments, ++ (unsigned long long)host_stats->iprx_packets, ++ (unsigned long long)host_stats->iprx_bytes, ++ (unsigned long long)host_stats->iprx_fragments, ++ (unsigned long long)host_stats->ip_datagram_reassembly, ++ (unsigned long long)host_stats->ip_invalid_address_error, ++ (unsigned long long)host_stats->ip_error_packets, ++ (unsigned long long)host_stats->ip_fragrx_overlap, ++ (unsigned long long)host_stats->ip_fragrx_outoforder, ++ (unsigned long long)host_stats->ip_datagram_reassembly_timeout, ++ (unsigned long long)host_stats->ipv6tx_packets, ++ (unsigned long long)host_stats->ipv6tx_bytes, ++ (unsigned long long)host_stats->ipv6tx_fragments, ++ (unsigned long long)host_stats->ipv6rx_packets, ++ (unsigned long long)host_stats->ipv6rx_bytes, ++ (unsigned long long)host_stats->ipv6rx_fragments, ++ (unsigned long long)host_stats->ipv6_datagram_reassembly, ++ (unsigned long long)host_stats->ipv6_invalid_address_error, ++ (unsigned long long)host_stats->ipv6_error_packets, ++ (unsigned long long)host_stats->ipv6_fragrx_overlap, ++ (unsigned long long)host_stats->ipv6_fragrx_outoforder, ++ (unsigned long long)host_stats->ipv6_datagram_reassembly_timeout, ++ /* TCP */ ++ (unsigned long long)host_stats->tcptx_segments, ++ (unsigned long long)host_stats->tcptx_bytes, ++ (unsigned long long)host_stats->tcprx_segments, ++ (unsigned long long)host_stats->tcprx_byte, ++ (unsigned long long)host_stats->tcp_duplicate_ack_retx, ++ (unsigned long long)host_stats->tcp_retx_timer_expired, ++ (unsigned long long)host_stats->tcprx_duplicate_ack, ++ (unsigned long long)host_stats->tcprx_pure_ackr, ++ (unsigned long long)host_stats->tcptx_delayed_ack, ++ (unsigned long long)host_stats->tcptx_pure_ack, ++ (unsigned long long)host_stats->tcprx_segment_error, ++ (unsigned long long)host_stats->tcprx_segment_outoforder, ++ (unsigned long long)host_stats->tcprx_window_probe, ++ (unsigned long long)host_stats->tcprx_window_update, ++ (unsigned long long)host_stats->tcptx_window_probe_persist, ++ /* ECC */ ++ (unsigned long long)host_stats->ecc_error_correction, ++ /* iSCSI */ ++ (unsigned long long)host_stats->iscsi_pdu_tx, ++ (unsigned long long)host_stats->iscsi_data_bytes_tx, ++ (unsigned long long)host_stats->iscsi_pdu_rx, ++ (unsigned long long)host_stats->iscsi_data_bytes_rx, ++ (unsigned long long)host_stats->iscsi_io_completed, ++ (unsigned long long)host_stats->iscsi_unexpected_io_rx, ++ (unsigned long long)host_stats->iscsi_format_error, ++ (unsigned long long)host_stats->iscsi_hdr_digest_error, ++ (unsigned long long)host_stats->iscsi_data_digest_error, ++ (unsigned long long)host_stats->iscsi_sequence_error); ++} ++ ++static int exec_host_stats_op(int op, int info_level, uint32_t host_no) ++{ ++ struct iscsi_transport *t = NULL; ++ char *req_buf = NULL; ++ int rc = ISCSI_SUCCESS; ++ int fd = 0, buf_size = 0; ++ ++ t = iscsi_sysfs_get_transport_by_hba(host_no); ++ if (!t) { ++ log_error("Could not match hostno %u to transport.", host_no); ++ rc = ISCSI_ERR_TRANS_NOT_FOUND; ++ goto exit_host_stats; ++ } ++ ++ buf_size = sizeof(struct iscsi_offload_host_stats) + ++ sizeof(struct iscsi_uevent); ++ req_buf = calloc(1, buf_size); ++ if (!req_buf) { ++ log_error("Could not allocate memory for host stats request."); ++ rc = ISCSI_ERR_NOMEM; ++ goto exit_host_stats; ++ } ++ ++ fd = ipc->ctldev_open(); ++ if (fd < 0) { ++ rc = ISCSI_ERR_INTERNAL; ++ log_error("Netlink open failed."); ++ goto exit_host_stats; ++ } ++ ++ rc = ipc->get_host_stats(t->handle, host_no, req_buf); ++ if (rc < 0) { ++ log_error("get_host_stats failed. errno=%d", errno); ++ rc = ISCSI_ERR; ++ goto exit_host_stats; ++ } ++ ++ print_host_stats((struct iscsi_offload_host_stats *)(req_buf + ++ sizeof(struct iscsi_uevent))); ++ ++ ipc->ctldev_close(); ++ ++exit_host_stats: ++ free(req_buf); ++ return rc; ++} ++ + static int verify_iface_params(struct list_head *params, struct node_rec *rec) + { + struct user_param *param; +@@ -1473,7 +2290,7 @@ static int verify_iface_params(struct list_head *params, struct node_rec *rec) + + /* TODO: merge iter helpers and clean them up, so we can use them here */ + static int exec_iface_op(int op, int do_show, int info_level, +- struct iface_rec *iface, uint32_t host_no, ++ struct iface_rec *iface, uint64_t host_no, + struct list_head *params) + { + struct host_info hinfo; +@@ -1594,9 +2411,9 @@ update_fail: + printf("%s applied.\n", iface->name); + break; + case OP_APPLY_ALL: +- if (host_no == -1) { +- log_error("Applyall requires a host number or MAC " +- "passed in with the --host argument."); ++ if (host_no > MAX_HOST_NO) { ++ log_error("Applyall requires a valid host number or MAC" ++ " passed in with the --host argument."); + rc = ISCSI_ERR_INVAL; + break; + } +@@ -1607,7 +2424,7 @@ update_fail: + memset(&hinfo, 0, sizeof(struct host_info)); + hinfo.host_no = host_no; + if (iscsi_sysfs_get_hostinfo_by_host_no(&hinfo)) { +- log_error("Could not match host%u to ifaces.", host_no); ++ log_error("Could not match host%lu to ifaces.", host_no); + rc = ISCSI_ERR_INVAL; + break; + } +@@ -1618,7 +2435,7 @@ update_fail: + break; + } + +- printf("Applied settings to ifaces attached to host%u.\n", ++ printf("Applied settings to ifaces attached to host%lu.\n", + host_no); + break; + default: +@@ -1711,12 +2528,12 @@ static int exec_node_op(int op, int do_login, int do_logout, + } + + if (do_rescan) { +- rc = for_each_session(rec, rescan_portal); ++ rc = for_each_session(rec, rescan_portal, 1); + goto out; + } + + if (do_stats) { +- rc = for_each_session(rec, session_stats); ++ rc = for_each_session(rec, session_stats, 0); + goto out; + } + +@@ -1832,7 +2649,7 @@ static int exec_fw_disc_op(discovery_rec_t *drec, struct list_head *ifaces, + rc = fw_get_targets(&targets); + if (rc) { + log_error("Could not get list of targets from firmware. " +- "(err %d)\n", rc); ++ "(err %d)", rc); + return rc; + } + rc = iface_create_ifaces_from_boot_contexts(&new_ifaces, &targets); +@@ -1845,7 +2662,7 @@ discover_fw_tgts: + rc = idbm_bind_ifaces_to_nodes(discovery_fw, drec, + ifaces, &rec_list); + if (rc) +- log_error("Could not perform fw discovery.\n"); ++ log_error("Could not perform fw discovery."); + else + rc = exec_disc_op_on_recs(drec, &rec_list, info_level, + do_login, op); +@@ -1883,7 +2700,7 @@ static int exec_fw_op(discovery_rec_t *drec, struct list_head *ifaces, + rc = fw_get_targets(&targets); + if (rc) { + log_error("Could not get list of targets from firmware. " +- "(err %d)\n", rc); ++ "(err %d)", rc); + return rc; + } + +@@ -1892,7 +2709,7 @@ static int exec_fw_op(discovery_rec_t *drec, struct list_head *ifaces, + rec = idbm_create_rec_from_boot_context(context); + if (!rec) { + log_error("Could not convert firmware info to " +- "node record.\n"); ++ "node record."); + rc = ISCSI_ERR_NOMEM; + break; + } +@@ -1999,16 +2816,10 @@ static int exec_discover(int disc_type, char *ip, int port, + rc = 0; + switch (disc_type) { + case DISCOVERY_TYPE_SENDTARGETS: +- /* +- * idbm_add_discovery call above handles drec syncing so +- * we always pass in 0 here. +- */ +- rc = do_sendtargets(drec, ifaces, info_level, do_login, op, ++ case DISCOVERY_TYPE_ISNS: ++ rc = do_target_discovery(drec, ifaces, info_level, do_login, op, + 0); + break; +- case DISCOVERY_TYPE_ISNS: +- rc = do_isns(drec, ifaces, info_level, do_login, op); +- break; + default: + log_error("Unsupported discovery type."); + break; +@@ -2140,8 +2951,7 @@ static int exec_disc_op(int disc_type, char *ip, int port, + idbm_sendtargets_defaults(&drec.u.sendtargets); + strlcpy(drec.address, ip, sizeof(drec.address)); + drec.port = port; +- +- rc = do_sendtargets(&drec, ifaces, info_level, ++ rc = do_target_discovery(&drec, ifaces, info_level, + do_login, op, 1); + if (rc) + goto done; +@@ -2164,7 +2974,9 @@ static int exec_disc_op(int disc_type, char *ip, int port, + else + drec.port = port; + +- rc = do_isns(&drec, ifaces, info_level, do_login, op); ++ drec.type = DISCOVERY_TYPE_ISNS; ++ rc = do_target_discovery(&drec, ifaces, info_level, ++ do_login, op, 0); + if (rc) + goto done; + break; +@@ -2195,8 +3007,9 @@ static int exec_disc_op(int disc_type, char *ip, int port, + } + if ((do_discover || do_login) && + drec.type == DISCOVERY_TYPE_SENDTARGETS) { +- rc = do_sendtargets(&drec, ifaces, info_level, +- do_login, op, 0); ++ rc = do_target_discovery(&drec, ifaces, ++ info_level, do_login, ++ op, 0); + } else if (op == OP_NOOP || op == OP_SHOW) { + if (!idbm_print_discovery_info(&drec, + do_show)) { +@@ -2234,10 +3047,10 @@ done: + return rc; + } + +-static uint32_t parse_host_info(char *optarg, int *rc) ++static uint64_t parse_host_info(char *optarg, int *rc) + { + int err = 0; +- uint32_t host_no = -1; ++ uint64_t host_no; + + *rc = 0; + if (strstr(optarg, ":")) { +@@ -2250,8 +3063,11 @@ static uint32_t parse_host_info(char *optarg, int *rc) + *rc = ISCSI_ERR_INVAL; + } + } else { +- host_no = strtoul(optarg, NULL, 10); +- if (errno) { ++ host_no = strtoull(optarg, NULL, 10); ++ if (errno || (host_no > MAX_HOST_NO)) { ++ if (host_no > MAX_HOST_NO) ++ errno = ERANGE; ++ + log_error("Invalid host no %s. %s.", + optarg, strerror(errno)); + *rc = ISCSI_ERR_INVAL; +@@ -2286,7 +3102,7 @@ static char *iscsi_ping_stat_strs[] = { + static char *iscsi_ping_stat_to_str(uint32_t status) + { + if (status < 0 || status > ISCSI_PING_NO_ARP_RECEIVED) { +- log_error("Invalid ping status %u\n", status); ++ log_error("Invalid ping status %u", status); + return NULL; + } + +@@ -2403,12 +3219,14 @@ main(int argc, char **argv) + int tpgt = PORTAL_GROUP_TAG_UNKNOWN, killiscsid=-1, do_show=0; + int packet_size=32, ping_count=1, ping_interval=0; + int do_discover = 0, sub_mode = -1; ++ int portal_type = -1; + struct sigaction sa_old; + struct sigaction sa_new; + struct list_head ifaces; + struct iface_rec *iface = NULL, *tmp; + struct node_rec *rec = NULL; +- uint32_t host_no = -1; ++ uint64_t host_no = (uint64_t)MAX_HOST_NO + 1; ++ uint64_t index = ULLONG_MAX; + struct user_param *param; + struct list_head params; + +@@ -2551,6 +3369,18 @@ main(int argc, char **argv) + printf("%s version %s\n", program_name, + ISCSI_VERSION_STR); + return 0; ++ case 'x': ++ index = strtoull(optarg, NULL, 10); ++ if (errno) { ++ log_error("Invalid index %s. %s.", ++ optarg, strerror(errno)); ++ rc = ISCSI_ERR_INVAL; ++ goto free_ifaces; ++ } ++ break; ++ case 'A': ++ portal_type = str_to_portal_type(optarg); ++ break; + case 'h': + usage(0); + } +@@ -2583,7 +3413,7 @@ main(int argc, char **argv) + usage(ISCSI_ERR_INVAL); + + if (mode == MODE_FW) { +- if ((rc = verify_mode_params(argc, argv, "ml", 0))) { ++ if ((rc = verify_mode_params(argc, argv, "dml", 0))) { + log_error("fw mode: option '-%c' is not " + "allowed/supported", rc); + rc = ISCSI_ERR_INVAL; +@@ -2603,7 +3433,7 @@ main(int argc, char **argv) + + switch (mode) { + case MODE_HOST: +- if ((rc = verify_mode_params(argc, argv, "CHdmPov", 0))) { ++ if ((rc = verify_mode_params(argc, argv, "CHdmPotnvxA", 0))) { + log_error("host mode: option '-%c' is not " + "allowed/supported", rc); + rc = ISCSI_ERR_INVAL; +@@ -2612,15 +3442,44 @@ main(int argc, char **argv) + if (sub_mode != -1) { + switch (sub_mode) { + case MODE_CHAP: +- if (!op || !host_no) { ++ if (!op || (host_no > MAX_HOST_NO)) { + log_error("CHAP mode requires host " + "no and valid operation"); + rc = ISCSI_ERR_INVAL; + break; + } ++ ++ if (index == ULLONG_MAX) ++ index = (uint64_t)MAX_CHAP_ENTRIES + 1; ++ + rc = exec_host_chap_op(op, info_level, host_no, +- value); ++ index, ¶ms); + break; ++ case MODE_FLASHNODE: ++ if (host_no > MAX_HOST_NO) { ++ log_error("FLASHNODE mode requires host no"); ++ rc = ISCSI_ERR_INVAL; ++ break; ++ } ++ ++ if (index == ULLONG_MAX) ++ index = (uint64_t)MAX_FLASHNODE_IDX + 1; ++ ++ rc = exec_flashnode_op(op, info_level, host_no, ++ index, portal_type, ++ ¶ms); ++ break; ++ case MODE_HOST_STATS: ++ if (host_no > MAX_HOST_NO) { ++ log_error("STATS mode requires host no"); ++ rc = ISCSI_ERR_INVAL; ++ break; ++ } ++ ++ rc = exec_host_stats_op(op, info_level, ++ host_no); ++ break; ++ + default: + log_error("Invalid Sub Mode"); + break; +diff --git a/usr/iscsid.c b/usr/iscsid.c +index b4bb65b..f8ffd23 100644 +--- a/usr/iscsid.c ++++ b/usr/iscsid.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -111,9 +112,7 @@ setup_rec_from_negotiated_values(node_rec_t *rec, struct session_info *info) + strlcpy(rec->name, info->targetname, TARGET_NAME_MAXLEN); + rec->conn[0].port = info->persistent_port; + strlcpy(rec->conn[0].address, info->persistent_address, NI_MAXHOST); +- memcpy(&rec->iface, &info->iface, sizeof(struct iface_rec)); + rec->tpgt = info->tpgt; +- iface_copy(&rec->iface, &info->iface); + + iscsi_sysfs_get_negotiated_session_conf(info->sid, &session_conf); + iscsi_sysfs_get_negotiated_conn_conf(info->sid, &conn_conf); +@@ -194,7 +193,7 @@ static int sync_session(void *data, struct session_info *info) + struct iscsi_transport *t; + int rc, retries = 0; + +- log_debug(7, "sync session [%d][%s,%s.%d][%s]\n", info->sid, ++ log_debug(7, "sync session [%d][%s,%s.%d][%s]", info->sid, + info->targetname, info->persistent_address, + info->port, info->iface.hwaddress); + +@@ -236,8 +235,9 @@ static int sync_session(void *data, struct session_info *info) + info->persistent_address, info->persistent_port, + &info->iface)) { + log_warning("Could not read data from db. Using default and " +- "currently negotiated values\n"); ++ "currently negotiated values"); + setup_rec_from_negotiated_values(&rec, info); ++ iface_copy(&rec.iface, &info->iface); + } else { + /* + * we have a valid record and iface so lets merge +@@ -251,13 +251,12 @@ static int sync_session(void *data, struct session_info *info) + memset(&sysfsrec, 0, sizeof(node_rec_t)); + setup_rec_from_negotiated_values(&sysfsrec, info); + /* +- * target, portal and iface name values have to be the same ++ * target, portal and iface values have to be the same + * or we would not have found the record, so just copy +- * CHAP and iface settings. ++ * CHAP settings. + */ + memcpy(&rec.session.auth, &sysfsrec.session.auth, + sizeof(struct iscsi_auth_config)); +- memcpy(&rec.iface, &info->iface, sizeof(rec.iface)); + } + + /* multiple drivers could be connected to the same portal */ +@@ -333,7 +332,7 @@ static void missing_iname_warn(char *initiatorname_file) + "iqn.yyyy-mm.[:identifier].\n\n" + "Example: InitiatorName=iqn.2001-04.com.redhat:fc6.\n" + "If using hardware iscsi like qla4xxx this message can be " +- "ignored.\n", initiatorname_file, initiatorname_file); ++ "ignored.", initiatorname_file, initiatorname_file); + } + + int main(int argc, char *argv[]) +@@ -342,6 +341,7 @@ int main(int argc, char *argv[]) + char *config_file = CONFIG_FILE; + char *initiatorname_file = INITIATOR_NAME_FILE; + char *pid_file = PID_FILE; ++ char *safe_logout; + int ch, longindex; + uid_t uid = 0; + struct sigaction sa_old; +@@ -477,11 +477,25 @@ int main(int argc, char *argv[]) + } + } + +- if (uid && setuid(uid) < 0) +- perror("setuid\n"); ++ if (gid && setgid(gid) < 0) { ++ log_error("Unable to setgid to %d", gid); ++ log_close(log_pid); ++ exit(ISCSI_ERR); ++ } + +- if (gid && setgid(gid) < 0) +- perror("setgid\n"); ++ if ((geteuid() == 0) && (getgroups(0, NULL))) { ++ if (setgroups(0, NULL) != 0) { ++ log_error("Unable to drop supplementary group ids"); ++ log_close(log_pid); ++ exit(ISCSI_ERR); ++ } ++ } ++ ++ if (uid && setuid(uid) < 0) { ++ log_error("Unable to setuid to %d", uid); ++ log_close(log_pid); ++ exit(ISCSI_ERR); ++ } + + memset(&daemon_config, 0, sizeof (daemon_config)); + daemon_config.pid_file = pid_file; +@@ -507,11 +521,17 @@ int main(int argc, char *argv[]) + daemon_config.initiator_name : "NOT SET"); + log_debug(1, "InitiatorAlias=%s", daemon_config.initiator_alias); + ++ safe_logout = cfg_get_string_param(config_file, "iscsid.safe_logout"); ++ if (safe_logout && !strcmp(safe_logout, "Yes")) ++ daemon_config.safe_logout = 1; ++ free(safe_logout); ++ + pid = fork(); + if (pid == 0) { + int nr_found = 0; + /* child */ +- iscsi_sysfs_for_each_session(NULL, &nr_found, sync_session); ++ /* TODO - test with async support enabled */ ++ iscsi_sysfs_for_each_session(NULL, &nr_found, sync_session, 0); + exit(0); + } else if (pid < 0) { + log_error("Fork failed error %d: existing sessions" +@@ -534,7 +554,6 @@ int main(int argc, char *argv[]) + exit(ISCSI_ERR); + } + +- actor_init(); + event_loop(ipc, control_fd, mgmt_ipc_fd); + + idbm_terminate(); +diff --git a/usr/iscsid.h b/usr/iscsid.h +index 15f264f..b9f3d54 100644 +--- a/usr/iscsid.h ++++ b/usr/iscsid.h +@@ -29,6 +29,7 @@ struct iscsi_daemon_config { + char *pid_file; + char *initiator_name; + char *initiator_alias; ++ int safe_logout; + }; + extern struct iscsi_daemon_config *dconfig; + +diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c +index 0902011..75bcf22 100644 +--- a/usr/iscsid_req.c ++++ b/usr/iscsid_req.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -32,6 +33,7 @@ + #include "iscsi_util.h" + #include "config.h" + #include "iscsi_err.h" ++#include "uip_mgmt_ipc.h" + + static void iscsid_startup(void) + { +@@ -54,9 +56,9 @@ static void iscsid_startup(void) + + #define MAXSLEEP 128 + +-static int iscsid_connect(int *fd, int start_iscsid) ++static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid) + { +- int nsec; ++ int nsec, addr_len; + struct sockaddr_un addr; + + *fd = socket(AF_LOCAL, SOCK_STREAM, 0); +@@ -65,15 +67,13 @@ static int iscsid_connect(int *fd, int start_iscsid) + return ISCSI_ERR_ISCSID_NOTCONN; + } + +- memset(&addr, 0, sizeof(addr)); +- addr.sun_family = AF_LOCAL; +- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, +- strlen(ISCSIADM_NAMESPACE)); ++ addr_len = setup_abstract_addr(&addr, unix_sock_name); ++ + /* + * Trying to connect with exponential backoff + */ + for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) { +- if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0) ++ if (connect(*fd, (struct sockaddr *) &addr, addr_len) == 0) + /* Connection established */ + return ISCSI_SUCCESS; + +@@ -96,6 +96,11 @@ static int iscsid_connect(int *fd, int start_iscsid) + return ISCSI_ERR_ISCSID_NOTCONN; + } + ++static int iscsid_connect(int *fd, int start_iscsid) ++{ ++ return ipc_connect(fd, ISCSIADM_NAMESPACE, start_iscsid); ++} ++ + int iscsid_request(int *fd, iscsiadm_req_t *req, int start_iscsid) + { + int err; +@@ -192,3 +197,82 @@ int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid) + return err; + return iscsid_req_wait(cmd, fd); + } ++ ++static int uip_connect(int *fd) ++{ ++ return ipc_connect(fd, ISCSID_UIP_NAMESPACE, 0); ++} ++ ++int uip_broadcast(void *buf, size_t buf_len) ++{ ++ int err; ++ int fd; ++ iscsid_uip_rsp_t rsp; ++ int flags; ++ int count; ++ ++ err = uip_connect(&fd); ++ if (err) { ++ log_warning("uIP daemon is not up"); ++ return err; ++ } ++ ++ log_debug(3, "connected to uIP daemon"); ++ ++ /* Send the data to uIP */ ++ err = write(fd, buf, buf_len); ++ if (err != buf_len) { ++ log_error("got write error (%d/%d), daemon died?", ++ err, errno); ++ close(fd); ++ return ISCSI_ERR_ISCSID_COMM_ERR; ++ } ++ ++ log_debug(3, "send iface config to uIP daemon"); ++ ++ /* Set the socket to a non-blocking read, this way if there are ++ * problems waiting for uIP, iscsid can bailout early */ ++ flags = fcntl(fd, F_GETFL, 0); ++ if (flags == -1) ++ flags = 0; ++ err = fcntl(fd, F_SETFL, flags | O_NONBLOCK); ++ if (err) { ++ log_error("could not set uip broadcast to non-blocking: %d", ++ errno); ++ close(fd); ++ return ISCSI_ERR; ++ } ++ ++#define MAX_UIP_BROADCAST_READ_TRIES 3 ++ for (count = 0; count < MAX_UIP_BROADCAST_READ_TRIES; count++) { ++ /* Wait for the response */ ++ err = read(fd, &rsp, sizeof(rsp)); ++ if (err == sizeof(rsp)) { ++ log_debug(3, "Broadcasted to uIP with length: %ld " ++ "cmd: 0x%x rsp: 0x%x", buf_len, ++ rsp.command, rsp.err); ++ err = 0; ++ break; ++ } else if ((err == -1) && (errno == EAGAIN)) { ++ usleep(250000); ++ continue; ++ } else { ++ log_error("Could not read response (%d/%d), daemon " ++ "died?", err, errno); ++ err = ISCSI_ERR; ++ break; ++ } ++ } ++ ++ if (count == MAX_UIP_BROADCAST_READ_TRIES) { ++ log_error("Could not broadcast to uIP after %d tries", ++ count); ++ err = ISCSI_ERR_AGAIN; ++ } else if (rsp.err != ISCSID_UIP_MGMT_IPC_DEVICE_UP) { ++ log_debug(3, "Device is not ready"); ++ err = ISCSI_ERR_AGAIN; ++ } ++ ++ close(fd); ++ return err; ++} +diff --git a/usr/iscsid_req.h b/usr/iscsid_req.h +index 68f5256..4fff43d 100644 +--- a/usr/iscsid_req.h ++++ b/usr/iscsid_req.h +@@ -33,4 +33,6 @@ extern int iscsid_req_by_rec(int cmd, struct node_rec *rec); + extern int iscsid_req_by_sid_async(int cmd, int sid, int *fd); + extern int iscsid_req_by_sid(int cmd, int sid); + ++extern int uip_broadcast(void *buf, size_t buf_len); ++ + #endif +diff --git a/usr/iscsistart.c b/usr/iscsistart.c +index 6924d49..7ff2236 100644 +--- a/usr/iscsistart.c ++++ b/usr/iscsistart.c +@@ -126,7 +126,7 @@ static int stop_event_loop(void) + rc = iscsid_exec_req(&req, &rsp, 0); + if (rc) { + iscsi_err_print_msg(rc); +- log_error("Could not stop event_loop\n"); ++ log_error("Could not stop event_loop"); + } + return rc; + } +@@ -287,22 +287,22 @@ static void catch_signal(int signo) + static int check_params(char *initiatorname) + { + if (!initiatorname) { +- log_error("InitiatorName not set. Exiting %s\n", program_name); ++ log_error("InitiatorName not set. Exiting %s", program_name); + return EINVAL; + } + + if (config_rec.tpgt == PORTAL_GROUP_TAG_UNKNOWN) { +- log_error("Portal Group not set. Exiting %s\n", program_name); ++ log_error("Portal Group not set. Exiting %s", program_name); + return EINVAL; + } + + if (!strlen(config_rec.name)) { +- log_error("TargetName not set. Exiting %s\n", program_name); ++ log_error("TargetName not set. Exiting %s", program_name); + return EINVAL; + } + + if (!strlen(config_rec.conn[0].address)) { +- log_error("IP Address not set. Exiting %s\n", program_name); ++ log_error("IP Address not set. Exiting %s", program_name); + return EINVAL; + } + +@@ -472,7 +472,7 @@ int main(int argc, char *argv[]) + + mgmt_ipc_fd = mgmt_ipc_listen(); + if (mgmt_ipc_fd < 0) { +- log_error("Could not setup mgmt ipc\n"); ++ log_error("Could not setup mgmt ipc"); + exit(ISCSI_ERR_NOMEM); + } + +@@ -509,7 +509,6 @@ int main(int argc, char *argv[]) + * Start Main Event Loop + */ + iscsi_initiator_init(); +- actor_init(); + event_loop(ipc, control_fd, mgmt_ipc_fd); + ipc->ctldev_close(); + mgmt_ipc_close(mgmt_ipc_fd); +diff --git a/usr/login.c b/usr/login.c +index db76c80..8289b03 100644 +--- a/usr/login.c ++++ b/usr/login.c +@@ -50,16 +50,14 @@ iscsi_add_text(struct iscsi_hdr *pdu, char *data, int max_data_length, + int pdu_length = ntoh24(pdu->dlength); + char *text = data; + char *end = data + max_data_length; +- char *pdu_text; + + /* find the end of the current text */ + text += pdu_length; +- pdu_text = text; + pdu_length += length; + + if (text + length >= end) { + log_warning("Failed to add login text " +- "'%s=%s'\n", param, value); ++ "'%s=%s'", param, value); + return 0; + } + +@@ -170,7 +168,7 @@ resolve_address(char *host, char *port, struct sockaddr_storage *ss) + + if ((rc = getaddrinfo(host, port, &hints, &res))) { + log_error("Cannot resolve host %s. getaddrinfo error: " +- "[%s]\n", host, gai_strerror(rc)); ++ "[%s]", host, gai_strerror(rc)); + return rc; + } + +@@ -1558,10 +1556,10 @@ iscsi_login(iscsi_session_t *session, int cid, char *buffer, size_t bufsize, + repoll: + pfd.revents = 0; + ret = poll(&pfd, 1, timeout); +- log_debug(7, "%s: Poll return %d\n", __FUNCTION__, ret); ++ log_debug(7, "%s: Poll return %d", __FUNCTION__, ret); + if (iscsi_timer_expired(&connection_timer)) { + log_warning("Login response timeout. Waited %d " +- "seconds and did not get reponse PDU.\n", ++ "seconds and did not get reponse PDU.", + session->conn[0].active_timeout); + c->ret = LOGIN_FAILED; + return c->ret; +@@ -1595,7 +1593,7 @@ repoll: + } + + } else if (ret < 0) { +- log_error("Login poll error.\n"); ++ log_error("Login poll error."); + c->ret = LOGIN_FAILED; + return c->ret; + } +diff --git a/usr/md5.c b/usr/md5.c +index 4ef1cb7..ba6c86d 100644 +--- a/usr/md5.c ++++ b/usr/md5.c +@@ -127,7 +127,7 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx) + + byteSwap(ctx->buf, 4); + memcpy(digest, ctx->buf, 16); +- memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ ++ memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ + } + + #ifndef ASM_MD5 +diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c +index 5c39c2e..c16bce9 100644 +--- a/usr/mgmt_ipc.c ++++ b/usr/mgmt_ipc.c +@@ -36,28 +36,33 @@ + #include "sysdeps.h" + #include "iscsi_ipc.h" + #include "iscsi_err.h" ++#include "iscsi_util.h" + + #define PEERUSER_MAX 64 + #define EXTMSG_MAX (64 * 1024) ++#define SD_SOCKET_FDS_START 3 + + int + mgmt_ipc_listen(void) + { +- int fd, err; ++ int fd, err, addr_len; + struct sockaddr_un addr; + ++ /* first check if we have fd handled by systemd */ ++ fd = mgmt_ipc_systemd(); ++ if (fd >= 0) ++ return fd; ++ ++ /* manually establish a socket */ + fd = socket(AF_LOCAL, SOCK_STREAM, 0); + if (fd < 0) { + log_error("Can not create IPC socket"); + return fd; + } + +- memset(&addr, 0, sizeof(addr)); +- addr.sun_family = AF_LOCAL; +- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, +- strlen(ISCSIADM_NAMESPACE)); ++ addr_len = setup_abstract_addr(&addr, ISCSIADM_NAMESPACE); + +- if ((err = bind(fd, (struct sockaddr *) &addr, sizeof(addr))) < 0) { ++ if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) { + log_error("Can not bind IPC socket"); + close(fd); + return err; +@@ -72,6 +77,28 @@ mgmt_ipc_listen(void) + return fd; + } + ++int mgmt_ipc_systemd(void) ++{ ++ const char *env; ++ ++ env = getenv("LISTEN_PID"); ++ ++ if (!env || (strtoul(env, NULL, 10) != getpid())) ++ return -EINVAL; ++ ++ env = getenv("LISTEN_FDS"); ++ ++ if (!env) ++ return -EINVAL; ++ ++ if (strtoul(env, NULL, 10) != 1) { ++ log_error("Did not receive exactly one IPC socket from systemd"); ++ return -EINVAL; ++ } ++ ++ return SD_SOCKET_FDS_START; ++} ++ + void + mgmt_ipc_close(int fd) + { +@@ -437,7 +464,6 @@ mgmt_ipc_write_rsp(queue_task_t *qtask, int err) + qtask->rsp.err = err; + if (write(qtask->mgmt_ipc_fd, &qtask->rsp, sizeof(qtask->rsp)) < 0) + log_error("IPC qtask write failed: %s", strerror(errno)); +- close(qtask->mgmt_ipc_fd); + mgmt_ipc_destroy_queue_task(qtask); + } + +diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h +index 7d8ce72..55972ed 100644 +--- a/usr/mgmt_ipc.h ++++ b/usr/mgmt_ipc.h +@@ -112,6 +112,7 @@ typedef int mgmt_ipc_fn_t(struct queue_task *); + struct queue_task; + void mgmt_ipc_write_rsp(struct queue_task *qtask, int err); + int mgmt_ipc_listen(void); ++int mgmt_ipc_systemd(void); + void mgmt_ipc_close(int fd); + void mgmt_ipc_handle(int accept_fd); + +diff --git a/usr/netlink.c b/usr/netlink.c +index c43f686..2b85efe 100644 +--- a/usr/netlink.c ++++ b/usr/netlink.c +@@ -339,6 +339,10 @@ __kipc_call(struct iovec *iovp, int count) + } else if (ev->type == ISCSI_UEVENT_GET_CHAP) { + /* kget_chap() will read */ + return 0; ++ } else if (ev->type == ISCSI_UEVENT_GET_HOST_STATS) { ++ /* kget_host_stats() will read */ ++ return 0; ++ + } else { + if ((rc = nlpayload_read(ctrl_fd, (void*)ev, + sizeof(*ev), 0)) < 0) { +@@ -372,7 +376,7 @@ ksendtargets(uint64_t transport_handle, uint32_t host_no, struct sockaddr *addr) + else if (addr->sa_family == PF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else { +- log_error("%s unknown addr family %d\n", ++ log_error("%s unknown addr family %d", + __FUNCTION__, addr->sa_family); + return -EINVAL; + } +@@ -382,7 +386,7 @@ ksendtargets(uint64_t transport_handle, uint32_t host_no, struct sockaddr *addr) + iov[1].iov_len = sizeof(*ev) + addrlen; + rc = __kipc_call(iov, 2); + if (rc < 0) { +- log_error("sendtargets failed rc%d\n", rc); ++ log_error("sendtargets failed rc%d", rc); + return rc; + } + return 0; +@@ -674,7 +678,7 @@ kset_host_param(uint64_t transport_handle, uint32_t host_no, + sprintf(param_str, "%s", (char *)value); + break; + default: +- log_error("invalid type %d\n", type); ++ log_error("invalid type %d", type); + return -EINVAL; + } + ev->u.set_host_param.len = len = strlen(param_str) + 1; +@@ -712,13 +716,16 @@ kset_param(uint64_t transport_handle, uint32_t sid, uint32_t cid, + case ISCSI_INT: + sprintf(param_str, "%d", *((int *)value)); + break; ++ case ISCSI_UINT: ++ sprintf(param_str, "%u", *((unsigned int *)value)); ++ break; + case ISCSI_STRING: + if (!strlen(value)) + return 0; + sprintf(param_str, "%s", (char *)value); + break; + default: +- log_error("invalid type %d\n", type); ++ log_error("invalid type %d", type); + return -EINVAL; + } + ev->u.set_param.len = len = strlen(param_str) + 1; +@@ -866,7 +873,7 @@ ktransport_ep_connect(iscsi_conn_t *conn, int non_blocking) + else if (dst_addr->sa_family == PF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else { +- log_error("%s unknown addr family %d\n", ++ log_error("%s unknown addr family %d", + __FUNCTION__, dst_addr->sa_family); + return -EINVAL; + } +@@ -935,7 +942,7 @@ ktransport_ep_disconnect(iscsi_conn_t *conn) + iov[1].iov_len = sizeof(ev); + rc = __kipc_call(iov, 2); + if (rc < 0) { +- log_error("connnection %d:%d transport disconnect failed for " ++ log_error("connection %d:%d transport disconnect failed for " + "ep %" PRIu64 " with error %d.", conn->session->id, + conn->id, conn->transport_ep_handle, rc); + } else +@@ -1031,6 +1038,10 @@ static int krecv_conn_state(struct iscsi_conn *conn, uint32_t *state) + /* fatal handling error or conn error */ + goto exit; + ++ /* unexpected event without a receive context */ ++ if (!conn->recv_context) ++ return -EAGAIN; ++ + *state = *(enum iscsi_conn_state *)conn->recv_context->data; + + ipc_ev_clbk->put_ev_context(conn->recv_context); +@@ -1068,7 +1079,7 @@ ksend_ping(uint64_t transport_handle, uint32_t host_no, struct sockaddr *addr, + else if (addr->sa_family == PF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else { +- log_error("%s unknown addr family %d\n", ++ log_error("%s unknown addr family %d", + __FUNCTION__, addr->sa_family); + return -EINVAL; + } +@@ -1228,6 +1239,29 @@ static int kget_chap(uint64_t transport_handle, uint32_t host_no, + return rc; + } + ++static int kset_chap(uint64_t transport_handle, uint32_t host_no, ++ struct iovec *iovs, uint32_t param_count) ++{ ++ int rc; ++ struct iscsi_uevent ev; ++ struct iovec *iov = iovs + 1; ++ ++ log_debug(8, "in %s", __func__); ++ ++ ev.type = ISCSI_UEVENT_SET_CHAP; ++ ev.transport_handle = transport_handle; ++ ev.u.set_path.host_no = host_no; ++ ++ iov->iov_base = &ev; ++ iov->iov_len = sizeof(ev); ++ ++ rc = __kipc_call(iovs, param_count); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ + static int kdelete_chap(uint64_t transport_handle, uint32_t host_no, + uint16_t chap_tbl_idx) + { +@@ -1252,6 +1286,211 @@ static int kdelete_chap(uint64_t transport_handle, uint32_t host_no, + return rc; + } + ++static int ++kset_flashnode_params(uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx, struct iovec *iovs, ++ uint32_t param_count) ++{ ++ struct iscsi_uevent ev; ++ int rc, ev_len; ++ struct iovec *iov = iovs + 1; ++ ++ log_debug(8, "in %s", __FUNCTION__); ++ ++ ev_len = sizeof(ev); ++ ev.type = ISCSI_UEVENT_SET_FLASHNODE_PARAMS; ++ ev.transport_handle = transport_handle; ++ ev.u.set_flashnode.host_no = host_no; ++ ev.u.set_flashnode.flashnode_idx = flashnode_idx; ++ /* first two iovs for nlmsg hdr and ev */ ++ ev.u.set_flashnode.count = param_count - 2; ++ ++ iov->iov_base = &ev; ++ iov->iov_len = ev_len; ++ rc = __kipc_call(iovs, param_count); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ ++static int ++knew_flashnode(uint64_t transport_handle, uint32_t host_no, void *value, ++ uint32_t *flashnode_idx) ++{ ++ struct iscsi_uevent *ev; ++ char *param_str; ++ int rc, len; ++ struct iovec iov[2]; ++ ++ log_debug(7, "in %s", __FUNCTION__); ++ ++ memset(setparam_buf, 0, NLM_SETPARAM_DEFAULT_MAX); ++ ev = (struct iscsi_uevent *)setparam_buf; ++ ev->type = ISCSI_UEVENT_NEW_FLASHNODE; ++ ev->transport_handle = transport_handle; ++ ev->u.new_flashnode.host_no = host_no; ++ ++ param_str = setparam_buf + sizeof(*ev); ++ if (!strlen(value)) ++ return 0; ++ sprintf(param_str, "%s", (char *)value); ++ len = strlen(param_str) + 1; ++ ev->u.new_flashnode.len = len; ++ ++ ++ iov[1].iov_base = ev; ++ iov[1].iov_len = sizeof(*ev) + len; ++ rc = __kipc_call(iov, 2); ++ if (rc < 0) ++ return rc; ++ ++ *flashnode_idx = ev->r.new_flashnode_ret.flashnode_idx; ++ return 0; ++} ++ ++static int ++kdel_flashnode(uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ struct iscsi_uevent ev; ++ int rc; ++ struct iovec iov[2]; ++ ++ log_debug(7, "in %s", __FUNCTION__); ++ ++ memset(&ev, 0, sizeof(struct iscsi_uevent)); ++ ev.type = ISCSI_UEVENT_DEL_FLASHNODE; ++ ev.transport_handle = transport_handle; ++ ev.u.del_flashnode.host_no = host_no; ++ ev.u.del_flashnode.flashnode_idx = flashnode_idx; ++ ++ iov[1].iov_base = &ev; ++ iov[1].iov_len = sizeof(ev); ++ rc = __kipc_call(iov, 2); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ ++static int ++klogin_flashnode(uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ struct iscsi_uevent ev; ++ int rc; ++ struct iovec iov[2]; ++ ++ log_debug(7, "in %s", __FUNCTION__); ++ ++ memset(&ev, 0, sizeof(struct iscsi_uevent)); ++ ev.type = ISCSI_UEVENT_LOGIN_FLASHNODE; ++ ev.transport_handle = transport_handle; ++ ev.u.login_flashnode.host_no = host_no; ++ ev.u.login_flashnode.flashnode_idx = flashnode_idx; ++ ++ iov[1].iov_base = &ev; ++ iov[1].iov_len = sizeof(ev); ++ rc = __kipc_call(iov, 2); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ ++static int ++klogout_flashnode(uint64_t transport_handle, uint32_t host_no, ++ uint32_t flashnode_idx) ++{ ++ struct iscsi_uevent ev; ++ int rc; ++ struct iovec iov[2]; ++ ++ log_debug(7, "in %s", __FUNCTION__); ++ ++ memset(&ev, 0, sizeof(struct iscsi_uevent)); ++ ev.type = ISCSI_UEVENT_LOGOUT_FLASHNODE; ++ ev.transport_handle = transport_handle; ++ ev.u.logout_flashnode.host_no = host_no; ++ ev.u.logout_flashnode.flashnode_idx = flashnode_idx; ++ ++ iov[1].iov_base = &ev; ++ iov[1].iov_len = sizeof(ev); ++ rc = __kipc_call(iov, 2); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ ++static int ++klogout_flashnode_sid(uint64_t transport_handle, uint32_t host_no, ++ uint32_t sid) ++{ ++ struct iscsi_uevent ev; ++ int rc; ++ struct iovec iov[2]; ++ ++ log_debug(7, "in %s", __FUNCTION__); ++ ++ memset(&ev, 0, sizeof(struct iscsi_uevent)); ++ ev.type = ISCSI_UEVENT_LOGOUT_FLASHNODE_SID; ++ ev.transport_handle = transport_handle; ++ ev.u.logout_flashnode_sid.host_no = host_no; ++ ev.u.logout_flashnode_sid.sid = sid; ++ ++ iov[1].iov_base = &ev; ++ iov[1].iov_len = sizeof(ev); ++ rc = __kipc_call(iov, 2); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ ++static int kget_host_stats(uint64_t transport_handle, uint32_t host_no, ++ char *host_stats) ++{ ++ int rc = 0; ++ int ev_size; ++ struct iscsi_uevent ev; ++ struct iovec iov[2]; ++ char nlm_ev[NLMSG_SPACE(sizeof(struct iscsi_uevent))]; ++ struct nlmsghdr *nlh; ++ ++ memset(&ev, 0, sizeof(struct iscsi_uevent)); ++ ++ ev.type = ISCSI_UEVENT_GET_HOST_STATS; ++ ev.transport_handle = transport_handle; ++ ev.u.get_host_stats.host_no = host_no; ++ ++ iov[1].iov_base = &ev; ++ iov[1].iov_len = sizeof(ev); ++ rc = __kipc_call(iov, 2); ++ if (rc < 0) ++ return rc; ++ ++ if ((rc = nl_read(ctrl_fd, nlm_ev, ++ NLMSG_SPACE(sizeof(struct iscsi_uevent)), ++ MSG_PEEK)) < 0) { ++ log_error("can not read nlm_ev, error %d", rc); ++ return rc; ++ } ++ ++ nlh = (struct nlmsghdr *)nlm_ev; ++ ev_size = nlh->nlmsg_len - NLMSG_ALIGN(sizeof(struct nlmsghdr)); ++ ++ if ((rc = nlpayload_read(ctrl_fd, (void *)host_stats, ++ ev_size, 0)) < 0) { ++ log_error("can not read from NL socket, error %d", rc); ++ return rc; ++ } ++ ++ return rc; ++} ++ ++ + static void drop_data(struct nlmsghdr *nlh) + { + int ev_size; +@@ -1281,7 +1520,7 @@ static int ctldev_handle(void) + nlh = (struct nlmsghdr *)nlm_ev; + ev = (struct iscsi_uevent *)NLMSG_DATA(nlm_ev); + +- log_debug(7, "%s got event type %u\n", __FUNCTION__, ev->type); ++ log_debug(7, "%s got event type %u", __FUNCTION__, ev->type); + /* drivers like qla4xxx can be inserted after iscsid is started */ + switch (ev->type) { + case ISCSI_KEVENT_CREATE_SESSION: +@@ -1296,10 +1535,10 @@ static int ctldev_handle(void) + ev->r.c_session_ret.sid); + return 0; + case ISCSI_KEVENT_DESTROY_SESSION: ++ drop_data(nlh); + if (!ipc_ev_clbk) + return 0; + +- drop_data(nlh); + if (ipc_ev_clbk->destroy_session) + ipc_ev_clbk->destroy_session(ev->r.d_session.host_no, + ev->r.d_session.sid); +@@ -1324,15 +1563,15 @@ static int ctldev_handle(void) + case ISCSI_KEVENT_HOST_EVENT: + switch (ev->r.host_event.code) { + case ISCSI_EVENT_LINKUP: +- log_warning("Host%u: Link Up.\n", ++ log_warning("Host%u: Link Up.", + ev->r.host_event.host_no); + break; + case ISCSI_EVENT_LINKDOWN: +- log_warning("Host%u: Link Down.\n", ++ log_warning("Host%u: Link Down.", + ev->r.host_event.host_no); + break; + default: +- log_debug(7, "Host%u: Unknwon host event: %u.\n", ++ log_debug(7, "Host%u: Unknwon host event: %u.", + ev->r.host_event.host_no, + ev->r.host_event.code); + } +@@ -1372,7 +1611,7 @@ static int ctldev_handle(void) + * nl interface. + */ + log_debug(1, "Could not verify connection %d:%d. Dropping " +- "event.\n", sid, cid); ++ "event.", sid, cid); + drop_data(nlh); + return -ENXIO; + } +@@ -1382,8 +1621,8 @@ static int ctldev_handle(void) + + ev_context = ipc_ev_clbk->get_ev_context(conn, ev_size); + if (!ev_context) { +- /* retry later */ + log_error("Can not allocate memory for receive context."); ++ drop_data(nlh); + return -ENOMEM; + } + +@@ -1542,7 +1781,15 @@ struct iscsi_ipc nl_ipc = { + .recv_conn_state = krecv_conn_state, + .exec_ping = kexec_ping, + .get_chap = kget_chap, ++ .set_chap = kset_chap, + .delete_chap = kdelete_chap, ++ .set_flash_node_params = kset_flashnode_params, ++ .new_flash_node = knew_flashnode, ++ .del_flash_node = kdel_flashnode, ++ .login_flash_node = klogin_flashnode, ++ .logout_flash_node = klogout_flashnode, ++ .logout_flash_node_sid = klogout_flashnode_sid, ++ .get_host_stats = kget_host_stats, + }; + struct iscsi_ipc *ipc = &nl_ipc; + +diff --git a/usr/session_info.c b/usr/session_info.c +index 1f84c49..2f48e65 100644 +--- a/usr/session_info.c ++++ b/usr/session_info.c +@@ -64,20 +64,32 @@ void session_info_free_list(struct list_head *list) + } + } + ++static char *get_iscsi_node_type(struct session_info *info) ++{ ++ int pid = iscsi_sysfs_session_user_created(info->sid); ++ ++ if (!pid) ++ return "flash"; ++ else ++ return "non-flash"; ++} ++ + static int session_info_print_flat(void *data, struct session_info *info) + { + struct iscsi_transport *t = iscsi_sysfs_get_transport_by_sid(info->sid); + + if (strchr(info->persistent_address, '.')) +- printf("%s: [%d] %s:%d,%d %s\n", ++ printf("%s: [%d] %s:%d,%d %s (%s)\n", + t ? t->name : UNKNOWN_VALUE, + info->sid, info->persistent_address, +- info->persistent_port, info->tpgt, info->targetname); ++ info->persistent_port, info->tpgt, info->targetname, ++ get_iscsi_node_type(info)); + else +- printf("%s: [%d] [%s]:%d,%d %s\n", ++ printf("%s: [%d] [%s]:%d,%d %s (%s)\n", + t ? t->name : UNKNOWN_VALUE, + info->sid, info->persistent_address, +- info->persistent_port, info->tpgt, info->targetname); ++ info->persistent_port, info->tpgt, info->targetname, ++ get_iscsi_node_type(info)); + return 0; + } + +@@ -230,7 +242,8 @@ void session_info_print_tree(struct list_head *list, char *prefix, + + list_for_each_entry(curr, list, list) { + if (!prev || strcmp(prev->targetname, curr->targetname)) { +- printf("%sTarget: %s\n", prefix, curr->targetname); ++ printf("%sTarget: %s (%s)\n", prefix, curr->targetname, ++ get_iscsi_node_type(curr)); + prev = NULL; + } + +@@ -278,6 +291,7 @@ void session_info_print_tree(struct list_head *list, char *prefix, + printf("%s\t\tSID: %d\n", prefix, curr->sid); + print_iscsi_state(curr->sid, prefix); + } ++ + if (flags & SESSION_INFO_ISCSI_TIM) { + printf("%s\t\t*********\n", prefix); + printf("%s\t\tTimeouts:\n", prefix); +@@ -368,7 +382,7 @@ int session_info_print(int info_level, struct session_info *info, int do_show) + num_found = 1; + } else + err = iscsi_sysfs_for_each_session(info, &num_found, +- session_info_print_flat); ++ session_info_print_flat, 0); + break; + case 3: + version = iscsi_sysfs_get_iscsi_kernel_version(); +@@ -403,7 +417,7 @@ int session_info_print(int info_level, struct session_info *info, int do_show) + link_info.match_fn = NULL; + + err = iscsi_sysfs_for_each_session(&link_info, &num_found, +- session_info_create_list); ++ session_info_create_list, 0); + if (err || !num_found) + break; + +diff --git a/usr/session_mgmt.c b/usr/session_mgmt.c +index ec1f43a..87b8e00 100644 +--- a/usr/session_mgmt.c ++++ b/usr/session_mgmt.c +@@ -172,18 +172,18 @@ int iscsi_login_portal(void *data, struct list_head *list, struct node_rec *rec) + * that are missing. + */ + rc = iscsi_sysfs_for_each_session(rec, &session_count, +- iscsi_match_session_count); ++ iscsi_match_session_count, 0); + if (rc) { + log_error("Could not count current number of sessions"); + goto done; + } + if (session_count >= rec->session.nr_sessions) { +- log_debug(1, "%s: %d session%s requested, but %d " ++ log_warning("%s: %d session%s requested, but %d " + "already present.", + rec->iface.name, rec->session.nr_sessions, + rec->session.nr_sessions == 1 ? "" : "s", + session_count); +- rc = 0; ++ rc = ISCSI_ERR_SESS_EXISTS; + goto done; + } + +@@ -421,7 +421,7 @@ int iscsi_logout_portals(void *data, int *nr_found, int wait, + *nr_found = 0; + + err = iscsi_sysfs_for_each_session(&link_info, nr_found, +- session_info_create_list); ++ session_info_create_list, 0); + if (err && !list_empty(&session_list)) + log_error("Could not read in all sessions: %s", + iscsi_err_to_str(err)); +@@ -466,7 +466,8 @@ free_list: + int iscsi_check_for_running_session(struct node_rec *rec) + { + int nr_found = 0; +- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session)) ++ if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session, ++ 0)) + return 1; + return 0; + } +diff --git a/usr/strings.c b/usr/strings.c +index 638cb4d..da5df28 100644 +--- a/usr/strings.c ++++ b/usr/strings.c +@@ -74,7 +74,7 @@ int str_enlarge_data(struct str_buffer *s, int length) + if (s) { + s->data_length += length; + if (s->data_length > s->allocated_length) { +- log_debug(7, "enlarge buffer from %lu to %lu\n", ++ log_debug(7, "enlarge buffer from %lu to %lu", + s->allocated_length, s->data_length); + new_buf = realloc(s->buffer, s->data_length); + if (!new_buf) { +diff --git a/usr/sysfs.c b/usr/sysfs.c +index 7f31c1a..6520bf6 100644 +--- a/usr/sysfs.c ++++ b/usr/sysfs.c +@@ -82,7 +82,7 @@ int sysfs_init(void) + remove_trailing_chars(sysfs_path, '/'); + } else + strlcpy(sysfs_path, "/sys", sizeof(sysfs_path)); +- dbg("sysfs_path='%s'\n", sysfs_path); ++ dbg("sysfs_path='%s'", sysfs_path); + + INIT_LIST_HEAD(&dev_list); + INIT_LIST_HEAD(&attr_list); +@@ -123,7 +123,7 @@ void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, + if (pos == NULL) + return; + strlcpy(dev->kernel, &pos[1], sizeof(dev->kernel)); +- dbg("kernel='%s'\n", dev->kernel); ++ dbg("kernel='%s'", dev->kernel); + + /* some devices have '!' in their name, change that to '/' */ + pos = dev->kernel; +@@ -138,7 +138,7 @@ void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, + while (isdigit(pos[-1])) + pos--; + strlcpy(dev->kernel_number, pos, sizeof(dev->kernel_number)); +- dbg("kernel_number='%s'\n", dev->kernel_number); ++ dbg("kernel_number='%s'", dev->kernel_number); + } + + int sysfs_resolve_link(char *devpath, size_t size) +@@ -155,11 +155,11 @@ int sysfs_resolve_link(char *devpath, size_t size) + if (len <= 0) + return -1; + link_target[len] = '\0'; +- dbg("path link '%s' points to '%s'\n", devpath, link_target); ++ dbg("path link '%s' points to '%s'", devpath, link_target); + + for (back = 0; strncmp(&link_target[back * 3], "../", 3) == 0; back++) + ; +- dbg("base '%s', tail '%s', back %i\n", devpath, &link_target[back * 3], back); ++ dbg("base '%s', tail '%s', back %i", devpath, &link_target[back * 3], back); + for (i = 0; i <= back; i++) { + char *pos = strrchr(devpath, '/'); + +@@ -167,7 +167,7 @@ int sysfs_resolve_link(char *devpath, size_t size) + return -1; + pos[0] = '\0'; + } +- dbg("after moving back '%s'\n", devpath); ++ dbg("after moving back '%s'", devpath); + strlcat(devpath, "/", size); + strlcat(devpath, &link_target[back * 3], size); + return 0; +@@ -195,7 +195,7 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + strncmp(devpath, "/block/", 7) != 0) + return NULL; + +- dbg("open '%s'\n", devpath); ++ dbg("open '%s'", devpath); + strlcpy(devpath_real, devpath, sizeof(devpath_real)); + remove_trailing_chars(devpath_real, '/'); + if (devpath[0] == '\0' ) +@@ -204,7 +204,7 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + /* look for device already in cache (we never put an untranslated path in the cache) */ + list_for_each_entry(dev_loop, &dev_list, node) { + if (strcmp(dev_loop->devpath, devpath_real) == 0) { +- dbg("found in cache '%s'\n", dev_loop->devpath); ++ dbg("found in cache '%s'", dev_loop->devpath); + return dev_loop; + } + } +@@ -213,7 +213,7 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + strlcpy(path, sysfs_path, sizeof(path)); + strlcat(path, devpath_real, sizeof(path)); + if (lstat(path, &statbuf) != 0) { +- dbg("stat '%s' failed: %s\n", path, strerror(errno)); ++ dbg("stat '%s' failed: %s", path, strerror(errno)); + return NULL; + } + if (S_ISLNK(statbuf.st_mode)) { +@@ -223,14 +223,14 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + /* now look for device in cache after path translation */ + list_for_each_entry(dev_loop, &dev_list, node) { + if (strcmp(dev_loop->devpath, devpath_real) == 0) { +- dbg("found in cache '%s'\n", dev_loop->devpath); ++ dbg("found in cache '%s'", dev_loop->devpath); + return dev_loop; + } + } + } + + /* it is a new device */ +- dbg("new uncached device '%s'\n", devpath_real); ++ dbg("new uncached device '%s'", devpath_real); + dev = malloc(sizeof(struct sysfs_device)); + if (dev == NULL) + return NULL; +@@ -246,7 +246,7 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + if (len > 0) { + /* get subsystem from "subsystem" link */ + link_target[len] = '\0'; +- dbg("subsystem link '%s' points to '%s'\n", link_path, link_target); ++ dbg("subsystem link '%s' points to '%s'", link_path, link_target); + pos = strrchr(link_target, '/'); + if (pos != NULL) + strlcpy(dev->subsystem, &pos[1], sizeof(dev->subsystem)); +@@ -275,13 +275,13 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + len = readlink(link_path, link_target, sizeof(link_target)); + if (len > 0) { + link_target[len] = '\0'; +- dbg("driver link '%s' points to '%s'\n", link_path, link_target); ++ dbg("driver link '%s' points to '%s'", link_path, link_target); + pos = strrchr(link_target, '/'); + if (pos != NULL) + strlcpy(dev->driver, &pos[1], sizeof(dev->driver)); + } + +- dbg("add to cache 'devpath=%s', subsystem='%s', driver='%s'\n", dev->devpath, dev->subsystem, dev->driver); ++ dbg("add to cache 'devpath=%s', subsystem='%s', driver='%s'", dev->devpath, dev->subsystem, dev->driver); + list_add(&dev->node, &dev_list); + + return dev; +@@ -292,14 +292,14 @@ struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev) + char parent_devpath[PATH_SIZE]; + char *pos; + +- dbg("open '%s'\n", dev->devpath); ++ dbg("open '%s'", dev->devpath); + + /* look if we already know the parent */ + if (dev->parent != NULL) + return dev->parent; + + strlcpy(parent_devpath, dev->devpath, sizeof(parent_devpath)); +- dbg("'%s'\n", parent_devpath); ++ dbg("'%s'", parent_devpath); + + /* strip last element */ + pos = strrchr(parent_devpath, '/'); +@@ -310,12 +310,12 @@ struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev) + if (strncmp(parent_devpath, "/class", 6) == 0) { + pos = strrchr(parent_devpath, '/'); + if (pos == &parent_devpath[6] || pos == parent_devpath) { +- dbg("/class top level, look for device link\n"); ++ dbg("/class top level, look for device link"); + goto device_link; + } + } + if (strcmp(parent_devpath, "/block") == 0) { +- dbg("/block top level, look for device link\n"); ++ dbg("/block top level, look for device link"); + goto device_link; + } + +@@ -364,7 +364,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) + ssize_t size; + size_t sysfs_len; + +- dbg("open '%s'/'%s'\n", devpath, attr_name); ++ dbg("open '%s'/'%s'", devpath, attr_name); + sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full)); + if(sysfs_len >= sizeof(path_full)) + sysfs_len = sizeof(path_full) - 1; +@@ -376,23 +376,23 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) + /* look for attribute in cache */ + list_for_each_entry(attr_loop, &attr_list, node) { + if (strcmp(attr_loop->path, path) == 0) { +- dbg("found in cache '%s'\n", attr_loop->path); ++ dbg("found in cache '%s'", attr_loop->path); + return attr_loop->value; + } + } + + /* store attribute in cache (also negatives are kept in cache) */ +- dbg("new uncached attribute '%s'\n", path_full); ++ dbg("new uncached attribute '%s'", path_full); + attr = malloc(sizeof(struct sysfs_attr)); + if (attr == NULL) + return NULL; + memset(attr, 0x00, sizeof(struct sysfs_attr)); + strlcpy(attr->path, path, sizeof(attr->path)); +- dbg("add to cache '%s'\n", path_full); ++ dbg("add to cache '%s'", path_full); + list_add(&attr->node, &attr_list); + + if (lstat(path_full, &statbuf) != 0) { +- dbg("stat '%s' failed: %s\n", path_full, strerror(errno)); ++ dbg("stat '%s' failed: %s", path_full, strerror(errno)); + goto out; + } + +@@ -407,7 +407,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) + link_target[len] = '\0'; + pos = strrchr(link_target, '/'); + if (pos != NULL) { +- dbg("cache '%s' with link value '%s'\n", path_full, value); ++ dbg("cache '%s' with link value '%s'", path_full, value); + strlcpy(attr->value_local, &pos[1], sizeof(attr->value_local)); + attr->value = attr->value_local; + } +@@ -426,7 +426,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) + /* read attribute value */ + fd = open(path_full, O_RDONLY); + if (fd < 0) { +- dbg("attribute '%s' can not be opened\n", path_full); ++ dbg("attribute '%s' can not be opened", path_full); + goto out; + } + size = read(fd, value, sizeof(value)); +@@ -439,7 +439,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) + /* got a valid value, store and return it */ + value[size] = '\0'; + remove_trailing_chars(value, '\n'); +- dbg("cache '%s' with attribute value '%s'\n", path_full, value); ++ dbg("cache '%s' with attribute value '%s'", path_full, value); + strlcpy(attr->value_local, value, sizeof(attr->value_local)); + attr->value = attr->value_local; + +@@ -554,14 +554,14 @@ char *sysfs_get_value(const char *id, char *subsys, char *param) + + if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), + subsys, id)) { +- log_debug(3, "Could not lookup devpath for %s %s\n", ++ log_debug(3, "Could not lookup devpath for %s %s", + subsys, id); + return NULL; + } + + sysfs_value = sysfs_attr_get_value(devpath, param); + if (!sysfs_value) { +- log_debug(3, "Could not read attr %s on path %s\n", ++ log_debug(3, "Could not read attr %s on path %s", + param, devpath); + return NULL; + } +@@ -671,12 +671,11 @@ int sysfs_set_param(char *id, char *subsys, char *attr_name, + char devpath[PATH_SIZE]; + size_t sysfs_len; + char path_full[PATH_SIZE]; +- const char *path; + int rc = 0, fd; + + if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), + subsys, id)) { +- log_debug(3, "Could not lookup devpath for %s %s\n", ++ log_debug(3, "Could not lookup devpath for %s %s", + subsys, id); + return EIO; + } +@@ -684,25 +683,24 @@ int sysfs_set_param(char *id, char *subsys, char *attr_name, + sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full)); + if(sysfs_len >= sizeof(path_full)) + sysfs_len = sizeof(path_full) - 1; +- path = &path_full[sysfs_len]; + strlcat(path_full, devpath, sizeof(path_full)); + strlcat(path_full, "/", sizeof(path_full)); + strlcat(path_full, attr_name, sizeof(path_full)); + + if (lstat(path_full, &statbuf)) { +- log_debug(3, "Could not stat %s\n", path_full); ++ log_debug(3, "Could not stat %s", path_full); + return errno; + } + + if ((statbuf.st_mode & S_IWUSR) == 0) { +- log_error("Could not write to %s. Invalid permissions.\n", ++ log_error("Could not write to %s. Invalid permissions.", + path_full); + return EACCES; + } + + fd = open(path_full, O_WRONLY); + if (fd < 0) { +- log_error("Could not open %s err %d\n", path_full, errno); ++ log_error("Could not open %s err %d", path_full, errno); + return errno; + } + +@@ -711,3 +709,43 @@ int sysfs_set_param(char *id, char *subsys, char *attr_name, + close(fd); + return rc; + } ++ ++char *sysfs_get_uevent_field(const char *path, const char *field) ++{ ++ char *uevent_path = NULL; ++ FILE *f = NULL; ++ char *line, buffer[1024]; ++ char *ff, *d; ++ char *out = NULL; ++ ++ uevent_path = calloc(1, PATH_MAX); ++ if (!uevent_path) ++ return NULL; ++ snprintf(uevent_path, PATH_MAX, "%s/uevent", path); ++ ++ f = fopen(uevent_path, "r"); ++ if (!f) ++ goto out; ++ while ((line = fgets(buffer, sizeof (buffer), f))) { ++ ff = strtok(line, "="); ++ d = strtok(NULL, "\n"); ++ if (strcmp(ff, field)) ++ continue; ++ out = strdup(d); ++ break; ++ } ++ fclose(f); ++out: ++ free(uevent_path); ++ return out; ++} ++ ++char *sysfs_get_uevent_devtype(const char *path) ++{ ++ return sysfs_get_uevent_field(path, "DEVTYPE"); ++} ++ ++char *sysfs_get_uevent_devname(const char *path) ++{ ++ return sysfs_get_uevent_field(path, "DEVNAME"); ++} +diff --git a/usr/sysfs.h b/usr/sysfs.h +index 304dbbf..462060e 100644 +--- a/usr/sysfs.h ++++ b/usr/sysfs.h +@@ -66,4 +66,8 @@ extern int sysfs_get_uint16(char *id, char *subsys, char *param, + extern int sysfs_set_param(char *id, char *subsys, char *attr_name, + char *write_buf, ssize_t buf_size); + ++extern char *sysfs_get_uevent_field(const char *path, const char *field); ++extern char *sysfs_get_uevent_devtype(const char *path); ++extern char *sysfs_get_uevent_devname(const char *path); ++ + #endif +diff --git a/usr/transport.c b/usr/transport.c +index e6e3dfc..c96d9c6 100644 +--- a/usr/transport.c ++++ b/usr/transport.c +@@ -35,6 +35,7 @@ + #include "log.h" + #include "iscsi_util.h" + #include "iscsi_sysfs.h" ++#include "uip_mgmt_ipc.h" + #include "cxgbi.h" + #include "be2iscsi.h" + #include "iser.h" +@@ -57,7 +58,8 @@ struct iscsi_transport_template iscsi_iser = { + + struct iscsi_transport_template cxgb3i = { + .name = "cxgb3i", +- .set_host_ip = 1, ++ .set_host_ip = SET_HOST_IP_OPT, ++ .bind_ep_required = 1, + .ep_connect = ktransport_ep_connect, + .ep_poll = ktransport_ep_poll, + .ep_disconnect = ktransport_ep_disconnect, +@@ -66,7 +68,8 @@ struct iscsi_transport_template cxgb3i = { + + struct iscsi_transport_template cxgb4i = { + .name = "cxgb4i", +- .set_host_ip = 1, ++ .set_host_ip = SET_HOST_IP_NOT_REQ, ++ .bind_ep_required = 1, + .ep_connect = ktransport_ep_connect, + .ep_poll = ktransport_ep_poll, + .ep_disconnect = ktransport_ep_disconnect, +@@ -75,14 +78,18 @@ struct iscsi_transport_template cxgb4i = { + + struct iscsi_transport_template bnx2i = { + .name = "bnx2i", +- .set_host_ip = 1, ++ .set_host_ip = SET_HOST_IP_REQ, ++ .use_boot_info = 1, ++ .bind_ep_required = 1, + .ep_connect = ktransport_ep_connect, + .ep_poll = ktransport_ep_poll, + .ep_disconnect = ktransport_ep_disconnect, ++ .set_net_config = uip_broadcast_params, + }; + + struct iscsi_transport_template be2iscsi = { + .name = "be2iscsi", ++ .bind_ep_required = 1, + .create_conn = be2iscsi_create_conn, + .ep_connect = ktransport_ep_connect, + .ep_poll = ktransport_ep_poll, +@@ -91,7 +98,16 @@ struct iscsi_transport_template be2iscsi = { + + struct iscsi_transport_template qla4xxx = { + .name = "qla4xxx", +- .set_host_ip = 0, ++ .set_host_ip = SET_HOST_IP_NOT_REQ, ++ .bind_ep_required = 1, ++ .ep_connect = ktransport_ep_connect, ++ .ep_poll = ktransport_ep_poll, ++ .ep_disconnect = ktransport_ep_disconnect, ++}; ++ ++struct iscsi_transport_template ocs = { ++ .name = "ocs", ++ .bind_ep_required = 1, + .ep_connect = ktransport_ep_connect, + .ep_poll = ktransport_ep_poll, + .ep_disconnect = ktransport_ep_disconnect, +@@ -105,6 +121,7 @@ static struct iscsi_transport_template *iscsi_transport_templates[] = { + &bnx2i, + &qla4xxx, + &be2iscsi, ++ &ocs, + NULL + }; + +@@ -132,7 +149,7 @@ int transport_probe_for_offload(void) + for (i = 0; ifni[i].if_index && ifni[i].if_name; i++) { + struct if_nameindex *n = &ifni[i]; + +- log_debug(6, "kmod probe found %s\n", n->if_name); ++ log_debug(6, "kmod probe found %s", n->if_name); + + strlcpy(if_hwaddr.ifr_name, n->if_name, IFNAMSIZ); + if (ioctl(sockfd, SIOCGIFHWADDR, &if_hwaddr) < 0) +@@ -264,12 +281,12 @@ int set_transport_template(struct iscsi_transport *t) + + if (!strcmp(tmpl->name, t->name)) { + t->template = tmpl; +- log_debug(3, "Matched transport %s\n", t->name); ++ log_debug(3, "Matched transport %s", t->name); + return 0; + } + } + + log_error("Could not find template for %s. An updated iscsiadm " +- "is probably needed.\n", t->name); ++ "is probably needed.", t->name); + return ENOSYS; + } +diff --git a/usr/transport.h b/usr/transport.h +index 672561b..831403b 100644 +--- a/usr/transport.h ++++ b/usr/transport.h +@@ -20,6 +20,12 @@ + #include "types.h" + #include "config.h" + ++enum set_host_ip_opts { ++ SET_HOST_IP_NOT_REQ, /* iface.ipaddress is not supported */ ++ SET_HOST_IP_REQ, /* iface.ipaddress must be specified */ ++ SET_HOST_IP_OPT, /* iface.ipaddress is not required */ ++}; ++ + struct iscsi_transport; + struct iscsi_conn; + +@@ -31,10 +37,15 @@ struct iscsi_transport_template { + * the host's ip address. + */ + uint8_t set_host_ip; ++ uint8_t use_boot_info; ++ uint8_t bind_ep_required; + int (*ep_connect) (struct iscsi_conn *conn, int non_blocking); + int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms); + void (*ep_disconnect) (struct iscsi_conn *conn); + void (*create_conn) (struct iscsi_conn *conn); ++ int (*set_net_config) (struct iscsi_transport *t, ++ struct iface_rec *iface, ++ struct iscsi_session *session); + }; + + /* represents data path provider */ +diff --git a/usr/types.h b/usr/types.h +index 77e3f97..9d9ba86 100644 +--- a/usr/types.h ++++ b/usr/types.h +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + /* + * using the __be types allows stricter static +diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c +new file mode 100644 +index 0000000..1dfc6d0 +--- /dev/null ++++ b/usr/uip_mgmt_ipc.c +@@ -0,0 +1,41 @@ ++/* ++ * uIP iSCSI Daemon/Admin Management IPC ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++ ++#include "log.h" ++#include "uip_mgmt_ipc.h" ++#include "iscsid_req.h" ++ ++int uip_broadcast_params(struct iscsi_transport *t, ++ struct iface_rec *iface, ++ struct iscsi_session *session) ++{ ++ struct iscsid_uip_broadcast broadcast; ++ ++ log_debug(3, "broadcasting to uip"); ++ ++ memset(&broadcast, 0, sizeof(broadcast)); ++ ++ broadcast.header.command = ISCSID_UIP_IPC_GET_IFACE; ++ broadcast.header.payload_len = sizeof(*iface); ++ ++ memcpy(&broadcast.u.iface_rec, iface, sizeof(*iface)); ++ ++ return uip_broadcast(&broadcast, ++ sizeof(iscsid_uip_broadcast_header_t) + ++ sizeof(*iface)); ++} +diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h +new file mode 100644 +index 0000000..29a4769 +--- /dev/null ++++ b/usr/uip_mgmt_ipc.h +@@ -0,0 +1,73 @@ ++/* ++ * uIP iSCSI Daemon/Admin Management IPC ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++#ifndef UIP_MGMT_IPC_H ++#define UIP_MGMT_IPC_H ++ ++#include "types.h" ++#include "iscsi_if.h" ++#include "config.h" ++#include "mgmt_ipc.h" ++ ++#include "initiator.h" ++#include "transport.h" ++ ++#define ISCSID_UIP_NAMESPACE "ISCSID_UIP_ABSTRACT_NAMESPACE" ++ ++typedef enum iscsid_uip_cmd { ++ ISCSID_UIP_IPC_UNKNOWN = 0, ++ ISCSID_UIP_IPC_GET_IFACE = 1, ++ ++ __ISCSID_UIP_IPC_MAX_COMMAND ++} iscsid_uip_cmd_e; ++ ++typedef struct iscsid_uip_broadcast_header { ++ iscsid_uip_cmd_e command; ++ uint32_t payload_len; ++} iscsid_uip_broadcast_header_t; ++ ++/* IPC Request */ ++typedef struct iscsid_uip_broadcast { ++ struct iscsid_uip_broadcast_header header; ++ ++ union { ++ /* messages */ ++ struct ipc_broadcast_iface_rec { ++ struct iface_rec rec; ++ } iface_rec; ++ } u; ++} iscsid_uip_broadcast_t; ++ ++typedef enum iscsid_uip_mgmt_ipc_err { ++ ISCSID_UIP_MGMT_IPC_OK = 0, ++ ISCSID_UIP_MGMT_IPC_ERR = 1, ++ ISCSID_UIP_MGMT_IPC_ERR_NOT_FOUND = 2, ++ ISCSID_UIP_MGMT_IPC_ERR_NOMEM = 3, ++ ISCSID_UIP_MGMT_IPC_DEVICE_UP = 4, ++ ISCSID_UIP_MGMT_IPC_DEVICE_INITIALIZING = 5, ++} iscsid_uip_mgmt_ipc_err_e; ++ ++/* IPC Response */ ++typedef struct iscsid_uip_mgmt_rsp { ++ iscsid_uip_cmd_e command; ++ iscsid_uip_mgmt_ipc_err_e err; ++} iscsid_uip_rsp_t; ++ ++extern int uip_broadcast_params(struct iscsi_transport *t, ++ struct iface_rec *iface, ++ struct iscsi_session *session); ++ ++ ++#endif /* UIP_MGMT_IPC_H */ +diff --git a/utils/Makefile b/utils/Makefile +index 2c7e891..f65f1e7 100644 +--- a/utils/Makefile ++++ b/utils/Makefile +@@ -1,12 +1,13 @@ + # This Makefile will work only with GNU make. + +-CFLAGS += $(OPTFLAGS) -O2 -fno-inline -Wall -Wstrict-prototypes -g ++CFLAGS ?= -O2 -fno-inline -g ++CFLAGS += -Wall -Wstrict-prototypes + PROGRAMS = iscsi-iname + + all: $(PROGRAMS) + + iscsi-iname: md5.o iscsi-iname.o +- $(CC) $(CFLAGS) $^ $(DBM_LIB) -o $@ ++ $(CC) $(CFLAGS) $(LDFLAGS) $^ $(DBM_LIB) -o $@ + + clean: + rm -f *.o $(PROGRAMS) .depend +diff --git a/utils/fwparam_ibft/Makefile b/utils/fwparam_ibft/Makefile +index c72bb7f..773d8eb 100644 +--- a/utils/fwparam_ibft/Makefile ++++ b/utils/fwparam_ibft/Makefile +@@ -26,9 +26,9 @@ OBJS := fw_entry.o fwparam_sysfs.o $(SYSDEPS_OBJS) ../../usr/iscsi_net_util.o + OBJS += prom_lex.o prom_parse.tab.o fwparam_ppc.o + CLEANFILES = $(OBJS) *.output *~ + +-OPTFLAGS ?= -O2 -g -fPIC ++CFLAGS ?= -O2 -g + WARNFLAGS ?= -Wall -Wstrict-prototypes +-CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../../include -I../../usr -D_GNU_SOURCE ++CFLAGS += -fPIC $(WARNFLAGS) -I../../include -I../../usr -D_GNU_SOURCE + + all: $(OBJS) + +diff --git a/utils/fwparam_ibft/fw_entry.c b/utils/fwparam_ibft/fw_entry.c +index b6f05c1..f94a035 100644 +--- a/utils/fwparam_ibft/fw_entry.c ++++ b/utils/fwparam_ibft/fw_entry.c +@@ -67,15 +67,15 @@ int fw_setup_nics(void) + * to force iSCSI traffic through correct NIC + */ + list_for_each_entry(context, &targets, list) { +- /* if it is a offload nic ignore it */ +- if (!net_get_transport_name_from_netdev(context->iface, ++ /* if it is a offload nic ignore it */ ++ if (!net_get_transport_name_from_netdev(context->iface, + transport)) + continue; + + if (iface_prev == NULL || strcmp(context->iface, iface_prev)) { + /* Note: test above works because there is a +- * maximum of two targets in the iBFT +- */ ++ * maximum of two targets in the iBFT ++ */ + iface_prev = context->iface; + needs_bringup = 1; + } +@@ -192,10 +192,13 @@ static void dump_network(struct boot_context *context) + if (strlen(context->mac)) + printf("%s = %s\n", IFACE_HWADDR, context->mac); + /* +- * If this has a valid address then DHCP was used (broadcom sends +- * 0.0.0.0). ++ * If the 'origin' field is 3 (IBFT_IP_PREFIX_ORIGIN_DHCP), ++ * then DHCP is used. ++ * Otherwise evaluate the 'dhcp' field, if this has a valid ++ * address then DHCP was used (broadcom sends 0.0.0.0). + */ +- if (strlen(context->dhcp) && strcmp(context->dhcp, "0.0.0.0")) ++ if ((context->origin == IBFT_IP_PREFIX_ORIGIN_DHCP) || ++ (strlen(context->dhcp) && strcmp(context->dhcp, "0.0.0.0"))) + printf("%s = DHCP\n", IFACE_BOOT_PROTO); + else + printf("%s = STATIC\n", IFACE_BOOT_PROTO); +diff --git a/utils/fwparam_ibft/fwparam_ibft_sysfs.c b/utils/fwparam_ibft/fwparam_ibft_sysfs.c +index 9185c85..2dc6f6d 100644 +--- a/utils/fwparam_ibft/fwparam_ibft_sysfs.c ++++ b/utils/fwparam_ibft/fwparam_ibft_sysfs.c +@@ -201,6 +201,8 @@ static int fill_nic_context(char *id, struct boot_context *context) + sizeof(context->secondary_dns)); + sysfs_get_str(id, IBFT_SUBSYS, "dhcp", context->dhcp, + sizeof(context->dhcp)); ++ sysfs_get_str(id, IBFT_SUBSYS, "origin", context->origin, ++ sizeof(context->origin)); + return 0; + } + +diff --git a/utils/fwparam_ibft/fwparam_sysfs.c b/utils/fwparam_ibft/fwparam_sysfs.c +index 3997363..23eb913 100644 +--- a/utils/fwparam_ibft/fwparam_sysfs.c ++++ b/utils/fwparam_ibft/fwparam_sysfs.c +@@ -170,6 +170,18 @@ static int fill_nic_context(char *subsys, char *id, + { + int rc; + ++ rc = sysfs_get_int(id, subsys, "flags", &context->nic_flags); ++ /* ++ * Per spec we would need to check against Bit 0 ++ * (Block Valid Flag), but some firmware only ++ * sets Bit 1 (Firmware Booting Selected). ++ * So any setting is deemed okay. ++ */ ++ if (!rc && (context->nic_flags == 0)) ++ rc = ENODEV; ++ if (rc) ++ return rc; ++ + rc = sysfs_get_str(id, subsys, "mac", context->mac, + sizeof(context->mac)); + if (rc) +@@ -200,6 +212,9 @@ static int fill_nic_context(char *subsys, char *id, + strlcpy(context->scsi_host_name, subsys, + sizeof(context->scsi_host_name)); + ++ memset(&context->boot_nic, 0, sizeof(context->boot_nic)); ++ snprintf(context->boot_nic, sizeof(context->boot_nic), "%s", id); ++ + sysfs_get_str(id, subsys, "ip-addr", context->ipaddr, + sizeof(context->ipaddr)); + sysfs_get_str(id, subsys, "vlan", context->vlan, +@@ -214,6 +229,7 @@ static int fill_nic_context(char *subsys, char *id, + sizeof(context->secondary_dns)); + sysfs_get_str(id, subsys, "dhcp", context->dhcp, + sizeof(context->dhcp)); ++ sysfs_get_int(id, subsys, "origin", (int *)&context->origin); + return 0; + } + +@@ -224,12 +240,26 @@ static void fill_initiator_context(char *subsys, struct boot_context *context) + sizeof(context->initiatorname)); + sysfs_get_str("initiator", subsys, "isid", context->isid, + sizeof(context->isid)); ++ ++ strlcpy(context->boot_root, subsys, sizeof(context->boot_root)); + } + static int fill_tgt_context(char *subsys, char *id, + struct boot_context *context) + { + int rc; + ++ rc = sysfs_get_int(id, subsys, "flags", &context->target_flags); ++ /* ++ * Per spec we would need to check against Bit 0 ++ * (Block Valid Flag), but some firmware only ++ * sets Bit 1 (Firmware Booting Selected). ++ * So any setting is deemed okay. ++ */ ++ if (!rc && (context->target_flags == 0)) ++ rc = ENODEV; ++ if (rc) ++ return rc; ++ + rc = sysfs_get_str(id, subsys, "target-name", context->targetname, + sizeof(context->targetname)); + if (rc) +@@ -240,6 +270,9 @@ static int fill_tgt_context(char *subsys, char *id, + if (rc) + return rc; + ++ memset(&context->boot_target, 0, sizeof(context->boot_target)); ++ snprintf(context->boot_target, sizeof(context->boot_target), "%s", id); ++ + /* + * We can live without the rest of they do not exist. If we + * failed to get them we will figure it out when we login. +@@ -315,7 +348,7 @@ static int get_boot_info(struct boot_context *context, char *rootdir, + nic_cnt = 0; + tgt_cnt = 0; + if (file_exist(initiator_dir)) { +- /* Find the target's and the ethernet's */ ++ /* Find the targets and the ethernets */ + rc = nftw(rootdir, find_sysfs_dirs, 20, 1); + + /* Find wihch target and which ethernet have +@@ -391,7 +424,7 @@ static int get_targets(struct list_head *list, char *rootdir, char *subsys) + nic_cnt = 0; + tgt_cnt = 0; + +- /* Find the target's and the ethernet's */ ++ /* Find the targets and the ethernets */ + nftw(rootdir, find_sysfs_dirs, 20, 1); + for (i = 0; i < tgt_cnt; i++) { + context = calloc(1, sizeof(*context)); +diff --git a/utils/iscsi-gen-initiatorname b/utils/iscsi-gen-initiatorname +new file mode 100755 +index 0000000..88bd43b +--- /dev/null ++++ b/utils/iscsi-gen-initiatorname +@@ -0,0 +1,73 @@ ++#!/bin/bash ++# ++# /sbin/iscsi-gen-initiatorname ++# ++# Generate a default iSCSI Initiatorname for SUSE installations. ++# ++# Copyright (c) 2011 Hannes Reinecke, SUSE Labs ++# This script is licensed under the GPL. ++# ++ ++if [ "$1" ] ; then ++ if [ "$1" = "-f" ] ; then ++ FORCE=1 ++ else ++ echo "Invalid option $1" ++ echo "Usage: $0 [-f]" ++ exit 1 ++ fi ++fi ++ ++if [ -d /sys/firmware/ibft/initiator ] ; then ++ read iSCSI_INITIATOR_NAME < /sys/firmware/ibft/initiator/initiator-name ++fi ++ ++if [ -f /etc/iscsi/initiatorname.iscsi -a -z "$FORCE" ] ; then ++ if [ "$iSCSI_INITIATOR_NAME" ] ; then ++ eval $(cat /etc/iscsi/initiatorname.iscsi | sed -e '/^#/d') ++ if [ "$iSCSI_INITIATOR_NAME" != "$InitiatorName" ] ; then ++ echo "iSCSI Initiatorname from iBFT is different from the current setting." ++ echo "Please call '/sbin/iscsi-gen-initiatorname -f' to update the iSCSI Initiatorname." ++ exit 1 ++ fi ++ fi ++fi ++ ++if [ "$iSCSI_INITIATOR_NAME" ] ; then ++ cat << EOF >> /etc/iscsi/initiatorname.iscsi ++## ++## /etc/iscsi/iscsi.initiatorname ++## ++## iSCSI Initiatorname taken from iBFT BIOS tables. ++## ++## DO NOT EDIT OR REMOVE THIS FILE! ++## If you remove this file, the iSCSI daemon will not start. ++## Any change here will not be reflected to the iBFT BIOS tables. ++## If a different initiatorname is required please change the ++## initiatorname in the BIOS setup and call ++## /sbin/iscsi-gen-initiatorname -f ++## to recreate an updated version of this file. ++## ++InitiatorName=$iSCSI_INITIATOR_NAME ++EOF ++fi ++ ++if [ ! -f /etc/iscsi/initiatorname.iscsi ] ; then ++ cat << EOF >> /etc/iscsi/initiatorname.iscsi ++## ++## /etc/iscsi/iscsi.initiatorname ++## ++## Default iSCSI Initiatorname. ++## ++## DO NOT EDIT OR REMOVE THIS FILE! ++## If you remove this file, the iSCSI daemon will not start. ++## If you change the InitiatorName, existing access control lists ++## may reject this initiator. The InitiatorName must be unique ++## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames. ++EOF ++ ISSUEDATE="1996-04" ++ INAME=$(/sbin/iscsi-iname -p iqn.$ISSUEDATE.de.suse:01) ++ printf "InitiatorName=$INAME\n" >>/etc/iscsi/initiatorname.iscsi ++ chmod 0600 /etc/iscsi/initiatorname.iscsi ++fi ++ +diff --git a/utils/iscsi_offload b/utils/iscsi_offload +new file mode 100755 +index 0000000..7cd1dad +--- /dev/null ++++ b/utils/iscsi_offload +@@ -0,0 +1,378 @@ ++#!/bin/bash ++# ++# iscsi_offload ++# ++# Configure iSCSI offload engines for use with open-iscsi ++# Usage: ++# iscsi_offload [-d | -f | -i | -t ] ++# ++# Copyright (c) 2011 Hannes Reinecke, SUSE Labs ++# This script is licensed under the GPL. ++# ++# The script creates an open-iscsi interface definition ++# in the style -, where matches the ++# network interface passed on the commandline. ++# If '-t' (test mode) is passed as an option, the script ++# will not create nor modify any setting but just print ++# the currently active ones. ++# ++# Currently the script works with Broadcom (bnx2i) and ++# Chelsio T3 (cxgbi) iSCSI offload engines. ++# Should work with Chelsio T4, but has not been tested. ++# ServerEngines (be2iscsi) and QLogic (qla4xxx) can only ++# be configured via BIOS, open-iscsi support is still in ++# development. ++# ++ ++# ++# Return codes: ++# 0: Success ++# 1: Invalid command line parameter ++# 2: iSCSI offloading not supported ++# 3: Error during module loading ++# 4: Cannot configure interface via iscsiadm, use BIOS setup ++# 5: internal error running iscsiadm ++# ++# Output: ++# [none|dhcp|ip |ibft] ++# where ++# : MAC Address of the iSCSI offload engine ++# none: No IP configuration set for the iSCSI offload engine ++# dhcp: iSCSI offload engine configured for DHCP ++# ip: iSCSI offload engine configured with static IP address ++# ibft: iSCSI offload engine configured from iBFT values ++# ++ ++# ++# Figure out the MAC address of the iSCSI offload engine ++# corresponding to a NIC from a given PCI device. ++# bnx2 is using one PCI device per port for both network and iSCSI offloading ++# cxgb3 is using one PCI device for everything. ++# ++iscsi_macaddress_from_pcidevice() ++{ ++ local path=$1 ++ local if=$2 ++ local h ++ local host ++ ++ for h in $path/host* ; do ++ if [ -d "$h" ] ; then ++ host=${h##*/} ++ read netdev < /sys/class/iscsi_host/$host/netdev ++ if [ "$netdev" = "$IFNAME" ] ; then ++ read mac < /sys/class/iscsi_host/$host/hwaddress ++ if [ "$mac" != "00:00:00:00:00:00" ] ; then ++ echo "$mac" ++ fi ++ break; ++ fi ++ fi ++ done ++} ++ ++# ++# Figure out the MAC address of the iSCSI offload engine ++# corresponding to a NIC from a given PCI function. ++# It is assumed that the MAC address of the iSCSI offload ++# engine is equal of the MAC address of the NIC plus one. ++# Suitable for be2iscsi and qla4xxx ++# ++iscsi_macaddress_from_pcifn() ++{ ++ local path=$1 ++ local if=$2 ++ local h ++ local host ++ local ifmac ++ ++ ifmac=$(ip addr show dev $if | sed -n 's/ *link\/ether \(.*\) brd.*/\1/p') ++ m5=$(( 0x${ifmac##*:} )) ++ m5=$(( $m5 + 1 )) ++ ifmac=$(printf "%s:%02x" ${ifmac%:*} $m5) ++ for host in /sys/class/iscsi_host/host* ; do ++ if [ -L "$host" ] ; then ++ read mac < $host/hwaddress ++ if [ "$mac" = "$ifmac" ] ; then ++ echo "$mac" ++ break; ++ fi ++ fi ++ done ++} ++ ++update_iface_setting() { ++ local iface="$1" ++ local name="$2" ++ local value="$3" ++ ++ iface_value=$(iscsiadm -m iface -I $iface | sed -n "s/$name = \(.*\)/\1/p") ++ if [ "$iface_value" = "" ] ; then ++ iface_value= ++ fi ++ if [ "$iface_value" != "$value" ] ; then ++ if ! iscsiadm -m iface -I $iface -o update -n "$name" -v "$value" ; then ++ return 1 ++ fi ++ fi ++ return 0 ++} ++ ++while getopts di:t options ; do ++ case $options in ++ d ) mode=dhcp;; ++ i ) mode=static ++ optaddr=$OPTARG ++ ;; ++ f ) mode=firmware;; ++ t ) dry_run=1;; ++ ?) printf "Usage: %s [-d|-t|-i ipaddr|-f] ifname\n" $0 ++ exit 1;; ++ esac ++done ++shift $(($OPTIND - 1)) ++ ++IFNAME=$1 ++ibft_mode="none" ++ ++if [ -z "$IFNAME" ] ; then ++ echo "No interface specified" ++ exit 1 ++fi ++ ++if [ "$dry_run" ] ; then ++ if [ "$mode" = "dhcp" ] ; then ++ echo "'-t' specified, ignoring '-d'" ++ mode= ++ elif [ "$mode" = "static" ] ; then ++ echo "'-t' specified, ignoring '-s'" ++ mode= ++ fi ++fi ++ ++if [ ! -L /sys/class/net/$IFNAME ] ; then ++ echo "Interface $IFNAME not found" ++ exit 1 ++fi ++ ++if [ "$optaddr" ] && ! ip route get $optaddr ; then ++ echo "Invalid IP address $optaddr" ++ exit 1 ++fi ++if [ "$dry_run" ] ; then ++ mode= ++fi ++ ++ ++ifpath=$(cd -P /sys/class/net/$IFNAME; echo $PWD) ++pcipath=$(cd -P $ifpath/device; echo $PWD) ++ ++if [ -d $pcipath ] ; then ++ drvlink=$(readlink $pcipath/driver) ++ driver=${drvlink##*/} ++fi ++ ++if [ -z "$driver" ] ; then ++ echo "No driver found for interface $IFNAME" ++ exit 1 ++fi ++ ++case "$driver" in ++ bnx2*) ++ mod=bnx2i ++ ;; ++ cxgb*) ++ mod=cxgb3i ++ ;; ++ be2*) ++ mod=be2iscsi ++ ;; ++ qla*) ++ mod=qla4xxx ++ ;; ++esac ++ ++if [ -z "$mod" ] ; then ++ echo "iSCSI offloading not supported on interface $IFNAME" ++ exit 2 ++fi ++ ++# Check if the required modules are already loaded ++loaded=$(sed -n "/^$mod/p" /proc/modules) ++if [ -z "$loaded" ] ; then ++ modprobe $mod ++fi ++ ++loaded=$(sed -n "/^$mod/p" /proc/modules) ++if [ -z "$loaded" ] ; then ++ echo "Loading of $mod.ko failed, please check dmesg" ++ exit 3 ++fi ++ ++# Get the correct MAC address for the various devices ++if [ "$mod" = "bnx2i" ] ; then ++ mac=$(iscsi_macaddress_from_pcidevice $pcipath $IFNAME) ++elif [ "$mod" = "cxgb3i" ] ; then ++ mac=$(iscsi_macaddress_from_pcidevice $pcipath $IFNAME) ++elif [ "$mod" = "be2iscsi" ] ; then ++ mac=$(iscsi_macaddress_from_pcifn $pcipath $IFNAME) ++elif [ "$mod" = "qla4xxx" ] ; then ++ mac=$(iscsi_macaddress_from_pcifn $pcipath $IFNAME) ++fi ++ ++if [ -z "$mac" ] ; then ++ echo "iSCSI offloading not supported on interface $IFNAME" ++ exit 2 ++fi ++ ++gen_iface="$mod.$mac" ++ioe_iface="${IFNAME}-${mod}" ++ ++# Get existing settings ++if iscsiadm -m iface -I $ioe_iface > /dev/null 2>&1 ; then ++ ioe_mac=$(iscsiadm -m iface -I $ioe_iface 2> /dev/null| sed -n "s/iface\.hwaddress = \(.*\)/\1/p") ++ ioe_mod=$(iscsiadm -m iface -I $ioe_iface 2> /dev/null| sed -n "s/iface\.transport_name = \(.*\)/\1/p") ++ ipaddr=$(iscsiadm -m iface -I $ioe_iface 2> /dev/null| sed -n "s/iface\.ipaddress = \(.*\)/\1/p") ++ if [ "$ipaddr" == "" ] ; then ++ ipaddr= ++ fi ++elif [ "$mod" = "be2iscsi" ] ; then ++ ioe_mac=$mac ++ ioe_mod=$mod ++else ++ # Create new interface ++ iscsiadm -m iface -I $ioe_iface --op=new 2> /dev/null ++ ioe_mac= ++ ioe_mod= ++ ipaddr= ++fi ++ ++if [ -z "$dry_run" ] ; then ++ if [ "$ioe_mac" != "$mac" ] ; then ++ if [ -n "$ioe_mac" ] ; then ++ echo "Warning: Updating MAC address on iface $ioe_iface" ++ fi ++ update_iface_setting $ioe_iface iface.hwaddress "$mac" ++ fi ++ ++ if [ "$ioe_mod" != "$mod" ] ; then ++ if [ -n "$ioe_mod" ] ; then ++ echo "Warning: Update transport on iface $ioe_iface" ++ fi ++ update_iface_setting $ioe_iface iface.transport_name "$mod" ++ fi ++elif [ -z "$ipaddr" ] ; then ++ ipaddr=$(iscsiadm -m iface -I $gen_iface 2> /dev/null| sed -n "s/iface\.ipaddress = \(.*\)/\1/p") ++ if [ "$ipaddr" = "" ] ; then ++ ipaddr= ++ fi ++elif [ "$ioe_mod" != "$mod" ] ; then ++ echo "Warning: Transport mismatch on iface $ioe_iface: $ioe_mod should be $mod" ++fi ++ ++# Check iBFT setting ++for d in /sys/firmware/* ; do ++ [ -d $d ] || continue ++ [ -d $d/ethernet0 ] || continue ++ iboot_dir=$d ++done ++if [ -n "$iboot_dir" ] && [ -d "$iboot_dir" ] ; then ++ for if in ${iboot_dir}/ethernet* ; do ++ read ibft_mac < $if/mac ++ [ "$ibft_mac" = "$mac" ] || continue ++ ibft_origin=0 ++ [ -f ${if}/origin ] && read ibft_origin < $if/origin ++ if [ "$ibft_origin" -eq 1 ] ; then ++ ibft_mode="static" ++ elif [ "$ibft_origin" -eq 3 ] ; then ++ ibft_mode="dhcp" ++ fi ++ [ -f $if/dhcp ] && read ibft_dhcp < $if/dhcp ++ if [ -n "$ibft_dhcp" -a "$ibft_mode" != "dhcp" ] ; then ++ ibft_mode=dhcp ++ fi ++ if [ "$ibft_mode" = "dhcp" ] ; then ++ ibft_ipaddr="0.0.0.0" ++ ibft_gateway= ++ ibft_mask= ++ break ++ fi ++ [ -f $if/ip-addr ] && read ibft_ipaddr < $if/ip-addr ++ [ -f $if/gateway ] && read ibft_gateway < $if/gateway ++ [ -f $if/subnet-mask ] && read ibft_mask < $if/subnet-mask ++ break ++ done ++fi ++ ++if [ -z "$optaddr" ] && [ "$ibft_ipaddr" ] ; then ++ optaddr=$ibft_ipaddr ++fi ++ ++# Check if the interface needs to be configured ++if [ -z "$mode" ] ; then ++ if [ "$ibft_mode" != "none" ] ; then ++ echo "$mac ibft" ++ mode="ibft" ++ elif [ -z "$ipaddr" ] ; then ++ echo "$mac none" ++ mode="none" ++ elif [ "$ipaddr" = "0.0.0.0" ] ; then ++ echo "$mac dhcp" ++ ipaddr= ++ mode="dhcp" ++ else ++ echo "$mac ip $ipaddr" ++ mode="static" ++ fi ++ [ "$dry_run" ] && exit 0 ++elif [ "$mode" = "dhcp" ] ; then ++ if [ "$ipaddr" = "0.0.0.0" ] ; then ++ echo "$mac dhcp" ++ exit 0 ++ fi ++ optaddr="0.0.0.0" ++elif [ "$mode" = "static" ] && [ "$ipaddr" = "$optaddr" ] ; then ++ echo "$mac ip $ipaddr" ++ exit 0 ++fi ++ ++if [ "$mod" = "be2iscsi" ] ; then ++ exit 4 ++fi ++ ++if ! update_iface_setting $ioe_iface iface.ipaddress "$optaddr" ; then ++ echo "Failed to set IP address: $?" ++ exit 1 ++fi ++if ! update_iface_setting $gen_iface iface.ipaddress "$optaddr" ; then ++ echo "Failed to set IP address for generic interface: $?" ++ exit 1 ++fi ++ ++if ! update_iface_setting $ioe_iface iface.gateway "$ibft_gateway" ; then ++ echo "Failed to set gateway address: $?" ++ exit 1 ++fi ++ ++if ! update_iface_setting $gen_iface iface.gateway "$ibft_gateway" ; then ++ echo "Failed to set gateway address for generic interface: $?" ++ exit 1 ++fi ++ ++if ! update_iface_setting $ioe_iface iface.subnet_mask "$ibft_mask" ; then ++ echo "Failed to set subnet mask: $?" ++ exit 1 ++fi ++ ++if ! update_iface_setting $gen_iface iface.subnet_mask "$ibft_mask" ; then ++ echo "Failed to set subnet mask for generic interface: $?" ++ exit 1 ++fi ++ ++if [ "$mod" = "qla4xxx" ] ; then ++ iscsiadm -m iface -H $mac -o applyall ++fi ++ip link set dev $IFNAME up ++ ++exit 0 ++ +diff --git a/utils/md5.c b/utils/md5.c +index 53956c6..cbe8d08 100644 +--- a/utils/md5.c ++++ b/utils/md5.c +@@ -133,7 +133,7 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx) + + byteSwap(ctx->buf, 4); + memcpy(digest, ctx->buf, 16); +- memset(ctx, 0, sizeof (ctx)); /* In case it's sensitive */ ++ memset(ctx, 0, sizeof (*ctx)); /* In case it's sensitive */ + } + + #ifndef ASM_MD5 +diff --git a/utils/open-isns/bitvector.c b/utils/open-isns/bitvector.c +index 3e23f26..9d66276 100644 +--- a/utils/open-isns/bitvector.c ++++ b/utils/open-isns/bitvector.c +@@ -327,10 +327,10 @@ isns_bitvector_is_empty(const isns_bitvector_t *bv) + wp = bv->ib_words; + end = wp + bv->ib_count; + while (wp < end) { +- unsigned int base, rlen; ++ unsigned int rlen; + +- base = *wp++; +- rlen = *wp++; ++ rlen = wp[1]; ++ wp += 2; + + while (rlen--) { + if (*wp++) +@@ -462,11 +462,10 @@ isns_bitvector_foreach(const isns_bitvector_t *bv, + wp = bv->ib_words; + end = wp + bv->ib_count; + while (wp < end) { +- unsigned int base, rlen, bits; ++ unsigned int base, rlen; + + base = wp[0]; + rlen = wp[1]; +- bits = rlen * 32; + wp += 2; + + while (rlen--) { +@@ -492,11 +491,10 @@ isns_bitvector_dump(const isns_bitvector_t *bv, isns_print_fn_t *fn) + wp = bv->ib_words; + end = wp + bv->ib_count; + while (wp < end) { +- unsigned int base, rlen, bits; ++ unsigned int base, rlen; + + base = wp[0]; + rlen = wp[1]; +- bits = rlen * 32; + wp += 2; + + fn(" <%u:", base); +@@ -538,11 +536,10 @@ isns_bitvector_print(const isns_bitvector_t *bv, + wp = bv->ib_words; + end = wp + bv->ib_count; + while (wp < end) { +- unsigned int base, rlen, bits; ++ unsigned int base, rlen; + + base = wp[0]; + rlen = wp[1]; +- bits = rlen * 32; + wp += 2; + + while (rlen--) { +diff --git a/utils/open-isns/dd.c b/utils/open-isns/dd.c +index b392036..c2dcd10 100644 +--- a/utils/open-isns/dd.c ++++ b/utils/open-isns/dd.c +@@ -599,10 +599,9 @@ isns_dd_insert(isns_dd_t *dd) + void + isns_dd_list_resize(isns_dd_list_t *list, unsigned int last_index) + { +- unsigned int new_size, cur_size; ++ unsigned int new_size; + isns_dd_t **new_data; + +- cur_size = LIST_SIZE(list->ddl_count); + new_size = LIST_SIZE(last_index + 1); + if (new_size < list->ddl_count) + return; +diff --git a/utils/open-isns/doc/isnsadm.8 b/utils/open-isns/doc/isnsadm.8 +index c3e2b83..88ec4cf 100644 +--- a/utils/open-isns/doc/isnsadm.8 ++++ b/utils/open-isns/doc/isnsadm.8 +@@ -25,6 +25,10 @@ isnsadm \- iSNS client utility + .PP + .B isnsadm + .RB [ ... ] ++.RI --dd-deregister " dd-id attr=value ++.PP ++.B isnsadm ++.RB [ ... ] + .RI --enroll " client-name attr=value + .PP + .B isnsadm +@@ -452,6 +456,18 @@ Note, in order to add members to an existing domain, you must + specify the domain's numeric ID. The domain's symbolic name + is not a valid handle when referring to a discovery domain. + .\"--------------------------- ++.SS Discovery Domain Deregistration mode ++In this mode, you can deregister a discoery domain previously registered. ++Only the node which registered a discovery domain in the first place is ++permitted to remove it, or any of its members. (Control ++nodes are not bound by this restriction). ++.PP ++In Discovery Domain deregistration mode, the argument list consists of ++the Discovery Domain ID, followed by a list of ++.IB attr = value ++pairs. Discovery Domain Deregistration supports the same set of attributes as ++query mode. ++.\"--------------------------- + .SS Client Enrollment + This mode only works when the server recognizes the client + as having control node capabilities, which is possible in +diff --git a/utils/open-isns/isnsadm.c b/utils/open-isns/isnsadm.c +index fadd87d..db34f8f 100644 +--- a/utils/open-isns/isnsadm.c ++++ b/utils/open-isns/isnsadm.c +@@ -272,6 +272,8 @@ usage(int exval, const char *msg) + "\nThe following actions are supported:\n" + " --register Register one or more objects\n" + " --deregister Deregister an object (and children)\n" ++ " --dd-register Register a Discovery Domain (and members)\n" ++ " --dd-deregister Deregister a Discovery Domain (and members)\n" + " --query Query iSNS server for objects\n" + " --list List all objects of a given type\n" + " --enroll Create a new policy object for a client\n" +diff --git a/utils/sysdeps/Makefile b/utils/sysdeps/Makefile +index 53c10e5..4299164 100644 +--- a/utils/sysdeps/Makefile ++++ b/utils/sysdeps/Makefile +@@ -1,6 +1,7 @@ + # This Makefile will work only with GNU make. + +-CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -O2 -fno-inline -Wall -Wstrict-prototypes -g ++CFLAGS ?= -O2 -fno-inline -g ++CFLAGS += $(WARNFLAGS) -Wall -Wstrict-prototypes + + SYSDEPS_OBJS=sysdeps.o + +-- +2.1.0 + diff --git a/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch b/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch deleted file mode 100644 index 844babf..0000000 --- a/0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch +++ /dev/null @@ -1,37 +0,0 @@ -From f0a8c95426d21413d9980d31740e193208e3280e Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Wed, 5 Sep 2012 14:14:20 -0700 -Subject: ISCSISTART: Bring up the corresponding network interface for iboot - -This is needed for the iSCSI offload boot. - -Snip from M. Christie: -Note that we must bring up the interface before iface_setup_from_boot_context, -because we will want iscsi_sysfs_get_host_no_from_hwaddress to be able to match -a MAC to a iscsi host. For some bnx2i cards, the card has to be ifupd for the -iscsi interface to have a MAC. If it is not ifupd we have seen MACs with all -zeros or no iscsi_hosts on different cards. - -Signed-off-by: Eddie Wai ---- - usr/iface.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/usr/iface.c b/usr/iface.c -index 3a9582e..4028e34 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -917,6 +917,10 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - transport_name)) - t = iscsi_sysfs_get_transport_by_name(transport_name); - -+ if (net_ifup_netdev(context->iface)) -+ log_warning("Could not bring up netdev %s for boot", -+ context->iface); -+ - hostno = iscsi_sysfs_get_host_no_from_hwaddress(context->mac, - &rc); - if (rc) { --- -1.7.11.7 - diff --git a/0002-idmb_rec_write-check-for-tpgt-first.patch b/0002-idmb_rec_write-check-for-tpgt-first.patch new file mode 100644 index 0000000..73e901b --- /dev/null +++ b/0002-idmb_rec_write-check-for-tpgt-first.patch @@ -0,0 +1,55 @@ +From a6b6a38a783a29951a3c91f95416ebec69ea2375 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Tue, 13 Aug 2013 10:59:44 -0700 +Subject: [PATCH] idmb_rec_write, check for tpgt first + +Factor out the check for a tpgt to a single place, before going crazy on +the rec files. Makes flow of this function easier to follow, and preps +for splitting it up. +--- + usr/idbm.c | 18 +++++------------- + 1 file changed, 5 insertions(+), 13 deletions(-) + +diff --git a/usr/idbm.c b/usr/idbm.c +index 198a5ef..caec94f 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -2041,6 +2041,10 @@ static int idbm_rec_write(node_rec_t *rec) + if (rc) + goto free_portal; + ++ if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) ++ /* drop down to old style portal as config */ ++ goto open_conf; ++ + rc = stat(portal, &statb); + if (rc) { + rc = 0; +@@ -2049,23 +2053,11 @@ static int idbm_rec_write(node_rec_t *rec) + * set the tgpt. In new versions you must pass all the info in + * from the start + */ +- if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) +- /* drop down to old style portal as config */ +- goto open_conf; +- else +- goto mkdir_portal; ++ goto mkdir_portal; + } + + if (!S_ISDIR(statb.st_mode)) { + /* +- * older iscsiadm versions had you create the config then set +- * set the tgpt. In new versions you must pass all the info in +- * from the start +- */ +- if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) +- /* drop down to old style portal as config */ +- goto open_conf; +- /* + * Old style portal as a file, but with tpgt. Let's update it. + */ + if (unlink(portal)) { +-- +2.1.0 + diff --git a/0003-idbm_rec_write-seperate-old-and-new-style-writes.patch b/0003-idbm_rec_write-seperate-old-and-new-style-writes.patch new file mode 100644 index 0000000..d2ae70d --- /dev/null +++ b/0003-idbm_rec_write-seperate-old-and-new-style-writes.patch @@ -0,0 +1,180 @@ +From c9247e2ad8b8e2b6cebdb5e5de4e0949f0d3db8c Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Tue, 13 Aug 2013 11:34:31 -0700 +Subject: [PATCH] idbm_rec_write, seperate old and new style writes + +Duplicates a small bit of code, but easier to understand and extened. +--- + usr/idbm.c | 116 +++++++++++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 79 insertions(+), 37 deletions(-) + +diff --git a/usr/idbm.c b/usr/idbm.c +index caec94f..63265c2 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -2000,7 +2000,7 @@ mkdir_portal: + return f; + } + +-static int idbm_rec_write(node_rec_t *rec) ++static int idbm_rec_write_new(node_rec_t *rec) + { + struct stat statb; + FILE *f; +@@ -2012,38 +2012,8 @@ static int idbm_rec_write(node_rec_t *rec) + log_error("Could not alloc portal"); + return ISCSI_ERR_NOMEM; + } +- +- snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); +- if (access(portal, F_OK) != 0) { +- if (mkdir(portal, 0660) != 0) { +- log_error("Could not make %s: %s", portal, +- strerror(errno)); +- rc = ISCSI_ERR_IDBM; +- goto free_portal; +- } +- } +- +- snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); +- if (access(portal, F_OK) != 0) { +- if (mkdir(portal, 0660) != 0) { +- log_error("Could not make %s: %s", portal, +- strerror(errno)); +- rc = ISCSI_ERR_IDBM; +- goto free_portal; +- } +- } +- + snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, + rec->name, rec->conn[0].address, rec->conn[0].port); +- log_debug(5, "Looking for config file %s", portal); +- +- rc = idbm_lock(); +- if (rc) +- goto free_portal; +- +- if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) +- /* drop down to old style portal as config */ +- goto open_conf; + + rc = stat(portal, &statb); + if (rc) { +@@ -2064,11 +2034,11 @@ static int idbm_rec_write(node_rec_t *rec) + log_error("Could not convert %s: %s", portal, + strerror(errno)); + rc = ISCSI_ERR_IDBM; +- goto unlock; ++ goto free_portal; + } + } else { + rc = ISCSI_ERR_INVAL; +- goto unlock; ++ goto free_portal; + } + + mkdir_portal: +@@ -2079,24 +2049,96 @@ mkdir_portal: + log_error("Could not make dir %s: %s", + portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; +- goto unlock; ++ goto free_portal; + } + } + + snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR, + rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt, + rec->iface.name); +-open_conf: ++/* open_conf: */ + f = fopen(portal, "w"); + if (!f) { + log_error("Could not open %s: %s", portal, strerror(errno)); + rc = ISCSI_ERR_IDBM; +- goto unlock; ++ goto free_portal; + } + + idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); + fclose(f); +-unlock: ++free_portal: ++ free(portal); ++ return rc; ++} ++ ++static int idbm_rec_write_old(node_rec_t *rec) ++{ ++ FILE *f; ++ char *portal; ++ int rc = 0; ++ ++ portal = malloc(PATH_MAX); ++ if (!portal) { ++ log_error("Could not alloc portal"); ++ return ISCSI_ERR_NOMEM; ++ } ++ snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, ++ rec->name, rec->conn[0].address, rec->conn[0].port); ++ ++ f = fopen(portal, "w"); ++ if (!f) { ++ log_error("Could not open %s: %sd", portal, strerror(errno)); ++ rc = ISCSI_ERR_IDBM; ++ goto free_portal; ++ } ++ idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); ++ fclose(f); ++free_portal: ++ free(portal); ++ return rc; ++} ++ ++static int idbm_rec_write(node_rec_t *rec) ++{ ++ char *portal; ++ int rc = 0; ++ ++ portal = malloc(PATH_MAX); ++ if (!portal) { ++ log_error("Could not alloc portal"); ++ return ISCSI_ERR_NOMEM; ++ } ++ ++ snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); ++ if (access(portal, F_OK) != 0) { ++ if (mkdir(portal, 0660) != 0) { ++ log_error("Could not make %s: %s", portal, ++ strerror(errno)); ++ rc = ISCSI_ERR_IDBM; ++ goto free_portal; ++ } ++ } ++ ++ snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); ++ if (access(portal, F_OK) != 0) { ++ if (mkdir(portal, 0660) != 0) { ++ log_error("Could not make %s: %s", portal, ++ strerror(errno)); ++ rc = ISCSI_ERR_IDBM; ++ goto free_portal; ++ } ++ } ++ ++ rc = idbm_lock(); ++ if (rc) ++ goto free_portal; ++ ++ if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) ++ /* old style portal as config */ ++ rc = idbm_rec_write_old(rec); ++ else ++ rc = idbm_rec_write_new(rec); ++ + idbm_unlock(); + free_portal: + free(portal); +-- +2.1.0 + diff --git a/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch b/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch deleted file mode 100644 index c80ff3a..0000000 --- a/0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch +++ /dev/null @@ -1,35 +0,0 @@ -From d81fd4903cebb1d00aa48b0718d20e34b00dfde1 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Wed, 26 Sep 2012 21:19:39 -0500 -Subject: iscsi tools: fix compile error when OFFLOAD_BOOT_SUPPORT defined - -Fix compile error when OFFLOAD_BOOT_SUPPORT is defined and fix -warning when it is defined. ---- - usr/iface.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/usr/iface.c b/usr/iface.c -index 4028e34..4f81a76 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -894,7 +894,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - struct boot_context *context) - { - struct iscsi_transport *t = NULL; -- char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; - uint32_t hostno; - - if (strlen(context->initiatorname)) -@@ -910,6 +909,8 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - } else if (strlen(context->iface)) { - /* this ifdef is only temp until distros and firmwares are updated */ - #ifdef OFFLOAD_BOOT_SUPPORTED -+ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; -+ int rc; - - memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN); - /* make sure offload driver is loaded */ --- -1.7.11.7 - diff --git a/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch b/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch deleted file mode 100644 index 5de8d3e..0000000 --- a/0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 13d08e79090421fbf67fd727aada487ea23ecc2d Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Thu, 27 Sep 2012 13:57:12 -0700 -Subject: ISCSID: Passing more net params from ibft to iface - -Added the passing of the vlan_id, subnet_mask, and gateway attributes -from the ibft context to the iface struct for the connection request. - -Signed-off-by: Eddie Wai ---- - usr/iface.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/usr/iface.c b/usr/iface.c -index 4f81a76..c86892e 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -962,6 +962,11 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - sizeof(iface->hwaddress)); - strlcpy(iface->ipaddress, context->ipaddr, - sizeof(iface->ipaddress)); -+ iface->vlan_id = atoi(context->vlan); -+ strlcpy(iface->subnet_mask, context->mask, -+ sizeof(iface->subnet_mask)); -+ strlcpy(iface->gateway, context->gateway, -+ sizeof(iface->gateway)); - log_debug(1, "iface " iface_fmt "\n", iface_str(iface)); - return 1; - } --- -1.7.11.7 - diff --git a/0004-idbw_rec_write-pick-tpgt-from-existing-record.patch b/0004-idbw_rec_write-pick-tpgt-from-existing-record.patch new file mode 100644 index 0000000..8f5665f --- /dev/null +++ b/0004-idbw_rec_write-pick-tpgt-from-existing-record.patch @@ -0,0 +1,87 @@ +From 6143b83d2a0a313b1588ec0949fdf61e38f3b980 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Tue, 13 Aug 2013 12:39:07 -0700 +Subject: [PATCH] idbw_rec_write, pick tpgt from existing record + +On a static add (-m node -o new) without a user specified tpgt, looks +for existing new style records with tpgt before creating an old style +record without. If one exists, take the tpgt from it an write an +updated new style record instead. +--- + usr/idbm.c | 40 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + +diff --git a/usr/idbm.c b/usr/idbm.c +index 63265c2..d8f42b6 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -162,6 +163,8 @@ static struct idbm *db; + _n++; \ + } while(0) + ++static int idbm_remove_disc_to_node_link(node_rec_t *rec, char *portal); ++ + static void + idbm_recinfo_discovery(discovery_rec_t *r, recinfo_t *ri) + { +@@ -2076,12 +2079,49 @@ static int idbm_rec_write_old(node_rec_t *rec) + FILE *f; + char *portal; + int rc = 0; ++ glob_t globbuf; ++ int i; ++ int tpgt = PORTAL_GROUP_TAG_UNKNOWN; + + portal = malloc(PATH_MAX); + if (!portal) { + log_error("Could not alloc portal"); + return ISCSI_ERR_NOMEM; + } ++ ++ /* check for newer portal dir with tpgt */ ++ snprintf(portal, PATH_MAX, "%s/%s/%s,%d,*", NODE_CONFIG_DIR, ++ rec->name, rec->conn[0].address, rec->conn[0].port); ++ rc = glob(portal, GLOB_ONLYDIR, NULL, &globbuf); ++ if (!rc) { ++ if (globbuf.gl_pathc > 1) ++ log_warning("multiple tpg records for portal " ++ "%s/%s:%d found", rec->name, ++ rec->conn[0].address, rec->conn[0].port); ++ /* set pattern for sscanf matching of tpgt */ ++ snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%%u", NODE_CONFIG_DIR, ++ rec->name, rec->conn[0].address, rec->conn[0].port); ++ for (i = 0; i < globbuf.gl_pathc; i++) { ++ rc = sscanf(globbuf.gl_pathv[i], portal, &tpgt); ++ if (rc == 1) ++ break; ++ } ++ if (tpgt == PORTAL_GROUP_TAG_UNKNOWN) ++ log_warning("glob match on existing records, " ++ "but no valid tpgt found"); ++ } ++ globfree(&globbuf); ++ rc = 0; ++ ++ /* if a tpgt was selected from an old record, write entry in new format */ ++ if (tpgt != PORTAL_GROUP_TAG_UNKNOWN) { ++ log_warning("using tpgt %u from existing record", tpgt); ++ rec->tpgt = tpgt; ++ rc = idbm_remove_disc_to_node_link(rec, portal); ++ free(portal); ++ return idbm_rec_write_new(rec); ++ } ++ + snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, + rec->name, rec->conn[0].address, rec->conn[0].port); + +-- +2.1.0 + diff --git a/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch b/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch deleted file mode 100644 index 4a95ac1..0000000 --- a/0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 9dd181dcb1ca299cd82075b8e598fc57d87ee1c0 Mon Sep 17 00:00:00 2001 -From: Jim Ramsay -Date: Wed, 3 Oct 2012 09:57:43 -0400 -Subject: iscsi tools: Convert '-r' argument to an integer before checking if - it is a path - -If there is a file in the CWD named '1' and you were trying to run -'iscsiadm -m session -r 1 ...', the command would fail with "1 is not a -directory". - -Root cause: The code that parses the -r option's argument tries lstat(2) -first, falling back to atoi(3) only if lstat fails. - -This change inverts the order of checks, first with strtol(3) to see if -the argument given is a positive integer, then falling back to lstat(2) -only if it is not. - -Signed-off-by: Jim Ramsay ---- - usr/iscsi_sysfs.c | 17 +++++++++-------- - 1 file changed, 9 insertions(+), 8 deletions(-) - -diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c -index 123dde3..4015b35 100644 ---- a/usr/iscsi_sysfs.c -+++ b/usr/iscsi_sysfs.c -@@ -740,7 +740,7 @@ int iscsi_sysfs_session_has_leadconn(uint32_t sid) - * /sys/devices/platform/hostH/sessionS/targetH:B:I - * /sys/devices/platform/hostH/sessionS - * -- * return the sid S. If just the sid is passed in it will be covnerted -+ * return the sid S. If just the sid is passed in it will be converted - * to a int. - */ - int iscsi_sysfs_get_sid_from_path(char *session) -@@ -748,15 +748,16 @@ int iscsi_sysfs_get_sid_from_path(char *session) - struct sysfs_device *dev_parent, *dev; - struct stat statb; - char devpath[PATH_SIZE]; -+ char *end; -+ int sid; -+ -+ sid = strtol(session, &end, 10); -+ if (sid > 0 && *session != '\0' && *end == '\0') -+ return sid; - - if (lstat(session, &statb)) { -- log_debug(1, "Could not stat %s failed with %d", -- session, errno); -- if (index(session, '/')) { -- log_error("%s is an invalid session path\n", session); -- exit(1); -- } -- return atoi(session); -+ log_error("%s is an invalid session ID or path\n", session); -+ exit(1); - } - - if (!S_ISDIR(statb.st_mode) && !S_ISLNK(statb.st_mode)) { --- -1.7.11.7 - diff --git a/0005-update-systemd-service-files-add-iscsi.service-for-s.patch b/0005-update-systemd-service-files-add-iscsi.service-for-s.patch new file mode 100644 index 0000000..1f3fca3 --- /dev/null +++ b/0005-update-systemd-service-files-add-iscsi.service-for-s.patch @@ -0,0 +1,93 @@ +From d8eb7f9f08f3371aa153779ee6dafb6b04afb914 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 19 Dec 2012 15:07:36 -0800 +Subject: [PATCH] update systemd service files, add iscsi.service for starting + sessions on boot + +Signed-off-by: Chris Leech +--- + etc/systemd/iscsi.service | 19 +++++++++++++++++++ + etc/systemd/iscsi_mark_root_nodes | 14 ++++++++++++++ + etc/systemd/iscsid.service | 7 +++++-- + etc/systemd/iscsid.socket | 2 +- + 4 files changed, 39 insertions(+), 3 deletions(-) + create mode 100644 etc/systemd/iscsi.service + create mode 100755 etc/systemd/iscsi_mark_root_nodes + +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +new file mode 100644 +index 0000000..bbd52fd +--- /dev/null ++++ b/etc/systemd/iscsi.service +@@ -0,0 +1,19 @@ ++[Unit] ++Description=Login and scanning of iSCSI devices ++Documentation=man:iscsid(8) man:iscsiadm(8) ++DefaultDependencies=no ++Conflicts=shutdown.target ++After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service ++Before=remote-fs-pre.target ++ConditionPathExists=/etc/iscsi/initiatorname.iscsi ++ ++[Service] ++Type=oneshot ++RemainAfterExit=true ++ExecStart=/usr/libexec/iscsi_mark_root_nodes ++ExecStart=/sbin/iscsiadm -m node --loginall=automatic ++ExecStop=/bin/sync ++ExecStop=/sbin/iscsiadm -m node --logoutall=automatic ++ ++[Install] ++WantedBy=sysinit.target +diff --git a/etc/systemd/iscsi_mark_root_nodes b/etc/systemd/iscsi_mark_root_nodes +new file mode 100755 +index 0000000..c68475c +--- /dev/null ++++ b/etc/systemd/iscsi_mark_root_nodes +@@ -0,0 +1,14 @@ ++#!/bin/bash ++ ++ISCSIADM=/sbin/iscsiadm ++SESSION_FILE=/run/initramfs/iscsi.sessions ++ ++if [ ! -f $SESSION_FILE ] ; then ++ exit 0 ++fi ++ ++while read t num i target; do ++ ip=${i%:*} ++ $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot ++done < $SESSION_FILE ++ +diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service +index 028e0b3..653dd08 100644 +--- a/etc/systemd/iscsid.service ++++ b/etc/systemd/iscsid.service +@@ -1,7 +1,10 @@ + [Unit] + Description=Open-iSCSI +-Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) +-After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service ++Documentation=man:iscsid(8) man:iscsiadm(8) ++DefaultDependencies=no ++Conflicts=shutdown.target ++After=network.target iscsiuio.service ++Before=remote-fs-pre.target + + [Service] + Type=forking +diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket +index 832451d..58a8d12 100644 +--- a/etc/systemd/iscsid.socket ++++ b/etc/systemd/iscsid.socket +@@ -1,6 +1,6 @@ + [Unit] + Description=Open-iSCSI iscsid Socket +-Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) ++Documentation=man:iscsid(8) man:iscsiadm(8) + + [Socket] + ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE +-- +2.1.0 + diff --git a/0006-Update-README-for-removal-of-DBM-requirement.patch b/0006-Update-README-for-removal-of-DBM-requirement.patch deleted file mode 100644 index 3fb2408..0000000 --- a/0006-Update-README-for-removal-of-DBM-requirement.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 97db3db45c7e96888ea48a54ff19b7ff5d08cca6 Mon Sep 17 00:00:00 2001 -From: Andy Grover -Date: Wed, 24 Oct 2012 15:37:28 -0700 -Subject: Update README for removal of DBM requirement - -Removed in 093b1f4 (2006) - -Signed-off-by: Andy Grover ---- - README | 23 ++++++++++++++--------- - 1 file changed, 14 insertions(+), 9 deletions(-) - -diff --git a/README b/README -index 7364b2d..ec22098 100644 ---- a/README -+++ b/README -@@ -159,15 +159,20 @@ Usage: iscsid [OPTION] - 5. Open-iSCSI Configuration Utility - =================================== - --Open-iSCSI persistent configuration is implemented as a DBM database --available on all Linux installations. -- --The database contains two tables: -- --- Discovery table (/etc/iscsi/send_targets); --- Node table (/etc/iscsi/nodes). -- --The regular place for iSCSI database files: /etc/iscsi/nodes -+Open-iSCSI persistent configuration is stored in a number of -+directories under a configuration root directory, using a flat-file -+format. This configuration root directory is /etc/iscsi by default, -+but may also commonly be in /var/lib/iscsi. -+ -+Configuration is contained in directories for: -+ -+- nodes -+- slp -+- isns -+- static -+- fw -+- send_targets -+- ifaces - - The iscsiadm utility is a command-line tool to manage (update, delete, - insert, query) the persistent database. --- -1.7.11.7 - diff --git a/0006-iscsi-boot-related-service-file-updates.patch b/0006-iscsi-boot-related-service-file-updates.patch new file mode 100644 index 0000000..ae93e68 --- /dev/null +++ b/0006-iscsi-boot-related-service-file-updates.patch @@ -0,0 +1,75 @@ +From 33c39eb2242c01ead31aaaa964bc17a60dbf1582 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 19 Aug 2013 07:18:25 -0700 +Subject: [PATCH] iscsi boot related service file updates + +make sure iscsid gets started if there are any boot sessions running +add reload target to fix double session problem when restarting from NM +don't rely on session list passed from initrd, never got fully implemented +--- + etc/systemd/iscsi-mark-root-nodes | 13 +++++++++++++ + etc/systemd/iscsi.service | 3 ++- + etc/systemd/iscsi_mark_root_nodes | 14 -------------- + 3 files changed, 15 insertions(+), 15 deletions(-) + create mode 100644 etc/systemd/iscsi-mark-root-nodes + delete mode 100755 etc/systemd/iscsi_mark_root_nodes + +diff --git a/etc/systemd/iscsi-mark-root-nodes b/etc/systemd/iscsi-mark-root-nodes +new file mode 100644 +index 0000000..157be62 +--- /dev/null ++++ b/etc/systemd/iscsi-mark-root-nodes +@@ -0,0 +1,13 @@ ++#!/bin/bash ++ ++ISCSIADM=/sbin/iscsiadm ++ ++$ISCSIADM -m session >/dev/null 2>&1 || exit 0 ++ ++$ISCSIADM -m session | while read t num i target; do ++ ip=${i%:*} ++ $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot ++done ++ ++systemctl start iscsid.service ++ +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +index bbd52fd..0309e2f 100644 +--- a/etc/systemd/iscsi.service ++++ b/etc/systemd/iscsi.service +@@ -10,10 +10,11 @@ ConditionPathExists=/etc/iscsi/initiatorname.iscsi + [Service] + Type=oneshot + RemainAfterExit=true +-ExecStart=/usr/libexec/iscsi_mark_root_nodes ++ExecStart=/usr/libexec/iscsi-mark-root-nodes + ExecStart=/sbin/iscsiadm -m node --loginall=automatic + ExecStop=/bin/sync + ExecStop=/sbin/iscsiadm -m node --logoutall=automatic ++ExecReload=/sbin/iscsiadm -m node --loginall=automatic + + [Install] + WantedBy=sysinit.target +diff --git a/etc/systemd/iscsi_mark_root_nodes b/etc/systemd/iscsi_mark_root_nodes +deleted file mode 100755 +index c68475c..0000000 +--- a/etc/systemd/iscsi_mark_root_nodes ++++ /dev/null +@@ -1,14 +0,0 @@ +-#!/bin/bash +- +-ISCSIADM=/sbin/iscsiadm +-SESSION_FILE=/run/initramfs/iscsi.sessions +- +-if [ ! -f $SESSION_FILE ] ; then +- exit 0 +-fi +- +-while read t num i target; do +- ip=${i%:*} +- $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot +-done < $SESSION_FILE +- +-- +2.1.0 + diff --git a/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch b/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch deleted file mode 100644 index 53ade5f..0000000 --- a/0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 2d086a831dc16d10729d6fce17bed3ade3efd16c Mon Sep 17 00:00:00 2001 -From: Tomasz Torcz -Date: Wed, 28 Nov 2012 13:37:06 +0100 -Subject: iscsid,iscsiadm: fix abstract socket length in bind() call - -For abstract sockets, the addrlen parameter should be the actual -length of socket's name. Otherwise socket gets padded with some -number of NULs. ---- - usr/iscsid_req.c | 10 ++++++---- - usr/mgmt_ipc.c | 9 +++++---- - 2 files changed, 11 insertions(+), 8 deletions(-) - -diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c -index 0902011..1c4678d 100644 ---- a/usr/iscsid_req.c -+++ b/usr/iscsid_req.c -@@ -56,7 +56,7 @@ static void iscsid_startup(void) - - static int iscsid_connect(int *fd, int start_iscsid) - { -- int nsec; -+ int nsec, addr_len; - struct sockaddr_un addr; - - *fd = socket(AF_LOCAL, SOCK_STREAM, 0); -@@ -65,15 +65,17 @@ static int iscsid_connect(int *fd, int start_iscsid) - return ISCSI_ERR_ISCSID_NOTCONN; - } - -+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1; -+ - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; -- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, -- strlen(ISCSIADM_NAMESPACE)); -+ memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len); -+ - /* - * Trying to connect with exponential backoff - */ - for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) { -- if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0) -+ if (connect(*fd, (struct sockaddr *) &addr, addr_len) == 0) - /* Connection established */ - return ISCSI_SUCCESS; - -diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c -index 5c39c2e..a1dafc9 100644 ---- a/usr/mgmt_ipc.c -+++ b/usr/mgmt_ipc.c -@@ -43,7 +43,7 @@ - int - mgmt_ipc_listen(void) - { -- int fd, err; -+ int fd, err, addr_len; - struct sockaddr_un addr; - - fd = socket(AF_LOCAL, SOCK_STREAM, 0); -@@ -52,12 +52,13 @@ mgmt_ipc_listen(void) - return fd; - } - -+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1; -+ - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; -- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, -- strlen(ISCSIADM_NAMESPACE)); -+ memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len); - -- if ((err = bind(fd, (struct sockaddr *) &addr, sizeof(addr))) < 0) { -+ if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) { - log_error("Can not bind IPC socket"); - close(fd); - return err; --- -1.7.11.7 - diff --git a/0007-update-initscripts-and-docs.patch b/0007-update-initscripts-and-docs.patch new file mode 100644 index 0000000..4c7ccc1 --- /dev/null +++ b/0007-update-initscripts-and-docs.patch @@ -0,0 +1,130 @@ +From 067a87077e35e4df3564b42c675394797afa59c8 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 19 Nov 2012 16:37:13 -0800 +Subject: [PATCH] update initscripts and docs + +--- + README | 9 +++------ + etc/iscsid.conf | 23 +++++++++++------------ + usr/idbm.c | 4 ++++ + 3 files changed, 18 insertions(+), 18 deletions(-) + +diff --git a/README b/README +index 06d1b6f..0ac4529 100644 +--- a/README ++++ b/README +@@ -74,11 +74,6 @@ the cache sync command will fail. + - iscsiadm's -P 3 option will not print out scsi devices. + - iscsid will not automatically online devices. + +-You need to enable "Cryptographic API" under "Cryptographic options" in the +-kernel config. And you must enable "CRC32c CRC algorithm" even if +-you do not use header or data digests. They are the kernel options, +-CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively. +- + By default the kernel's iSCSI modules will be used. Running: + + make +@@ -1118,7 +1113,7 @@ Red Hat or Fedora: + ----------------- + To start open-iscsi in Red Hat/Fedora you can do: + +- service open-iscsi start ++ service iscsi start + + To get open-iscsi to automatically start at run time you may have to + run: +@@ -1326,6 +1321,8 @@ iscsid will only perform rediscovery when it gets a SCN from the server. + # linux-isns (SLES's iSNS server) where it sometimes does not send SCN + # events in the proper format, so they may not get handled. + ++To set the startup value, so that nodes are not logged into automatically ++use the value "manual". + + Example: + -------- +diff --git a/etc/iscsid.conf b/etc/iscsid.conf +index c30a7dc..cfa6844 100644 +--- a/etc/iscsid.conf ++++ b/etc/iscsid.conf +@@ -17,10 +17,10 @@ + # maintainers. + # + # Default for Fedora and RHEL. (uncomment to activate). +-# iscsid.startup = /etc/rc.d/init.d/iscsid force-start ++iscsid.startup = /etc/rc.d/init.d/iscsid force-start + # + # Default for upstream open-iscsi scripts (uncomment to activate). +-iscsid.startup = /sbin/iscsid ++# iscsid.startup = /sbin/iscsid + + # Check for active mounts on devices reachable through a session + # and refuse to logout if there are any. Defaults to "No". +@@ -39,8 +39,8 @@ iscsid.startup = /sbin/iscsid + # To request that the iscsi initd scripts startup a session set to "automatic". + # node.startup = automatic + # +-# To manually startup the session set to "manual". The default is manual. +-node.startup = manual ++# To manually startup the session set to "manual". The default is automatic. ++node.startup = automatic + + # For "automatic" startup nodes, setting this to "Yes" will try logins on each + # available iface until one succeeds, and then stop. The default "No" will try +@@ -262,28 +262,27 @@ node.conn[0].iscsi.MaxXmitDataSegmentLength = 0 + discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768 + + # To allow the targets to control the setting of the digest checking, +-# with the initiator requesting a preference of enabling the checking, uncomment# one or both of the following lines: ++# with the initiator requesting a preference of enabling the checking, uncomment ++# the following lines (Data digests are not supported.): + #node.conn[0].iscsi.HeaderDigest = CRC32C,None +-#node.conn[0].iscsi.DataDigest = CRC32C,None ++ + # + # To allow the targets to control the setting of the digest checking, + # with the initiator requesting a preference of disabling the checking, +-# uncomment one or both of the following lines: ++# uncomment the following line: + #node.conn[0].iscsi.HeaderDigest = None,CRC32C +-#node.conn[0].iscsi.DataDigest = None,CRC32C + # + # To enable CRC32C digest checking for the header and/or data part of +-# iSCSI PDUs, uncomment one or both of the following lines: ++# iSCSI PDUs, uncomment the following line: + #node.conn[0].iscsi.HeaderDigest = CRC32C +-#node.conn[0].iscsi.DataDigest = CRC32C + # + # To disable digest checking for the header and/or data part of +-# iSCSI PDUs, uncomment one or both of the following lines: ++# iSCSI PDUs, uncomment the following line: + #node.conn[0].iscsi.HeaderDigest = None +-#node.conn[0].iscsi.DataDigest = None + # + # The default is to never use DataDigests or HeaderDigests. + # ++node.conn[0].iscsi.HeaderDigest = None + + # For multipath configurations, you may want more than one session to be + # created on each iface record. If node.session.nr_sessions is greater +diff --git a/usr/idbm.c b/usr/idbm.c +index d8f42b6..589078c 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -512,9 +512,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) + IDBM_SHOW, "None", "CRC32C", "CRC32C,None", + "None,CRC32C", num, 1); + sprintf(key, CONN_DATA_DIGEST, i); ++ ++#if 0 ++We do not support data digests + __recinfo_int_o4(key, ri, r, conn[i].iscsi.DataDigest, IDBM_SHOW, + "None", "CRC32C", "CRC32C,None", + "None,CRC32C", num, 1); ++#endif + sprintf(key, CONN_IFMARKER, i); + __recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW, + "No", "Yes", num, 1); +-- +2.1.0 + diff --git a/0008-iscsid-implement-systemd-compatible-socket-activatio.patch b/0008-iscsid-implement-systemd-compatible-socket-activatio.patch deleted file mode 100644 index 2e4715c..0000000 --- a/0008-iscsid-implement-systemd-compatible-socket-activatio.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 5d0e19fcc1cea77a72647cf96c5d3d773e8ee277 Mon Sep 17 00:00:00 2001 -From: Tomasz Torcz -Date: Wed, 28 Nov 2012 13:37:07 +0100 -Subject: iscsid: implement systemd-compatible socket activation - ---- - usr/mgmt_ipc.c | 29 +++++++++++++++++++++++++++++ - usr/mgmt_ipc.h | 1 + - 2 files changed, 30 insertions(+) - -diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c -index a1dafc9..87bd346 100644 ---- a/usr/mgmt_ipc.c -+++ b/usr/mgmt_ipc.c -@@ -39,6 +39,7 @@ - - #define PEERUSER_MAX 64 - #define EXTMSG_MAX (64 * 1024) -+#define SD_SOCKET_FDS_START 3 - - int - mgmt_ipc_listen(void) -@@ -46,6 +47,12 @@ mgmt_ipc_listen(void) - int fd, err, addr_len; - struct sockaddr_un addr; - -+ /* first check if we have fd handled by systemd */ -+ fd = mgmt_ipc_systemd(); -+ if (fd >= 0) -+ return fd; -+ -+ /* manually establish a socket */ - fd = socket(AF_LOCAL, SOCK_STREAM, 0); - if (fd < 0) { - log_error("Can not create IPC socket"); -@@ -73,6 +80,28 @@ mgmt_ipc_listen(void) - return fd; - } - -+int mgmt_ipc_systemd(void) -+{ -+ const char *env; -+ -+ env = getenv("LISTEN_PID"); -+ -+ if (!env || (strtoul(env, NULL, 10) != getpid())) -+ return -EINVAL; -+ -+ env = getenv("LISTEN_FDS"); -+ -+ if (!env) -+ return -EINVAL; -+ -+ if (strtoul(env, NULL, 10) != 1) { -+ log_error("Did not receive exactly one IPC socket from systemd"); -+ return -EINVAL; -+ } -+ -+ return SD_SOCKET_FDS_START; -+} -+ - void - mgmt_ipc_close(int fd) - { -diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h -index 7d8ce72..55972ed 100644 ---- a/usr/mgmt_ipc.h -+++ b/usr/mgmt_ipc.h -@@ -112,6 +112,7 @@ typedef int mgmt_ipc_fn_t(struct queue_task *); - struct queue_task; - void mgmt_ipc_write_rsp(struct queue_task *qtask, int err); - int mgmt_ipc_listen(void); -+int mgmt_ipc_systemd(void); - void mgmt_ipc_close(int fd); - void mgmt_ipc_handle(int accept_fd); - --- -1.7.11.7 - diff --git a/0008-use-var-for-config.patch b/0008-use-var-for-config.patch new file mode 100644 index 0000000..b42d934 --- /dev/null +++ b/0008-use-var-for-config.patch @@ -0,0 +1,239 @@ +From f60148c57a269a5dc79a8138e3b9775611ff20d0 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 19 Nov 2012 16:38:45 -0800 +Subject: [PATCH] use var for config + +--- + README | 33 ++++++++++++++++----------------- + doc/iscsiadm.8 | 8 ++++---- + usr/idbm.c | 6 +++--- + usr/idbm.h | 13 +++++++------ + usr/iface.h | 4 +++- + 5 files changed, 33 insertions(+), 31 deletions(-) + +diff --git a/README b/README +index 0ac4529..e7c7bf5 100644 +--- a/README ++++ b/README +@@ -156,8 +156,7 @@ Usage: iscsid [OPTION] + + Open-iSCSI persistent configuration is stored in a number of + directories under a configuration root directory, using a flat-file +-format. This configuration root directory is /etc/iscsi by default, +-but may also commonly be in /var/lib/iscsi. ++format. This configuration root directory is /var/lib/iscsi by default. + + Configuration is contained in directories for: + +@@ -475,7 +474,7 @@ a scsi_host per HBA port). + To manage both types of initiator stacks, iscsiadm uses the interface (iface) + structure. For each HBA port or for software iscsi for each network + device (ethX) or NIC, that you wish to bind sessions to you must create +-a iface config /etc/iscsi/ifaces. ++a iface config /var/lib/iscsi/ifaces. + + Prep: + +@@ -509,29 +508,29 @@ Running: + iface0 qla4xxx,00:c0:dd:08:63:e8,20.15.0.7,default,iqn.2005-06.com.redhat:madmax + iface1 qla4xxx,00:c0:dd:08:63:ea,20.15.0.9,default,iqn.2005-06.com.redhat:madmax + +-Will report iface configurations that are setup in /etc/iscsi/ifaces. ++Will report iface configurations that are setup in /var/lib/iscsi/ifaces. + The format is: + + iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname + + For software iscsi, you can create the iface configs by hand, but it is + reccomended that you use iscsiadm's iface mode. There is a iface.example in +-/etc/iscsi/ifaces which can be used as a template for the daring. ++/var/lib/iscsi/ifaces which can be used as a template for the daring. + + For each network object you wish to bind a session to you must create +-a seperate iface config in /etc/iscsi/ifaces and each iface config file ++a seperate iface config in /var/lib/iscsi/ifaces and each iface config file + must have a unique name which is less than or equal to 64 characters. + + Example: + + If you have NIC1 with MAC address 00:0F:1F:92:6B:BF and NIC2 with + MAC address 00:C0:DD:08:63:E7 and you wanted to do software iscsi over +-TCP/IP. Then in /etc/iscsi/ifaces/iface0 you would enter: ++TCP/IP. Then in /var/lib/iscsi/ifaces/iface0 you would enter: + + iface.transport_name = tcp + iface.hwaddress = 00:0F:1F:92:6B:BF + +-and in /etc/iscsi/ifaces/iface1 you would enter: ++and in /var/lib/iscsi/ifaces/iface1 you would enter: + + iface.transport_name = tcp + iface.hwaddress = 00:C0:DD:08:63:E7 +@@ -581,7 +580,7 @@ cxgb3i.00:07:43:05:97:07 cxgb3i,00:07:43:05:97:07,,, + qla4xxx.00:0e:1e:04:8b:2e qla4xxx,00:0e:1e:04:8b:2e,,, + + +-Will report iface configurations that are setup in /etc/iscsi/ifaces. ++Will report iface configurations that are setup in /var/lib/iscsi/ifaces. + The format is: + + iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname +@@ -667,7 +666,7 @@ need a seperate network connection to the target for discovery purposes. + *This will be fixed in the next version of open-iscsi* + + For compatibility reasons, when you run iscsiadm to do discovery, it +-will check for interfaces in /etc/iscsi/iscsi/ifaces that are using ++will check for interfaces in /var/lib/iscsi/ifaces that are using + tcp for the iface.transport and it will bind the portals that are discovered + so that they will be logged in through those ifaces. This behavior can also + be overriden by passing in the interfaces you want to use. For the case +@@ -685,7 +684,7 @@ we do not bind a session to a iface, then you can use the special iface + + iscsiadm -m discoverydb -t st -p ip:port -I default --discover -P 1 + +-And if you did not define any interfaces in /etc/iscsi/ifaces and do ++And if you did not define any interfaces in /var/lib/iscsi/ifaces and do + not pass anything into iscsiadm, running iscsiadm will do the default + behavior, where we allow the network subsystem to decide which + device to use. +@@ -727,7 +726,7 @@ To now log into targets it is the same as with sofware iscsi. See section + + ./iscsiadm -m discoverydb -t st -p 192.168.1.1:3260 --discover + +- This will search /etc/iscsi/send_targets for a record with the ++ This will search /var/lib/iscsi/send_targets for a record with the + ID [portal = 192.168.1.1:3260 and type = sendtargets. If found it + will perform discovery using the settings stored in the record. + If a record does not exist, it will be created using the iscsid.conf +@@ -736,7 +735,7 @@ To now log into targets it is the same as with sofware iscsi. See section + The argument to -p may also be a hostname instead of an address. + ./iscsiadm -m discoverydb -t st -p smoehost --discover + +- For the ifaces, iscsiadm will first search /etc/iscsi/ifaces for ++ For the ifaces, iscsiadm will first search /var/lib/iscsi/ifaces for + interfaces using software iscsi. If any are found then nodes found + during discovery will be setup so that they can logged in through + those interfaces. To specify a specific iface, pass the +@@ -792,7 +791,7 @@ To now log into targets it is the same as with sofware iscsi. See section + This command will perform discovery, but not manipulate the node DB. + + - SendTargets iSCSI Discovery with a specific interface. If you +- wish to only use a subset of the interfaces in /etc/iscsi/ifaces ++ wish to only use a subset of the interfaces in /var/lib/iscsi/ifaces + then you can pass them in during discovery: + + ./iscsiadm -m discoverydb -t sendtargets -p 192.168.1.1:3260 \ +@@ -1193,8 +1192,8 @@ where targetname is the name of the target and ip_address:port is the address + and port of the portal. tpgt, is the portal group tag of + the portal, and is not used in iscsiadm commands except for static + record creation. And iface name is the name of the iscsi interface +-defined in /etc/iscsi/ifaces. If no interface was defined in +-/etc/iscsi/ifaces or passed in, the default behavior is used. ++defined in /var/lib/iscsi/ifaces. If no interface was defined in ++/var/lib/iscsi/ifaces or passed in, the default behavior is used. + Default here is iscsi_tcp/tcp to be used over which ever NIC the + network layer decides is best. + +@@ -1309,7 +1308,7 @@ If set, iscsid will perform discovery to the address every + discovery.isns.discoveryd_poll_inval or + discovery.sendtargets.discoveryd_poll_inval seconds, + and it will log into any portals found from the discovery source using +-the ifaces in /etc/iscsi/ifaces. ++the ifaces in /var/lib/iscsi/ifaces. + + Note that for iSNS the poll_interval does not have to be set. If not set, + iscsid will only perform rediscovery when it gets a SCN from the server. +diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 +index f046236..3a581e3 100644 +--- a/doc/iscsiadm.8 ++++ b/doc/iscsiadm.8 +@@ -241,7 +241,7 @@ This option is only valid for ping submode. + .TP + \fB\-I\fR, \fB\-\-interface=\fI[iface]\fR + The interface argument specifies the iSCSI interface to use for the operation. +-iSCSI interfaces (iface) are defined in /etc/iscsi/ifaces. For hardware ++iSCSI interfaces (iface) are defined in /var/lib/iscsi/ifaces. For hardware + iSCSI (qla4xxx) the iface config must have the hardware address + (iface.hwaddress = port's MAC address) + and the driver/transport_name (iface.transport_name). The iface's name is +@@ -318,7 +318,7 @@ If no other options are specified: for \fIdiscovery\fR, \fIdiscoverydb\fR and + \fInode\fR, all of their respective records are displayed; for \fIsession\fR, + all active sessions and connections are displayed; for \fIfw\fR, all boot + firmware values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; +-and for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. ++and for \fIiface\fR, all ifaces setup in /var/lib/iscsi/ifaces are displayed. + + .TP + \fB\-n\fR, \fB\-\-name=\fIname\fR +@@ -703,10 +703,10 @@ The configuration file read by \fBiscsid\fR and \fBiscsiadm\fR on startup. + The file containing the iSCSI InitiatorName and InitiatorAlias read by + \fBiscsid\fR and \fBiscsiadm\fR on startup. + .TP +-/etc/iscsi/nodes/ ++/var/lib/iscsi/nodes/ + This directory contains the nodes with their targets. + .TP +-/etc/iscsi/send_targets ++/var/lib/iscsi/send_targets + This directory contains the portals. + + .SH "SEE ALSO" +diff --git a/usr/idbm.c b/usr/idbm.c +index 589078c..a57a445 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -2917,9 +2917,9 @@ free_info: + int idbm_init(idbm_get_config_file_fn *fn) + { + /* make sure root db dir is there */ +- if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) { +- if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) { +- log_error("Could not make %s %d", ISCSI_CONFIG_ROOT, ++ if (access(ISCSIVAR, F_OK) != 0) { ++ if (mkdir(ISCSIVAR, 0660) != 0) { ++ log_error("Could not make %s %d", ISCSIVAR, + errno); + return errno; + } +diff --git a/usr/idbm.h b/usr/idbm.h +index b9020fe..b89ddff 100644 +--- a/usr/idbm.h ++++ b/usr/idbm.h +@@ -29,12 +29,13 @@ + #include "list.h" + #include "flashnode.h" + +-#define NODE_CONFIG_DIR ISCSI_CONFIG_ROOT"nodes" +-#define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp" +-#define ISNS_CONFIG_DIR ISCSI_CONFIG_ROOT"isns" +-#define STATIC_CONFIG_DIR ISCSI_CONFIG_ROOT"static" +-#define FW_CONFIG_DIR ISCSI_CONFIG_ROOT"fw" +-#define ST_CONFIG_DIR ISCSI_CONFIG_ROOT"send_targets" ++#define ISCSIVAR "/var/lib/iscsi/" ++#define NODE_CONFIG_DIR ISCSIVAR"nodes" ++#define SLP_CONFIG_DIR ISCSIVAR"slp" ++#define ISNS_CONFIG_DIR ISCSIVAR"isns" ++#define STATIC_CONFIG_DIR ISCSIVAR"static" ++#define FW_CONFIG_DIR ISCSIVAR"fw" ++#define ST_CONFIG_DIR ISCSIVAR"send_targets" + #define ST_CONFIG_NAME "st_config" + #define ISNS_CONFIG_NAME "isns_config" + +diff --git a/usr/iface.h b/usr/iface.h +index 01f7074..f396918 100644 +--- a/usr/iface.h ++++ b/usr/iface.h +@@ -20,7 +20,9 @@ + #ifndef ISCSI_IFACE_H + #define ISCSI_IFACE_H + +-#define IFACE_CONFIG_DIR ISCSI_CONFIG_ROOT"ifaces" ++#include "idbm.h" ++ ++#define IFACE_CONFIG_DIR ISCSIVAR"ifaces" + + struct iface_rec; + struct list_head; +-- +2.1.0 + diff --git a/0009-iscsid-add-example-unit-files-for-systemd.patch b/0009-iscsid-add-example-unit-files-for-systemd.patch deleted file mode 100644 index 28b9b78..0000000 --- a/0009-iscsid-add-example-unit-files-for-systemd.patch +++ /dev/null @@ -1,54 +0,0 @@ -From c34e0bdcbafdb6f9304e1474d51fe1c789c5dea2 Mon Sep 17 00:00:00 2001 -From: Tomasz Torcz -Date: Wed, 28 Nov 2012 13:37:08 +0100 -Subject: iscsid: add example unit files for systemd -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Those two units, based on the work by Jóhann B. Guðmundsson, exploit -on-demand socket activation in iscsid. ---- - etc/systemd/iscsid.service | 13 +++++++++++++ - etc/systemd/iscsid.socket | 9 +++++++++ - 2 files changed, 22 insertions(+) - create mode 100644 etc/systemd/iscsid.service - create mode 100644 etc/systemd/iscsid.socket - -diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service -new file mode 100644 -index 0000000..028e0b3 ---- /dev/null -+++ b/etc/systemd/iscsid.service -@@ -0,0 +1,13 @@ -+[Unit] -+Description=Open-iSCSI -+Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) -+After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service -+ -+[Service] -+Type=forking -+PIDFile=/var/run/iscsid.pid -+ExecStart=/usr/sbin/iscsid -+ExecStop=/sbin/iscsiadm -k 0 2 -+ -+[Install] -+WantedBy=multi-user.target -diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket -new file mode 100644 -index 0000000..832451d ---- /dev/null -+++ b/etc/systemd/iscsid.socket -@@ -0,0 +1,9 @@ -+[Unit] -+Description=Open-iSCSI iscsid Socket -+Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) -+ -+[Socket] -+ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE -+ -+[Install] -+WantedBy=sockets.target --- -1.7.11.7 - diff --git a/0009-use-red-hat-for-name.patch b/0009-use-red-hat-for-name.patch new file mode 100644 index 0000000..b2a7440 --- /dev/null +++ b/0009-use-red-hat-for-name.patch @@ -0,0 +1,25 @@ +From b346b33b7a0031cb9e727be994fa4a05d18b5f66 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 19 Nov 2012 16:40:04 -0800 +Subject: [PATCH] use red hat for name + +--- + utils/iscsi-iname.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/utils/iscsi-iname.c b/utils/iscsi-iname.c +index 6347edc..cb2f6c8 100644 +--- a/utils/iscsi-iname.c ++++ b/utils/iscsi-iname.c +@@ -73,7 +73,7 @@ main(int argc, char *argv[]) + exit(0); + } + } else { +- prefix = "iqn.2005-03.org.open-iscsi"; ++ prefix = "iqn.1994-05.com.redhat"; + } + + /* try to feed some entropy from the pool to MD5 in order to get +-- +2.1.0 + diff --git a/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch b/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch deleted file mode 100644 index a177796..0000000 --- a/0010-iscsi-tools-fix-get_random_bytes-error-handling.patch +++ /dev/null @@ -1,61 +0,0 @@ -From a7afdf46c3193eb102cc6ec2a3b61e8d36794437 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Fri, 14 Dec 2012 12:40:27 -0600 -Subject: iscsi tools: fix get_random_bytes error handling - -Bug report from Rahul: - -There seems to be a bug in function get_random_bytes(). I reported -this earlier as well but somehow it didn't appear here. - -get_random_bytes(unsigned char *data, unsigned int length) -{ - long r; - unsigned n; - int fd; - - fd = open("/dev/urandom", O_RDONLY); - while (length > 0) { - - if (!fd || read(fd, &r, sizeof(long)) != -1) <<<< the condition is -incorrect ---- - usr/auth.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/usr/auth.c b/usr/auth.c -index c924545..4ff0425 100644 ---- a/usr/auth.c -+++ b/usr/auth.c -@@ -189,24 +189,24 @@ get_random_bytes(unsigned char *data, unsigned int length) - - long r; - unsigned n; -- int fd; -+ int fd, r_size = sizeof(r); - - fd = open("/dev/urandom", O_RDONLY); - while (length > 0) { - -- if (!fd || read(fd, &r, sizeof(long)) != -1) -+ if (fd == -1 || read(fd, &r, r_size) != r_size) - r = rand(); - r = r ^ (r >> 8); - r = r ^ (r >> 4); - n = r & 0x7; - -- if (!fd || read(fd, &r, sizeof(long)) != -1) -+ if (fd == -1 || read(fd, &r, r_size) != r_size) - r = rand(); - r = r ^ (r >> 8); - r = r ^ (r >> 5); - n = (n << 3) | (r & 0x7); - -- if (!fd || read(fd, &r, sizeof(long)) != -1) -+ if (fd == -1 || read(fd, &r, r_size) != r_size) - r = rand(); - r = r ^ (r >> 8); - r = r ^ (r >> 5); --- -1.7.11.7 - diff --git a/0010-libiscsi.patch b/0010-libiscsi.patch new file mode 100644 index 0000000..6075b08 --- /dev/null +++ b/0010-libiscsi.patch @@ -0,0 +1,4009 @@ +From c76c0965e20aa2a0df13b02cf080594d1a1f7c04 Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Mon, 26 Jan 2015 12:57:11 -0800 +Subject: [PATCH] libiscsi + +--- + Makefile | 2 + + libiscsi/Makefile | 61 ++ + libiscsi/libiscsi.c | 617 +++++++++++ + libiscsi/libiscsi.doxy | 1473 +++++++++++++++++++++++++++ + libiscsi/libiscsi.h | 344 +++++++ + libiscsi/no_date_footer.html | 6 + + libiscsi/pylibiscsi.c | 709 +++++++++++++ + libiscsi/setup.py | 9 + + libiscsi/tests/test_discovery_firmware.c | 53 + + libiscsi/tests/test_discovery_sendtargets.c | 60 ++ + libiscsi/tests/test_get_auth.c | 70 ++ + libiscsi/tests/test_get_initiator_name.c | 38 + + libiscsi/tests/test_get_network_config.c | 45 + + libiscsi/tests/test_login.c | 52 + + libiscsi/tests/test_logout.c | 51 + + libiscsi/tests/test_params.c | 103 ++ + libiscsi/tests/test_set_auth.c | 58 ++ + usr/Makefile | 2 +- + usr/discovery.c | 5 + + usr/idbm.c | 6 +- + usr/idbm.h | 3 + + usr/iscsi_ipc.h | 2 + + 22 files changed, 3765 insertions(+), 4 deletions(-) + create mode 100644 libiscsi/Makefile + create mode 100644 libiscsi/libiscsi.c + create mode 100644 libiscsi/libiscsi.doxy + create mode 100644 libiscsi/libiscsi.h + create mode 100644 libiscsi/no_date_footer.html + create mode 100644 libiscsi/pylibiscsi.c + create mode 100644 libiscsi/setup.py + create mode 100644 libiscsi/tests/test_discovery_firmware.c + create mode 100644 libiscsi/tests/test_discovery_sendtargets.c + create mode 100644 libiscsi/tests/test_get_auth.c + create mode 100644 libiscsi/tests/test_get_initiator_name.c + create mode 100644 libiscsi/tests/test_get_network_config.c + create mode 100644 libiscsi/tests/test_login.c + create mode 100644 libiscsi/tests/test_logout.c + create mode 100644 libiscsi/tests/test_params.c + create mode 100644 libiscsi/tests/test_set_auth.c + +diff --git a/Makefile b/Makefile +index 1ef9273..859f13f 100644 +--- a/Makefile ++++ b/Makefile +@@ -44,6 +44,7 @@ user: utils/open-isns/Makefile iscsiuio/Makefile + $(MAKE) -C usr + $(MAKE) -C utils + $(MAKE) -C iscsiuio ++ $(MAKE) -C libiscsi + @echo + @echo "Compilation complete Output file" + @echo "----------------------------------- ----------------" +@@ -75,6 +76,7 @@ kernel: force + force: ; + + clean: ++ $(MAKE) -C libiscsi clean + $(MAKE) -C utils/sysdeps clean + $(MAKE) -C utils/fwparam_ibft clean + $(MAKE) -C utils clean +diff --git a/libiscsi/Makefile b/libiscsi/Makefile +new file mode 100644 +index 0000000..317a7ec +--- /dev/null ++++ b/libiscsi/Makefile +@@ -0,0 +1,61 @@ ++# This Makefile will work only with GNU make. ++ ++OSNAME=$(shell uname -s) ++OPTFLAGS ?= -O2 -g ++WARNFLAGS ?= -Wall -Wstrict-prototypes ++CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr \ ++ -D$(OSNAME) -fPIC -D_GNU_SOURCE -fvisibility=hidden ++LIB = libiscsi.so.0 ++TESTS = tests/test_discovery_sendtargets tests/test_discovery_firmware ++TESTS += tests/test_login tests/test_logout tests/test_params ++TESTS += tests/test_get_network_config tests/test_get_initiator_name ++TESTS += tests/test_set_auth tests/test_get_auth ++ ++COMMON_SRCS = sysdeps.o ++# sources shared between iscsid, iscsiadm and iscsistart ++ISCSI_LIB_SRCS = netlink.o transport.o cxgbi.o be2iscsi.o iscsi_timer.o initiator_common.o iscsi_err.o session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o iser.o uip_mgmt_ipc.o ++FW_PARAM_SRCS = fw_entry.o prom_lex.o prom_parse.tab.o fwparam_ppc.o fwparam_sysfs.o ++ ++# sources shared with the userspace utils, note we build these separately ++# to get PIC versions. ++COMMON_OBJS = $(patsubst %.o, common-objs/%.o, $(COMMON_SRCS)) ++USR_OBJS = $(patsubst %.o, usr-objs/%.o, $(ISCSI_LIB_SRCS) strings.o) ++FW_OBJS = $(patsubst %.o, fw-objs/%.o, $(FW_PARAM_SRCS)) ++ ++# Flags for the tests ++tests/% : CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I. ++ ++all: lib tests html ++ ++lib: $(LIB) ++tests: $(TESTS) ++ ++common-objs/%.o: ../utils/sysdeps/%.c ++ mkdir -p common-objs ++ $(CC) $(CFLAGS) -c $< -o $@ ++ ++usr-objs/%.o: ../usr/%.c ++ mkdir -p usr-objs ++ $(CC) $(CFLAGS) -c $< -o $@ ++ ++fw-objs/%.o: ../utils/fwparam_ibft/%.c ++ mkdir -p fw-objs ++ $(CC) $(CFLAGS) -c $< -o $@ ++ ++$(LIB): $(COMMON_OBJS) $(FW_OBJS) $(USR_OBJS) libiscsi.o ++ $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIB) $^ -o $@ ++ ln -s -f $(LIB) libiscsi.so ++ ++$(TESTS): $(FW_OBJS) $(COMMON_OBJS) $(USR_OBJS) $(LIB) ++ ++html: libiscsi.h libiscsi.doxy ++ doxygen libiscsi.doxy ++ ++clean: ++ rm -rf *.o common-objs usr-objs fw-objs libuip-objs libiscsi.so* \ ++ .depend *~ html $(TESTS) tests/*~ ++ ++depend: ++ gcc $(CFLAGS) -M `ls *.c` > .depend ++ ++-include .depend ../usr/.depend +diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c +new file mode 100644 +index 0000000..064e4b5 +--- /dev/null ++++ b/libiscsi/libiscsi.c +@@ -0,0 +1,617 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "libiscsi.h" ++#include "idbm.h" ++#include "discovery.h" ++#include "log.h" ++#include "sysfs.h" ++#include "iscsi_sysfs.h" ++#include "session_info.h" ++#include "iscsi_util.h" ++#include "sysdeps.h" ++#include "iface.h" ++#include "iscsi_proto.h" ++#include "fw_context.h" ++#include "iscsid_req.h" ++#include "iscsi_err.h" ++ ++#define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; } ++ ++/* UGLY, not thread safe :( */ ++static int sysfs_initialized = 0; ++ ++struct libiscsi_context { ++ char error_str[256]; ++ /* For get_parameter_helper() */ ++ const char *parameter; ++ char *value; ++}; ++ ++static void libiscsi_log(int prio, void *priv, const char *fmt, va_list ap) ++{ ++ struct libiscsi_context *context = priv; ++ ++ if (prio > LOG_ERR) /* We are only interested in errors (or worse) */ ++ return; ++ ++ vsnprintf(context->error_str, sizeof(context->error_str), fmt, ap); ++} ++ ++struct libiscsi_context *libiscsi_init(void) ++{ ++ struct libiscsi_context *context; ++ ++ context = calloc(1, sizeof *context); ++ if (!context) ++ return NULL; ++ ++ log_init("libiscsi", 1024, libiscsi_log, context); ++ if (!sysfs_initialized) { ++ sysfs_init(); ++ sysfs_initialized = 1; ++ } ++ increase_max_files(); ++ if (idbm_init(NULL)) { ++ sysfs_cleanup(); ++ free(context); ++ return NULL; ++ } ++ ++ iface_setup_host_bindings(); ++ ++ return context; ++} ++ ++void libiscsi_cleanup(struct libiscsi_context *context) ++{ ++ idbm_terminate(); ++ free_transports(); ++ sysfs_cleanup(); ++ free(context); ++} ++ ++static void free_iface_list(struct list_head *ifaces) ++{ ++ struct iface_rec *iface, *tmp_iface; ++ ++ list_for_each_entry_safe(iface, tmp_iface, ifaces, list) { ++ list_del(&iface->list); ++ free(iface); ++ } ++} ++ ++static void free_rec_list(struct list_head *rec_list) ++{ ++ struct node_rec *rec, *tmp; ++ ++ list_for_each_entry_safe(rec, tmp, rec_list, list) { ++ list_del(&rec->list); ++ free(rec); ++ } ++} ++ ++int libiscsi_discover_sendtargets(struct libiscsi_context *context, ++ const char *address, int port, ++ const struct libiscsi_auth_info *auth_info, ++ int *nr_found, struct libiscsi_node **found_nodes) ++{ ++ struct discovery_rec drec; ++ LIST_HEAD(bound_rec_list); ++ struct node_rec *rec; ++ int rc = 0, found = 0; ++ ++ INIT_LIST_HEAD(&bound_rec_list); ++ ++ if (nr_found) ++ *nr_found = 0; ++ if (found_nodes) ++ *found_nodes = NULL; ++ ++ CHECK(libiscsi_verify_auth_info(context, auth_info)) ++ ++ /* Fill the drec struct with all needed info */ ++ memset(&drec, 0, sizeof drec); ++ idbm_sendtargets_defaults(&drec.u.sendtargets); ++ drec.type = DISCOVERY_TYPE_SENDTARGETS; ++ strlcpy(drec.address, address, sizeof(drec.address)); ++ drec.port = port ? port : ISCSI_LISTEN_PORT; ++ switch(auth_info ? auth_info->method : libiscsi_auth_none) { ++ case libiscsi_auth_chap: ++ drec.u.sendtargets.auth.authmethod = AUTH_METHOD_CHAP; ++ strlcpy(drec.u.sendtargets.auth.username, ++ auth_info->chap.username, AUTH_STR_MAX_LEN); ++ strlcpy((char *)drec.u.sendtargets.auth.password, ++ auth_info->chap.password, AUTH_STR_MAX_LEN); ++ drec.u.sendtargets.auth.password_length = ++ strlen((char *)drec.u.sendtargets.auth.password); ++ strlcpy(drec.u.sendtargets.auth.username_in, ++ auth_info->chap.reverse_username, AUTH_STR_MAX_LEN); ++ strlcpy((char *)drec.u.sendtargets.auth.password_in, ++ auth_info->chap.reverse_password, AUTH_STR_MAX_LEN); ++ drec.u.sendtargets.auth.password_in_length = ++ strlen((char *)drec.u.sendtargets.auth.password_in); ++ break; ++ } ++ ++ CHECK(idbm_add_discovery(&drec)) ++ ++ CHECK(idbm_bind_ifaces_to_nodes(discovery_sendtargets, ++ &drec, NULL, &bound_rec_list)) ++ ++ /* now add/update records */ ++ list_for_each_entry(rec, &bound_rec_list, list) { ++ CHECK(idbm_add_node(rec, &drec, 1 /* overwrite */)) ++ found++; ++ } ++ ++ if (nr_found) ++ *nr_found = found; ++ ++ if (found_nodes && found) { ++ *found_nodes = calloc(found, sizeof **found_nodes); ++ if (*found_nodes == NULL) { ++ snprintf(context->error_str, ++ sizeof(context->error_str), strerror(ENOMEM)); ++ rc = ENOMEM; ++ goto leave; ++ } ++ found = 0; ++ list_for_each_entry(rec, &bound_rec_list, list) { ++ strlcpy((*found_nodes)[found].name, rec->name, ++ LIBISCSI_VALUE_MAXLEN); ++ (*found_nodes)[found].tpgt = rec->tpgt; ++ strlcpy((*found_nodes)[found].address, ++ rec->conn[0].address, NI_MAXHOST); ++ (*found_nodes)[found].port = rec->conn[0].port; ++ strlcpy((*found_nodes)[found].iface, ++ rec->iface.name, LIBISCSI_VALUE_MAXLEN); ++ found++; ++ } ++ } ++ ++leave: ++ free_rec_list(&bound_rec_list); ++ return rc; ++} ++ ++int libiscsi_discover_firmware(struct libiscsi_context *context, ++ int *nr_found, struct libiscsi_node **found_nodes) ++{ ++ struct list_head targets, ifaces, rec_list; ++ discovery_rec_t drec; ++ int rc = 0; ++ ++ INIT_LIST_HEAD(&targets); ++ INIT_LIST_HEAD(&ifaces); ++ INIT_LIST_HEAD(&rec_list); ++ ++ if (nr_found) { ++ *nr_found = 0; ++ } ++ ++ if (found_nodes) { ++ *found_nodes = NULL; ++ } ++ ++ rc = fw_get_targets(&targets); ++ if (rc) { ++ log_error("%s: Could not get list of targets from firmware " ++ "(err %d).\n", __func__, rc); ++ return rc; ++ } ++ ++ CHECK(iface_create_ifaces_from_boot_contexts(&ifaces, &targets)); ++ ++ memset(&drec, 0, sizeof(drec)); ++ drec.type = DISCOVERY_TYPE_FW; ++ rc = idbm_bind_ifaces_to_nodes(discovery_fw, &drec, &ifaces, &rec_list); ++ if (rc) { ++ log_error("%s: Could not determine target nodes from firmware " ++ "(err %d).\n", __func__, rc); ++ goto leave; ++ } ++ ++ int node_count = 0; ++ struct list_head *pos; ++ list_for_each(pos, &rec_list) { ++ ++node_count; ++ } ++ ++ struct libiscsi_node* new_nodes; ++ /* allocate enough space for all the nodes */ ++ new_nodes = calloc(node_count, sizeof *new_nodes); ++ if (new_nodes == NULL) { ++ rc = ENOMEM; ++ log_error("%s: %s.\n", __func__, strerror(ENOMEM)); ++ goto leave; ++ } ++ ++ struct node_rec *rec; ++ struct libiscsi_node *new_node = new_nodes; ++ /* in one loop, add nodes to idbm and create libiscsi_node entries */ ++ list_for_each_entry(rec, &rec_list, list) { ++ CHECK(idbm_add_node(rec, NULL, 1 /* overwrite */)); ++ ++ strlcpy(new_node->name, rec->name, LIBISCSI_VALUE_MAXLEN); ++ new_node->tpgt = rec->tpgt; ++ strlcpy(new_node->address, rec->conn[0].address, NI_MAXHOST); ++ new_node->port = rec->conn[0].port; ++ strlcpy(new_node->iface, rec->iface.name, LIBISCSI_VALUE_MAXLEN); ++ ++ ++new_node; ++ } ++ ++ /* update output parameters */ ++ if (nr_found) { ++ *nr_found = node_count; ++ } ++ if (found_nodes) { ++ *found_nodes = new_nodes; ++ } ++ ++leave: ++ fw_free_targets(&targets); ++ ++ free_iface_list(&ifaces); ++ free_rec_list(&rec_list); ++ ++ return rc; ++} ++ ++int libiscsi_verify_auth_info(struct libiscsi_context *context, ++ const struct libiscsi_auth_info *auth_info) ++{ ++ switch(auth_info ? auth_info->method : libiscsi_auth_none) { ++ case libiscsi_auth_none: ++ break; ++ case libiscsi_auth_chap: ++ if (!auth_info->chap.username[0]) { ++ strcpy(context->error_str, "Empty username"); ++ return EINVAL; ++ } ++ if (!auth_info->chap.password[0]) { ++ strcpy(context->error_str, "Empty password"); ++ return EINVAL; ++ } ++ if (auth_info->chap.reverse_username[0] && ++ !auth_info->chap.reverse_password[0]) { ++ strcpy(context->error_str, "Empty reverse password"); ++ return EINVAL; ++ } ++ break; ++ default: ++ sprintf(context->error_str, ++ "Invalid authentication method: %d", ++ (int)auth_info->method); ++ return EINVAL; ++ } ++ return 0; ++} ++ ++int libiscsi_node_set_auth(struct libiscsi_context *context, ++ const struct libiscsi_node *node, ++ const struct libiscsi_auth_info *auth_info) ++{ ++ int rc = 0; ++ ++ CHECK(libiscsi_verify_auth_info(context, auth_info)) ++ ++ switch(auth_info ? auth_info->method : libiscsi_auth_none) { ++ case libiscsi_auth_none: ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.authmethod", "None")) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.username", "")) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.password", "")) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.username_in", "")) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.password_in", "")) ++ break; ++ ++ case libiscsi_auth_chap: ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.authmethod", "CHAP")) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.username", ++ auth_info->chap.username)) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.password", ++ auth_info->chap.password)) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.username_in", ++ auth_info->chap.reverse_username)) ++ CHECK(libiscsi_node_set_parameter(context, node, ++ "node.session.auth.password_in", ++ auth_info->chap.reverse_password)) ++ break; ++ } ++leave: ++ return rc; ++} ++ ++int libiscsi_node_get_auth(struct libiscsi_context *context, ++ const struct libiscsi_node *node, ++ struct libiscsi_auth_info *auth_info) ++{ ++ int rc = 0; ++ char value[LIBISCSI_VALUE_MAXLEN]; ++ ++ memset(auth_info, 0, sizeof *auth_info); ++ ++ CHECK(libiscsi_node_get_parameter(context, node, ++ "node.session.auth.authmethod", value)) ++ ++ if (!strcmp(value, "None")) { ++ auth_info->method = libiscsi_auth_none; ++ } else if (!strcmp(value, "CHAP")) { ++ auth_info->method = libiscsi_auth_chap; ++ CHECK(libiscsi_node_get_parameter(context, node, ++ "node.session.auth.username", ++ auth_info->chap.username)) ++ CHECK(libiscsi_node_get_parameter(context, node, ++ "node.session.auth.password", ++ auth_info->chap.password)) ++ CHECK(libiscsi_node_get_parameter(context, node, ++ "node.session.auth.username_in", ++ auth_info->chap.reverse_username)) ++ CHECK(libiscsi_node_get_parameter(context, node, ++ "node.session.auth.password_in", ++ auth_info->chap.reverse_password)) ++ } else { ++ snprintf(context->error_str, sizeof(context->error_str), ++ "unknown authentication method: %s", value); ++ rc = EINVAL; ++ } ++leave: ++ return rc; ++} ++ ++static void node_to_rec(const struct libiscsi_node *node, ++ struct node_rec *rec) ++{ ++ memset(rec, 0, sizeof *rec); ++ idbm_node_setup_defaults(rec); ++ strlcpy(rec->name, node->name, TARGET_NAME_MAXLEN); ++ rec->tpgt = node->tpgt; ++ strlcpy(rec->conn[0].address, node->address, NI_MAXHOST); ++ rec->conn[0].port = node->port; ++} ++ ++int login_helper(void *data, node_rec_t *rec) ++{ ++ char *iface = (char*)data; ++ if (strcmp(iface, rec->iface.name)) ++ /* different iface, skip it */ ++ return -1; ++ ++ int rc = iscsid_req_by_rec(MGMT_IPC_SESSION_LOGIN, rec); ++ if (rc) { ++ iscsi_err_print_msg(rc); ++ rc = ENOTCONN; ++ } ++ return rc; ++} ++ ++int libiscsi_node_login(struct libiscsi_context *context, ++ const struct libiscsi_node *node) ++{ ++ int nr_found = 0, rc; ++ ++ CHECK(idbm_for_each_iface(&nr_found, (void*)node->iface, login_helper, ++ (char *)node->name, node->tpgt, ++ (char *)node->address, node->port)) ++ if (nr_found == 0) { ++ strcpy(context->error_str, "No such node"); ++ rc = ENODEV; ++ } ++leave: ++ return rc; ++} ++ ++static int logout_helper(void *data, struct session_info *info) ++{ ++ int rc; ++ struct node_rec *rec = data; ++ ++ if (!iscsi_match_session(rec, info)) ++ /* Tell iscsi_sysfs_for_each_session this session was not a ++ match so that it will not increase nr_found. */ ++ return -1; ++ ++ rc = iscsid_req_by_sid(MGMT_IPC_SESSION_LOGOUT, info->sid); ++ if (rc) { ++ iscsi_err_print_msg(rc); ++ rc = EIO; ++ } ++ ++ return rc; ++} ++ ++int libiscsi_node_logout(struct libiscsi_context *context, ++ const struct libiscsi_node *node) ++{ ++ int nr_found = 0, rc; ++ struct node_rec rec; ++ ++ node_to_rec(node, &rec); ++ CHECK(iscsi_sysfs_for_each_session(&rec, &nr_found, logout_helper,0)) ++ if (nr_found == 0) { ++ strcpy(context->error_str, "No matching session"); ++ rc = ENODEV; ++ } ++leave: ++ return rc; ++} ++ ++int libiscsi_node_set_parameter(struct libiscsi_context *context, ++ const struct libiscsi_node *node, ++ const char *parameter, const char *value) ++{ ++ int nr_found = 0, rc; ++ struct user_param *param; ++ struct list_head params; ++ ++ INIT_LIST_HEAD(¶ms); ++ param = idbm_alloc_user_param(parameter, value); ++ if (!param) { ++ rc = ENOMEM; ++ goto leave; ++ } ++ list_add_tail(¶ms, ¶m->list); ++ ++ CHECK(idbm_for_each_iface(&nr_found, ¶ms, idbm_node_set_param, ++ (char *)node->name, node->tpgt, ++ (char *)node->address, node->port)) ++ if (nr_found == 0) { ++ strcpy(context->error_str, "No such node"); ++ rc = ENODEV; ++ } ++ free(param->name); ++ free(param); ++leave: ++ return rc; ++} ++ ++static int get_parameter_helper(void *data, node_rec_t *rec) ++{ ++ struct libiscsi_context *context = data; ++ recinfo_t *info; ++ int i; ++ ++ info = idbm_recinfo_alloc(MAX_KEYS); ++ if (!info) { ++ snprintf(context->error_str, sizeof(context->error_str), ++ strerror(ENOMEM)); ++ return ENOMEM; ++ } ++ ++ idbm_recinfo_node(rec, info); ++ ++ for (i = 0; i < MAX_KEYS; i++) { ++ if (!info[i].visible) ++ continue; ++ ++ if (strcmp(context->parameter, info[i].name)) ++ continue; ++ ++ strlcpy(context->value, info[i].value, LIBISCSI_VALUE_MAXLEN); ++ break; ++ } ++ ++ free(info); ++ ++ if (i == MAX_KEYS) { ++ strcpy(context->error_str, "No such parameter"); ++ return EINVAL; ++ } ++ ++ return 0; ++} ++ ++int libiscsi_node_get_parameter(struct libiscsi_context *context, ++ const struct libiscsi_node *node, const char *parameter, char *value) ++{ ++ int nr_found = 0, rc = 0; ++ ++ context->parameter = parameter; ++ context->value = value; ++ ++ /* Note we assume there is only one interface, if not we will get ++ the value from the last interface iterated over! ++ This (multiple interfaces) can only happen if someone explicitly ++ created ones using iscsiadm. Even then this should not be a problem ++ as most settings should be the same independent of the iface. */ ++ CHECK(idbm_for_each_iface(&nr_found, context, get_parameter_helper, ++ (char *)node->name, node->tpgt, ++ (char *)node->address, node->port)) ++ if (nr_found == 0) { ++ strcpy(context->error_str, "No such node"); ++ rc = ENODEV; ++ } ++leave: ++ return rc; ++} ++ ++const char *libiscsi_get_error_string(struct libiscsi_context *context) ++{ ++ /* Sometimes the core open-iscsi code does not give us an error ++ message */ ++ if (!context->error_str[0]) ++ return "Unknown error"; ++ ++ return context->error_str; ++} ++ ++ ++/************************** Utility functions *******************************/ ++ ++int libiscsi_get_firmware_network_config( ++ struct libiscsi_network_config *config) ++{ ++ struct boot_context fw_entry; ++ ++ if (!sysfs_initialized) { ++ sysfs_init(); ++ sysfs_initialized = 1; ++ } ++ ++ memset(config, 0, sizeof *config); ++ memset(&fw_entry, 0, sizeof fw_entry); ++ if (fw_get_entry(&fw_entry)) ++ return ENODEV; ++ ++ config->dhcp = strlen(fw_entry.dhcp) ? 1 : 0; ++ strlcpy(config->iface_name, fw_entry.iface, LIBISCSI_VALUE_MAXLEN); ++ strlcpy(config->mac_address, fw_entry.mac, LIBISCSI_VALUE_MAXLEN); ++ strlcpy(config->ip_address, fw_entry.ipaddr, LIBISCSI_VALUE_MAXLEN); ++ strlcpy(config->netmask, fw_entry.mask, LIBISCSI_VALUE_MAXLEN); ++ strlcpy(config->gateway, fw_entry.gateway, LIBISCSI_VALUE_MAXLEN); ++ strlcpy(config->primary_dns, fw_entry.primary_dns, LIBISCSI_VALUE_MAXLEN); ++ strlcpy(config->secondary_dns, fw_entry.secondary_dns, LIBISCSI_VALUE_MAXLEN); ++ return 0; ++} ++ ++int libiscsi_get_firmware_initiator_name(char *initiatorname) ++{ ++ struct boot_context fw_entry; ++ ++ if (!sysfs_initialized) { ++ sysfs_init(); ++ sysfs_initialized = 1; ++ } ++ ++ memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN); ++ memset(&fw_entry, 0, sizeof fw_entry); ++ if (fw_get_entry(&fw_entry)) ++ return ENODEV; ++ ++ strlcpy(initiatorname, fw_entry.initiatorname, LIBISCSI_VALUE_MAXLEN); ++ ++ return 0; ++} +diff --git a/libiscsi/libiscsi.doxy b/libiscsi/libiscsi.doxy +new file mode 100644 +index 0000000..7a5ff7f +--- /dev/null ++++ b/libiscsi/libiscsi.doxy +@@ -0,0 +1,1473 @@ ++# Doxyfile 1.5.7.1 ++ ++# This file describes the settings to be used by the documentation system ++# doxygen (www.doxygen.org) for a project ++# ++# All text after a hash (#) is considered a comment and will be ignored ++# The format is: ++# TAG = value [value, ...] ++# For lists items can also be appended using: ++# TAG += value [value, ...] ++# Values that contain spaces should be placed between quotes (" ") ++ ++#--------------------------------------------------------------------------- ++# Project related configuration options ++#--------------------------------------------------------------------------- ++ ++# This tag specifies the encoding used for all characters in the config file ++# that follow. The default is UTF-8 which is also the encoding used for all ++# text before the first occurrence of this tag. Doxygen uses libiconv (or the ++# iconv built into libc) for the transcoding. See ++# http://www.gnu.org/software/libiconv for the list of possible encodings. ++ ++DOXYFILE_ENCODING = UTF-8 ++ ++# The PROJECT_NAME tag is a single word (or a sequence of words surrounded ++# by quotes) that should identify the project. ++ ++PROJECT_NAME = libiscsi ++ ++# The PROJECT_NUMBER tag can be used to enter a project or revision number. ++# This could be handy for archiving the generated documentation or ++# if some version control system is used. ++ ++PROJECT_NUMBER = ++ ++# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) ++# base path where the generated documentation will be put. ++# If a relative path is entered, it will be relative to the location ++# where doxygen was started. If left blank the current directory will be used. ++ ++OUTPUT_DIRECTORY = ++ ++# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create ++# 4096 sub-directories (in 2 levels) under the output directory of each output ++# format and will distribute the generated files over these directories. ++# Enabling this option can be useful when feeding doxygen a huge amount of ++# source files, where putting all generated files in the same directory would ++# otherwise cause performance problems for the file system. ++ ++CREATE_SUBDIRS = NO ++ ++# The OUTPUT_LANGUAGE tag is used to specify the language in which all ++# documentation generated by doxygen is written. Doxygen will use this ++# information to generate all constant output in the proper language. ++# The default language is English, other supported languages are: ++# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, ++# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, ++# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), ++# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, ++# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, ++# Spanish, Swedish, and Ukrainian. ++ ++OUTPUT_LANGUAGE = English ++ ++# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will ++# include brief member descriptions after the members that are listed in ++# the file and class documentation (similar to JavaDoc). ++# Set to NO to disable this. ++ ++BRIEF_MEMBER_DESC = YES ++ ++# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend ++# the brief description of a member or function before the detailed description. ++# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the ++# brief descriptions will be completely suppressed. ++ ++REPEAT_BRIEF = NO ++ ++# This tag implements a quasi-intelligent brief description abbreviator ++# that is used to form the text in various listings. Each string ++# in this list, if found as the leading text of the brief description, will be ++# stripped from the text and the result after processing the whole list, is ++# used as the annotated text. Otherwise, the brief description is used as-is. ++# If left blank, the following values are used ("$name" is automatically ++# replaced with the name of the entity): "The $name class" "The $name widget" ++# "The $name file" "is" "provides" "specifies" "contains" ++# "represents" "a" "an" "the" ++ ++ABBREVIATE_BRIEF = ++ ++# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then ++# Doxygen will generate a detailed section even if there is only a brief ++# description. ++ ++ALWAYS_DETAILED_SEC = YES ++ ++# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all ++# inherited members of a class in the documentation of that class as if those ++# members were ordinary class members. Constructors, destructors and assignment ++# operators of the base classes will not be shown. ++ ++INLINE_INHERITED_MEMB = NO ++ ++# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full ++# path before files name in the file list and in the header files. If set ++# to NO the shortest path that makes the file name unique will be used. ++ ++FULL_PATH_NAMES = YES ++ ++# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag ++# can be used to strip a user-defined part of the path. Stripping is ++# only done if one of the specified strings matches the left-hand part of ++# the path. The tag can be used to show relative paths in the file list. ++# If left blank the directory from which doxygen is run is used as the ++# path to strip. ++ ++STRIP_FROM_PATH = ++ ++# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of ++# the path mentioned in the documentation of a class, which tells ++# the reader which header file to include in order to use a class. ++# If left blank only the name of the header file containing the class ++# definition is used. Otherwise one should specify the include paths that ++# are normally passed to the compiler using the -I flag. ++ ++STRIP_FROM_INC_PATH = ++ ++# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter ++# (but less readable) file names. This can be useful is your file systems ++# doesn't support long names like on DOS, Mac, or CD-ROM. ++ ++SHORT_NAMES = NO ++ ++# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen ++# will interpret the first line (until the first dot) of a JavaDoc-style ++# comment as the brief description. If set to NO, the JavaDoc ++# comments will behave just like regular Qt-style comments ++# (thus requiring an explicit @brief command for a brief description.) ++ ++JAVADOC_AUTOBRIEF = NO ++ ++# If the QT_AUTOBRIEF tag is set to YES then Doxygen will ++# interpret the first line (until the first dot) of a Qt-style ++# comment as the brief description. If set to NO, the comments ++# will behave just like regular Qt-style comments (thus requiring ++# an explicit \brief command for a brief description.) ++ ++QT_AUTOBRIEF = NO ++ ++# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen ++# treat a multi-line C++ special comment block (i.e. a block of //! or /// ++# comments) as a brief description. This used to be the default behaviour. ++# The new default is to treat a multi-line C++ comment block as a detailed ++# description. Set this tag to YES if you prefer the old behaviour instead. ++ ++MULTILINE_CPP_IS_BRIEF = NO ++ ++# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented ++# member inherits the documentation from any documented member that it ++# re-implements. ++ ++INHERIT_DOCS = YES ++ ++# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce ++# a new page for each member. If set to NO, the documentation of a member will ++# be part of the file/class/namespace that contains it. ++ ++SEPARATE_MEMBER_PAGES = NO ++ ++# The TAB_SIZE tag can be used to set the number of spaces in a tab. ++# Doxygen uses this value to replace tabs by spaces in code fragments. ++ ++TAB_SIZE = 8 ++ ++# This tag can be used to specify a number of aliases that acts ++# as commands in the documentation. An alias has the form "name=value". ++# For example adding "sideeffect=\par Side Effects:\n" will allow you to ++# put the command \sideeffect (or @sideeffect) in the documentation, which ++# will result in a user-defined paragraph with heading "Side Effects:". ++# You can put \n's in the value part of an alias to insert newlines. ++ ++ALIASES = ++ ++# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C ++# sources only. Doxygen will then generate output that is more tailored for C. ++# For instance, some of the names that are used will be different. The list ++# of all members will be omitted, etc. ++ ++OPTIMIZE_OUTPUT_FOR_C = YES ++ ++# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java ++# sources only. Doxygen will then generate output that is more tailored for ++# Java. For instance, namespaces will be presented as packages, qualified ++# scopes will look different, etc. ++ ++OPTIMIZE_OUTPUT_JAVA = NO ++ ++# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran ++# sources only. Doxygen will then generate output that is more tailored for ++# Fortran. ++ ++OPTIMIZE_FOR_FORTRAN = NO ++ ++# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL ++# sources. Doxygen will then generate output that is tailored for ++# VHDL. ++ ++OPTIMIZE_OUTPUT_VHDL = NO ++ ++# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want ++# to include (a tag file for) the STL sources as input, then you should ++# set this tag to YES in order to let doxygen match functions declarations and ++# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. ++# func(std::string) {}). This also make the inheritance and collaboration ++# diagrams that involve STL classes more complete and accurate. ++ ++BUILTIN_STL_SUPPORT = NO ++ ++# If you use Microsoft's C++/CLI language, you should set this option to YES to ++# enable parsing support. ++ ++CPP_CLI_SUPPORT = NO ++ ++# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. ++# Doxygen will parse them like normal C++ but will assume all classes use public ++# instead of private inheritance when no explicit protection keyword is present. ++ ++SIP_SUPPORT = NO ++ ++# For Microsoft's IDL there are propget and propput attributes to indicate getter ++# and setter methods for a property. Setting this option to YES (the default) ++# will make doxygen to replace the get and set methods by a property in the ++# documentation. This will only work if the methods are indeed getting or ++# setting a simple type. If this is not the case, or you want to show the ++# methods anyway, you should set this option to NO. ++ ++IDL_PROPERTY_SUPPORT = YES ++ ++# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC ++# tag is set to YES, then doxygen will reuse the documentation of the first ++# member in the group (if any) for the other members of the group. By default ++# all members of a group must be documented explicitly. ++ ++DISTRIBUTE_GROUP_DOC = NO ++ ++# Set the SUBGROUPING tag to YES (the default) to allow class member groups of ++# the same type (for instance a group of public functions) to be put as a ++# subgroup of that type (e.g. under the Public Functions section). Set it to ++# NO to prevent subgrouping. Alternatively, this can be done per class using ++# the \nosubgrouping command. ++ ++SUBGROUPING = YES ++ ++# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum ++# is documented as struct, union, or enum with the name of the typedef. So ++# typedef struct TypeS {} TypeT, will appear in the documentation as a struct ++# with name TypeT. When disabled the typedef will appear as a member of a file, ++# namespace, or class. And the struct will be named TypeS. This can typically ++# be useful for C code in case the coding convention dictates that all compound ++# types are typedef'ed and only the typedef is referenced, never the tag name. ++ ++TYPEDEF_HIDES_STRUCT = NO ++ ++# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to ++# determine which symbols to keep in memory and which to flush to disk. ++# When the cache is full, less often used symbols will be written to disk. ++# For small to medium size projects (<1000 input files) the default value is ++# probably good enough. For larger projects a too small cache size can cause ++# doxygen to be busy swapping symbols to and from disk most of the time ++# causing a significant performance penality. ++# If the system has enough physical memory increasing the cache will improve the ++# performance by keeping more symbols in memory. Note that the value works on ++# a logarithmic scale so increasing the size by one will rougly double the ++# memory usage. The cache size is given by this formula: ++# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, ++# corresponding to a cache size of 2^16 = 65536 symbols ++ ++SYMBOL_CACHE_SIZE = 0 ++ ++#--------------------------------------------------------------------------- ++# Build related configuration options ++#--------------------------------------------------------------------------- ++ ++# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in ++# documentation are documented, even if no documentation was available. ++# Private class members and static file members will be hidden unless ++# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES ++ ++EXTRACT_ALL = YES ++ ++# If the EXTRACT_PRIVATE tag is set to YES all private members of a class ++# will be included in the documentation. ++ ++EXTRACT_PRIVATE = NO ++ ++# If the EXTRACT_STATIC tag is set to YES all static members of a file ++# will be included in the documentation. ++ ++EXTRACT_STATIC = NO ++ ++# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) ++# defined locally in source files will be included in the documentation. ++# If set to NO only classes defined in header files are included. ++ ++EXTRACT_LOCAL_CLASSES = YES ++ ++# This flag is only useful for Objective-C code. When set to YES local ++# methods, which are defined in the implementation section but not in ++# the interface are included in the documentation. ++# If set to NO (the default) only methods in the interface are included. ++ ++EXTRACT_LOCAL_METHODS = NO ++ ++# If this flag is set to YES, the members of anonymous namespaces will be ++# extracted and appear in the documentation as a namespace called ++# 'anonymous_namespace{file}', where file will be replaced with the base ++# name of the file that contains the anonymous namespace. By default ++# anonymous namespace are hidden. ++ ++EXTRACT_ANON_NSPACES = NO ++ ++# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all ++# undocumented members of documented classes, files or namespaces. ++# If set to NO (the default) these members will be included in the ++# various overviews, but no documentation section is generated. ++# This option has no effect if EXTRACT_ALL is enabled. ++ ++HIDE_UNDOC_MEMBERS = NO ++ ++# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all ++# undocumented classes that are normally visible in the class hierarchy. ++# If set to NO (the default) these classes will be included in the various ++# overviews. This option has no effect if EXTRACT_ALL is enabled. ++ ++HIDE_UNDOC_CLASSES = NO ++ ++# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all ++# friend (class|struct|union) declarations. ++# If set to NO (the default) these declarations will be included in the ++# documentation. ++ ++HIDE_FRIEND_COMPOUNDS = NO ++ ++# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any ++# documentation blocks found inside the body of a function. ++# If set to NO (the default) these blocks will be appended to the ++# function's detailed documentation block. ++ ++HIDE_IN_BODY_DOCS = NO ++ ++# The INTERNAL_DOCS tag determines if documentation ++# that is typed after a \internal command is included. If the tag is set ++# to NO (the default) then the documentation will be excluded. ++# Set it to YES to include the internal documentation. ++ ++INTERNAL_DOCS = NO ++ ++# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate ++# file names in lower-case letters. If set to YES upper-case letters are also ++# allowed. This is useful if you have classes or files whose names only differ ++# in case and if your file system supports case sensitive file names. Windows ++# and Mac users are advised to set this option to NO. ++ ++CASE_SENSE_NAMES = YES ++ ++# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen ++# will show members with their full class and namespace scopes in the ++# documentation. If set to YES the scope will be hidden. ++ ++HIDE_SCOPE_NAMES = NO ++ ++# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen ++# will put a list of the files that are included by a file in the documentation ++# of that file. ++ ++SHOW_INCLUDE_FILES = YES ++ ++# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] ++# is inserted in the documentation for inline members. ++ ++INLINE_INFO = YES ++ ++# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen ++# will sort the (detailed) documentation of file and class members ++# alphabetically by member name. If set to NO the members will appear in ++# declaration order. ++ ++SORT_MEMBER_DOCS = YES ++ ++# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the ++# brief documentation of file, namespace and class members alphabetically ++# by member name. If set to NO (the default) the members will appear in ++# declaration order. ++ ++SORT_BRIEF_DOCS = NO ++ ++# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the ++# hierarchy of group names into alphabetical order. If set to NO (the default) ++# the group names will appear in their defined order. ++ ++SORT_GROUP_NAMES = NO ++ ++# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be ++# sorted by fully-qualified names, including namespaces. If set to ++# NO (the default), the class list will be sorted only by class name, ++# not including the namespace part. ++# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. ++# Note: This option applies only to the class list, not to the ++# alphabetical list. ++ ++SORT_BY_SCOPE_NAME = NO ++ ++# The GENERATE_TODOLIST tag can be used to enable (YES) or ++# disable (NO) the todo list. This list is created by putting \todo ++# commands in the documentation. ++ ++GENERATE_TODOLIST = YES ++ ++# The GENERATE_TESTLIST tag can be used to enable (YES) or ++# disable (NO) the test list. This list is created by putting \test ++# commands in the documentation. ++ ++GENERATE_TESTLIST = YES ++ ++# The GENERATE_BUGLIST tag can be used to enable (YES) or ++# disable (NO) the bug list. This list is created by putting \bug ++# commands in the documentation. ++ ++GENERATE_BUGLIST = YES ++ ++# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or ++# disable (NO) the deprecated list. This list is created by putting ++# \deprecated commands in the documentation. ++ ++GENERATE_DEPRECATEDLIST= YES ++ ++# The ENABLED_SECTIONS tag can be used to enable conditional ++# documentation sections, marked by \if sectionname ... \endif. ++ ++ENABLED_SECTIONS = ++ ++# The MAX_INITIALIZER_LINES tag determines the maximum number of lines ++# the initial value of a variable or define consists of for it to appear in ++# the documentation. If the initializer consists of more lines than specified ++# here it will be hidden. Use a value of 0 to hide initializers completely. ++# The appearance of the initializer of individual variables and defines in the ++# documentation can be controlled using \showinitializer or \hideinitializer ++# command in the documentation regardless of this setting. ++ ++MAX_INITIALIZER_LINES = 30 ++ ++# Set the SHOW_USED_FILES tag to NO to disable the list of files generated ++# at the bottom of the documentation of classes and structs. If set to YES the ++# list will mention the files that were used to generate the documentation. ++ ++SHOW_USED_FILES = YES ++ ++# If the sources in your project are distributed over multiple directories ++# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy ++# in the documentation. The default is NO. ++ ++SHOW_DIRECTORIES = NO ++ ++# Set the SHOW_FILES tag to NO to disable the generation of the Files page. ++# This will remove the Files entry from the Quick Index and from the ++# Folder Tree View (if specified). The default is YES. ++ ++SHOW_FILES = YES ++ ++# Set the SHOW_NAMESPACES tag to NO to disable the generation of the ++# Namespaces page. This will remove the Namespaces entry from the Quick Index ++# and from the Folder Tree View (if specified). The default is YES. ++ ++SHOW_NAMESPACES = YES ++ ++# The FILE_VERSION_FILTER tag can be used to specify a program or script that ++# doxygen should invoke to get the current version for each file (typically from ++# the version control system). Doxygen will invoke the program by executing (via ++# popen()) the command , where is the value of ++# the FILE_VERSION_FILTER tag, and is the name of an input file ++# provided by doxygen. Whatever the program writes to standard output ++# is used as the file version. See the manual for examples. ++ ++FILE_VERSION_FILTER = ++ ++# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by ++# doxygen. The layout file controls the global structure of the generated output files ++# in an output format independent way. The create the layout file that represents ++# doxygen's defaults, run doxygen with the -l option. You can optionally specify a ++# file name after the option, if omitted DoxygenLayout.xml will be used as the name ++# of the layout file. ++ ++LAYOUT_FILE = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to warning and progress messages ++#--------------------------------------------------------------------------- ++ ++# The QUIET tag can be used to turn on/off the messages that are generated ++# by doxygen. Possible values are YES and NO. If left blank NO is used. ++ ++QUIET = YES ++ ++# The WARNINGS tag can be used to turn on/off the warning messages that are ++# generated by doxygen. Possible values are YES and NO. If left blank ++# NO is used. ++ ++WARNINGS = YES ++ ++# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings ++# for undocumented members. If EXTRACT_ALL is set to YES then this flag will ++# automatically be disabled. ++ ++WARN_IF_UNDOCUMENTED = YES ++ ++# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for ++# potential errors in the documentation, such as not documenting some ++# parameters in a documented function, or documenting parameters that ++# don't exist or using markup commands wrongly. ++ ++WARN_IF_DOC_ERROR = YES ++ ++# This WARN_NO_PARAMDOC option can be abled to get warnings for ++# functions that are documented, but have no documentation for their parameters ++# or return value. If set to NO (the default) doxygen will only warn about ++# wrong or incomplete parameter documentation, but not about the absence of ++# documentation. ++ ++WARN_NO_PARAMDOC = NO ++ ++# The WARN_FORMAT tag determines the format of the warning messages that ++# doxygen can produce. The string should contain the $file, $line, and $text ++# tags, which will be replaced by the file and line number from which the ++# warning originated and the warning text. Optionally the format may contain ++# $version, which will be replaced by the version of the file (if it could ++# be obtained via FILE_VERSION_FILTER) ++ ++WARN_FORMAT = "$file:$line: $text" ++ ++# The WARN_LOGFILE tag can be used to specify a file to which warning ++# and error messages should be written. If left blank the output is written ++# to stderr. ++ ++WARN_LOGFILE = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the input files ++#--------------------------------------------------------------------------- ++ ++# The INPUT tag can be used to specify the files and/or directories that contain ++# documented source files. You may enter file names like "myfile.cpp" or ++# directories like "/usr/src/myproject". Separate the files or directories ++# with spaces. ++ ++INPUT = ++ ++# This tag can be used to specify the character encoding of the source files ++# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is ++# also the default input encoding. Doxygen uses libiconv (or the iconv built ++# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for ++# the list of possible encodings. ++ ++INPUT_ENCODING = UTF-8 ++ ++# If the value of the INPUT tag contains directories, you can use the ++# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp ++# and *.h) to filter out the source-files in the directories. If left ++# blank the following patterns are tested: ++# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx ++# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 ++ ++FILE_PATTERNS = ++ ++# The RECURSIVE tag can be used to turn specify whether or not subdirectories ++# should be searched for input files as well. Possible values are YES and NO. ++# If left blank NO is used. ++ ++RECURSIVE = NO ++ ++# The EXCLUDE tag can be used to specify files and/or directories that should ++# excluded from the INPUT source files. This way you can easily exclude a ++# subdirectory from a directory tree whose root is specified with the INPUT tag. ++ ++EXCLUDE = ++ ++# The EXCLUDE_SYMLINKS tag can be used select whether or not files or ++# directories that are symbolic links (a Unix filesystem feature) are excluded ++# from the input. ++ ++EXCLUDE_SYMLINKS = NO ++ ++# If the value of the INPUT tag contains directories, you can use the ++# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude ++# certain files from those directories. Note that the wildcards are matched ++# against the file with absolute path, so to exclude all test directories ++# for example use the pattern */test/* ++ ++EXCLUDE_PATTERNS = ++ ++# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names ++# (namespaces, classes, functions, etc.) that should be excluded from the ++# output. The symbol name can be a fully qualified name, a word, or if the ++# wildcard * is used, a substring. Examples: ANamespace, AClass, ++# AClass::ANamespace, ANamespace::*Test ++ ++EXCLUDE_SYMBOLS = ++ ++# The EXAMPLE_PATH tag can be used to specify one or more files or ++# directories that contain example code fragments that are included (see ++# the \include command). ++ ++EXAMPLE_PATH = ++ ++# If the value of the EXAMPLE_PATH tag contains directories, you can use the ++# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp ++# and *.h) to filter out the source-files in the directories. If left ++# blank all files are included. ++ ++EXAMPLE_PATTERNS = ++ ++# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be ++# searched for input files to be used with the \include or \dontinclude ++# commands irrespective of the value of the RECURSIVE tag. ++# Possible values are YES and NO. If left blank NO is used. ++ ++EXAMPLE_RECURSIVE = NO ++ ++# The IMAGE_PATH tag can be used to specify one or more files or ++# directories that contain image that are included in the documentation (see ++# the \image command). ++ ++IMAGE_PATH = ++ ++# The INPUT_FILTER tag can be used to specify a program that doxygen should ++# invoke to filter for each input file. Doxygen will invoke the filter program ++# by executing (via popen()) the command , where ++# is the value of the INPUT_FILTER tag, and is the name of an ++# input file. Doxygen will then use the output that the filter program writes ++# to standard output. If FILTER_PATTERNS is specified, this tag will be ++# ignored. ++ ++INPUT_FILTER = ++ ++# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern ++# basis. Doxygen will compare the file name with each pattern and apply the ++# filter if there is a match. The filters are a list of the form: ++# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further ++# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER ++# is applied to all files. ++ ++FILTER_PATTERNS = ++ ++# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using ++# INPUT_FILTER) will be used to filter the input files when producing source ++# files to browse (i.e. when SOURCE_BROWSER is set to YES). ++ ++FILTER_SOURCE_FILES = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to source browsing ++#--------------------------------------------------------------------------- ++ ++# If the SOURCE_BROWSER tag is set to YES then a list of source files will ++# be generated. Documented entities will be cross-referenced with these sources. ++# Note: To get rid of all source code in the generated output, make sure also ++# VERBATIM_HEADERS is set to NO. ++ ++SOURCE_BROWSER = NO ++ ++# Setting the INLINE_SOURCES tag to YES will include the body ++# of functions and classes directly in the documentation. ++ ++INLINE_SOURCES = NO ++ ++# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct ++# doxygen to hide any special comment blocks from generated source code ++# fragments. Normal C and C++ comments will always remain visible. ++ ++STRIP_CODE_COMMENTS = YES ++ ++# If the REFERENCED_BY_RELATION tag is set to YES ++# then for each documented function all documented ++# functions referencing it will be listed. ++ ++REFERENCED_BY_RELATION = NO ++ ++# If the REFERENCES_RELATION tag is set to YES ++# then for each documented function all documented entities ++# called/used by that function will be listed. ++ ++REFERENCES_RELATION = NO ++ ++# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) ++# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from ++# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will ++# link to the source code. Otherwise they will link to the documentstion. ++ ++REFERENCES_LINK_SOURCE = YES ++ ++# If the USE_HTAGS tag is set to YES then the references to source code ++# will point to the HTML generated by the htags(1) tool instead of doxygen ++# built-in source browser. The htags tool is part of GNU's global source ++# tagging system (see http://www.gnu.org/software/global/global.html). You ++# will need version 4.8.6 or higher. ++ ++USE_HTAGS = NO ++ ++# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen ++# will generate a verbatim copy of the header file for each class for ++# which an include is specified. Set to NO to disable this. ++ ++VERBATIM_HEADERS = YES ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the alphabetical class index ++#--------------------------------------------------------------------------- ++ ++# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index ++# of all compounds will be generated. Enable this if the project ++# contains a lot of classes, structs, unions or interfaces. ++ ++ALPHABETICAL_INDEX = NO ++ ++# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then ++# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns ++# in which this list will be split (can be a number in the range [1..20]) ++ ++COLS_IN_ALPHA_INDEX = 5 ++ ++# In case all classes in a project start with a common prefix, all ++# classes will be put under the same header in the alphabetical index. ++# The IGNORE_PREFIX tag can be used to specify one or more prefixes that ++# should be ignored while generating the index headers. ++ ++IGNORE_PREFIX = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the HTML output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_HTML tag is set to YES (the default) Doxygen will ++# generate HTML output. ++ ++GENERATE_HTML = YES ++ ++# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `html' will be used as the default path. ++ ++HTML_OUTPUT = html ++ ++# The HTML_FILE_EXTENSION tag can be used to specify the file extension for ++# each generated HTML page (for example: .htm,.php,.asp). If it is left blank ++# doxygen will generate files with .html extension. ++ ++HTML_FILE_EXTENSION = .html ++ ++# The HTML_HEADER tag can be used to specify a personal HTML header for ++# each generated HTML page. If it is left blank doxygen will generate a ++# standard header. ++ ++HTML_HEADER = ++ ++# The HTML_FOOTER tag can be used to specify a personal HTML footer for ++# each generated HTML page. If it is left blank doxygen will generate a ++# standard footer. ++ ++HTML_FOOTER = no_date_footer.html ++ ++# The HTML_STYLESHEET tag can be used to specify a user-defined cascading ++# style sheet that is used by each HTML page. It can be used to ++# fine-tune the look of the HTML output. If the tag is left blank doxygen ++# will generate a default style sheet. Note that doxygen will try to copy ++# the style sheet file to the HTML output directory, so don't put your own ++# stylesheet in the HTML output directory as well, or it will be erased! ++ ++HTML_STYLESHEET = ++ ++# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, ++# files or namespaces will be aligned in HTML using tables. If set to ++# NO a bullet list will be used. ++ ++HTML_ALIGN_MEMBERS = YES ++ ++# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML ++# documentation will contain sections that can be hidden and shown after the ++# page has loaded. For this to work a browser that supports ++# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox ++# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). ++ ++HTML_DYNAMIC_SECTIONS = NO ++ ++# If the GENERATE_DOCSET tag is set to YES, additional index files ++# will be generated that can be used as input for Apple's Xcode 3 ++# integrated development environment, introduced with OSX 10.5 (Leopard). ++# To create a documentation set, doxygen will generate a Makefile in the ++# HTML output directory. Running make will produce the docset in that ++# directory and running "make install" will install the docset in ++# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find ++# it at startup. ++# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. ++ ++GENERATE_DOCSET = NO ++ ++# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the ++# feed. A documentation feed provides an umbrella under which multiple ++# documentation sets from a single provider (such as a company or product suite) ++# can be grouped. ++ ++DOCSET_FEEDNAME = "Doxygen generated docs" ++ ++# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that ++# should uniquely identify the documentation set bundle. This should be a ++# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen ++# will append .docset to the name. ++ ++DOCSET_BUNDLE_ID = org.doxygen.Project ++ ++# If the GENERATE_HTMLHELP tag is set to YES, additional index files ++# will be generated that can be used as input for tools like the ++# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) ++# of the generated HTML documentation. ++ ++GENERATE_HTMLHELP = NO ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can ++# be used to specify the file name of the resulting .chm file. You ++# can add a path in front of the file if the result should not be ++# written to the html output directory. ++ ++CHM_FILE = ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can ++# be used to specify the location (absolute path including file name) of ++# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run ++# the HTML help compiler on the generated index.hhp. ++ ++HHC_LOCATION = ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag ++# controls if a separate .chi index file is generated (YES) or that ++# it should be included in the master .chm file (NO). ++ ++GENERATE_CHI = NO ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING ++# is used to encode HtmlHelp index (hhk), content (hhc) and project file ++# content. ++ ++CHM_INDEX_ENCODING = ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag ++# controls whether a binary table of contents is generated (YES) or a ++# normal table of contents (NO) in the .chm file. ++ ++BINARY_TOC = NO ++ ++# The TOC_EXPAND flag can be set to YES to add extra items for group members ++# to the contents of the HTML help documentation and to the tree view. ++ ++TOC_EXPAND = NO ++ ++# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER ++# are set, an additional index file will be generated that can be used as input for ++# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated ++# HTML documentation. ++ ++GENERATE_QHP = NO ++ ++# If the QHG_LOCATION tag is specified, the QCH_FILE tag can ++# be used to specify the file name of the resulting .qch file. ++# The path specified is relative to the HTML output folder. ++ ++QCH_FILE = ++ ++# The QHP_NAMESPACE tag specifies the namespace to use when generating ++# Qt Help Project output. For more information please see ++# Qt Help Project / Namespace. ++ ++QHP_NAMESPACE = org.doxygen.Project ++ ++# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating ++# Qt Help Project output. For more information please see ++# Qt Help Project / Virtual Folders. ++ ++QHP_VIRTUAL_FOLDER = doc ++ ++# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can ++# be used to specify the location of Qt's qhelpgenerator. ++# If non-empty doxygen will try to run qhelpgenerator on the generated ++# .qhp file . ++ ++QHG_LOCATION = ++ ++# The DISABLE_INDEX tag can be used to turn on/off the condensed index at ++# top of each HTML page. The value NO (the default) enables the index and ++# the value YES disables it. ++ ++DISABLE_INDEX = NO ++ ++# This tag can be used to set the number of enum values (range [1..20]) ++# that doxygen will group on one line in the generated HTML documentation. ++ ++ENUM_VALUES_PER_LINE = 4 ++ ++# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index ++# structure should be generated to display hierarchical information. ++# If the tag value is set to FRAME, a side panel will be generated ++# containing a tree-like index structure (just like the one that ++# is generated for HTML Help). For this to work a browser that supports ++# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, ++# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are ++# probably better off using the HTML help feature. Other possible values ++# for this tag are: HIERARCHIES, which will generate the Groups, Directories, ++# and Class Hierarchy pages using a tree view instead of an ordered list; ++# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which ++# disables this behavior completely. For backwards compatibility with previous ++# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE ++# respectively. ++ ++GENERATE_TREEVIEW = NONE ++ ++# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be ++# used to set the initial width (in pixels) of the frame in which the tree ++# is shown. ++ ++TREEVIEW_WIDTH = 250 ++ ++# Use this tag to change the font size of Latex formulas included ++# as images in the HTML documentation. The default is 10. Note that ++# when you change the font size after a successful doxygen run you need ++# to manually remove any form_*.png images from the HTML output directory ++# to force them to be regenerated. ++ ++FORMULA_FONTSIZE = 10 ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the LaTeX output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will ++# generate Latex output. ++ ++GENERATE_LATEX = NO ++ ++# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `latex' will be used as the default path. ++ ++LATEX_OUTPUT = latex ++ ++# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be ++# invoked. If left blank `latex' will be used as the default command name. ++ ++LATEX_CMD_NAME = latex ++ ++# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to ++# generate index for LaTeX. If left blank `makeindex' will be used as the ++# default command name. ++ ++MAKEINDEX_CMD_NAME = makeindex ++ ++# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact ++# LaTeX documents. This may be useful for small projects and may help to ++# save some trees in general. ++ ++COMPACT_LATEX = NO ++ ++# The PAPER_TYPE tag can be used to set the paper type that is used ++# by the printer. Possible values are: a4, a4wide, letter, legal and ++# executive. If left blank a4wide will be used. ++ ++PAPER_TYPE = a4wide ++ ++# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX ++# packages that should be included in the LaTeX output. ++ ++EXTRA_PACKAGES = ++ ++# The LATEX_HEADER tag can be used to specify a personal LaTeX header for ++# the generated latex document. The header should contain everything until ++# the first chapter. If it is left blank doxygen will generate a ++# standard header. Notice: only use this tag if you know what you are doing! ++ ++LATEX_HEADER = ++ ++# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated ++# is prepared for conversion to pdf (using ps2pdf). The pdf file will ++# contain links (just like the HTML output) instead of page references ++# This makes the output suitable for online browsing using a pdf viewer. ++ ++PDF_HYPERLINKS = YES ++ ++# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of ++# plain latex in the generated Makefile. Set this option to YES to get a ++# higher quality PDF documentation. ++ ++USE_PDFLATEX = YES ++ ++# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. ++# command to the generated LaTeX files. This will instruct LaTeX to keep ++# running if errors occur, instead of asking the user for help. ++# This option is also used when generating formulas in HTML. ++ ++LATEX_BATCHMODE = NO ++ ++# If LATEX_HIDE_INDICES is set to YES then doxygen will not ++# include the index chapters (such as File Index, Compound Index, etc.) ++# in the output. ++ ++LATEX_HIDE_INDICES = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the RTF output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output ++# The RTF output is optimized for Word 97 and may not look very pretty with ++# other RTF readers or editors. ++ ++GENERATE_RTF = NO ++ ++# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `rtf' will be used as the default path. ++ ++RTF_OUTPUT = rtf ++ ++# If the COMPACT_RTF tag is set to YES Doxygen generates more compact ++# RTF documents. This may be useful for small projects and may help to ++# save some trees in general. ++ ++COMPACT_RTF = NO ++ ++# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated ++# will contain hyperlink fields. The RTF file will ++# contain links (just like the HTML output) instead of page references. ++# This makes the output suitable for online browsing using WORD or other ++# programs which support those fields. ++# Note: wordpad (write) and others do not support links. ++ ++RTF_HYPERLINKS = NO ++ ++# Load stylesheet definitions from file. Syntax is similar to doxygen's ++# config file, i.e. a series of assignments. You only have to provide ++# replacements, missing definitions are set to their default value. ++ ++RTF_STYLESHEET_FILE = ++ ++# Set optional variables used in the generation of an rtf document. ++# Syntax is similar to doxygen's config file. ++ ++RTF_EXTENSIONS_FILE = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the man page output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_MAN tag is set to YES (the default) Doxygen will ++# generate man pages ++ ++GENERATE_MAN = NO ++ ++# The MAN_OUTPUT tag is used to specify where the man pages will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `man' will be used as the default path. ++ ++MAN_OUTPUT = man ++ ++# The MAN_EXTENSION tag determines the extension that is added to ++# the generated man pages (default is the subroutine's section .3) ++ ++MAN_EXTENSION = .3 ++ ++# If the MAN_LINKS tag is set to YES and Doxygen generates man output, ++# then it will generate one additional man file for each entity ++# documented in the real man page(s). These additional files ++# only source the real man page, but without them the man command ++# would be unable to find the correct page. The default is NO. ++ ++MAN_LINKS = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the XML output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_XML tag is set to YES Doxygen will ++# generate an XML file that captures the structure of ++# the code including all documentation. ++ ++GENERATE_XML = NO ++ ++# The XML_OUTPUT tag is used to specify where the XML pages will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `xml' will be used as the default path. ++ ++XML_OUTPUT = xml ++ ++# The XML_SCHEMA tag can be used to specify an XML schema, ++# which can be used by a validating XML parser to check the ++# syntax of the XML files. ++ ++XML_SCHEMA = ++ ++# The XML_DTD tag can be used to specify an XML DTD, ++# which can be used by a validating XML parser to check the ++# syntax of the XML files. ++ ++XML_DTD = ++ ++# If the XML_PROGRAMLISTING tag is set to YES Doxygen will ++# dump the program listings (including syntax highlighting ++# and cross-referencing information) to the XML output. Note that ++# enabling this will significantly increase the size of the XML output. ++ ++XML_PROGRAMLISTING = YES ++ ++#--------------------------------------------------------------------------- ++# configuration options for the AutoGen Definitions output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will ++# generate an AutoGen Definitions (see autogen.sf.net) file ++# that captures the structure of the code including all ++# documentation. Note that this feature is still experimental ++# and incomplete at the moment. ++ ++GENERATE_AUTOGEN_DEF = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the Perl module output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_PERLMOD tag is set to YES Doxygen will ++# generate a Perl module file that captures the structure of ++# the code including all documentation. Note that this ++# feature is still experimental and incomplete at the ++# moment. ++ ++GENERATE_PERLMOD = NO ++ ++# If the PERLMOD_LATEX tag is set to YES Doxygen will generate ++# the necessary Makefile rules, Perl scripts and LaTeX code to be able ++# to generate PDF and DVI output from the Perl module output. ++ ++PERLMOD_LATEX = NO ++ ++# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be ++# nicely formatted so it can be parsed by a human reader. This is useful ++# if you want to understand what is going on. On the other hand, if this ++# tag is set to NO the size of the Perl module output will be much smaller ++# and Perl will parse it just the same. ++ ++PERLMOD_PRETTY = YES ++ ++# The names of the make variables in the generated doxyrules.make file ++# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. ++# This is useful so different doxyrules.make files included by the same ++# Makefile don't overwrite each other's variables. ++ ++PERLMOD_MAKEVAR_PREFIX = ++ ++#--------------------------------------------------------------------------- ++# Configuration options related to the preprocessor ++#--------------------------------------------------------------------------- ++ ++# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will ++# evaluate all C-preprocessor directives found in the sources and include ++# files. ++ ++ENABLE_PREPROCESSING = YES ++ ++# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro ++# names in the source code. If set to NO (the default) only conditional ++# compilation will be performed. Macro expansion can be done in a controlled ++# way by setting EXPAND_ONLY_PREDEF to YES. ++ ++MACRO_EXPANSION = NO ++ ++# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES ++# then the macro expansion is limited to the macros specified with the ++# PREDEFINED and EXPAND_AS_DEFINED tags. ++ ++EXPAND_ONLY_PREDEF = NO ++ ++# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files ++# in the INCLUDE_PATH (see below) will be search if a #include is found. ++ ++SEARCH_INCLUDES = YES ++ ++# The INCLUDE_PATH tag can be used to specify one or more directories that ++# contain include files that are not input files but should be processed by ++# the preprocessor. ++ ++INCLUDE_PATH = ++ ++# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard ++# patterns (like *.h and *.hpp) to filter out the header-files in the ++# directories. If left blank, the patterns specified with FILE_PATTERNS will ++# be used. ++ ++INCLUDE_FILE_PATTERNS = ++ ++# The PREDEFINED tag can be used to specify one or more macro names that ++# are defined before the preprocessor is started (similar to the -D option of ++# gcc). The argument of the tag is a list of macros of the form: name ++# or name=definition (no spaces). If the definition and the = are ++# omitted =1 is assumed. To prevent a macro definition from being ++# undefined via #undef or recursively expanded use the := operator ++# instead of the = operator. ++ ++PREDEFINED = ++ ++# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then ++# this tag can be used to specify a list of macro names that should be expanded. ++# The macro definition that is found in the sources will be used. ++# Use the PREDEFINED tag if you want to use a different macro definition. ++ ++EXPAND_AS_DEFINED = ++ ++# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then ++# doxygen's preprocessor will remove all function-like macros that are alone ++# on a line, have an all uppercase name, and do not end with a semicolon. Such ++# function macros are typically used for boiler-plate code, and will confuse ++# the parser if not removed. ++ ++SKIP_FUNCTION_MACROS = YES ++ ++#--------------------------------------------------------------------------- ++# Configuration::additions related to external references ++#--------------------------------------------------------------------------- ++ ++# The TAGFILES option can be used to specify one or more tagfiles. ++# Optionally an initial location of the external documentation ++# can be added for each tagfile. The format of a tag file without ++# this location is as follows: ++# TAGFILES = file1 file2 ... ++# Adding location for the tag files is done as follows: ++# TAGFILES = file1=loc1 "file2 = loc2" ... ++# where "loc1" and "loc2" can be relative or absolute paths or ++# URLs. If a location is present for each tag, the installdox tool ++# does not have to be run to correct the links. ++# Note that each tag file must have a unique name ++# (where the name does NOT include the path) ++# If a tag file is not located in the directory in which doxygen ++# is run, you must also specify the path to the tagfile here. ++ ++TAGFILES = ++ ++# When a file name is specified after GENERATE_TAGFILE, doxygen will create ++# a tag file that is based on the input files it reads. ++ ++GENERATE_TAGFILE = ++ ++# If the ALLEXTERNALS tag is set to YES all external classes will be listed ++# in the class index. If set to NO only the inherited external classes ++# will be listed. ++ ++ALLEXTERNALS = NO ++ ++# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed ++# in the modules index. If set to NO, only the current project's groups will ++# be listed. ++ ++EXTERNAL_GROUPS = YES ++ ++# The PERL_PATH should be the absolute path and name of the perl script ++# interpreter (i.e. the result of `which perl'). ++ ++PERL_PATH = /usr/bin/perl ++ ++#--------------------------------------------------------------------------- ++# Configuration options related to the dot tool ++#--------------------------------------------------------------------------- ++ ++# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will ++# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base ++# or super classes. Setting the tag to NO turns the diagrams off. Note that ++# this option is superseded by the HAVE_DOT option below. This is only a ++# fallback. It is recommended to install and use dot, since it yields more ++# powerful graphs. ++ ++CLASS_DIAGRAMS = YES ++ ++# You can define message sequence charts within doxygen comments using the \msc ++# command. Doxygen will then run the mscgen tool (see ++# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the ++# documentation. The MSCGEN_PATH tag allows you to specify the directory where ++# the mscgen tool resides. If left empty the tool is assumed to be found in the ++# default search path. ++ ++MSCGEN_PATH = ++ ++# If set to YES, the inheritance and collaboration graphs will hide ++# inheritance and usage relations if the target is undocumented ++# or is not a class. ++ ++HIDE_UNDOC_RELATIONS = YES ++ ++# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is ++# available from the path. This tool is part of Graphviz, a graph visualization ++# toolkit from AT&T and Lucent Bell Labs. The other options in this section ++# have no effect if this option is set to NO (the default) ++ ++HAVE_DOT = NO ++ ++# By default doxygen will write a font called FreeSans.ttf to the output ++# directory and reference it in all dot files that doxygen generates. This ++# font does not include all possible unicode characters however, so when you need ++# these (or just want a differently looking font) you can specify the font name ++# using DOT_FONTNAME. You need need to make sure dot is able to find the font, ++# which can be done by putting it in a standard location or by setting the ++# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory ++# containing the font. ++ ++DOT_FONTNAME = FreeSans ++ ++# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. ++# The default size is 10pt. ++ ++DOT_FONTSIZE = 10 ++ ++# By default doxygen will tell dot to use the output directory to look for the ++# FreeSans.ttf font (which doxygen will put there itself). If you specify a ++# different font using DOT_FONTNAME you can set the path where dot ++# can find it using this tag. ++ ++DOT_FONTPATH = ++ ++# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen ++# will generate a graph for each documented class showing the direct and ++# indirect inheritance relations. Setting this tag to YES will force the ++# the CLASS_DIAGRAMS tag to NO. ++ ++CLASS_GRAPH = YES ++ ++# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen ++# will generate a graph for each documented class showing the direct and ++# indirect implementation dependencies (inheritance, containment, and ++# class references variables) of the class with other documented classes. ++ ++COLLABORATION_GRAPH = YES ++ ++# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen ++# will generate a graph for groups, showing the direct groups dependencies ++ ++GROUP_GRAPHS = YES ++ ++# If the UML_LOOK tag is set to YES doxygen will generate inheritance and ++# collaboration diagrams in a style similar to the OMG's Unified Modeling ++# Language. ++ ++UML_LOOK = NO ++ ++# If set to YES, the inheritance and collaboration graphs will show the ++# relations between templates and their instances. ++ ++TEMPLATE_RELATIONS = NO ++ ++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT ++# tags are set to YES then doxygen will generate a graph for each documented ++# file showing the direct and indirect include dependencies of the file with ++# other documented files. ++ ++INCLUDE_GRAPH = YES ++ ++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and ++# HAVE_DOT tags are set to YES then doxygen will generate a graph for each ++# documented header file showing the documented files that directly or ++# indirectly include this file. ++ ++INCLUDED_BY_GRAPH = YES ++ ++# If the CALL_GRAPH and HAVE_DOT options are set to YES then ++# doxygen will generate a call dependency graph for every global function ++# or class method. Note that enabling this option will significantly increase ++# the time of a run. So in most cases it will be better to enable call graphs ++# for selected functions only using the \callgraph command. ++ ++CALL_GRAPH = NO ++ ++# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then ++# doxygen will generate a caller dependency graph for every global function ++# or class method. Note that enabling this option will significantly increase ++# the time of a run. So in most cases it will be better to enable caller ++# graphs for selected functions only using the \callergraph command. ++ ++CALLER_GRAPH = NO ++ ++# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen ++# will graphical hierarchy of all classes instead of a textual one. ++ ++GRAPHICAL_HIERARCHY = YES ++ ++# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES ++# then doxygen will show the dependencies a directory has on other directories ++# in a graphical way. The dependency relations are determined by the #include ++# relations between the files in the directories. ++ ++DIRECTORY_GRAPH = YES ++ ++# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images ++# generated by dot. Possible values are png, jpg, or gif ++# If left blank png will be used. ++ ++DOT_IMAGE_FORMAT = png ++ ++# The tag DOT_PATH can be used to specify the path where the dot tool can be ++# found. If left blank, it is assumed the dot tool can be found in the path. ++ ++DOT_PATH = ++ ++# The DOTFILE_DIRS tag can be used to specify one or more directories that ++# contain dot files that are included in the documentation (see the ++# \dotfile command). ++ ++DOTFILE_DIRS = ++ ++# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of ++# nodes that will be shown in the graph. If the number of nodes in a graph ++# becomes larger than this value, doxygen will truncate the graph, which is ++# visualized by representing a node as a red box. Note that doxygen if the ++# number of direct children of the root node in a graph is already larger than ++# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note ++# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. ++ ++DOT_GRAPH_MAX_NODES = 50 ++ ++# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the ++# graphs generated by dot. A depth value of 3 means that only nodes reachable ++# from the root by following a path via at most 3 edges will be shown. Nodes ++# that lay further from the root node will be omitted. Note that setting this ++# option to 1 or 2 may greatly reduce the computation time needed for large ++# code bases. Also note that the size of a graph can be further restricted by ++# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. ++ ++MAX_DOT_GRAPH_DEPTH = 0 ++ ++# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent ++# background. This is disabled by default, because dot on Windows does not ++# seem to support this out of the box. Warning: Depending on the platform used, ++# enabling this option may lead to badly anti-aliased labels on the edges of ++# a graph (i.e. they become hard to read). ++ ++DOT_TRANSPARENT = NO ++ ++# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output ++# files in one run (i.e. multiple -o and -T options on the command line). This ++# makes dot run faster, but since only newer versions of dot (>1.8.10) ++# support this, this feature is disabled by default. ++ ++DOT_MULTI_TARGETS = NO ++ ++# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will ++# generate a legend page explaining the meaning of the various boxes and ++# arrows in the dot generated graphs. ++ ++GENERATE_LEGEND = YES ++ ++# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will ++# remove the intermediate dot files that are used to generate ++# the various graphs. ++ ++DOT_CLEANUP = YES ++ ++#--------------------------------------------------------------------------- ++# Configuration::additions related to the search engine ++#--------------------------------------------------------------------------- ++ ++# The SEARCHENGINE tag specifies whether or not a search engine should be ++# used. If set to NO the values of all tags below this one will be ignored. ++ ++SEARCHENGINE = NO +diff --git a/libiscsi/libiscsi.h b/libiscsi/libiscsi.h +new file mode 100644 +index 0000000..756590e +--- /dev/null ++++ b/libiscsi/libiscsi.h +@@ -0,0 +1,344 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#ifndef __LIBISCSI_H ++#define __LIBISCSI_H ++ ++#include ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++#if __GNUC__ >= 4 ++#define PUBLIC __attribute__ ((visibility("default"))) ++#else ++#define PUBLIC ++#endif ++ ++/** \brief Maximum length for iSCSI values. ++ * ++ * Maximum length for iSCSI values such as hostnames and parameter values. ++ */ ++#define LIBISCSI_VALUE_MAXLEN 256 ++ ++/** \brief supported authentication methods ++ * ++ * This enum lists all supported authentication methods. ++ */ ++enum libiscsi_auth_t { ++ libiscsi_auth_none /** No authentication */, ++ libiscsi_auth_chap /** CHAP authentication */, ++}; ++ ++/** \brief libiscsi context struct ++ * ++ * Note: even though libiscsi uses a context struct, the underlying open-iscsi ++ * code does not, so libiscsi is not thread safe, not even when using one ++ * context per thread! ++ */ ++struct libiscsi_context; ++ ++/** \brief iSCSI node record ++ * ++ * Struct holding data uniquely identifying an iSCSI node. ++ */ ++struct libiscsi_node { ++ char name[LIBISCSI_VALUE_MAXLEN] /** iSCSI iqn for the node. */; ++ int tpgt /** Portal group number. */; ++ /* Note open-iscsi has some code in place for multiple connections in one ++ node record and thus multiple address / port combi's, but this does not ++ get used anywhere, so we keep things simple and assume one connection */ ++ char address[NI_MAXHOST] /** Portal hostname or IP-address. */; ++ int port /** Portal port number. */; ++ char iface[LIBISCSI_VALUE_MAXLEN] /** Interface to connect through. */; ++}; ++ ++/** \brief libiscsi CHAP authentication information struct ++ * ++ * Struct holding all data needed for CHAP login / authentication. Note that ++ * \e reverse_username may be a 0 length string in which case only forward ++ * authentication will be done. ++ */ ++struct libiscsi_chap_auth_info { ++ char username[LIBISCSI_VALUE_MAXLEN] /** Username */; ++ char password[LIBISCSI_VALUE_MAXLEN] /** Password */; ++ char reverse_username[LIBISCSI_VALUE_MAXLEN] /** Reverse Username */; ++ char reverse_password[LIBISCSI_VALUE_MAXLEN] /** Reverse Password */; ++}; ++ ++/** \brief generic libiscsi authentication information struct ++ * ++ * Struct holding authentication information for discovery and login. ++ */ ++struct libiscsi_auth_info { ++ enum libiscsi_auth_t method /** Authentication method to use */; ++ union { ++ struct libiscsi_chap_auth_info chap /** Chap specific info */; ++ } /** Union holding method depenend info */; ++}; ++ ++/** \brief Initalize libiscsi ++ * ++ * This function creates a libiscsi context and initalizes it. This context ++ * is need to use other libiscsi funtions. ++ * ++ * \return A pointer to the created context, or NULL in case of an error. ++ */ ++PUBLIC struct libiscsi_context *libiscsi_init(void); ++ ++/** \brief Cleanup libiscsi used resource ++ * ++ * This function cleanups any used resources and then destroys the passed ++ * context. After this the passed in context may no longer be used! ++ * ++ * \param context libiscsi context to operate on. ++ */ ++PUBLIC void libiscsi_cleanup(struct libiscsi_context *context); ++ ++/** \brief Discover iSCSI nodes using sendtargets and add them to the node db. ++ * ++ * This function connects to the given address and port and then tries to ++ * discover iSCSI nodes using the sendtargets protocol. Any found nodes are ++ * added to the local iSCSI node database and are returned in a dynamically ++ * allocated array. ++ * ++ * Note that the (optional) authentication info is for authenticating the ++ * discovery, and is not for the found nodes! If the connection(s) to the ++ * node(s) need authentication too, you can set the username / password for ++ * those (which can be different!) using the libiscsi_node_set_auth() function. ++ * ++ * \param context libiscsi context to operate on. ++ * \param address Hostname or IP-address to connect to. ++ * \param port Port to connect to, or 0 for the default port. ++ * \param auth_info Authentication information, or NULL. ++ * \param nr_found The number of found nodes will be returned ++ * through this pointer if not NULL. ++ * \param found_nodes The address of the dynamically allocated array ++ * of found nodes will be returned through this ++ * pointer if not NULL. The caller must free this ++ * array using free(). ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_discover_sendtargets(struct libiscsi_context *context, ++ const char *address, int port, const struct libiscsi_auth_info *auth_info, ++ int *nr_found, struct libiscsi_node **found_nodes); ++ ++/** \brief Read iSCSI node info from firmware and add them to the node db. ++ * ++ * This function discovers iSCSI nodes using firmware (ppc or ibft). Any found ++ * nodes are added to the local iSCSI node database and are returned in a ++ * dynamically allocated array. ++ * ++ * Note that unlike sendtargets discovery, this function will also read ++ * authentication info and store that in the database too. ++ * ++ * Note this function currently is a stub which will always return -EINVAL ++ * (IOW it is not yet implemented) ++ * ++ * \param context libiscsi context to operate on. ++ * \param nr_found The number of found nodes will be returned ++ * through this pointer if not NULL. ++ * \param found_nodes The address of the dynamically allocated array ++ * of found nodes will be returned through this ++ * pointer if not NULL. The caller must free this ++ * array using free(). ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_discover_firmware(struct libiscsi_context *context, ++ int *nr_found, struct libiscsi_node **found_nodes); ++ ++/** \brief Check validity of the given authentication info. ++ * ++ * This function checks the validity of the given authentication info. For ++ * example in case of CHAP, if the username and password are not empty. ++ * ++ * This function is mainly intended for use by language bindings. ++ * ++ * \param context libiscsi context to operate on. ++ * \param auth_info Authentication information to check. ++ * \return 0 on success, otherwise EINVAL. ++ */ ++PUBLIC int libiscsi_verify_auth_info(struct libiscsi_context *context, ++ const struct libiscsi_auth_info *auth_info); ++ ++/** \brief Set the authentication info for the given node. ++ * ++ * This function sets the authentication information for the node described by ++ * the given node record. This will overwrite any existing authentication ++ * information. ++ * ++ * This is the way to specify authentication information for nodes found ++ * through sendtargets discovery. ++ * ++ * Note: ++ * 1) This is a convience wrapper around libiscsi_node_set_parameter(), ++ * setting the node.session.auth.* parameters. ++ * 2) For nodes found through firmware discovery the authentication information ++ * has already been set from the firmware. ++ * 3) \e auth_info may be NULL in which case any existing authinfo will be ++ * cleared. ++ * ++ * \param context libiscsi context to operate on. ++ * \param node iSCSI node to set auth information of ++ * \param auth_info Authentication information, or NULL. ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_node_set_auth(struct libiscsi_context *context, ++ const struct libiscsi_node *node, ++ const struct libiscsi_auth_info *auth_info); ++ ++/** \brief Get the authentication info for the given node. ++ * ++ * This function gets the authentication information for the node described by ++ * the given node record. ++ * ++ * \param context libiscsi context to operate on. ++ * \param node iSCSI node to set auth information of ++ * \param auth_info Pointer to a libiscsi_auth_info struct where ++ * the retreived information will be stored. ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_node_get_auth(struct libiscsi_context *context, ++ const struct libiscsi_node *node, ++ struct libiscsi_auth_info *auth_info); ++ ++/** \brief Login to an iSCSI node. ++ * ++ * Login to the iSCSI node described by the given node record. ++ * ++ * \param context libiscsi context to operate on. ++ * \param node iSCSI node to login to. ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_node_login(struct libiscsi_context *context, ++ const struct libiscsi_node *node); ++ ++/** \brief Logout of an iSCSI node. ++ * ++ * Logout of the iSCSI node described by the given node record. ++ * ++ * \param context libiscsi context to operate on. ++ * \param node iSCSI node to logout from. ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_node_logout(struct libiscsi_context *context, ++ const struct libiscsi_node *node); ++ ++/** \brief Set an iSCSI parameter for the given node ++ * ++ * Set the given nodes iSCSI parameter named by \e parameter to value \e value. ++ * ++ * \param context libiscsi context to operate on. ++ * \param node iSCSI node to change a parameter from. ++ * \param parameter Name of the parameter to set. ++ * \param value Value to set the parameter too. ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_node_set_parameter(struct libiscsi_context *context, ++ const struct libiscsi_node *node, ++ const char *parameter, const char *value); ++ ++/** \brief Get the value of an iSCSI parameter for the given node ++ * ++ * Get the value of the given nodes iSCSI parameter named by \e parameter. ++ * ++ * \param context libiscsi context to operate on. ++ * \param node iSCSI node to change a parameter from. ++ * \param parameter Name of the parameter to get. ++ * \param value The retreived value is stored here, this buffer must be ++ * atleast LIBISCSI_VALUE_MAXLEN bytes large. ++ * \return 0 on success, otherwise a standard error code ++ * (from errno.h). ++ */ ++PUBLIC int libiscsi_node_get_parameter(struct libiscsi_context *context, ++ const struct libiscsi_node *node, const char *parameter, char *value); ++ ++/** \brief Get human readable string describing the last libiscsi error. ++ * ++ * This function can be called to get a human readable error string when a ++ * libiscsi function has returned an error. This function uses a single buffer ++ * per context, thus the result is only valid as long as no other libiscsi ++ * calls are made on the same context after the failing function call. ++ * ++ * \param context libiscsi context to operate on. ++ * ++ * \return human readable string describing the last libiscsi error. ++ */ ++PUBLIC const char *libiscsi_get_error_string(struct libiscsi_context *context); ++ ++ ++/************************** Utility functions *******************************/ ++ ++/** \brief libiscsi network config struct ++ * ++ * libiscsi network config struct. ++ */ ++struct libiscsi_network_config { ++ int dhcp /** Using DHCP? (boolean). */; ++ char iface_name[LIBISCSI_VALUE_MAXLEN] /** Interface name. */; ++ char mac_address[LIBISCSI_VALUE_MAXLEN] /** MAC address. */; ++ char ip_address[LIBISCSI_VALUE_MAXLEN] /** IP address. */; ++ char netmask[LIBISCSI_VALUE_MAXLEN] /** Netmask. */; ++ char gateway[LIBISCSI_VALUE_MAXLEN] /** IP of Default gateway. */; ++ char primary_dns[LIBISCSI_VALUE_MAXLEN] /** IP of the Primary DNS. */; ++ char secondary_dns[LIBISCSI_VALUE_MAXLEN] /** IP of the Secondary DNS. */; ++}; ++ ++/** \brief Get network configuration information from iscsi firmware ++ * ++ * Function can be called to get the network configuration information ++ * (like dhcp, ip, netmask, default gateway, etc.) from the firmware of a ++ * network adapter with iscsi boot firmware. ++ * ++ * Note that not all fields of the returned struct are necessarilly filled, ++ * unset fields contain a 0 length string. ++ * ++ * \param config pointer to a libiscsi_network_config struct to fill. ++ * ++ * \return 0 on success, ENODEV when no iscsi firmware was found. ++ */ ++PUBLIC int libiscsi_get_firmware_network_config( ++ struct libiscsi_network_config *config); ++ ++/** \brief Get the initiator name (iqn) from the iscsi firmware ++ * ++ * Get the initiator name (iqn) from the iscsi firmware. ++ * ++ * \param initiatorname The initiator name is stored here, this buffer must be ++ * atleast LIBISCSI_VALUE_MAXLEN bytes large. ++ * \return 0 on success, ENODEV when no iscsi firmware was found. ++ */ ++PUBLIC int libiscsi_get_firmware_initiator_name(char *initiatorname); ++ ++#undef PUBLIC ++ ++#ifdef __cplusplus ++} ++#endif /* __cplusplus */ ++ ++#endif +diff --git a/libiscsi/no_date_footer.html b/libiscsi/no_date_footer.html +new file mode 100644 +index 0000000..1e0c6c4 +--- /dev/null ++++ b/libiscsi/no_date_footer.html +@@ -0,0 +1,6 @@ ++
++Generated for $projectname by doxygen ++$doxygenversion
++ ++ +diff --git a/libiscsi/pylibiscsi.c b/libiscsi/pylibiscsi.c +new file mode 100644 +index 0000000..8800853 +--- /dev/null ++++ b/libiscsi/pylibiscsi.c +@@ -0,0 +1,709 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include "libiscsi.h" ++ ++#if PY_MAJOR_VERSION >= 3 ++#define IS_PY3K ++#define MODINITERROR return NULL ++#define PYNUM_FROMLONG PyLong_FromLong ++#define PYSTR_FROMSTRING PyUnicode_FromString ++#else ++#define MODINITERROR return ++#define PYNUM_FROMLONG PyInt_FromLong ++#define PYSTR_FROMSTRING PyString_FromString ++#endif ++ ++#define RET_TRUE_ELSE_FALSE { Py_RETURN_TRUE; } else { Py_RETURN_FALSE; } ++#define CMP_TO_RICHCMP(cmpfunc) \ ++ int comp_res = cmpfunc(self, other); \ ++ switch (op) { \ ++ case Py_LT: \ ++ if (comp_res < 0) RET_TRUE_ELSE_FALSE \ ++ case Py_LE: \ ++ if (comp_res <= 0) RET_TRUE_ELSE_FALSE \ ++ case Py_EQ: \ ++ if (comp_res == 0) RET_TRUE_ELSE_FALSE \ ++ case Py_NE: \ ++ if (comp_res != 0) RET_TRUE_ELSE_FALSE \ ++ case Py_GT: \ ++ if (comp_res > 0) RET_TRUE_ELSE_FALSE \ ++ default: \ ++ if (comp_res >= 0) RET_TRUE_ELSE_FALSE \ ++ } ++ ++static struct libiscsi_context *context = NULL; ++ ++/****************************** helpers ***********************************/ ++static int check_string(const char *string) ++{ ++ if (strlen(string) >= LIBISCSI_VALUE_MAXLEN) { ++ PyErr_SetString(PyExc_ValueError, "string too long"); ++ return -1; ++ } ++ return 0; ++} ++ ++/********************** PyIscsiChapAuthInfo ***************************/ ++ ++typedef struct { ++ PyObject_HEAD ++ ++ struct libiscsi_auth_info info; ++} PyIscsiChapAuthInfo; ++ ++static int PyIscsiChapAuthInfo_init(PyObject *self, PyObject *args, ++ PyObject *kwds) ++{ ++ int i; ++ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; ++ char *kwlist[] = {"username", "password", "reverse_username", ++ "reverse_password", NULL}; ++ const char *string[4] = { NULL, NULL, NULL, NULL }; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, ++ "zz|zz:chapAuthInfo.__init__", ++ kwlist, &string[0], &string[1], ++ &string[2], &string[3])) ++ return -1; ++ ++ for (i = 0; i < 4; i++) ++ if (string[i] && check_string(string[i])) ++ return -1; ++ ++ memset (&chap->info, 0, sizeof(chap->info)); ++ chap->info.method = libiscsi_auth_chap; ++ if (string[0]) ++ strcpy(chap->info.chap.username, string[0]); ++ if (string[1]) ++ strcpy(chap->info.chap.password, string[1]); ++ if (string[2]) ++ strcpy(chap->info.chap.reverse_username, string[2]); ++ if (string[3]) ++ strcpy(chap->info.chap.reverse_password, string[3]); ++ ++ if (libiscsi_verify_auth_info(context, &chap->info)) { ++ PyErr_SetString(PyExc_ValueError, ++ libiscsi_get_error_string(context)); ++ return -1; ++ } ++ return 0; ++} ++ ++static PyObject *PyIscsiChapAuthInfo_get(PyObject *self, void *data) ++{ ++ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; ++ const char *attr = (const char *)data; ++ ++ if (!strcmp(attr, "username")) { ++ return PYSTR_FROMSTRING(chap->info.chap.username); ++ } else if (!strcmp(attr, "password")) { ++ return PYSTR_FROMSTRING(chap->info.chap.password); ++ } else if (!strcmp(attr, "reverse_username")) { ++ return PYSTR_FROMSTRING(chap->info.chap.reverse_username); ++ } else if (!strcmp(attr, "reverse_password")) { ++ return PYSTR_FROMSTRING(chap->info.chap.reverse_password); ++ } ++ return NULL; ++} ++ ++static int PyIscsiChapAuthInfo_set(PyObject *self, PyObject *value, void *data) ++{ ++ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; ++ const char *attr = (const char *)data; ++ const char *str; ++ ++ if (!PyArg_Parse(value, "s", &str) || check_string(str)) ++ return -1; ++ ++ if (!strcmp(attr, "username")) { ++ strcpy(chap->info.chap.username, str); ++ } else if (!strcmp(attr, "password")) { ++ strcpy(chap->info.chap.password, str); ++ } else if (!strcmp(attr, "reverse_username")) { ++ strcpy(chap->info.chap.reverse_username, str); ++ } else if (!strcmp(attr, "reverse_password")) { ++ strcpy(chap->info.chap.reverse_password, str); ++ } ++ ++ return 0; ++} ++ ++static int PyIscsiChapAuthInfo_compare(PyIscsiChapAuthInfo *self, ++ PyIscsiChapAuthInfo *other) ++{ ++ int r; ++ ++ r = strcmp(self->info.chap.username, other->info.chap.username); ++ if (r) ++ return r; ++ ++ r = strcmp(self->info.chap.password, other->info.chap.password); ++ if (r) ++ return r; ++ ++ r = strcmp(self->info.chap.reverse_username, ++ other->info.chap.reverse_username); ++ if (r) ++ return r; ++ ++ r = strcmp(self->info.chap.reverse_password, ++ other->info.chap.reverse_password); ++ return r; ++} ++ ++PyObject *PyIscsiChapAuthInfo_richcompare(PyIscsiChapAuthInfo *self, ++ PyIscsiChapAuthInfo *other, ++ int op) ++{ ++ CMP_TO_RICHCMP(PyIscsiChapAuthInfo_compare) ++} ++ ++static PyObject *PyIscsiChapAuthInfo_str(PyObject *self) ++{ ++ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; ++ char s[1024], reverse[512] = ""; ++ ++ if (chap->info.chap.reverse_username[0]) ++ snprintf(reverse, sizeof(reverse), ", %s:%s", ++ chap->info.chap.reverse_username, ++ chap->info.chap.reverse_password); ++ ++ snprintf(s, sizeof(s), "%s:%s%s", chap->info.chap.username, ++ chap->info.chap.password, reverse); ++ ++ return PYSTR_FROMSTRING(s); ++} ++ ++static struct PyGetSetDef PyIscsiChapAuthInfo_getseters[] = { ++ {"username", (getter)PyIscsiChapAuthInfo_get, ++ (setter)PyIscsiChapAuthInfo_set, ++ "username", "username"}, ++ {"password", (getter)PyIscsiChapAuthInfo_get, ++ (setter)PyIscsiChapAuthInfo_set, ++ "password", "password"}, ++ {"reverse_username", (getter)PyIscsiChapAuthInfo_get, ++ (setter)PyIscsiChapAuthInfo_set, ++ "reverse_username", "reverse_username"}, ++ {"reverse_password", (getter)PyIscsiChapAuthInfo_get, ++ (setter)PyIscsiChapAuthInfo_set, ++ "reverse_password", "reverse_password"}, ++ {NULL} ++}; ++ ++PyTypeObject PyIscsiChapAuthInfo_Type = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ .tp_name = "libiscsi.chapAuthInfo", ++ .tp_basicsize = sizeof (PyIscsiChapAuthInfo), ++ .tp_getset = PyIscsiChapAuthInfo_getseters, ++ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE ++#ifndef IS_PY3K ++ // Py_TPFLAGS_CHECKTYPES is only needed on Python 2 ++ | Py_TPFLAGS_CHECKTYPES ++#endif ++ , ++ .tp_richcompare = (richcmpfunc)PyIscsiChapAuthInfo_compare, ++ .tp_init = PyIscsiChapAuthInfo_init, ++ .tp_str = PyIscsiChapAuthInfo_str, ++ .tp_new = PyType_GenericNew, ++ .tp_doc = "iscsi chap authentication information.", ++}; ++ ++/***************************** PyIscsiNode ********************************/ ++ ++typedef struct { ++ PyObject_HEAD ++ ++ struct libiscsi_node node; ++} PyIscsiNode; ++ ++static int PyIscsiNode_init(PyObject *self, PyObject *args, PyObject *kwds) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ char *kwlist[] = {"name", "tpgt", "address", "port", "iface", NULL}; ++ const char *name = NULL, *address = NULL, *iface = NULL; ++ int tpgt = -1, port = 3260; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isis:node.__init__", ++ kwlist, &name, &tpgt, &address, ++ &port, &iface)) ++ return -1; ++ if (address == NULL) { ++ PyErr_SetString(PyExc_ValueError, "address not set"); ++ return -1; ++ } ++ if (check_string(name) || check_string(address) || check_string(iface)) ++ return -1; ++ ++ strcpy(node->node.name, name); ++ node->node.tpgt = tpgt; ++ strcpy(node->node.address, address); ++ node->node.port = port; ++ strcpy(node->node.iface, iface); ++ ++ return 0; ++} ++ ++static PyObject *PyIscsiNode_get(PyObject *self, void *data) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ const char *attr = (const char *)data; ++ ++ if (!strcmp(attr, "name")) { ++ return PYSTR_FROMSTRING(node->node.name); ++ } else if (!strcmp(attr, "tpgt")) { ++ return PYNUM_FROMLONG(node->node.tpgt); ++ } else if (!strcmp(attr, "address")) { ++ return PYSTR_FROMSTRING(node->node.address); ++ } else if (!strcmp(attr, "port")) { ++ return PYNUM_FROMLONG(node->node.port); ++ } else if (!strcmp(attr, "iface")) { ++ return PYSTR_FROMSTRING(node->node.iface); ++ } ++ return NULL; ++} ++ ++static int PyIscsiNode_set(PyObject *self, PyObject *value, void *data) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ const char *attr = (const char *)data; ++ const char *str; ++ int i; ++ ++ if (!strcmp(attr, "name")) { ++ if (!PyArg_Parse(value, "s", &str) || check_string(str)) ++ return -1; ++ strcpy(node->node.name, str); ++ } else if (!strcmp(attr, "tpgt")) { ++ if (!PyArg_Parse(value, "i", &i)) ++ return -1; ++ node->node.tpgt = i; ++ } else if (!strcmp(attr, "address")) { ++ if (!PyArg_Parse(value, "s", &str) || check_string(str)) ++ return -1; ++ strcpy(node->node.address, str); ++ } else if (!strcmp(attr, "port")) { ++ if (!PyArg_Parse(value, "i", &i)) ++ return -1; ++ node->node.port = i; ++ } else if (!strcmp(attr, "iface")) { ++ if (!PyArg_Parse(value, "s", &str) || check_string(str)) ++ return -1; ++ strcpy(node->node.iface, str); ++ } ++ ++ return 0; ++} ++ ++static int PyIscsiNode_compare(PyIscsiNode *self, PyIscsiNode *other) ++{ ++ int res; ++ ++ res = strcmp(self->node.name, other->node.name); ++ if (res) ++ return res; ++ ++ if (self->node.tpgt < other->node.tpgt) ++ return -1; ++ if (self->node.tpgt > other->node.tpgt) ++ return -1; ++ ++ res = strcmp(self->node.address, other->node.address); ++ if (res) ++ return res; ++ ++ if (self->node.port < other->node.port) ++ return -1; ++ if (self->node.port > other->node.port) ++ return -1; ++ ++ res = strcmp(self->node.iface, other->node.iface); ++ if (res) ++ return res; ++ ++ return 0; ++} ++ ++PyObject *PyIscsiNode_richcompare(PyIscsiNode *self, PyIscsiNode *other, int op) ++{ ++ CMP_TO_RICHCMP(PyIscsiNode_compare) ++} ++ ++static PyObject *PyIscsiNode_str(PyObject *self) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ char s[1024], tpgt[16] = ""; ++ ++ if (node->node.tpgt != -1) ++ sprintf(tpgt, ",%d", node->node.tpgt); ++ ++ snprintf(s, sizeof(s), "%s:%d%s %s", node->node.address, ++ node->node.port, tpgt, node->node.name); ++ ++ return PYSTR_FROMSTRING(s); ++} ++ ++static PyObject *PyIscsiNode_login(PyObject *self) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ ++ if (libiscsi_node_login(context, &node->node)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ Py_RETURN_NONE; ++} ++ ++static PyObject *PyIscsiNode_logout(PyObject *self) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ ++ if (libiscsi_node_logout(context, &node->node)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ Py_RETURN_NONE; ++} ++ ++static PyObject *PyIscsiNode_setAuth(PyObject *self, PyObject *args, ++ PyObject *kwds) ++{ ++ char *kwlist[] = {"authinfo", NULL}; ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ PyObject *arg; ++ const struct libiscsi_auth_info *authinfo = NULL; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &arg)) ++ return NULL; ++ ++ if (arg == Py_None) { ++ authinfo = NULL; ++ } else if (PyObject_IsInstance(arg, (PyObject *) ++ &PyIscsiChapAuthInfo_Type)) { ++ PyIscsiChapAuthInfo *pyauthinfo = (PyIscsiChapAuthInfo *)arg; ++ authinfo = &pyauthinfo->info; ++ } else { ++ PyErr_SetString(PyExc_ValueError, "invalid authinfo type"); ++ return NULL; ++ } ++ ++ if (libiscsi_node_set_auth(context, &node->node, authinfo)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ Py_RETURN_NONE; ++} ++ ++static PyObject *PyIscsiNode_getAuth(PyObject *self) ++{ ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ PyIscsiChapAuthInfo *pyauthinfo; ++ struct libiscsi_auth_info authinfo; ++ ++ if (libiscsi_node_get_auth(context, &node->node, &authinfo)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ ++ switch (authinfo.method) { ++ case libiscsi_auth_chap: ++ pyauthinfo = PyObject_New(PyIscsiChapAuthInfo, ++ &PyIscsiChapAuthInfo_Type); ++ if (!pyauthinfo) ++ return NULL; ++ ++ pyauthinfo->info = authinfo; ++ ++ return (PyObject *)pyauthinfo; ++ ++ case libiscsi_auth_none: ++ default: ++ Py_RETURN_NONE; ++ } ++} ++ ++static PyObject *PyIscsiNode_setParameter(PyObject *self, PyObject *args, ++ PyObject *kwds) ++{ ++ char *kwlist[] = {"parameter", "value", NULL}; ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ const char *parameter, *value; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss", kwlist, ++ ¶meter, &value)) ++ return NULL; ++ if (check_string(parameter) || check_string(value)) ++ return NULL; ++ ++ if (libiscsi_node_set_parameter(context, &node->node, parameter, ++ value)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ Py_RETURN_NONE; ++} ++ ++static PyObject *PyIscsiNode_getParameter(PyObject *self, PyObject *args, ++ PyObject *kwds) ++{ ++ char *kwlist[] = {"parameter", NULL}; ++ PyIscsiNode *node = (PyIscsiNode *)self; ++ const char *parameter; ++ char value[LIBISCSI_VALUE_MAXLEN]; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, ¶meter)) ++ return NULL; ++ if (check_string(parameter)) ++ return NULL; ++ ++ if (libiscsi_node_get_parameter(context, &node->node, parameter, ++ value)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ return Py_BuildValue("s", value); ++} ++ ++static struct PyGetSetDef PyIscsiNode_getseters[] = { ++ {"name", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, ++ "name", "name"}, ++ {"tpgt", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, ++ "tpgt", "tpgt"}, ++ {"address", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, ++ "address", "address"}, ++ {"port", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, ++ "port", "port"}, ++ {"iface", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, ++ "iface", "iface"}, ++ {NULL} ++}; ++ ++static struct PyMethodDef PyIscsiNode_methods[] = { ++ {"login", (PyCFunction) PyIscsiNode_login, METH_NOARGS, ++ "Log in to the node"}, ++ {"logout", (PyCFunction) PyIscsiNode_logout, METH_NOARGS, ++ "Log out of the node"}, ++ {"setAuth", (PyCFunction) PyIscsiNode_setAuth, ++ METH_VARARGS|METH_KEYWORDS, ++ "Set authentication information"}, ++ {"getAuth", (PyCFunction) PyIscsiNode_getAuth, METH_NOARGS, ++ "Get authentication information"}, ++ {"setParameter", (PyCFunction) PyIscsiNode_setParameter, ++ METH_VARARGS|METH_KEYWORDS, ++ "Set an iscsi node parameter"}, ++ {"getParameter", (PyCFunction) PyIscsiNode_getParameter, ++ METH_VARARGS|METH_KEYWORDS, ++ "Get an iscsi node parameter"}, ++ {NULL} ++}; ++ ++PyTypeObject PyIscsiNode_Type = { ++ PyVarObject_HEAD_INIT(NULL, 0) ++ .tp_name = "libiscsi.node", ++ .tp_basicsize = sizeof (PyIscsiNode), ++ .tp_getset = PyIscsiNode_getseters, ++ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE ++#ifndef IS_PY3K ++ | Py_TPFLAGS_CHECKTYPES ++#endif ++ , ++ .tp_methods = PyIscsiNode_methods, ++ .tp_richcompare = (richcmpfunc)PyIscsiNode_richcompare, ++ .tp_init = PyIscsiNode_init, ++ .tp_str = PyIscsiNode_str, ++ .tp_new = PyType_GenericNew, ++ .tp_doc = "The iscsi node contains iscsi node information.", ++}; ++ ++/***************************************************************************/ ++ ++static PyObject *pylibiscsi_discover_sendtargets(PyObject *self, ++ PyObject *args, PyObject *kwds) ++{ ++ char *kwlist[] = {"address", "port", "authinfo", NULL}; ++ const char *address = NULL; ++ int i, nr_found, port = 3260; ++ PyObject *authinfo_arg = NULL; ++ const struct libiscsi_auth_info *authinfo = NULL; ++ struct libiscsi_node *found_nodes; ++ PyObject* found_node_list; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|iO", ++ kwlist, &address, &port, ++ &authinfo_arg)) ++ return NULL; ++ ++ if (authinfo_arg) { ++ if (PyObject_IsInstance(authinfo_arg, (PyObject *) ++ &PyIscsiChapAuthInfo_Type)) { ++ PyIscsiChapAuthInfo *pyauthinfo = ++ (PyIscsiChapAuthInfo *)authinfo_arg; ++ authinfo = &pyauthinfo->info; ++ } else if (authinfo_arg != Py_None) { ++ PyErr_SetString(PyExc_ValueError, ++ "invalid authinfo type"); ++ return NULL; ++ } ++ } ++ ++ if (libiscsi_discover_sendtargets(context, address, port, authinfo, ++ &nr_found, &found_nodes)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ ++ if (nr_found == 0) ++ Py_RETURN_NONE; ++ ++ found_node_list = PyList_New(nr_found); ++ if (!found_node_list) ++ return NULL; ++ ++ for(i = 0; i < nr_found; i++) { ++ PyIscsiNode *pynode; ++ ++ pynode = PyObject_New(PyIscsiNode, &PyIscsiNode_Type); ++ if (!pynode) { ++ /* This will deref already added nodes for us */ ++ Py_DECREF(found_node_list); ++ return NULL; ++ } ++ pynode->node = found_nodes[i]; ++ PyList_SET_ITEM(found_node_list, i, (PyObject *)pynode); ++ } ++ ++ return found_node_list; ++} ++ ++static PyObject *pylibiscsi_discover_firmware(PyObject *self) ++{ ++ int i, nr_found; ++ struct libiscsi_node *found_nodes; ++ PyObject* found_node_list; ++ ++ if (libiscsi_discover_firmware(context, &nr_found, &found_nodes)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ ++ if (nr_found == 0) ++ Py_RETURN_NONE; ++ ++ found_node_list = PyList_New(nr_found); ++ if (!found_node_list) ++ return NULL; ++ ++ for(i = 0; i < nr_found; i++) { ++ PyIscsiNode *pynode; ++ ++ pynode = PyObject_New(PyIscsiNode, &PyIscsiNode_Type); ++ if (!pynode) { ++ /* This will deref already added nodes for us */ ++ Py_DECREF(found_node_list); ++ return NULL; ++ } ++ pynode->node = found_nodes[i]; ++ PyList_SET_ITEM(found_node_list, i, (PyObject *)pynode); ++ } ++ ++ return found_node_list; ++} ++ ++static PyObject *pylibiscsi_get_firmware_initiator_name(PyObject *self) ++{ ++ char initiatorname[LIBISCSI_VALUE_MAXLEN]; ++ ++ if (libiscsi_get_firmware_initiator_name(initiatorname)) { ++ PyErr_SetString(PyExc_IOError, ++ libiscsi_get_error_string(context)); ++ return NULL; ++ } ++ ++ return PYSTR_FROMSTRING(initiatorname); ++} ++ ++static PyMethodDef pylibiscsi_functions[] = { ++ { "discover_sendtargets", ++ (PyCFunction)pylibiscsi_discover_sendtargets, ++ METH_VARARGS|METH_KEYWORDS, ++ "Do sendtargets discovery and return a list of found nodes)"}, ++ { "discover_firmware", ++ (PyCFunction)pylibiscsi_discover_firmware, METH_NOARGS, ++ "Do firmware discovery and return a list of found nodes)"}, ++ { "get_firmware_initiator_name", ++ (PyCFunction)pylibiscsi_get_firmware_initiator_name, ++ METH_NOARGS, ++ "Get initator name (iqn) from firmware"}, ++ {NULL, NULL} ++}; ++ ++#ifdef IS_PY3K ++static struct PyModuleDef libiscsi_def = { ++ PyModuleDef_HEAD_INIT, ++ "libiscsi", ++ NULL, ++ -1, ++ pylibiscsi_functions, ++ NULL, ++ NULL, ++ NULL, ++ NULL ++}; ++ ++PyMODINIT_FUNC PyInit_libiscsi(void) ++#else ++PyMODINIT_FUNC initlibiscsi(void) ++#endif ++{ ++ PyObject *m; ++ ++ if (!context) /* We may be called more then once */ ++ context = libiscsi_init(); ++ if (!context) ++ MODINITERROR; ++ ++ if (PyType_Ready(&PyIscsiChapAuthInfo_Type) < 0) ++ MODINITERROR; ++ ++ if (PyType_Ready(&PyIscsiNode_Type) < 0) ++ MODINITERROR; ++ ++#ifdef IS_PY3K ++ m = PyModule_Create(&libiscsi_def); ++#else ++ m = Py_InitModule("libiscsi", pylibiscsi_functions); ++#endif ++ Py_INCREF(&PyIscsiChapAuthInfo_Type); ++ PyModule_AddObject(m, "chapAuthInfo", (PyObject *) &PyIscsiChapAuthInfo_Type); ++ Py_INCREF(&PyIscsiNode_Type); ++ PyModule_AddObject(m, "node", (PyObject *) &PyIscsiNode_Type); ++#ifdef IS_PY3K ++ return m; ++#endif ++} +diff --git a/libiscsi/setup.py b/libiscsi/setup.py +new file mode 100644 +index 0000000..caa4e66 +--- /dev/null ++++ b/libiscsi/setup.py +@@ -0,0 +1,9 @@ ++from distutils.core import setup, Extension ++ ++module1 = Extension('libiscsi', ++ sources = ['pylibiscsi.c'], ++ libraries = ['iscsi'], ++ library_dirs = ['.']) ++ ++setup (name = 'PyIscsi',version = '1.0', ++ description = 'libiscsi python bindings', ext_modules = [module1]) +diff --git a/libiscsi/tests/test_discovery_firmware.c b/libiscsi/tests/test_discovery_firmware.c +new file mode 100644 +index 0000000..76e852a +--- /dev/null ++++ b/libiscsi/tests/test_discovery_firmware.c +@@ -0,0 +1,53 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node *found_nodes; ++ struct libiscsi_context *context; ++ int i, found, rc = 0; ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ rc = libiscsi_discover_firmware(context, &found, &found_nodes); ++ if (rc) ++ fprintf(stderr, "Error discovering: %s\n", ++ libiscsi_get_error_string(context)); ++ ++ for (i = 0; i < found; i++) { ++ fprintf(stdout, "Found node: %s, tpgt: %d, portal: %s:%d\n", ++ found_nodes[i].name, found_nodes[i].tpgt, ++ found_nodes[i].address, found_nodes[i].port); ++ } ++ ++ libiscsi_cleanup(context); ++ free (found_nodes); ++ ++ return rc; ++} +diff --git a/libiscsi/tests/test_discovery_sendtargets.c b/libiscsi/tests/test_discovery_sendtargets.c +new file mode 100644 +index 0000000..1a3c12e +--- /dev/null ++++ b/libiscsi/tests/test_discovery_sendtargets.c +@@ -0,0 +1,60 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node *found_nodes; ++ struct libiscsi_context *context; ++ struct libiscsi_auth_info auth_info; ++ int i, found, rc = 0; ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ memset(&auth_info, 0, sizeof(auth_info)); ++ auth_info.method = libiscsi_auth_chap; ++ strcpy(auth_info.chap.username, "joe"); ++ strcpy(auth_info.chap.password, "secret"); ++ ++ rc = libiscsi_discover_sendtargets(context, "127.0.0.1", 3260, ++ &auth_info, &found, &found_nodes); ++ if (rc) ++ fprintf(stderr, "Error discovering: %s\n", ++ libiscsi_get_error_string(context)); ++ ++ for (i = 0; i < found; i++) { ++ fprintf(stdout, "Found node: %s, tpgt: %d, portal: %s:%d\n", ++ found_nodes[i].name, found_nodes[i].tpgt, ++ found_nodes[i].address, found_nodes[i].port); ++ } ++ ++ libiscsi_cleanup(context); ++ free (found_nodes); ++ ++ return rc; ++} +diff --git a/libiscsi/tests/test_get_auth.c b/libiscsi/tests/test_get_auth.c +new file mode 100644 +index 0000000..5e234da +--- /dev/null ++++ b/libiscsi/tests/test_get_auth.c +@@ -0,0 +1,70 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node node; ++ struct libiscsi_context *context; ++ struct libiscsi_auth_info auth_info; ++ int rc = 0; ++ ++ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", ++ "iqn.2009-01.com.example:testdisk"); ++ node.tpgt = 1; ++ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); ++ node.port = 3260; ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ rc = libiscsi_node_get_auth(context, &node, &auth_info); ++ if (rc) { ++ fprintf(stderr, "Error setting authinfo: %s\n", ++ libiscsi_get_error_string(context)); ++ goto leave; ++ } ++ ++ switch (auth_info.method) { ++ case libiscsi_auth_none: ++ printf("Method: \"None\"\n"); ++ break; ++ case libiscsi_auth_chap: ++ printf("Method: \"CHAP\"\n"); ++ printf("User: \"%s\"\n", auth_info.chap.username); ++ printf("Pass: \"%s\"\n", auth_info.chap.password); ++ printf("RevUser: \"%s\"\n", ++ auth_info.chap.reverse_username); ++ printf("RevPass: \"%s\"\n", ++ auth_info.chap.reverse_password); ++ break; ++ } ++leave: ++ libiscsi_cleanup(context); ++ ++ return rc; ++} +diff --git a/libiscsi/tests/test_get_initiator_name.c b/libiscsi/tests/test_get_initiator_name.c +new file mode 100644 +index 0000000..997c053 +--- /dev/null ++++ b/libiscsi/tests/test_get_initiator_name.c +@@ -0,0 +1,38 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ char initiatorname[LIBISCSI_VALUE_MAXLEN]; ++ ++ if (libiscsi_get_firmware_initiator_name(initiatorname)) { ++ fprintf(stderr, "No iscsi boot firmware found\n"); ++ return 1; ++ } ++ ++ printf("iqn:\t%s\n", initiatorname); ++ ++ return 0; ++} +diff --git a/libiscsi/tests/test_get_network_config.c b/libiscsi/tests/test_get_network_config.c +new file mode 100644 +index 0000000..2dedd61 +--- /dev/null ++++ b/libiscsi/tests/test_get_network_config.c +@@ -0,0 +1,45 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_network_config config; ++ ++ if (libiscsi_get_firmware_network_config(&config)) { ++ fprintf(stderr, "No iscsi boot firmware found\n"); ++ return 1; ++ } ++ ++ printf("dhcp:\t%d\n", config.dhcp); ++ printf("iface:\t%s\n", config.iface_name); ++ printf("mac:\t%s\n", config.mac_address); ++ printf("ipaddr:\t%s\n", config.ip_address); ++ printf("mask:\t%s\n", config.netmask); ++ printf("gate:\t%s\n", config.gateway); ++ printf("dns1:\t%s\n", config.primary_dns); ++ printf("dns2:\t%s\n", config.secondary_dns); ++ ++ return 0; ++} +diff --git a/libiscsi/tests/test_login.c b/libiscsi/tests/test_login.c +new file mode 100644 +index 0000000..3eb70d6 +--- /dev/null ++++ b/libiscsi/tests/test_login.c +@@ -0,0 +1,52 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node node; ++ struct libiscsi_context *context; ++ int rc = 0; ++ ++ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", ++ "iqn.2009-01.com.example:testdisk"); ++ node.tpgt = 1; ++ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); ++ node.port = 3260; ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ rc = libiscsi_node_login(context, &node); ++ if (rc) ++ fprintf(stderr, "Error logging in: %s\n", ++ libiscsi_get_error_string(context)); ++ ++ libiscsi_cleanup(context); ++ ++ return rc; ++} +diff --git a/libiscsi/tests/test_logout.c b/libiscsi/tests/test_logout.c +new file mode 100644 +index 0000000..b734dca +--- /dev/null ++++ b/libiscsi/tests/test_logout.c +@@ -0,0 +1,51 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node node; ++ struct libiscsi_context *context; ++ int rc = 0; ++ ++ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", ++ "iqn.2009-01.com.example:testdisk"); ++ node.tpgt = 1; ++ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); ++ node.port = 3260; ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ rc = libiscsi_node_logout(context, &node); ++ if (rc) ++ fprintf(stderr, "Error logging out: %s\n", ++ libiscsi_get_error_string(context)); ++ ++ libiscsi_cleanup(context); ++ ++ return rc; ++} +diff --git a/libiscsi/tests/test_params.c b/libiscsi/tests/test_params.c +new file mode 100644 +index 0000000..d3223be +--- /dev/null ++++ b/libiscsi/tests/test_params.c +@@ -0,0 +1,103 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node node; ++ struct libiscsi_context *context; ++ char orig_value[LIBISCSI_VALUE_MAXLEN], value[LIBISCSI_VALUE_MAXLEN]; ++ int rc = 0; ++ ++ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", ++ "iqn.2009-01.com.example:testdisk"); ++ node.tpgt = 1; ++ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); ++ node.port = 3260; ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ rc = libiscsi_node_get_parameter(context, &node, "node.startup", ++ orig_value); ++ if (rc) { ++ fprintf(stderr, "Error getting original value: %s\n", ++ libiscsi_get_error_string(context)); ++ goto leave; ++ } ++ ++ rc = libiscsi_node_set_parameter(context, &node, "node.startup", ++ "automatic"); ++ if (rc) { ++ fprintf(stderr, "Error setting node startup param: %s\n", ++ libiscsi_get_error_string(context)); ++ goto leave; ++ } ++ ++ rc = libiscsi_node_get_parameter(context, &node, "node.startup", ++ value); ++ if (rc) { ++ fprintf(stderr, "Error getting node startup param: %s\n", ++ libiscsi_get_error_string(context)); ++ goto leave; ++ } ++ ++ if (strcmp(value, "automatic")) { ++ fprintf(stderr, "Error set and get values do not match!\n"); ++ rc = EIO; ++ goto leave; ++ } ++ ++ rc = libiscsi_node_set_parameter(context, &node, "node.startup", ++ orig_value); ++ if (rc) { ++ fprintf(stderr, "Error setting original value: %s\n", ++ libiscsi_get_error_string(context)); ++ goto leave; ++ } ++ ++ rc = libiscsi_node_get_parameter(context, &node, "node.startup", ++ value); ++ if (rc) { ++ fprintf(stderr, "Error re-getting original value: %s\n", ++ libiscsi_get_error_string(context)); ++ goto leave; ++ } ++ ++ if (strcmp(value, orig_value)) { ++ fprintf(stderr, ++ "Error set and get original values do not match!\n"); ++ rc = EIO; ++ goto leave; ++ } ++ ++leave: ++ libiscsi_cleanup(context); ++ ++ return rc; ++} +diff --git a/libiscsi/tests/test_set_auth.c b/libiscsi/tests/test_set_auth.c +new file mode 100644 +index 0000000..a21f888 +--- /dev/null ++++ b/libiscsi/tests/test_set_auth.c +@@ -0,0 +1,58 @@ ++/* ++ * iSCSI Administration library ++ * ++ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. ++ * Copyright (C) 2008-2009 Hans de Goede ++ * maintained by open-iscsi@googlegroups.com ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++#include ++#include ++#include ++#include "libiscsi.h" ++ ++int main(void) ++{ ++ struct libiscsi_node node; ++ struct libiscsi_context *context; ++ struct libiscsi_auth_info auth_info; ++ int rc = 0; ++ ++ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", ++ "iqn.2009-01.com.example:testdisk"); ++ node.tpgt = 1; ++ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); ++ node.port = 3260; ++ ++ memset(&auth_info, 0, sizeof(auth_info)); ++ auth_info.method = libiscsi_auth_chap; ++ strcpy(auth_info.chap.username, "joe"); ++ strcpy(auth_info.chap.password, "secret"); ++ ++ context = libiscsi_init(); ++ if (!context) { ++ fprintf(stderr, "Error initializing libiscsi\n"); ++ return 1; ++ } ++ ++ rc = libiscsi_node_set_auth(context, &node, &auth_info); ++ if (rc) ++ fprintf(stderr, "Error setting authinfo: %s\n", ++ libiscsi_get_error_string(context)); ++ ++ libiscsi_cleanup(context); ++ ++ return rc; ++} +diff --git a/usr/Makefile b/usr/Makefile +index e23fee1..12780e4 100644 +--- a/usr/Makefile ++++ b/usr/Makefile +@@ -31,7 +31,7 @@ endif + CFLAGS ?= -O2 -g + WARNFLAGS ?= -Wall -Wstrict-prototypes + CFLAGS += $(WARNFLAGS) -I../include -I. -I../utils/open-isns \ +- -D$(OSNAME) $(IPC_CFLAGS) ++ -D$(OSNAME) $(IPC_CFLAGS) -DISNS_ENABLE + PROGRAMS = iscsid iscsiadm iscsistart + + # libc compat files +diff --git a/usr/discovery.c b/usr/discovery.c +index 38968ca..ab89c69 100644 +--- a/usr/discovery.c ++++ b/usr/discovery.c +@@ -36,6 +36,7 @@ + #include "types.h" + #include "iscsi_proto.h" + #include "initiator.h" ++#include "config.h" + #include "log.h" + #include "idbm.h" + #include "iscsi_settings.h" +@@ -50,9 +51,11 @@ + #include "iscsi_timer.h" + #include "iscsi_err.h" + /* libisns includes */ ++#ifdef ISNS_ENABLE + #include "isns.h" + #include "paths.h" + #include "message.h" ++#endif + + #ifdef SLP_ENABLE + #include "iscsi-slp-discovery.h" +@@ -98,6 +101,7 @@ static int request_initiator_name(void) + return 0; + } + ++#ifdef ISNS_ENABLE + void discovery_isns_free_servername(void) + { + if (isns_config.ic_server_name) +@@ -377,6 +381,7 @@ retry: + discovery_isns_free_servername(); + return rc; + } ++#endif + + int discovery_fw(void *data, struct iface_rec *iface, + struct list_head *rec_list) +diff --git a/usr/idbm.c b/usr/idbm.c +index a57a445..00151b5 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -1709,9 +1709,9 @@ int idbm_print_all_discovery(int info_level) + * fn should return -1 if it skipped the rec, a ISCSI_ERR error code if + * the operation failed or 0 if fn was run successfully. + */ +-static int idbm_for_each_iface(int *found, void *data, +- idbm_iface_op_fn *fn, +- char *targetname, int tpgt, char *ip, int port) ++int idbm_for_each_iface(int *found, void *data, ++ idbm_iface_op_fn *fn, ++ char *targetname, int tpgt, char *ip, int port) + { + DIR *iface_dirfd; + struct dirent *iface_dent; +diff --git a/usr/idbm.h b/usr/idbm.h +index b89ddff..3631262 100644 +--- a/usr/idbm.h ++++ b/usr/idbm.h +@@ -102,6 +102,9 @@ struct rec_op_data { + node_rec_t *match_rec; + idbm_iface_op_fn *fn; + }; ++extern int idbm_for_each_iface(int *found, void *data, ++ idbm_iface_op_fn *fn, ++ char *targetname, int tpgt, char *ip, int port); + extern int idbm_for_each_portal(int *found, void *data, + idbm_portal_op_fn *fn, char *targetname); + extern int idbm_for_each_node(int *found, void *data, +diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h +index 5087b5c..a6dc40a 100644 +--- a/usr/iscsi_ipc.h ++++ b/usr/iscsi_ipc.h +@@ -166,4 +166,6 @@ struct iscsi_ipc { + char *host_stats); + }; + ++struct iscsi_ipc *ipc; ++ + #endif /* ISCSI_IPC_H */ +-- +2.1.0 + diff --git a/0011-ISCSID-Added-socket-communication-hooks-for-uip.patch b/0011-ISCSID-Added-socket-communication-hooks-for-uip.patch deleted file mode 100644 index 2c4f5be..0000000 --- a/0011-ISCSID-Added-socket-communication-hooks-for-uip.patch +++ /dev/null @@ -1,597 +0,0 @@ -From 2ff28eacd7c98d438a1864a09a124991ff2e1189 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Tue, 28 May 2013 02:18:08 -0500 -Subject: ISCSID: Added socket communication hooks for uip - -From Eddie Wai: - -This patch adds the communication path between iscsid->iscsiuio. - -It utilizes the set_net_config func ptr in the iscsi_transport_template -to initiate the callbacks. - -Two new files are introduced: uip_mgmt_ipc.h and uip_mgmt_ipc.c - -Signed-off-by: Eddie Wai ---- - include/iscsi_err.h | 2 + - usr/Makefile | 3 +- - usr/initiator.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++- - usr/initiator.h | 4 ++ - usr/initiator_common.c | 34 +++++++++++++++ - usr/iscsid_req.c | 91 +++++++++++++++++++++++++++++++++++++++- - usr/iscsid_req.h | 2 + - usr/transport.c | 2 + - usr/transport.h | 3 ++ - usr/uip_mgmt_ipc.c | 41 ++++++++++++++++++ - usr/uip_mgmt_ipc.h | 73 ++++++++++++++++++++++++++++++++ - 11 files changed, 363 insertions(+), 4 deletions(-) - create mode 100644 usr/uip_mgmt_ipc.c - create mode 100644 usr/uip_mgmt_ipc.h - -diff --git a/include/iscsi_err.h b/include/iscsi_err.h -index aabea4e..1139133 100644 ---- a/include/iscsi_err.h -+++ b/include/iscsi_err.h -@@ -62,6 +62,8 @@ enum { - ISCSI_ERR_OP_NOT_SUPP = 27, - /* device or resource in use */ - ISCSI_ERR_BUSY = 28, -+ /* Operation failed, but retrying layer may succeed */ -+ ISCSI_ERR_AGAIN = 29, - - /* Always last. Indicates end of error code space */ - ISCSI_MAX_ERR_VAL, -diff --git a/usr/Makefile b/usr/Makefile -index 673b7f1..33b517c 100644 ---- a/usr/Makefile -+++ b/usr/Makefile -@@ -40,7 +40,8 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o) - ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \ - sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \ - iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \ -- initiator_common.o iscsi_err.o $(IPC_OBJ) $(SYSDEPS_SRCS) -+ initiator_common.o iscsi_err.o uip_mgmt_ipc.o \ -+ $(IPC_OBJ) $(SYSDEPS_SRCS) - # core initiator files - INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o - -diff --git a/usr/initiator.c b/usr/initiator.c -index d475358..86df222 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -45,6 +45,7 @@ - #include "iscsi_sysfs.h" - #include "iscsi_settings.h" - #include "iface.h" -+#include "host.h" - #include "sysdeps.h" - #include "iscsi_err.h" - #include "kern_err_table.h" -@@ -557,6 +558,48 @@ static int iscsi_conn_connect(struct iscsi_conn *conn, queue_task_t *qtask) - return 0; - } - -+static void iscsi_uio_poll_login_timedout(void *data) -+{ -+ struct queue_task *qtask = data; -+ struct iscsi_conn *conn = qtask->conn; -+ iscsi_session_t *session = conn->session; -+ -+ log_debug(3, "timeout waiting for UIO ...\n"); -+ mgmt_ipc_write_rsp(qtask, ISCSI_ERR_TRANS_TIMEOUT); -+ conn_delete_timers(conn); -+ __session_destroy(session); -+} -+ -+static int iscsi_sched_uio_poll(queue_task_t *qtask) -+{ -+ struct iscsi_conn *conn = qtask->conn; -+ struct iscsi_session *session = conn->session; -+ struct iscsi_transport *t = session->t; -+ struct iscsi_ev_context *ev_context; -+ -+ if (!t->template->set_net_config) -+ return 0; -+ -+ ev_context = iscsi_ev_context_get(conn, 0); -+ if (!ev_context) { -+ /* while reopening the recv pool should be full */ -+ log_error("BUG: __session_conn_reopen could " -+ "not get conn context for recv."); -+ return -ENOMEM; -+ } -+ -+ ev_context->data = qtask; -+ conn->state = ISCSI_CONN_STATE_XPT_WAIT; -+ -+ iscsi_sched_ev_context(ev_context, conn, 0, EV_UIO_POLL); -+ -+ log_debug(3, "Setting login UIO poll timer %p timeout %d", -+ &conn->login_timer, conn->login_timeout); -+ actor_timer(&conn->login_timer, conn->login_timeout * 1000, -+ iscsi_uio_poll_login_timedout, qtask); -+ return -EAGAIN; -+} -+ - static void - __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop, - int redirected) -@@ -598,6 +641,11 @@ __session_conn_reopen(iscsi_conn_t *conn, queue_task_t *qtask, int do_stop, - if (!redirected) - session->reopen_cnt++; - -+ /* uIP will needs to be re-triggered on the connection re-open */ -+ if (iscsi_set_net_config(conn->session->t, conn->session, -+ &conn->session->nrec.iface) != 0) -+ goto queue_reopen; -+ - if (iscsi_conn_connect(conn, qtask)) { - delay = ISCSI_CONN_ERR_REOPEN_DELAY; - goto queue_reopen; -@@ -1670,6 +1718,53 @@ failed_login: - - } - -+static void session_conn_uio_poll(void *data) -+{ -+ struct iscsi_ev_context *ev_context = data; -+ iscsi_conn_t *conn = ev_context->conn; -+ struct iscsi_session *session = conn->session; -+ queue_task_t *qtask = ev_context->data; -+ int rc; -+ -+ log_debug(4, "retrying uio poll"); -+ rc = iscsi_set_net_config(session->t, session, -+ &conn->session->nrec.iface); -+ if (rc != 0) { -+ if (rc == ISCSI_ERR_AGAIN) { -+ ev_context->data = qtask; -+ iscsi_sched_ev_context(ev_context, conn, 2, -+ EV_UIO_POLL); -+ return; -+ } else { -+ log_error("session_conn_uio_poll() " -+ "connection failure [0x%x]", rc); -+ actor_delete(&conn->login_timer); -+ iscsi_login_eh(conn, qtask, ISCSI_ERR_INTERNAL); -+ iscsi_ev_context_put(ev_context); -+ return; -+ } -+ } -+ -+ iscsi_ev_context_put(ev_context); -+ actor_delete(&conn->login_timer); -+ log_debug(4, "UIO ready trying connect"); -+ -+ /* uIP is ready try to connect */ -+ if (gettimeofday(&conn->initial_connect_time, NULL)) -+ log_error("Could not get initial connect time. If " -+ "login errors iscsid may give up the initial " -+ "login early. You should manually login."); -+ -+ conn->state = ISCSI_CONN_STATE_XPT_WAIT; -+ if (iscsi_conn_connect(conn, qtask)) { -+ int delay = ISCSI_CONN_ERR_REOPEN_DELAY; -+ -+ log_debug(4, "Waiting %u seconds before trying to reconnect.\n", -+ delay); -+ queue_delayed_reopen(qtask, delay); -+ } -+} -+ - static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, - struct iscsi_conn *conn, unsigned long tmo, - int event) -@@ -1711,6 +1806,11 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, - ev_context); - actor_schedule(&ev_context->actor); - break; -+ case EV_UIO_POLL: -+ actor_new(&ev_context->actor, session_conn_uio_poll, -+ ev_context); -+ actor_schedule(&ev_context->actor); -+ break; - case EV_CONN_LOGOUT_TIMER: - actor_timer(&ev_context->actor, tmo * 1000, - iscsi_logout_timedout, ev_context); -@@ -1844,7 +1944,17 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) - conn = &session->conn[0]; - qtask->conn = conn; - -- if (iscsi_host_set_net_params(&rec->iface, session)) { -+ rc = iscsi_host_set_net_params(&rec->iface, session); -+ if (rc == ISCSI_ERR_AGAIN) { -+ iscsi_sched_uio_poll(qtask); -+ /* -+ * Cannot block iscsid, so caller is going to internally -+ * retry the operation. -+ */ -+ qtask->rsp.command = MGMT_IPC_SESSION_LOGIN; -+ qtask->rsp.err = ISCSI_SUCCESS; -+ return ISCSI_SUCCESS; -+ } else if (rc) { - __session_destroy(session); - return ISCSI_ERR_LOGIN; - } -diff --git a/usr/initiator.h b/usr/initiator.h -index b45caab..d6dc02e 100644 ---- a/usr/initiator.h -+++ b/usr/initiator.h -@@ -83,6 +83,7 @@ typedef enum iscsi_event_e { - EV_CONN_LOGOUT_TIMER, - EV_CONN_STOP, - EV_CONN_LOGIN, -+ EV_UIO_POLL, - } iscsi_event_e; - - struct queue_task; -@@ -353,5 +354,8 @@ extern void iscsi_copy_operational_params(struct iscsi_conn *conn, - extern int iscsi_setup_authentication(struct iscsi_session *session, - struct iscsi_auth_config *auth_cfg); - extern int iscsi_setup_portal(struct iscsi_conn *conn, char *address, int port); -+extern int iscsi_set_net_config(struct iscsi_transport *t, -+ iscsi_session_t *session, -+ struct iface_rec *iface); - - #endif /* INITIATOR_H */ -diff --git a/usr/initiator_common.c b/usr/initiator_common.c -index ef6820c..eb72795 100644 ---- a/usr/initiator_common.c -+++ b/usr/initiator_common.c -@@ -562,6 +562,36 @@ TODO handle this - return 0; - } - -+int iscsi_set_net_config(struct iscsi_transport *t, iscsi_session_t *session, -+ struct iface_rec *iface) -+{ -+ if (t->template->set_net_config) { -+ /* uip needs the netdev name */ -+ struct host_info hinfo; -+ int hostno, rc; -+ -+ /* this assumes that the netdev or hw address is going to be -+ set */ -+ hostno = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc); -+ if (rc) { -+ log_debug(4, "Couldn't get host no.\n"); -+ return rc; -+ } -+ -+ /* uip needs the netdev name */ -+ if (!strlen(iface->netdev)) { -+ memset(&hinfo, 0, sizeof(hinfo)); -+ hinfo.host_no = hostno; -+ iscsi_sysfs_get_hostinfo_by_host_no(&hinfo); -+ strcpy(iface->netdev, hinfo.iface.netdev); -+ } -+ -+ return t->template->set_net_config(t, iface, session); -+ } -+ -+ return 0; -+} -+ - int iscsi_host_set_net_params(struct iface_rec *iface, - struct iscsi_session *session) - { -@@ -600,6 +630,10 @@ int iscsi_host_set_net_params(struct iface_rec *iface, - log_warning("Could not brining up netdev %s. Try running " - "'ifup %s' first if login fails.", netdev, netdev); - -+ rc = iscsi_set_net_config(t, session, iface); -+ if (rc != 0) -+ return rc; -+ - rc = host_set_param(t, session->hostno, - ISCSI_HOST_PARAM_IPADDRESS, - iface->ipaddress, ISCSI_STRING); -diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c -index 1c4678d..15f6353 100644 ---- a/usr/iscsid_req.c -+++ b/usr/iscsid_req.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -32,6 +33,7 @@ - #include "iscsi_util.h" - #include "config.h" - #include "iscsi_err.h" -+#include "uip_mgmt_ipc.h" - - static void iscsid_startup(void) - { -@@ -54,7 +56,7 @@ static void iscsid_startup(void) - - #define MAXSLEEP 128 - --static int iscsid_connect(int *fd, int start_iscsid) -+static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid) - { - int nsec, addr_len; - struct sockaddr_un addr; -@@ -69,7 +71,8 @@ static int iscsid_connect(int *fd, int start_iscsid) - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; -- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len); -+ memcpy((char *) &addr.sun_path + 1, unix_sock_name, -+ strlen(unix_sock_name)); - - /* - * Trying to connect with exponential backoff -@@ -98,6 +101,11 @@ static int iscsid_connect(int *fd, int start_iscsid) - return ISCSI_ERR_ISCSID_NOTCONN; - } - -+static int iscsid_connect(int *fd, int start_iscsid) -+{ -+ return ipc_connect(fd, ISCSIADM_NAMESPACE, start_iscsid); -+} -+ - int iscsid_request(int *fd, iscsiadm_req_t *req, int start_iscsid) - { - int err; -@@ -194,3 +202,82 @@ int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid) - return err; - return iscsid_req_wait(cmd, fd); - } -+ -+static int uip_connect(int *fd) -+{ -+ return ipc_connect(fd, ISCSID_UIP_NAMESPACE, 0); -+} -+ -+int uip_broadcast(void *buf, size_t buf_len) -+{ -+ int err; -+ int fd; -+ iscsid_uip_rsp_t rsp; -+ int flags; -+ int count; -+ -+ err = uip_connect(&fd); -+ if (err) { -+ log_warning("uIP daemon is not up"); -+ return err; -+ } -+ -+ log_debug(3, "connected to uIP daemon"); -+ -+ /* Send the data to uIP */ -+ err = write(fd, buf, buf_len); -+ if (err != buf_len) { -+ log_error("got write error (%d/%d), daemon died?", -+ err, errno); -+ close(fd); -+ return ISCSI_ERR_ISCSID_COMM_ERR; -+ } -+ -+ log_debug(3, "send iface config to uIP daemon"); -+ -+ /* Set the socket to a non-blocking read, this way if there are -+ * problems waiting for uIP, iscsid can bailout early */ -+ flags = fcntl(fd, F_GETFL, 0); -+ if (flags == -1) -+ flags = 0; -+ err = fcntl(fd, F_SETFL, flags | O_NONBLOCK); -+ if (err) { -+ log_error("could not set uip broadcast to non-blocking: %d", -+ errno); -+ close(fd); -+ return ISCSI_ERR; -+ } -+ -+#define MAX_UIP_BROADCAST_READ_TRIES 3 -+ for (count = 0; count < MAX_UIP_BROADCAST_READ_TRIES; count++) { -+ /* Wait for the response */ -+ err = read(fd, &rsp, sizeof(rsp)); -+ if (err == sizeof(rsp)) { -+ log_debug(3, "Broadcasted to uIP with length: %ld " -+ "cmd: 0x%x rsp: 0x%x\n", buf_len, -+ rsp.command, rsp.err); -+ err = 0; -+ break; -+ } else if ((err == -1) && (errno == EAGAIN)) { -+ usleep(250000); -+ continue; -+ } else { -+ log_error("Could not read response (%d/%d), daemon " -+ "died?", err, errno); -+ err = ISCSI_ERR; -+ break; -+ } -+ } -+ -+ if (count == MAX_UIP_BROADCAST_READ_TRIES) { -+ log_error("Could not broadcast to uIP after %d tries", -+ count); -+ err = ISCSI_ERR_AGAIN; -+ } else if (rsp.err != ISCSID_UIP_MGMT_IPC_DEVICE_UP) { -+ log_debug(3, "Device is not ready\n"); -+ err = ISCSI_ERR_AGAIN; -+ } -+ -+ close(fd); -+ return err; -+} -diff --git a/usr/iscsid_req.h b/usr/iscsid_req.h -index 68f5256..4fff43d 100644 ---- a/usr/iscsid_req.h -+++ b/usr/iscsid_req.h -@@ -33,4 +33,6 @@ extern int iscsid_req_by_rec(int cmd, struct node_rec *rec); - extern int iscsid_req_by_sid_async(int cmd, int sid, int *fd); - extern int iscsid_req_by_sid(int cmd, int sid); - -+extern int uip_broadcast(void *buf, size_t buf_len); -+ - #endif -diff --git a/usr/transport.c b/usr/transport.c -index e6e3dfc..10212af 100644 ---- a/usr/transport.c -+++ b/usr/transport.c -@@ -35,6 +35,7 @@ - #include "log.h" - #include "iscsi_util.h" - #include "iscsi_sysfs.h" -+#include "uip_mgmt_ipc.h" - #include "cxgbi.h" - #include "be2iscsi.h" - #include "iser.h" -@@ -79,6 +80,7 @@ struct iscsi_transport_template bnx2i = { - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -+ .set_net_config = uip_broadcast_params, - }; - - struct iscsi_transport_template be2iscsi = { -diff --git a/usr/transport.h b/usr/transport.h -index 672561b..5dcf872 100644 ---- a/usr/transport.h -+++ b/usr/transport.h -@@ -35,6 +35,9 @@ struct iscsi_transport_template { - int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms); - void (*ep_disconnect) (struct iscsi_conn *conn); - void (*create_conn) (struct iscsi_conn *conn); -+ int (*set_net_config) (struct iscsi_transport *t, -+ struct iface_rec *iface, -+ struct iscsi_session *session); - }; - - /* represents data path provider */ -diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c -new file mode 100644 -index 0000000..f3074ee ---- /dev/null -+++ b/usr/uip_mgmt_ipc.c -@@ -0,0 +1,41 @@ -+/* -+ * uIP iSCSI Daemon/Admin Management IPC -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+ -+#include "log.h" -+#include "uip_mgmt_ipc.h" -+#include "iscsid_req.h" -+ -+int uip_broadcast_params(struct iscsi_transport *t, -+ struct iface_rec *iface, -+ struct iscsi_session *session) -+{ -+ struct iscsid_uip_broadcast broadcast; -+ -+ log_debug(3, "broadcasting to uip\n"); -+ -+ memset(&broadcast, 0, sizeof(broadcast)); -+ -+ broadcast.header.command = ISCSID_UIP_IPC_GET_IFACE; -+ broadcast.header.payload_len = sizeof(*iface); -+ -+ memcpy(&broadcast.u.iface_rec, iface, sizeof(*iface)); -+ -+ return uip_broadcast(&broadcast, -+ sizeof(iscsid_uip_broadcast_header_t) + -+ sizeof(*iface)); -+} -diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h -new file mode 100644 -index 0000000..29a4769 ---- /dev/null -+++ b/usr/uip_mgmt_ipc.h -@@ -0,0 +1,73 @@ -+/* -+ * uIP iSCSI Daemon/Admin Management IPC -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+#ifndef UIP_MGMT_IPC_H -+#define UIP_MGMT_IPC_H -+ -+#include "types.h" -+#include "iscsi_if.h" -+#include "config.h" -+#include "mgmt_ipc.h" -+ -+#include "initiator.h" -+#include "transport.h" -+ -+#define ISCSID_UIP_NAMESPACE "ISCSID_UIP_ABSTRACT_NAMESPACE" -+ -+typedef enum iscsid_uip_cmd { -+ ISCSID_UIP_IPC_UNKNOWN = 0, -+ ISCSID_UIP_IPC_GET_IFACE = 1, -+ -+ __ISCSID_UIP_IPC_MAX_COMMAND -+} iscsid_uip_cmd_e; -+ -+typedef struct iscsid_uip_broadcast_header { -+ iscsid_uip_cmd_e command; -+ uint32_t payload_len; -+} iscsid_uip_broadcast_header_t; -+ -+/* IPC Request */ -+typedef struct iscsid_uip_broadcast { -+ struct iscsid_uip_broadcast_header header; -+ -+ union { -+ /* messages */ -+ struct ipc_broadcast_iface_rec { -+ struct iface_rec rec; -+ } iface_rec; -+ } u; -+} iscsid_uip_broadcast_t; -+ -+typedef enum iscsid_uip_mgmt_ipc_err { -+ ISCSID_UIP_MGMT_IPC_OK = 0, -+ ISCSID_UIP_MGMT_IPC_ERR = 1, -+ ISCSID_UIP_MGMT_IPC_ERR_NOT_FOUND = 2, -+ ISCSID_UIP_MGMT_IPC_ERR_NOMEM = 3, -+ ISCSID_UIP_MGMT_IPC_DEVICE_UP = 4, -+ ISCSID_UIP_MGMT_IPC_DEVICE_INITIALIZING = 5, -+} iscsid_uip_mgmt_ipc_err_e; -+ -+/* IPC Response */ -+typedef struct iscsid_uip_mgmt_rsp { -+ iscsid_uip_cmd_e command; -+ iscsid_uip_mgmt_ipc_err_e err; -+} iscsid_uip_rsp_t; -+ -+extern int uip_broadcast_params(struct iscsi_transport *t, -+ struct iface_rec *iface, -+ struct iscsi_session *session); -+ -+ -+#endif /* UIP_MGMT_IPC_H */ --- -1.8.1.4 - diff --git a/0011-remove-the-offload-boot-supported-ifdef.patch b/0011-remove-the-offload-boot-supported-ifdef.patch new file mode 100644 index 0000000..cb358c7 --- /dev/null +++ b/0011-remove-the-offload-boot-supported-ifdef.patch @@ -0,0 +1,45 @@ +From 8c5e8c8afba875944daa61fadc3add41475fab61 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 19 Nov 2012 17:09:24 -0800 +Subject: [PATCH] remove the offload boot supported ifdef + +--- + usr/iface.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/usr/iface.c b/usr/iface.c +index 0a7f0bb..753ed37 100644 +--- a/usr/iface.c ++++ b/usr/iface.c +@@ -996,6 +996,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + { + struct iscsi_transport *t = NULL; + uint32_t hostno; ++ int rc; + + if (strlen(context->initiatorname)) + strlcpy(iface->iname, context->initiatorname, +@@ -1009,10 +1010,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + return 0; + } + } else if (strlen(context->iface)) { +-/* this ifdef is only temp until distros and firmwares are updated */ +-#ifdef OFFLOAD_BOOT_SUPPORTED + char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; +- int rc; + + memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN); + /* make sure offload driver is loaded */ +@@ -1038,9 +1036,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface, + } + + strlcpy(iface->netdev, context->iface, sizeof(iface->netdev)); +-#else +- return 0; +-#endif + } else + return 0; + +-- +2.1.0 + diff --git a/0012-ISCSID-Modified-the-Makefile-for-iscsiuio-compilatio.patch b/0012-ISCSID-Modified-the-Makefile-for-iscsiuio-compilatio.patch deleted file mode 100644 index 681d4bb..0000000 --- a/0012-ISCSID-Modified-the-Makefile-for-iscsiuio-compilatio.patch +++ /dev/null @@ -1,70 +0,0 @@ -From c9ff6b4ce766a25da4a2e9f9f4836139c9c2331e Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Fri, 15 Feb 2013 16:58:37 -0800 -Subject: ISCSID: Modified the Makefile for iscsiuio compilation - -This patch modifies the open-iscsi Makefile to include the compilation, -binary/manpage install, and clean of the iscsiuio source. - -Signed-off-by: Eddie Wai ---- - Makefile | 12 +++++++++--- - 1 file changed, 9 insertions(+), 3 deletions(-) - -diff --git a/Makefile b/Makefile -index c5d9700..0b7bb98 100644 ---- a/Makefile -+++ b/Makefile -@@ -14,8 +14,8 @@ mandir = $(prefix)/share/man - etcdir = /etc - initddir = $(etcdir)/init.d - --MANPAGES = doc/iscsid.8 doc/iscsiadm.8 doc/iscsi_discovery.8 --PROGRAMS = usr/iscsid usr/iscsiadm utils/iscsi_discovery utils/iscsi-iname -+MANPAGES = doc/iscsid.8 doc/iscsiadm.8 doc/iscsi_discovery.8 iscsiuio/docs/iscsiuio.8 -+PROGRAMS = usr/iscsid usr/iscsiadm utils/iscsi_discovery utils/iscsi-iname iscsiuio/src/unix/iscsiuio - INSTALL = install - ETCFILES = etc/iscsid.conf - IFACEFILES = etc/iface.example -@@ -26,24 +26,29 @@ IFACEFILES = etc/iface.example - - all: user - --user: utils/open-isns/Makefile -+user: utils/open-isns/Makefile iscsiuio/Makefile - $(MAKE) -C utils/open-isns - $(MAKE) -C utils/sysdeps - $(MAKE) -C utils/fwparam_ibft - $(MAKE) -C usr - $(MAKE) -C utils -+ $(MAKE) -C iscsiuio - @echo - @echo "Compilation complete Output file" - @echo "----------------------------------- ----------------" - @echo "Built iSCSI daemon: usr/iscsid" - @echo "Built management application: usr/iscsiadm" - @echo "Built boot tool: usr/iscsistart" -+ @echo "Built iscsiuio daemon: iscsiuio/src/unix/iscsiuio" - @echo - @echo "Read README file for detailed information." - - utils/open-isns/Makefile: utils/open-isns/configure utils/open-isns/Makefile.in - cd utils/open-isns; ./configure CFLAGS="$(OPTFLAGS)" --with-security=no - -+iscsiuio/Makefile: iscsiuio/configure iscsiuio/Makefile.in -+ cd iscsiuio; ./configure -+ - kernel: force - $(MAKE) -C kernel - @echo "Kernel Compilation complete Output file" -@@ -61,6 +66,7 @@ clean: - $(MAKE) -C utils clean - $(MAKE) -C usr clean - $(MAKE) -C kernel clean -+ $(MAKE) -C iscsiuio clean - $(MAKE) -C utils/open-isns clean - $(MAKE) -C utils/open-isns distclean - --- -1.8.1.4 - diff --git a/0012-iscsiuio-systemd-unit-files.patch b/0012-iscsiuio-systemd-unit-files.patch new file mode 100644 index 0000000..0fc2039 --- /dev/null +++ b/0012-iscsiuio-systemd-unit-files.patch @@ -0,0 +1,53 @@ +From c9994e01142feb7010d695747062367c5dfd5c4d Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Tue, 22 Jan 2013 14:27:12 -0800 +Subject: [PATCH] iscsiuio systemd unit files + +--- + etc/systemd/iscsiuio.service | 17 +++++++++++++++++ + etc/systemd/iscsiuio.socket | 9 +++++++++ + 2 files changed, 26 insertions(+) + create mode 100644 etc/systemd/iscsiuio.service + create mode 100644 etc/systemd/iscsiuio.socket + +diff --git a/etc/systemd/iscsiuio.service b/etc/systemd/iscsiuio.service +new file mode 100644 +index 0000000..f0410b7 +--- /dev/null ++++ b/etc/systemd/iscsiuio.service +@@ -0,0 +1,17 @@ ++[Unit] ++Description=iSCSI UserSpace I/O driver ++Documentation=man:iscsiuio(8) ++DefaultDependencies=no ++Conflicts=shutdown.target ++Requires=iscsid.service ++BindTo=iscsid.service ++After=network.target ++Before=remote-fs-pre.target iscsid.service ++ ++[Service] ++Type=forking ++PIDFile=/var/run/iscsiuio.pid ++ExecStart=/usr/sbin/iscsiuio ++ ++[Install] ++WantedBy=multi-user.target +diff --git a/etc/systemd/iscsiuio.socket b/etc/systemd/iscsiuio.socket +new file mode 100644 +index 0000000..d42cedc +--- /dev/null ++++ b/etc/systemd/iscsiuio.socket +@@ -0,0 +1,9 @@ ++[Unit] ++Description=Open-iSCSI iscsiuio Socket ++Documentation=man:iscsiuio(8) ++ ++[Socket] ++ListenStream=@ISCSID_UIP_ABSTRACT_NAMESPACE ++ ++[Install] ++WantedBy=sockets.target +-- +2.1.0 + diff --git a/0013-ISCSID-Added-iscsiuio-source-to-the-open-iscsi-pkg.patch b/0013-ISCSID-Added-iscsiuio-source-to-the-open-iscsi-pkg.patch deleted file mode 100644 index eea3f25..0000000 --- a/0013-ISCSID-Added-iscsiuio-source-to-the-open-iscsi-pkg.patch +++ /dev/null @@ -1,75371 +0,0 @@ -From 001bcfd9d3c5a3f3b85e1635b54f0482cf36dbb7 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Fri, 15 Feb 2013 16:45:24 -0800 -Subject: ISCSID: Added iscsiuio source to the open-iscsi pkg - -This patch adds the iscsiuio source files to the open-iscsi package. -iscsiuio version: 0.7.6.1g - -Signed-off-by: Eddie Wai ---- - iscsiuio/AUTHORS | 0 - iscsiuio/COPYING | 674 + - iscsiuio/ChangeLog | 7 + - iscsiuio/INSTALL | 290 + - iscsiuio/Makefile.am | 25 + - iscsiuio/Makefile.in | 629 + - iscsiuio/NEWS | 0 - iscsiuio/README | 225 + - iscsiuio/RELEASE.TXT | 1988 ++ - iscsiuio/aclocal.m4 | 7276 +++++++ - iscsiuio/compile | 142 + - iscsiuio/config.guess | 1548 ++ - iscsiuio/config.h.in | 111 + - iscsiuio/config.status | 1236 ++ - iscsiuio/config.sub | 1695 ++ - iscsiuio/configure | 22765 +++++++++++++++++++++ - iscsiuio/configure.ac | 76 + - iscsiuio/depcomp | 589 + - iscsiuio/docs/iscsiuio.8 | 86 + - iscsiuio/install-sh | 519 + - iscsiuio/iscsiuiolog | 10 + - iscsiuio/ltmain.sh | 6912 +++++++ - iscsiuio/missing | 367 + - iscsiuio/src/Makefile.am | 1 + - iscsiuio/src/Makefile.in | 471 + - iscsiuio/src/README | 13 + - iscsiuio/src/apps/Makefile.am | 1 + - iscsiuio/src/apps/Makefile.in | 471 + - iscsiuio/src/apps/README | 2 + - iscsiuio/src/apps/brcm-iscsi/Makefile.am | 13 + - iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi | 1 + - iscsiuio/src/apps/brcm-iscsi/Makefile.in | 446 + - iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c | 88 + - iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h | 90 + - iscsiuio/src/apps/dhcpc/Makefile.am | 13 + - iscsiuio/src/apps/dhcpc/Makefile.dhcpc | 1 + - iscsiuio/src/apps/dhcpc/Makefile.in | 461 + - iscsiuio/src/apps/dhcpc/dhcpc.c | 417 + - iscsiuio/src/apps/dhcpc/dhcpc.h | 86 + - iscsiuio/src/apps/dhcpc/dhcpv6.c | 513 + - iscsiuio/src/apps/dhcpc/dhcpv6.h | 252 + - iscsiuio/src/uip-1.0-changelog.txt | 98 + - iscsiuio/src/uip/Makefile.am | 18 + - iscsiuio/src/uip/Makefile.in | 562 + - iscsiuio/src/uip/Makefile.include | 47 + - iscsiuio/src/uip/clock.h | 87 + - iscsiuio/src/uip/debug.h | 13 + - iscsiuio/src/uip/icmpv6.h | 301 + - iscsiuio/src/uip/ipv6.c | 1296 ++ - iscsiuio/src/uip/ipv6.h | 346 + - iscsiuio/src/uip/ipv6_ndpc.c | 426 + - iscsiuio/src/uip/ipv6_ndpc.h | 97 + - iscsiuio/src/uip/ipv6_pkt.h | 49 + - iscsiuio/src/uip/lc-addrlabels.h | 80 + - iscsiuio/src/uip/lc-switch.h | 73 + - iscsiuio/src/uip/lc.h | 130 + - iscsiuio/src/uip/psock.c | 339 + - iscsiuio/src/uip/psock.h | 383 + - iscsiuio/src/uip/pt.h | 322 + - iscsiuio/src/uip/timer.c | 127 + - iscsiuio/src/uip/timer.h | 84 + - iscsiuio/src/uip/uip-neighbor.c | 219 + - iscsiuio/src/uip/uip-neighbor.h | 105 + - iscsiuio/src/uip/uip.c | 2405 +++ - iscsiuio/src/uip/uip.h | 1569 ++ - iscsiuio/src/uip/uip_arch.h | 137 + - iscsiuio/src/uip/uip_arp.c | 481 + - iscsiuio/src/uip/uip_arp.h | 197 + - iscsiuio/src/uip/uip_eth.c | 49 + - iscsiuio/src/uip/uip_eth.h | 43 + - iscsiuio/src/uip/uipopt.h | 536 + - iscsiuio/src/unix/Makefile.am | 39 + - iscsiuio/src/unix/Makefile.in | 767 + - iscsiuio/src/unix/build_date.c | 1 + - iscsiuio/src/unix/build_date.h | 1 + - iscsiuio/src/unix/clock-arch.c | 54 + - iscsiuio/src/unix/clock-arch.h | 39 + - iscsiuio/src/unix/iscsid_ipc.c | 1044 + - iscsiuio/src/unix/iscsid_ipc.h | 51 + - iscsiuio/src/unix/libs/Makefile.am | 13 + - iscsiuio/src/unix/libs/Makefile.in | 450 + - iscsiuio/src/unix/libs/bnx2.c | 1164 ++ - iscsiuio/src/unix/libs/bnx2.h | 303 + - iscsiuio/src/unix/libs/bnx2x.c | 1625 ++ - iscsiuio/src/unix/libs/bnx2x.h | 705 + - iscsiuio/src/unix/libs/cnic.c | 661 + - iscsiuio/src/unix/libs/cnic.h | 54 + - iscsiuio/src/unix/logger.c | 180 + - iscsiuio/src/unix/logger.h | 128 + - iscsiuio/src/unix/main.c | 397 + - iscsiuio/src/unix/nic.c | 1551 ++ - iscsiuio/src/unix/nic.h | 379 + - iscsiuio/src/unix/nic_id.c | 361 + - iscsiuio/src/unix/nic_id.h | 46 + - iscsiuio/src/unix/nic_nl.c | 677 + - iscsiuio/src/unix/nic_nl.h | 53 + - iscsiuio/src/unix/nic_utils.c | 1628 ++ - iscsiuio/src/unix/nic_utils.h | 101 + - iscsiuio/src/unix/nic_vlan.c | 336 + - iscsiuio/src/unix/nic_vlan.h | 88 + - iscsiuio/src/unix/options.h | 116 + - iscsiuio/src/unix/packet.c | 145 + - iscsiuio/src/unix/packet.h | 75 + - iscsiuio/src/unix/uip-conf.h | 160 + - iscsiuio/stamp-h1 | 1 + - 105 files changed, 74522 insertions(+) - create mode 100644 iscsiuio/AUTHORS - create mode 100644 iscsiuio/COPYING - create mode 100644 iscsiuio/ChangeLog - create mode 100644 iscsiuio/INSTALL - create mode 100644 iscsiuio/Makefile.am - create mode 100644 iscsiuio/Makefile.in - create mode 100644 iscsiuio/NEWS - create mode 100644 iscsiuio/README - create mode 100644 iscsiuio/RELEASE.TXT - create mode 100644 iscsiuio/aclocal.m4 - create mode 100755 iscsiuio/compile - create mode 100755 iscsiuio/config.guess - create mode 100644 iscsiuio/config.h.in - create mode 100644 iscsiuio/config.status - create mode 100755 iscsiuio/config.sub - create mode 100755 iscsiuio/configure - create mode 100644 iscsiuio/configure.ac - create mode 100755 iscsiuio/depcomp - create mode 100644 iscsiuio/docs/iscsiuio.8 - create mode 100755 iscsiuio/install-sh - create mode 100644 iscsiuio/iscsiuiolog - create mode 100755 iscsiuio/ltmain.sh - create mode 100755 iscsiuio/missing - create mode 100644 iscsiuio/src/Makefile.am - create mode 100644 iscsiuio/src/Makefile.in - create mode 100644 iscsiuio/src/README - create mode 100644 iscsiuio/src/apps/Makefile.am - create mode 100644 iscsiuio/src/apps/Makefile.in - create mode 100644 iscsiuio/src/apps/README - create mode 100644 iscsiuio/src/apps/brcm-iscsi/Makefile.am - create mode 100644 iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi - create mode 100644 iscsiuio/src/apps/brcm-iscsi/Makefile.in - create mode 100644 iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c - create mode 100644 iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h - create mode 100644 iscsiuio/src/apps/dhcpc/Makefile.am - create mode 100644 iscsiuio/src/apps/dhcpc/Makefile.dhcpc - create mode 100644 iscsiuio/src/apps/dhcpc/Makefile.in - create mode 100644 iscsiuio/src/apps/dhcpc/dhcpc.c - create mode 100644 iscsiuio/src/apps/dhcpc/dhcpc.h - create mode 100644 iscsiuio/src/apps/dhcpc/dhcpv6.c - create mode 100644 iscsiuio/src/apps/dhcpc/dhcpv6.h - create mode 100644 iscsiuio/src/uip-1.0-changelog.txt - create mode 100644 iscsiuio/src/uip/Makefile.am - create mode 100644 iscsiuio/src/uip/Makefile.in - create mode 100644 iscsiuio/src/uip/Makefile.include - create mode 100644 iscsiuio/src/uip/clock.h - create mode 100644 iscsiuio/src/uip/debug.h - create mode 100644 iscsiuio/src/uip/icmpv6.h - create mode 100644 iscsiuio/src/uip/ipv6.c - create mode 100644 iscsiuio/src/uip/ipv6.h - create mode 100644 iscsiuio/src/uip/ipv6_ndpc.c - create mode 100644 iscsiuio/src/uip/ipv6_ndpc.h - create mode 100644 iscsiuio/src/uip/ipv6_pkt.h - create mode 100644 iscsiuio/src/uip/lc-addrlabels.h - create mode 100644 iscsiuio/src/uip/lc-switch.h - create mode 100644 iscsiuio/src/uip/lc.h - create mode 100644 iscsiuio/src/uip/psock.c - create mode 100644 iscsiuio/src/uip/psock.h - create mode 100644 iscsiuio/src/uip/pt.h - create mode 100644 iscsiuio/src/uip/timer.c - create mode 100644 iscsiuio/src/uip/timer.h - create mode 100644 iscsiuio/src/uip/uip-neighbor.c - create mode 100644 iscsiuio/src/uip/uip-neighbor.h - create mode 100644 iscsiuio/src/uip/uip.c - create mode 100644 iscsiuio/src/uip/uip.h - create mode 100644 iscsiuio/src/uip/uip_arch.h - create mode 100644 iscsiuio/src/uip/uip_arp.c - create mode 100644 iscsiuio/src/uip/uip_arp.h - create mode 100644 iscsiuio/src/uip/uip_eth.c - create mode 100644 iscsiuio/src/uip/uip_eth.h - create mode 100644 iscsiuio/src/uip/uipopt.h - create mode 100644 iscsiuio/src/unix/Makefile.am - create mode 100644 iscsiuio/src/unix/Makefile.in - create mode 100644 iscsiuio/src/unix/build_date.c - create mode 100644 iscsiuio/src/unix/build_date.h - create mode 100644 iscsiuio/src/unix/clock-arch.c - create mode 100644 iscsiuio/src/unix/clock-arch.h - create mode 100644 iscsiuio/src/unix/iscsid_ipc.c - create mode 100644 iscsiuio/src/unix/iscsid_ipc.h - create mode 100644 iscsiuio/src/unix/libs/Makefile.am - create mode 100644 iscsiuio/src/unix/libs/Makefile.in - create mode 100644 iscsiuio/src/unix/libs/bnx2.c - create mode 100644 iscsiuio/src/unix/libs/bnx2.h - create mode 100644 iscsiuio/src/unix/libs/bnx2x.c - create mode 100644 iscsiuio/src/unix/libs/bnx2x.h - create mode 100644 iscsiuio/src/unix/libs/cnic.c - create mode 100644 iscsiuio/src/unix/libs/cnic.h - create mode 100644 iscsiuio/src/unix/logger.c - create mode 100644 iscsiuio/src/unix/logger.h - create mode 100644 iscsiuio/src/unix/main.c - create mode 100644 iscsiuio/src/unix/nic.c - create mode 100644 iscsiuio/src/unix/nic.h - create mode 100644 iscsiuio/src/unix/nic_id.c - create mode 100644 iscsiuio/src/unix/nic_id.h - create mode 100644 iscsiuio/src/unix/nic_nl.c - create mode 100644 iscsiuio/src/unix/nic_nl.h - create mode 100644 iscsiuio/src/unix/nic_utils.c - create mode 100644 iscsiuio/src/unix/nic_utils.h - create mode 100644 iscsiuio/src/unix/nic_vlan.c - create mode 100644 iscsiuio/src/unix/nic_vlan.h - create mode 100644 iscsiuio/src/unix/options.h - create mode 100644 iscsiuio/src/unix/packet.c - create mode 100644 iscsiuio/src/unix/packet.h - create mode 100644 iscsiuio/src/unix/uip-conf.h - create mode 100644 iscsiuio/stamp-h1 - -diff --git a/iscsiuio/AUTHORS b/iscsiuio/AUTHORS -new file mode 100644 -index 0000000..e69de29 -diff --git a/iscsiuio/COPYING b/iscsiuio/COPYING -new file mode 100644 -index 0000000..94a9ed0 ---- /dev/null -+++ b/iscsiuio/COPYING -@@ -0,0 +1,674 @@ -+ GNU GENERAL PUBLIC LICENSE -+ Version 3, 29 June 2007 -+ -+ Copyright (C) 2007 Free Software Foundation, Inc. -+ Everyone is permitted to copy and distribute verbatim copies -+ of this license document, but changing it is not allowed. -+ -+ Preamble -+ -+ The GNU General Public License is a free, copyleft license for -+software and other kinds of works. -+ -+ The licenses for most software and other practical works are designed -+to take away your freedom to share and change the works. By contrast, -+the GNU General Public License is intended to guarantee your freedom to -+share and change all versions of a program--to make sure it remains free -+software for all its users. We, the Free Software Foundation, use the -+GNU General Public License for most of our software; it applies also to -+any other work released this way by its authors. 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 -+them 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 prevent others from denying you -+these rights or asking you to surrender the rights. Therefore, you have -+certain responsibilities if you distribute copies of the software, or if -+you modify it: responsibilities to respect the freedom of others. -+ -+ For example, if you distribute copies of such a program, whether -+gratis or for a fee, you must pass on to the recipients the same -+freedoms that you received. 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. -+ -+ Developers that use the GNU GPL protect your rights with two steps: -+(1) assert copyright on the software, and (2) offer you this License -+giving you legal permission to copy, distribute and/or modify it. -+ -+ For the developers' and authors' protection, the GPL clearly explains -+that there is no warranty for this free software. For both users' and -+authors' sake, the GPL requires that modified versions be marked as -+changed, so that their problems will not be attributed erroneously to -+authors of previous versions. -+ -+ Some devices are designed to deny users access to install or run -+modified versions of the software inside them, although the manufacturer -+can do so. This is fundamentally incompatible with the aim of -+protecting users' freedom to change the software. The systematic -+pattern of such abuse occurs in the area of products for individuals to -+use, which is precisely where it is most unacceptable. Therefore, we -+have designed this version of the GPL to prohibit the practice for those -+products. If such problems arise substantially in other domains, we -+stand ready to extend this provision to those domains in future versions -+of the GPL, as needed to protect the freedom of users. -+ -+ Finally, every program is threatened constantly by software patents. -+States should not allow patents to restrict development and use of -+software on general-purpose computers, but in those that do, we wish to -+avoid the special danger that patents applied to a free program could -+make it effectively proprietary. To prevent this, the GPL assures that -+patents cannot be used to render the program non-free. -+ -+ The precise terms and conditions for copying, distribution and -+modification follow. -+ -+ TERMS AND CONDITIONS -+ -+ 0. Definitions. -+ -+ "This License" refers to version 3 of the GNU General Public License. -+ -+ "Copyright" also means copyright-like laws that apply to other kinds of -+works, such as semiconductor masks. -+ -+ "The Program" refers to any copyrightable work licensed under this -+License. Each licensee is addressed as "you". "Licensees" and -+"recipients" may be individuals or organizations. -+ -+ To "modify" a work means to copy from or adapt all or part of the work -+in a fashion requiring copyright permission, other than the making of an -+exact copy. The resulting work is called a "modified version" of the -+earlier work or a work "based on" the earlier work. -+ -+ A "covered work" means either the unmodified Program or a work based -+on the Program. -+ -+ To "propagate" a work means to do anything with it that, without -+permission, would make you directly or secondarily liable for -+infringement under applicable copyright law, except executing it on a -+computer or modifying a private copy. Propagation includes copying, -+distribution (with or without modification), making available to the -+public, and in some countries other activities as well. -+ -+ To "convey" a work means any kind of propagation that enables other -+parties to make or receive copies. Mere interaction with a user through -+a computer network, with no transfer of a copy, is not conveying. -+ -+ An interactive user interface displays "Appropriate Legal Notices" -+to the extent that it includes a convenient and prominently visible -+feature that (1) displays an appropriate copyright notice, and (2) -+tells the user that there is no warranty for the work (except to the -+extent that warranties are provided), that licensees may convey the -+work under this License, and how to view a copy of this License. If -+the interface presents a list of user commands or options, such as a -+menu, a prominent item in the list meets this criterion. -+ -+ 1. Source Code. -+ -+ The "source code" for a work means the preferred form of the work -+for making modifications to it. "Object code" means any non-source -+form of a work. -+ -+ A "Standard Interface" means an interface that either is an official -+standard defined by a recognized standards body, or, in the case of -+interfaces specified for a particular programming language, one that -+is widely used among developers working in that language. -+ -+ The "System Libraries" of an executable work include anything, other -+than the work as a whole, that (a) is included in the normal form of -+packaging a Major Component, but which is not part of that Major -+Component, and (b) serves only to enable use of the work with that -+Major Component, or to implement a Standard Interface for which an -+implementation is available to the public in source code form. A -+"Major Component", in this context, means a major essential component -+(kernel, window system, and so on) of the specific operating system -+(if any) on which the executable work runs, or a compiler used to -+produce the work, or an object code interpreter used to run it. -+ -+ The "Corresponding Source" for a work in object code form means all -+the source code needed to generate, install, and (for an executable -+work) run the object code and to modify the work, including scripts to -+control those activities. However, it does not include the work's -+System Libraries, or general-purpose tools or generally available free -+programs which are used unmodified in performing those activities but -+which are not part of the work. For example, Corresponding Source -+includes interface definition files associated with source files for -+the work, and the source code for shared libraries and dynamically -+linked subprograms that the work is specifically designed to require, -+such as by intimate data communication or control flow between those -+subprograms and other parts of the work. -+ -+ The Corresponding Source need not include anything that users -+can regenerate automatically from other parts of the Corresponding -+Source. -+ -+ The Corresponding Source for a work in source code form is that -+same work. -+ -+ 2. Basic Permissions. -+ -+ All rights granted under this License are granted for the term of -+copyright on the Program, and are irrevocable provided the stated -+conditions are met. This License explicitly affirms your unlimited -+permission to run the unmodified Program. The output from running a -+covered work is covered by this License only if the output, given its -+content, constitutes a covered work. This License acknowledges your -+rights of fair use or other equivalent, as provided by copyright law. -+ -+ You may make, run and propagate covered works that you do not -+convey, without conditions so long as your license otherwise remains -+in force. You may convey covered works to others for the sole purpose -+of having them make modifications exclusively for you, or provide you -+with facilities for running those works, provided that you comply with -+the terms of this License in conveying all material for which you do -+not control copyright. Those thus making or running the covered works -+for you must do so exclusively on your behalf, under your direction -+and control, on terms that prohibit them from making any copies of -+your copyrighted material outside their relationship with you. -+ -+ Conveying under any other circumstances is permitted solely under -+the conditions stated below. Sublicensing is not allowed; section 10 -+makes it unnecessary. -+ -+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. -+ -+ No covered work shall be deemed part of an effective technological -+measure under any applicable law fulfilling obligations under article -+11 of the WIPO copyright treaty adopted on 20 December 1996, or -+similar laws prohibiting or restricting circumvention of such -+measures. -+ -+ When you convey a covered work, you waive any legal power to forbid -+circumvention of technological measures to the extent such circumvention -+is effected by exercising rights under this License with respect to -+the covered work, and you disclaim any intention to limit operation or -+modification of the work as a means of enforcing, against the work's -+users, your or third parties' legal rights to forbid circumvention of -+technological measures. -+ -+ 4. Conveying Verbatim Copies. -+ -+ You may convey 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; -+keep intact all notices stating that this License and any -+non-permissive terms added in accord with section 7 apply to the code; -+keep intact all notices of the absence of any warranty; and give all -+recipients a copy of this License along with the Program. -+ -+ You may charge any price or no price for each copy that you convey, -+and you may offer support or warranty protection for a fee. -+ -+ 5. Conveying Modified Source Versions. -+ -+ You may convey a work based on the Program, or the modifications to -+produce it from the Program, in the form of source code under the -+terms of section 4, provided that you also meet all of these conditions: -+ -+ a) The work must carry prominent notices stating that you modified -+ it, and giving a relevant date. -+ -+ b) The work must carry prominent notices stating that it is -+ released under this License and any conditions added under section -+ 7. This requirement modifies the requirement in section 4 to -+ "keep intact all notices". -+ -+ c) You must license the entire work, as a whole, under this -+ License to anyone who comes into possession of a copy. This -+ License will therefore apply, along with any applicable section 7 -+ additional terms, to the whole of the work, and all its parts, -+ regardless of how they are packaged. This License gives no -+ permission to license the work in any other way, but it does not -+ invalidate such permission if you have separately received it. -+ -+ d) If the work has interactive user interfaces, each must display -+ Appropriate Legal Notices; however, if the Program has interactive -+ interfaces that do not display Appropriate Legal Notices, your -+ work need not make them do so. -+ -+ A compilation of a covered work with other separate and independent -+works, which are not by their nature extensions of the covered work, -+and which are not combined with it such as to form a larger program, -+in or on a volume of a storage or distribution medium, is called an -+"aggregate" if the compilation and its resulting copyright are not -+used to limit the access or legal rights of the compilation's users -+beyond what the individual works permit. Inclusion of a covered work -+in an aggregate does not cause this License to apply to the other -+parts of the aggregate. -+ -+ 6. Conveying Non-Source Forms. -+ -+ You may convey a covered work in object code form under the terms -+of sections 4 and 5, provided that you also convey the -+machine-readable Corresponding Source under the terms of this License, -+in one of these ways: -+ -+ a) Convey the object code in, or embodied in, a physical product -+ (including a physical distribution medium), accompanied by the -+ Corresponding Source fixed on a durable physical medium -+ customarily used for software interchange. -+ -+ b) Convey the object code in, or embodied in, a physical product -+ (including a physical distribution medium), accompanied by a -+ written offer, valid for at least three years and valid for as -+ long as you offer spare parts or customer support for that product -+ model, to give anyone who possesses the object code either (1) a -+ copy of the Corresponding Source for all the software in the -+ product that is covered by this License, on a durable physical -+ medium customarily used for software interchange, for a price no -+ more than your reasonable cost of physically performing this -+ conveying of source, or (2) access to copy the -+ Corresponding Source from a network server at no charge. -+ -+ c) Convey individual copies of the object code with a copy of the -+ written offer to provide the Corresponding Source. This -+ alternative is allowed only occasionally and noncommercially, and -+ only if you received the object code with such an offer, in accord -+ with subsection 6b. -+ -+ d) Convey the object code by offering access from a designated -+ place (gratis or for a charge), and offer equivalent access to the -+ Corresponding Source in the same way through the same place at no -+ further charge. You need not require recipients to copy the -+ Corresponding Source along with the object code. If the place to -+ copy the object code is a network server, the Corresponding Source -+ may be on a different server (operated by you or a third party) -+ that supports equivalent copying facilities, provided you maintain -+ clear directions next to the object code saying where to find the -+ Corresponding Source. Regardless of what server hosts the -+ Corresponding Source, you remain obligated to ensure that it is -+ available for as long as needed to satisfy these requirements. -+ -+ e) Convey the object code using peer-to-peer transmission, provided -+ you inform other peers where the object code and Corresponding -+ Source of the work are being offered to the general public at no -+ charge under subsection 6d. -+ -+ A separable portion of the object code, whose source code is excluded -+from the Corresponding Source as a System Library, need not be -+included in conveying the object code work. -+ -+ A "User Product" is either (1) a "consumer product", which means any -+tangible personal property which is normally used for personal, family, -+or household purposes, or (2) anything designed or sold for incorporation -+into a dwelling. In determining whether a product is a consumer product, -+doubtful cases shall be resolved in favor of coverage. For a particular -+product received by a particular user, "normally used" refers to a -+typical or common use of that class of product, regardless of the status -+of the particular user or of the way in which the particular user -+actually uses, or expects or is expected to use, the product. A product -+is a consumer product regardless of whether the product has substantial -+commercial, industrial or non-consumer uses, unless such uses represent -+the only significant mode of use of the product. -+ -+ "Installation Information" for a User Product means any methods, -+procedures, authorization keys, or other information required to install -+and execute modified versions of a covered work in that User Product from -+a modified version of its Corresponding Source. The information must -+suffice to ensure that the continued functioning of the modified object -+code is in no case prevented or interfered with solely because -+modification has been made. -+ -+ If you convey an object code work under this section in, or with, or -+specifically for use in, a User Product, and the conveying occurs as -+part of a transaction in which the right of possession and use of the -+User Product is transferred to the recipient in perpetuity or for a -+fixed term (regardless of how the transaction is characterized), the -+Corresponding Source conveyed under this section must be accompanied -+by the Installation Information. But this requirement does not apply -+if neither you nor any third party retains the ability to install -+modified object code on the User Product (for example, the work has -+been installed in ROM). -+ -+ The requirement to provide Installation Information does not include a -+requirement to continue to provide support service, warranty, or updates -+for a work that has been modified or installed by the recipient, or for -+the User Product in which it has been modified or installed. Access to a -+network may be denied when the modification itself materially and -+adversely affects the operation of the network or violates the rules and -+protocols for communication across the network. -+ -+ Corresponding Source conveyed, and Installation Information provided, -+in accord with this section must be in a format that is publicly -+documented (and with an implementation available to the public in -+source code form), and must require no special password or key for -+unpacking, reading or copying. -+ -+ 7. Additional Terms. -+ -+ "Additional permissions" are terms that supplement the terms of this -+License by making exceptions from one or more of its conditions. -+Additional permissions that are applicable to the entire Program shall -+be treated as though they were included in this License, to the extent -+that they are valid under applicable law. If additional permissions -+apply only to part of the Program, that part may be used separately -+under those permissions, but the entire Program remains governed by -+this License without regard to the additional permissions. -+ -+ When you convey a copy of a covered work, you may at your option -+remove any additional permissions from that copy, or from any part of -+it. (Additional permissions may be written to require their own -+removal in certain cases when you modify the work.) You may place -+additional permissions on material, added by you to a covered work, -+for which you have or can give appropriate copyright permission. -+ -+ Notwithstanding any other provision of this License, for material you -+add to a covered work, you may (if authorized by the copyright holders of -+that material) supplement the terms of this License with terms: -+ -+ a) Disclaiming warranty or limiting liability differently from the -+ terms of sections 15 and 16 of this License; or -+ -+ b) Requiring preservation of specified reasonable legal notices or -+ author attributions in that material or in the Appropriate Legal -+ Notices displayed by works containing it; or -+ -+ c) Prohibiting misrepresentation of the origin of that material, or -+ requiring that modified versions of such material be marked in -+ reasonable ways as different from the original version; or -+ -+ d) Limiting the use for publicity purposes of names of licensors or -+ authors of the material; or -+ -+ e) Declining to grant rights under trademark law for use of some -+ trade names, trademarks, or service marks; or -+ -+ f) Requiring indemnification of licensors and authors of that -+ material by anyone who conveys the material (or modified versions of -+ it) with contractual assumptions of liability to the recipient, for -+ any liability that these contractual assumptions directly impose on -+ those licensors and authors. -+ -+ All other non-permissive additional terms are considered "further -+restrictions" within the meaning of section 10. If the Program as you -+received it, or any part of it, contains a notice stating that it is -+governed by this License along with a term that is a further -+restriction, you may remove that term. If a license document contains -+a further restriction but permits relicensing or conveying under this -+License, you may add to a covered work material governed by the terms -+of that license document, provided that the further restriction does -+not survive such relicensing or conveying. -+ -+ If you add terms to a covered work in accord with this section, you -+must place, in the relevant source files, a statement of the -+additional terms that apply to those files, or a notice indicating -+where to find the applicable terms. -+ -+ Additional terms, permissive or non-permissive, may be stated in the -+form of a separately written license, or stated as exceptions; -+the above requirements apply either way. -+ -+ 8. Termination. -+ -+ You may not propagate or modify a covered work except as expressly -+provided under this License. Any attempt otherwise to propagate or -+modify it is void, and will automatically terminate your rights under -+this License (including any patent licenses granted under the third -+paragraph of section 11). -+ -+ However, if you cease all violation of this License, then your -+license from a particular copyright holder is reinstated (a) -+provisionally, unless and until the copyright holder explicitly and -+finally terminates your license, and (b) permanently, if the copyright -+holder fails to notify you of the violation by some reasonable means -+prior to 60 days after the cessation. -+ -+ Moreover, your license from a particular copyright holder is -+reinstated permanently if the copyright holder notifies you of the -+violation by some reasonable means, this is the first time you have -+received notice of violation of this License (for any work) from that -+copyright holder, and you cure the violation prior to 30 days after -+your receipt of the notice. -+ -+ Termination of your rights under this section does not terminate the -+licenses of parties who have received copies or rights from you under -+this License. If your rights have been terminated and not permanently -+reinstated, you do not qualify to receive new licenses for the same -+material under section 10. -+ -+ 9. Acceptance Not Required for Having Copies. -+ -+ You are not required to accept this License in order to receive or -+run a copy of the Program. Ancillary propagation of a covered work -+occurring solely as a consequence of using peer-to-peer transmission -+to receive a copy likewise does not require acceptance. However, -+nothing other than this License grants you permission to propagate or -+modify any covered work. These actions infringe copyright if you do -+not accept this License. Therefore, by modifying or propagating a -+covered work, you indicate your acceptance of this License to do so. -+ -+ 10. Automatic Licensing of Downstream Recipients. -+ -+ Each time you convey a covered work, the recipient automatically -+receives a license from the original licensors, to run, modify and -+propagate that work, subject to this License. You are not responsible -+for enforcing compliance by third parties with this License. -+ -+ An "entity transaction" is a transaction transferring control of an -+organization, or substantially all assets of one, or subdividing an -+organization, or merging organizations. If propagation of a covered -+work results from an entity transaction, each party to that -+transaction who receives a copy of the work also receives whatever -+licenses to the work the party's predecessor in interest had or could -+give under the previous paragraph, plus a right to possession of the -+Corresponding Source of the work from the predecessor in interest, if -+the predecessor has it or can get it with reasonable efforts. -+ -+ You may not impose any further restrictions on the exercise of the -+rights granted or affirmed under this License. For example, you may -+not impose a license fee, royalty, or other charge for exercise of -+rights granted under this License, and you may not initiate litigation -+(including a cross-claim or counterclaim in a lawsuit) alleging that -+any patent claim is infringed by making, using, selling, offering for -+sale, or importing the Program or any portion of it. -+ -+ 11. Patents. -+ -+ A "contributor" is a copyright holder who authorizes use under this -+License of the Program or a work on which the Program is based. The -+work thus licensed is called the contributor's "contributor version". -+ -+ A contributor's "essential patent claims" are all patent claims -+owned or controlled by the contributor, whether already acquired or -+hereafter acquired, that would be infringed by some manner, permitted -+by this License, of making, using, or selling its contributor version, -+but do not include claims that would be infringed only as a -+consequence of further modification of the contributor version. For -+purposes of this definition, "control" includes the right to grant -+patent sublicenses in a manner consistent with the requirements of -+this License. -+ -+ Each contributor grants you a non-exclusive, worldwide, royalty-free -+patent license under the contributor's essential patent claims, to -+make, use, sell, offer for sale, import and otherwise run, modify and -+propagate the contents of its contributor version. -+ -+ In the following three paragraphs, a "patent license" is any express -+agreement or commitment, however denominated, not to enforce a patent -+(such as an express permission to practice a patent or covenant not to -+sue for patent infringement). To "grant" such a patent license to a -+party means to make such an agreement or commitment not to enforce a -+patent against the party. -+ -+ If you convey a covered work, knowingly relying on a patent license, -+and the Corresponding Source of the work is not available for anyone -+to copy, free of charge and under the terms of this License, through a -+publicly available network server or other readily accessible means, -+then you must either (1) cause the Corresponding Source to be so -+available, or (2) arrange to deprive yourself of the benefit of the -+patent license for this particular work, or (3) arrange, in a manner -+consistent with the requirements of this License, to extend the patent -+license to downstream recipients. "Knowingly relying" means you have -+actual knowledge that, but for the patent license, your conveying the -+covered work in a country, or your recipient's use of the covered work -+in a country, would infringe one or more identifiable patents in that -+country that you have reason to believe are valid. -+ -+ If, pursuant to or in connection with a single transaction or -+arrangement, you convey, or propagate by procuring conveyance of, a -+covered work, and grant a patent license to some of the parties -+receiving the covered work authorizing them to use, propagate, modify -+or convey a specific copy of the covered work, then the patent license -+you grant is automatically extended to all recipients of the covered -+work and works based on it. -+ -+ A patent license is "discriminatory" if it does not include within -+the scope of its coverage, prohibits the exercise of, or is -+conditioned on the non-exercise of one or more of the rights that are -+specifically granted under this License. You may not convey a covered -+work if you are a party to an arrangement with a third party that is -+in the business of distributing software, under which you make payment -+to the third party based on the extent of your activity of conveying -+the work, and under which the third party grants, to any of the -+parties who would receive the covered work from you, a discriminatory -+patent license (a) in connection with copies of the covered work -+conveyed by you (or copies made from those copies), or (b) primarily -+for and in connection with specific products or compilations that -+contain the covered work, unless you entered into that arrangement, -+or that patent license was granted, prior to 28 March 2007. -+ -+ Nothing in this License shall be construed as excluding or limiting -+any implied license or other defenses to infringement that may -+otherwise be available to you under applicable patent law. -+ -+ 12. No Surrender of Others' Freedom. -+ -+ If 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 convey a -+covered work so as to satisfy simultaneously your obligations under this -+License and any other pertinent obligations, then as a consequence you may -+not convey it at all. For example, if you agree to terms that obligate you -+to collect a royalty for further conveying from those to whom you convey -+the Program, the only way you could satisfy both those terms and this -+License would be to refrain entirely from conveying the Program. -+ -+ 13. Use with the GNU Affero General Public License. -+ -+ Notwithstanding any other provision of this License, you have -+permission to link or combine any covered work with a work licensed -+under version 3 of the GNU Affero General Public License into a single -+combined work, and to convey the resulting work. The terms of this -+License will continue to apply to the part which is the covered work, -+but the special requirements of the GNU Affero General Public License, -+section 13, concerning interaction through a network will apply to the -+combination as such. -+ -+ 14. Revised Versions of this License. -+ -+ The Free Software Foundation may publish revised and/or new versions of -+the GNU 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 that a certain numbered version of the GNU General -+Public License "or any later version" applies to it, you have the -+option of following the terms and conditions either of that numbered -+version or of any later version published by the Free Software -+Foundation. If the Program does not specify a version number of the -+GNU General Public License, you may choose any version ever published -+by the Free Software Foundation. -+ -+ If the Program specifies that a proxy can decide which future -+versions of the GNU General Public License can be used, that proxy's -+public statement of acceptance of a version permanently authorizes you -+to choose that version for the Program. -+ -+ Later license versions may give you additional or different -+permissions. However, no additional obligations are imposed on any -+author or copyright holder as a result of your choosing to follow a -+later version. -+ -+ 15. Disclaimer of Warranty. -+ -+ 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. -+ -+ 16. Limitation of Liability. -+ -+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -+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. -+ -+ 17. Interpretation of Sections 15 and 16. -+ -+ If the disclaimer of warranty and limitation of liability provided -+above cannot be given local legal effect according to their terms, -+reviewing courts shall apply local law that most closely approximates -+an absolute waiver of all civil liability in connection with the -+Program, unless a warranty or assumption of liability accompanies a -+copy of the Program in return for a fee. -+ -+ 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 -+state 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 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 . -+ -+Also add information on how to contact you by electronic and paper mail. -+ -+ If the program does terminal interaction, make it output a short -+notice like this when it starts in an interactive mode: -+ -+ Copyright (C) -+ This program 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, your program's commands -+might be different; for a GUI interface, you would use an "about box". -+ -+ You should also get your employer (if you work as a programmer) or school, -+if any, to sign a "copyright disclaimer" for the program, if necessary. -+For more information on this, and how to apply and follow the GNU GPL, see -+. -+ -+ The GNU 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 Lesser General -+Public License instead of this License. But first, please read -+. -diff --git a/iscsiuio/ChangeLog b/iscsiuio/ChangeLog -new file mode 100644 -index 0000000..a91b4d5 ---- /dev/null -+++ b/iscsiuio/ChangeLog -@@ -0,0 +1,7 @@ -+Version 0.4.1 (July 20, 2009) -+ * Fix from Mike Christie to determine page size from getpagesize() -+ rather then the constant PAGE_SIZE. PAGE_SIZE is not defined om -+ ia64 and ppc. -+ * Update documentation to indicate IPv6 is not supported -+ * Fix code to catch the message from the CNIC that the network -+ interface is going down. -diff --git a/iscsiuio/INSTALL b/iscsiuio/INSTALL -new file mode 100644 -index 0000000..c9fd2c0 ---- /dev/null -+++ b/iscsiuio/INSTALL -@@ -0,0 +1,290 @@ -+Installation Instructions -+************************* -+ -+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -+2006, 2007, 2008 Free Software Foundation, Inc. -+ -+ This file is free documentation; the Free Software Foundation gives -+unlimited permission to copy, distribute and modify it. -+ -+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. -+ -+ 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. -+ -+ 4. Type `make install' to install the programs and any data files and -+ documentation. -+ -+ 5. 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. -+ -+ 6. Often, you can also type `make uninstall' to remove the installed -+ files again. -+ -+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 `..'. -+ -+ 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'. -+ -+ 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. -+ -+ 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'. -+ -+Optional Features -+================= -+ -+ 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. -+ -+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" -+ -+and if that doesn't work, install pre-built binaries of GCC for HP-UX. -+ -+ 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" -+ -+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 bug. Until the bug is fixed you can use this workaround: -+ -+ CONFIG_SHELL=/bin/bash /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. -diff --git a/iscsiuio/Makefile.am b/iscsiuio/Makefile.am -new file mode 100644 -index 0000000..28dd776 ---- /dev/null -+++ b/iscsiuio/Makefile.am -@@ -0,0 +1,25 @@ -+SUBDIRS= src -+ -+EXTRA_DIST = build_date -+ -+build_date: -+ echo 'char *build_date = "'`date`'";' > build_date.c -+ echo 'char *build_date;'> build_date.h -+ -+manprefix = /usr/share -+mandir = ${manprefix}/man -+logdir = /etc/logrotate.d -+ -+install-am: all-am -+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install-man install-log install-brcm -+ -+install-man: -+ cat docs/iscsiuio.8 | GZIP=$(GZIP_ENV) gzip -c > iscsiuio.8.gz -+ $(INSTALL_PROGRAM) iscsiuio.8.gz $(mandir)/man8 -+ -+install-log: -+ $(INSTALL_PROGRAM) iscsiuiolog $(logdir) -+ -+install-brcm: -+ -rm -f $(sbindir)/brcm_iscsiuio -+ -ln -s $(sbindir)/iscsiuio $(sbindir)/brcm_iscsiuio -diff --git a/iscsiuio/Makefile.in b/iscsiuio/Makefile.in -new file mode 100644 -index 0000000..04438b3 ---- /dev/null -+++ b/iscsiuio/Makefile.in -@@ -0,0 +1,629 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = . -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ -+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ -+ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ -+ TODO compile config.guess config.sub depcomp install-sh \ -+ ltmain.sh missing -+subdir = . -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ -+ configure.lineno configure.status.lineno -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = config.h -+CONFIG_CLEAN_FILES = -+SOURCES = -+DIST_SOURCES = -+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -+ html-recursive info-recursive install-data-recursive \ -+ install-exec-recursive install-info-recursive \ -+ install-recursive installcheck-recursive installdirs-recursive \ -+ pdf-recursive ps-recursive uninstall-info-recursive \ -+ uninstall-recursive -+ETAGS = etags -+CTAGS = ctags -+DIST_SUBDIRS = $(SUBDIRS) -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+distdir = $(PACKAGE)-$(VERSION) -+top_distdir = $(distdir) -+am__remove_distdir = \ -+ { test ! -d $(distdir) \ -+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ -+ && rm -fr $(distdir); }; } -+DIST_ARCHIVES = $(distdir).tar.gz -+GZIP_ENV = --best -+distuninstallcheck_listfiles = find . -type f -print -+distcleancheck_listfiles = find . -type f -print -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = ${manprefix}/man -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+SUBDIRS = src -+EXTRA_DIST = build_date -+manprefix = /usr/share -+logdir = /etc/logrotate.d -+all: config.h -+ $(MAKE) $(AM_MAKEFLAGS) all-recursive -+ -+.SUFFIXES: -+am--refresh: -+ @: -+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) -+ @for dep in $?; do \ -+ case '$(am__configure_deps)' in \ -+ *$$dep*) \ -+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ -+ cd $(srcdir) && $(AUTOMAKE) --gnu \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ -+ 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) -+ cd $(srcdir) && $(AUTOCONF) -+$(ACLOCAL_M4): $(am__aclocal_m4_deps) -+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -+ -+config.h: stamp-h1 -+ @if test ! -f $@; then \ -+ rm -f stamp-h1; \ -+ $(MAKE) stamp-h1; \ -+ else :; fi -+ -+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) -+ cd $(top_srcdir) && $(AUTOHEADER) -+ rm -f stamp-h1 -+ touch $@ -+ -+distclean-hdr: -+ -rm -f config.h stamp-h1 -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+# 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. -+$(RECURSIVE_TARGETS): -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ list='$(SUBDIRS)'; 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; \ -+ (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" -+ -+mostlyclean-recursive clean-recursive distclean-recursive \ -+maintainer-clean-recursive: -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ case "$@" in \ -+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ -+ *) list='$(SUBDIRS)' ;; \ -+ esac; \ -+ rev=''; for subdir in $$list; do \ -+ if test "$$subdir" = "."; then :; else \ -+ rev="$$subdir $$rev"; \ -+ fi; \ -+ done; \ -+ rev="$$rev ."; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ for subdir in $$rev; do \ -+ echo "Making $$target in $$subdir"; \ -+ if test "$$subdir" = "."; then \ -+ local_target="$$target-am"; \ -+ else \ -+ local_target="$$target"; \ -+ fi; \ -+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ -+ || eval $$failcom; \ -+ done && test -z "$$fail" -+tags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ -+ done -+ctags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ -+ done -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ 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 || \ -+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ -+ fi; \ -+ done; \ -+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+distclean-tags: -+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -+ -+distdir: $(DISTFILES) -+ $(am__remove_distdir) -+ mkdir $(distdir) -+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ -+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ -+ list='$(DISTFILES)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 \ -+ test -d "$(distdir)/$$subdir" \ -+ || $(mkdir_p) "$(distdir)/$$subdir" \ -+ || exit 1; \ -+ distdir=`$(am__cd) $(distdir) && pwd`; \ -+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ -+ (cd $$subdir && \ -+ $(MAKE) $(AM_MAKEFLAGS) \ -+ top_distdir="$$top_distdir" \ -+ distdir="$$distdir/$$subdir" \ -+ distdir) \ -+ || exit 1; \ -+ fi; \ -+ done -+ -find $(distdir) -type d ! -perm -755 -exec chmod a+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 $(SHELL) $(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__remove_distdir) -+ -+dist-bzip2: distdir -+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 -+ $(am__remove_distdir) -+ -+dist-tarZ: distdir -+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z -+ $(am__remove_distdir) -+ -+dist-shar: distdir -+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz -+ $(am__remove_distdir) -+ -+dist-zip: distdir -+ -rm -f $(distdir).zip -+ zip -rq $(distdir).zip $(distdir) -+ $(am__remove_distdir) -+ -+dist dist-all: distdir -+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz -+ $(am__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) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ -+ *.tar.bz2*) \ -+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ -+ *.tar.Z*) \ -+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ -+ *.shar.gz*) \ -+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ -+ *.zip*) \ -+ unzip $(distdir).zip ;;\ -+ esac -+ chmod -R a-w $(distdir); chmod a+w $(distdir) -+ mkdir $(distdir)/_build -+ mkdir $(distdir)/_inst -+ chmod a-w $(distdir) -+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ -+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ -+ && cd $(distdir)/_build \ -+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ -+ $(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 -+ $(am__remove_distdir) -+ @(echo "$(distdir) archives ready for distribution: "; \ -+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ -+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' -+distuninstallcheck: -+ @cd $(distuninstallcheck_dir) \ -+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ -+ || { 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 config.h -+installdirs: installdirs-recursive -+installdirs-am: -+install: install-recursive -+install-exec: install-exec-recursive -+install-data: install-data-recursive -+uninstall: uninstall-recursive -+ -+installcheck: installcheck-recursive -+install-strip: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-recursive -+ -+clean-am: clean-generic clean-libtool mostlyclean-am -+ -+distclean: distclean-recursive -+ -rm -f $(am__CONFIG_DISTCLEAN_FILES) -+ -rm -f Makefile -+distclean-am: clean-am distclean-generic distclean-hdr \ -+ distclean-libtool distclean-tags -+ -+dvi: dvi-recursive -+ -+dvi-am: -+ -+html: html-recursive -+ -+info: info-recursive -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-recursive -+ -+installcheck-am: -+ -+maintainer-clean: maintainer-clean-recursive -+ -rm -f $(am__CONFIG_DISTCLEAN_FILES) -+ -rm -rf $(top_srcdir)/autom4te.cache -+ -rm -f Makefile -+maintainer-clean-am: distclean-am maintainer-clean-generic -+ -+mostlyclean: mostlyclean-recursive -+ -+mostlyclean-am: mostlyclean-generic mostlyclean-libtool -+ -+pdf: pdf-recursive -+ -+pdf-am: -+ -+ps: ps-recursive -+ -+ps-am: -+ -+uninstall-am: uninstall-info-am -+ -+uninstall-info: uninstall-info-recursive -+ -+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ -+ check-am clean clean-generic clean-libtool clean-recursive \ -+ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ -+ dist-shar dist-tarZ dist-zip distcheck distclean \ -+ distclean-generic distclean-hdr distclean-libtool \ -+ distclean-recursive distclean-tags distcleancheck distdir \ -+ distuninstallcheck dvi dvi-am html html-am info info-am \ -+ install install-am install-data install-data-am install-exec \ -+ install-exec-am install-info install-info-am install-man \ -+ install-strip installcheck installcheck-am installdirs \ -+ installdirs-am maintainer-clean maintainer-clean-generic \ -+ maintainer-clean-recursive mostlyclean mostlyclean-generic \ -+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ -+ tags tags-recursive uninstall uninstall-am uninstall-info-am -+ -+ -+build_date: -+ echo 'char *build_date = "'`date`'";' > build_date.c -+ echo 'char *build_date;'> build_date.h -+ -+install-am: all-am -+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install-man install-log install-brcm -+ -+install-man: -+ cat docs/iscsiuio.8 | GZIP=$(GZIP_ENV) gzip -c > iscsiuio.8.gz -+ $(INSTALL_PROGRAM) iscsiuio.8.gz $(mandir)/man8 -+ -+install-log: -+ $(INSTALL_PROGRAM) iscsiuiolog $(logdir) -+ -+install-brcm: -+ -rm -f $(sbindir)/brcm_iscsiuio -+ -ln -s $(sbindir)/iscsiuio $(sbindir)/brcm_iscsiuio -+# 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: -diff --git a/iscsiuio/NEWS b/iscsiuio/NEWS -new file mode 100644 -index 0000000..e69de29 -diff --git a/iscsiuio/README b/iscsiuio/README -new file mode 100644 -index 0000000..1a6386f ---- /dev/null -+++ b/iscsiuio/README -@@ -0,0 +1,225 @@ -+Iscsiuio Userspace Tool -+Version 0.7.6.1g -+Jan 14, 2013 -+------------------------------------------------------ -+ -+This tool is to be used in conjunction with the Broadcom NetXtreme II Linux -+driver (Kernel module name: 'bnx2' and 'bnx2x'), Broadcom CNIC driver, -+and the Broadcom iSCSI driver (Kernel module name: 'bnx2i'). -+This user space tool is used in conjunction with the following -+Broadcom Network Controllers: -+ bnx2: BCM5706, BCM5708, BCM5709 devices -+ bnx2x: BCM57710, BCM57711, BCM57711E, BCM57712, BCM57712E, -+ BCM57800, BCM57810, BCM57840 devices -+ -+This utility will provide the ARP and DHCP functionality for the iSCSI offload. -+The communication to the driver is done via Userspace I/O (Kernel module name -+'uio'). -+ -+There is one component to this application: -+ -+1. 'iscsiuio' - This is the daemon which aids in creating iSCSI offloaded -+ connections. -+ -+Dependencies: -+======================================= -+ -+Linux Kernel Dependencies: -+1. Broadcom CNIC driver (cnic) -+1. Broadcom iSCSI offload driver (bnx2i) -+2. Userspace I/O driver (uio) -+ -+Directory Structure of this Package: -+======================================= -+ -+ -+ | -+ +-doc (documentation directory: man pages) -+ | -+ +-src -+ | -+ +- uip - the uIP stack -+ | -+ +- unix - iscsiuio source -+ -+ -+ -+Compiling / Installing -+======================================= -+ -+1. Please untar the tarball. -+2. Run the configure script. This will create the Makefiles and proper -+ header files needed for the build. -+3. Run 'make'. This will create the binary, 'iscsiuio' -+4. Run 'make install' to place the binaries in their installed location. -+ (The default location is '/sbin') -+ -+iscsid IFACE Configuration File: -+======================================= -+The network interface configuration files are driven by the iscsid iface -+files. The configuration data is parsed by iscsid and passed to the uIP -+stack when the connection is established. -+ -+One can use the following iscsiadm commands to create/set the configuration -+using the iface files: -+ -+1. Create the iface file: -+ -+ iscsiadm -m iface -I --op=new -+ -+2. Discover the targets associated with the new iface -+ -+ iscsiadm -m discovery -t st -p -I -+ -+3. Update the iface file: -+ -+ To use a static IPv4 address: -+ iscsiadm -m iface -I --op=update --name=iface.ipaddress --value= -+ -+ To use a DHCP address: -+ iscsiadm -m iface -I --op=update --name=iface.ipaddress --value=0.0.0.0 -+ -+ The following values are required. -+ -+ To specify the bnx2i as the transport: -+ iscsiadm -m iface -I --op=update --name=iface.transport_name --value=bnx2i -+ -+ To specify the network interface to offload with: -+ -+ a. Specify the physical network interface name -+ iscsiadm -m iface -I --op=update --name=iface.net_ifacename --value= -+ -+ b. Specify the iSCSI MAC address of the iSCSI HBA -+ iscsiadm -m iface -I --op=update --name=iface.hwaddress --value= -+ -+4. Now all the settings should be set so that one could connect to their -+ desired iSCSI target. -+ -+ iscsiadm -m node -p -T -I --login -+ -+bnx2 Limitations: -+======================================= -+* RX iSCSI ring: -+ * default ring size is 3 entries -+ * default buffer size is 0x400 bytes -+* TX iSCSI ring: -+ * default ring size of 1 entry -+ * default buffer size is 0x400 bytes -+ -+bnx2x Limitations: -+======================================= -+* RX iSCSI ring: -+ * default ring size is 15 entries -+ * default buffer size is 0x400 bytes -+* TX iSCSI ring: -+ * default ring size of 1 entry -+ * default buffer size is 0x400 bytes -+ -+Other Limiations: -+ -+Any packets larger then the buffer size will not be sent/received by the -+hardware and will be dropped. -+ -+IPv6 support: -+ -+IPv6 NDP (neighbor discovery protocol), DHCPv6 and Static IPv6 are now -+supported. The IPv6 address used for the connection will be matched against -+the DHCPv6/static IPv6 address, the RA (router advertise) address, and the -+assigned link local address. -+ -+VLAN support: -+ -+VLAN support is only supported when using static IP addresses. -+Also, currently only 1 VLAN is supported per physical network interface. -+Either non-VLAN offloaded traffic is allowed or VLAN offloaded traffic -+is allowed. The current implementation does not support both at the -+same time. -+ -+Currently there is no explicit VLAN attributes in the iface file. -+To configure the VLAN offload, the iface.hwaddress attribute or -+physical net_ifacename (without the VLAN identifier) must be used -+to specify the HBA device. For the proper CNIC routing, the -+corresponding L2 interface which has the associated VLAN interface must -+have an IP address on the same subnet. -+ -+The following attributes need to be filled when offloading via the -+VLAN interface: -+ -+ iface.iscsi_ifacename = -+ iface.hwaddress = XX:XX:XX:XX:XX:XX -+ iface.ipaddress = XX.XX.XX.XX -+ iface.transport_name = bnx2i -+ -+Setting IP address: -+ -+On RHEL5.4, RHEL5.5+, RHEL6.0+, and SLES11SP1 distributions, -+discovery login is done over the Linux TCP/IP stack and L2 network -+interface. The ethx interface corresponding to the HBA must -+therefore be in the same IP subnet in order to reach the iSCSI -+target during discovery. However, the HBA's IP address should not -+be the same as the L2 ethx's IP address. -+ -+Starting with RHEL6.1 and all other newer distributions, discovery -+using SendTargets is done over the HBA interface, so there is no -+need for the HBA and L2 network to be on the same subnet. However, -+if VLAN is used on the HBA, they still have to be on the same subnet -+as described above. -+ -+ -+Setting Netmask and Gateway addresses: -+ -+With the current limitations of the iface file, there are no entries -+to allow the user to enter a netmask or gateway IP address. -+ -+The only way to explicitly configure these options is to use DHCP -+addressing. Then the netmask/gateway are set on the DHCP server. -+These settings are then sent to uIP via the DHCPOFFERs. -+ -+If the netmask is not defined then the netmask are automatically -+generated depending on the destination IP address. -+ -+Debugging: -+======================================= -+ -+By default, the iscsiuio daemon does not output any messages to the log file, -+'/var/log/iscsiuio.log'. Message logging is only enabled when the daemon is -+run under debug mode. -+ -+To run the daemon in debug mode please pass the parameter '-d ' -+ -+where the following debug levels are defined: -+ -+PACKET 5 - Print all messages -+DEBUG 4 - Print debug messages -+INFO 3 - Print messages needed to follow the uIP code -+WARN 2 - Print warning messages -+ERROR 1 - Only print critical errors -+ -+A sample banner message: -+ -+INFO [Mon Jun 20 11:23:14 2011]Started iSCSI uio stack: Ver 0.7.0.6 -+INFO [Mon Jun 20 11:23:14 2011]Build date: Mon Jun 20 11:22:05 PDT 2011 -+INFO [Mon Jun 20 11:23:14 2011]Debug mode enabled -+ -+These messages can be used to help debug any issues. -+ -+When debugging issues like the iscsid, the iscsiuio daemon can be run -+in the foreground and the maximum debugging level should be used. -+ -+To place the daemon in foreground mode please pass the parameter '-f' -+ -+Note: The messages to the log file are not flushed unless debugging is enabled. -+ -+Note: If the daemon iscsiuio is running, one will not be able to -+ trample over the existing binary. One might see the following message: -+ -+ 'cannot create regular file `/sbin/iscsiuio': Text file busy' -+ -+ The solve this, please stop the iscsid service and then install. -+ -+Warning: If full debug is enabled, this may quickly fill the partition -+containing the iscsiuio logs. This is because full debugging will log -+packet activity which on a busy network will quickly fill the logs. -+ -+Note: If the bnx2i and cnic drivers are unloaded, then iscsiuio will also -+need to be restarted so that it can determine the iscsid version. -diff --git a/iscsiuio/RELEASE.TXT b/iscsiuio/RELEASE.TXT -new file mode 100644 -index 0000000..2fa19bb ---- /dev/null -+++ b/iscsiuio/RELEASE.TXT -@@ -0,0 +1,1988 @@ -+ Release Notes -+ Broadcom uIP Linux Driver -+ Version 0.7.6.1g -+ 01/14/2013 -+ -+ Broadcom Corporation -+ 5300 California Avenue, -+ Irvine, CA 92617 -+ -+ Copyright (c) 2004 - 2013 Broadcom Corporation -+ All rights reserved -+ -+ -+uIP v0.7.6.1g (Jan 14, 2013) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00067316 - IPv6 address prefix length < 32 -+ bits fails to connect -+ Cause: CIDR notation has an order bug in the IPv6 section -+ whenever the prefix length specified is < 32 -+ Change: Fixed the network order bug -+ Impact: IPv6 only -+ -+ -+uIP v0.7.6.1f (Nov 14, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00065768 - RHEL5.X iscsiuio segfault possible -+ if there is a specific 1024 byte size broadcast -+ packet -+ Cause: This is another corner case where the packet size -+ is also exactly 1024 bytes + padding that exceeded -+ the DMA rx buffer. The previous fix was not -+ sufficient -+ Change: Ensure that the packet size + padding do not -+ exceed this limit. -+ Impact: 10G only. 1G already has the guard against it. -+ -+ -+uIP v0.7.6.1e (Nov 07, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00066397 - Unable to connect to iSCSI target -+ with NPAR enabled on 57840 -+ Cause: The PCI device ID for 57840_MF has been changed from -+ 0x16ab to 0x16a4 -+ Change: Updated the PCI id table to match exactly what the -+ bnx2x 1.76 indicates -+ Impact: 57840 MF -+ -+ -+uIP v0.7.6.1d (Oct 31, 2012) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Added support for open-iscsi-2.0.873 -+ Impact: All -+ -+ -+uIP v0.7.6.1c (Oct 15, 2012) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Added support for 10G 57840 4x10 and 2x20 -+ Impact: 10G 57840 -+ -+ -+uIP v0.7.6.1b (Oct 09, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00065690 - Vconfig method of connecting over -+ tagged vlan with IPv6 failed -+ Cause: The new net param support changes has prevented -+ the old vconfig method from execising the IPv6 -+ acquisition engine properly -+ Change: Ensure that this old vconfig method to run the IPv6 -+ acquisition engine properly and to its entirety -+ Impact: IPv6 + VLAN using the network VLAN configuration -+ method -+ -+ 2. Problem: Cont00065768 - RHEL5.X iscsiuio segfault possible -+ if there is a specific 1024 byte size broadcast -+ packet -+ Cause: This is a corner case where the packet size is -+ exactly 1024 bytes + padding that exceeded the -+ DMA rx buffer. This has been there since day 1. -+ Change: Ensure that the packet size + padding do not -+ exceed this limit. -+ Impact: 10G only. 1G already has the guard against it. -+ -+ -+ Enhancements -+ ------------ -+ 1. Change: Source optimization - backported source code fixes -+ as reported from the upstream submission patch -+ Impact: ALL -+ -+ -+uIP v0.7.4.2k (Aug 10, 2012) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Enable HP SD mode -+ Impact: 577XX/578XX -+ -+ -+uIP v0.7.4.2j (Jul 18, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00064665 - Linux iSCSI connects via gateway address -+ on the wrong subnet -+ Cause: The gateway address used was not checked against the -+ subnet mask specified before the ARP requests. Since -+ this behavior deters from how L2 operates, therefore, -+ a change was made to correct this. -+ Change: Added check of the gateway specified against the subnet -+ specified. -+ Impact: Static IPv4 operation -+ -+ 2. Problem: Cont00064722 - Linux iSCSI unable to force IPv6 LL -+ override (advanced iface parameters) -+ Cause: The override LL address was not being populated to the -+ IPv6 address database correctly -+ Change: Added this correctly to the IPv6 initialization -+ Impact: Static/DHCP IPv6 LL address override only -+ -+ -+uIP v0.7.4.2i (Jul 11, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00064604 - Fails to connect to routed IPv6 target -+ via RA -+ Cause: The default router IPv6 address was not being retrieved -+ correctly. -+ Change: Fixed the default router IPv6 address read -+ Impact: All -+ -+ -+uIP v0.7.4.2h (Jun 15, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00063863 - can't boot into offload image -+ when VLAN is enabled -+ Cause: During the iSCSI login exchange, certain iSCSI targets -+ will send an ARP request even though the TCP connection -+ has been made. The bug was in this ARP reply where -+ the local MAC was corrupted when VLAN is enabled. -+ Change: Fixed the ARP reply packet -+ Impact: All -+ -+ -+uIP v0.7.4.2g (Jun 08, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00063816 - The initiator is not able to connect -+ to the iSCSI targets over VLAN -+ Cause: The process packet routine did not consider the PCP -+ of the VLAN tag to be non-zero. This created a -+ mismatch when this VLAN tag was compared against the -+ nic_iface->vlan_id which doesn't include the PCP. -+ Change: Added the consideration of non-zero PCP -+ Impact: All -+ -+ -+uIP v0.7.4.2f (Jun 04, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00063626 - Static IPv6 does not connect when -+ the prefix len is not set explicitly -+ Cause: The IPv6 prefix length was not set correctly -+ for Static IPv6 operation when CIDR notation is -+ not specified -+ Change: Fixed the default prefix length -+ Impact: Static IPv6 -+ -+ 2. Problem: Cont00063651 - Cannot connect to iSCSI targets -+ HP PTM/SF -+ Cause: Switch-Dependent mode + invalid Outer VLAN was -+ not supported -+ Change: Allow SD+invalid OV to fallback to SF operation mode -+ Impact: 5771X/578XX -+ -+ -+uIP v0.7.4.2e (May 30, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00063443 - Compilation error on SLES11sp1 -+ Cause: The iface_num field was not defined -+ Change: Fixed all references to iface_num -+ Impact: SLES11sp1 -+ -+ 2. Problem: Cont00063518 - HBA fails to connect across router -+ using iface.gateway address -+ Cause: The gateway override code did not populate the -+ address into the lower level engine -+ Change: Fixed the gateway override code -+ Impact: IPv4 Static IP operation -+ -+ 3. Problem: Cont00063567 - IPv6 LL and RA override does not work -+ Cause: The IPv6 LL/RA override addresses were overwritten -+ by the NDP engine -+ Change: Fixed the LL/RA override code -+ Impact: IPv6 operation -+ -+ Enhancements -+ ------------ -+ 1. Added support for jumbo MTU (independent from the L2 MTU) -+ -+ -+uIP v0.7.4.2d (May 21, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00063421 - Static IPv6 cannot connect via RA/LL -+ Cause: The router advertise and the linklocal address -+ were corrupted due to the override capabilities -+ added for the newer open-iscsi util -+ Change: Fixed the address override code -+ Impact: Static IPv6 -+ -+ Enhancements -+ ------------ -+ 1. Allow VLAN tag = 1 (router management) to connect offload -+ -+ -+uIP v0.7.4.2c (May 09, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: RHEL BZ 734010/804580 - issues found by the Coverity -+ scan -+ Cause: 10 code issues were flagged for revision -+ Change: Fixed all area of concern -+ Impact: All -+ -+ 2. Problem: Cont00063177 - IPv4 DHCP with VLAN specification in -+ iface file gets wrong address -+ Cause: The DHCPv4 handler was not discriminating the VLAN tag -+ associated with the DHCP offers from multiple DHCP -+ servers -+ Change: Changed the DHCPv4 handler to drop DHCP offer packets -+ that doesn't match the VLAN tag of the intended DHCP -+ discovery packet -+ Impact: DHCPv4 operation -+ -+ -+uIP v0.7.4.2b (May 01, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00062993 - IPv6 DHCP with VLAN specification in -+ iface file gets wrong address -+ Cause: The DHCPv6 request was using the same DUID as always -+ so the non-VLAN DHCP server responded to our broadcast -+ instead -+ Change: Changed the DHCPv6 request DUID to link address + time -+ instead of link address alone -+ Impact: DHCPv6 operation -+ -+ -+uIP v0.7.4.1j (Apr 24, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00062805 - Cannot login to iSCSI targets on RHEL6.3 -+ Cause: The problem was caused by a change made to the iface_rec -+ structure in the RHEL6.3 inbox open-iscsi util -+ Change: The new changes is now incorporated -+ Impact: All -+ -+ -+uIP v0.7.4.1i (Apr 16, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00062660 - Unable to login with VLAN iscsiuio -+ on RHEL6.2 -+ Cause: The open-iscsi util in RHEL6.2 has a bug which -+ does not pass the correct iface_num to iscsiuio -+ Change: Added workaround to fall back to do the legacy -+ VLAN support if iface_num and vlan_id = 0 -+ Impact: RHEL6.2 -+ -+ -+uIP v0.7.4.1h (Apr 13, 2012) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Added support for the new iface_num field in the iscsi_uevent -+ path -+ -+ 2. Fixed bug in the nic_iface search engine based on iface_num -+ -+ -+uIP v0.7.4.1g (Mar 22, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00061869 - Unable to setup an offload iSCSI -+ connection with FLR/NPAR under ESX5.0:PDA -+ Cause: The physical function ID was previously extracted -+ from the sysfs of the VM which might not be consistent -+ to the actual physical setup due to the function -+ remapping in the hypervisor -+ Change: Read the physical function ID directly from the BAR0 -+ ME register -+ Impact: All -+ -+ 2. Problem: Cont00062170 - IPv6 login/logout stress fails -+ Cause: The packet interrupt was lost after running the test -+ for a much longer period of time. A bug in the -+ packet processing routine was found to exit prematurely -+ Change: Fixed the packet processing routine to process all -+ packets before exiting -+ Impact: All -+ -+ -+uIP v0.7.4.1f (Mar 19, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00062170 - IPv6 login/logout stress fails -+ Cause: The packet buffer routine for IPv6 did not take -+ network order <-> host order into consideration -+ Change: Added a htons call to compensate for the ntohs pair -+ Impact: All -+ -+ -+uIP v0.7.4.1e (Mar 08, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00061978 - Load/unload stress test fails -+ Cause: The bnx2x open request was failing due to the module -+ request procedure. However, the open failure was -+ not being handled correctly. -+ Change: Fixed the device open error handling -+ Impact: 5771X/578XX -+ -+ -+uIP v0.7.4.1d (Mar 02, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00061708 - Unable to log into target after running -+ driver load/unload -+ Cause: A bug was introduced in the previous bug fix (CQ61459) -+ where a pthread_cond_broadcast call was erroneously -+ enabled -+ Change: Restored this back -+ Impact: All -+ -+ -+uIP v0.7.4.1c (Feb 16, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00061529 - Unable to connect to target after an -+ initial failed login attempt until iscsi service is -+ restarted -+ Cause: Upon a failed DHCPv4 acquisition due to the wrong VLAN -+ tag in the initial iface setup, any iscsid connect request -+ from the same NIC will get dropped due to a bug. -+ Change: Fixed the bug which prevented new iscsid connect requests -+ from getting honored -+ Impact: All -+ -+ Enhancements -+ ------------ -+ 1. Updated README -+ -+ -+uIP v0.7.4.1b (Feb 08, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00061513 - Unable to connect to target over VLAN -+ interface -+ Cause: The VLAN id was not properly passed back to the CNIC -+ driver for the offload request -+ Change: Fixed the VLAN id being passed back to the CNIC driver -+ Impact: All -+ -+ -+uIP v0.7.4.1a (Feb 01, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00049383 - No mechanism in iface file to support -+ gateway/routing -+ Change: Added support for the additional network parameters -+ as passed from the newer iscsi-util. -+ These parameters include: -+ IPv4: subnet_mask, gateway -+ IPv6: ipv6_linklocal, ipv6_router, -+ ipv6_autocfg, linklocal_autocfg, router_autocfg -+ VLAN: vlan_id, vlan_priority, vlan_state -+ Other: mtu, port -+ Impact: All -+ -+ 2. Problem: Cont00060806 - Unable to connect target using DHCP over -+ tagged VLAN -+ Change: DHCP+VLAN is a new feature enhancement that was added -+ alongside all other new iface parameters. -+ Impact: All -+ -+ -+ Enhancements -+ ------------ -+ 1. Lock iscsid's connect request with path_req so connect requests -+ with DHCP/Static will no longer override each other -+ -+ 2. Fixed the if_down handler from global to nic specific -+ -+ 3. Fixed various synchronization issues -+ -+ -+uIP v0.7.2.1e (Jan 05, 2012) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00060734 - ifupdown-mtu change stress with active -+ session causes iscsiuio to fail -+ Change: Fixed a race condition between the nic enable thread -+ and when DHCP fails -+ Impact: All -+ -+ -+uIP v0.7.2.1d (Dec 28, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00060368 - segfault observed after failing both -+ mpio paths -+ Change: Various memory leaks were identified and resolved in -+ the nic cleanup path -+ Impact: All -+ -+ -+uIP v0.7.2.1c (Dec 16, 2011) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Disable HP SD mode -+ -+ -+uIP v0.7.2.1b (Dec 14, 2011) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Default iscsiuio logging to off. Use the '-d' -+ option to enable -+ -+ -+uIP v0.7.0.14g (Oct 25, 2011) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Fixed the compilation under RHEL6.2 -+ 2. Change: Added oom_adjust call to prevent OOM Killer from killing -+ iscsiuio when memory is low -+ 3. Change: Added mlockall setting to prevent page swap -+ -+ -+uIP v0.7.0.14f (Oct 20, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00058994 - DOS vulnerability in uip during UDP flood -+ Cause: The warning messages from the UDP handler was logging -+ at a rate faster than the log file logrotate rate -+ Therefore, the system's OOM eventually got kicked in to -+ start terminating running processes which includes iscsiuio -+ Change: Moved several UDP warning messages from the default log -+ level to the debug log level -+ Impact: All (minor) -+ -+ 2. Problem: Cont00059288 - Show segfault w/ SLES11 SP1 Xen kernel -+ Cause: The bnx2x chip_id was not read correctly from the PCIe BAR1 -+ under the Xen kernel. The error was in the mmap area. -+ Change: Corrected the mmapping of the PCI MMIO space. -+ Impact: Xen kernels -+ -+ Enhancements -+ ------------ -+ 1. Change: Changed the log file open error to a warning and let -+ the daemon progress. This was only observed under iSCSI boot -+ -+ -+uIP v0.7.0.14e (Sep 19, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00058678 - Can not iboot target from ipv6 path -+ using VLAN -+ Cause: A bug was found in the path request path where the vlan -+ iface's protocol family was not used correctly in the -+ iface search -+ Change: This has been corrected -+ -+ -+uIP v0.7.0.14d (Sep 16, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00058602 - Can't iboot using IPv6 offload path -+ Cause: The bug was exposed by a fix in 0.7.0.14c where the -+ IPv6 router solicitation timeout exceeded the nic -+ enable thread timeout. -+ Change: The IPv6 router solicitation timeout has been adjusted -+ -+ -+uIP v0.7.0.14c (Sep 01, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00058256 - Sessions fail after loginstress to via -+ simultaneous ipv4 and ipv6 dhcp -+ Cause: Switching between DHCPv4/v6 coupled with VLAN exposed -+ a drawback in our nic_iface architecture design where -+ VLAN is not specified by iscsid. -+ Change: The code was optimized and improved the performance when -+ switching between DHCPv4/v6+VLAN. However, the ultimate -+ fix is to make use of the net config parameters introduced -+ in the newer open-iscsi util which will identify the -+ specific VLAN nic_iface to use. -+ -+ Enhancements -+ ------------ -+ 1. Change: Added support for bnx2x-1.71.00 -+ -+ -+uIP v0.7.0.14b (Aug 23, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00057840 - RHEL6.2 inbox: Unable to connect to -+ targets with 5709 -+ Cause: For cases when the bnx2/bnx2x driver gets removed, the -+ uio database that was built by cnic would have the device -+ ->net reference removed. This has caused an unnecessary -+ timeout of 5s for each stale uio entry in the database. -+ Change: Adjusted the routine which seeks the device->net entry -+ to include more logic instead of hard waiting for 5s. -+ -+ Enhancements -+ ------------ -+ 1. Change: Added support for RHEL6.2 for out-of-box release -+ 2. Change: Updated the man page with -h and -p info -+ 3. Change: Updated the -h info -+ -+ -+uIP v0.7.0.13 (Aug 10, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00057768 - iscsiuio logrotate causes daemon failure -+ Cause: The logrotate script will send a SIGUSR1 signal to notify -+ the iscsiuio daemon of such action. However, the daemon -+ wasn't programmed to catch this signal. -+ Change: Restored the catching of this signal -+ -+ -+uIP v0.7.0.12 (Aug 04, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00050634 - brcm_iscsiuio Tainted: running IoZone, -+ Iometer and receiving a UDP flood on 3260 -+ Cause: Upon iscsiuio termination, because of the UDP flood, -+ the nic thread will be busy servicing those UDP packets -+ while the signal handling thread will free up all nic -+ resources. The two threads were not in sync. -+ Change: Added a nic_remove_all routine to destroy all nic threads -+ before the nic resources get freed. -+ -+ Enhancements -+ ------------ -+ 1. Change: Fixed all warnings as reported by RHELS' Coverity testing. -+ -+ -+uIP v0.7.0.11 (Aug 02, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Erroneous VLAN tag was being passed by iscsid for connect -+ request -+ Cause: The iscsid's iface_rec_t ipc message does not contain this -+ vlan field. This field was added in uIP for future vlan -+ support. Since the buffer allocated to receive such message -+ in uIP didn't get initialized, therefore, garbled up VLAN -+ tag was getting used. -+ Change: Added the initialization of this buffer. -+ -+ -+uIP v0.7.0.10 (Jul 26, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Can't offload when switching from Static to DHCP then back to -+ Static IPv4 when connecting through a VLAN interface -+ Cause: The VLAN processing code did not reinstall the IP address -+ from the default nic_iface to the associated VLAN nic_iface. -+ This was only done on the very first time when the VLAN -+ interface was created and not on subsequent instances. -+ Change: Added code to mirror the default nic_iface IP/netmask/ip_config -+ on the VLAN nic_iface on every new connection request. -+ -+ -+uIP v0.7.0.9 (Jul 19, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Can't offload to 57810 NPAR NIC -+ Cause: The MF/VF variant of the PCI IDs were not supported previously -+ Change: Added support for the MF/VF variants for 57800/57810/57840 -+ -+ -+uIP v0.7.0.8 (Jun 30, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00056522 - Unable to connect to iSCSI target using -+ netxtreme2 package 7.0.9 -+ Cause: The iSCSI L2 ring's CID has changed from 17 to 49 -+ Change: The code now gets L2 iSCSI ring CID from the l2_buf directly. -+ This will work with any version of the cnic driver because -+ the location is a zero before this change. -+ -+ -+uIP v0.7.0.7 (Jun 23, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00056460 - iSCSI Offload boot RHEL5u5 x64 dropped tagged -+ packets with iSCSI Offload Boot with untagged -+ Cause: The ICMP echo replies to the target was corrupted in both -+ 1g and 10g mode -+ Change: The code will now handle both VLAN stripped and no VLAN stripped -+ incoming packets correctly. Also modified the transmit routine -+ to strip out any inline VLAN tag before setting up the hw to -+ insert VLAN tag. -+ -+ -+uIP v0.7.0.6 (Jun 21, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00056231 - DHCPv4 not working with iSCSI HBA w/ -+ linux-nx2 v7.0.7 -+ Cause: The 10g L2 FW HSI has been modified for PCIe performance -+ enhancement in the 7.0.7 package (FW 1.70.20) which uIP -+ has not adapted to. -+ Change: The eth_rx_cqe size has been increased from 32B to 64B. -+ -+ Enhancements -+ ------------ -+ 1. Change: The utility name has changed from brcm_iscsiuio to iscsiuio -+ as preparation for upstream submission. -+ 2. Change: Updated README -+ -+ -+uIP v0.7.0.5 (Jun 02, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00055915 - iSCSI does not connect on 57800 in 4-port mode -+ Cause: The 4-port mode was not being determined correctly -+ Change: Fixed the PORT4MODE register offset and the QZONE_ID macros -+ -+ -+uIP v0.7.0.4 (May 24, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00055832 - linux iscsiboot can not login to target using -+ offload path (57800) -+ Cause: The device ID comparison routine did not take care of the case -+ when one device ID is bitwise superset of another. -+ Change: Fixed the device ID comparison routine. -+ -+ -+uIP v0.7.0.3 (May. 19, 2011) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Updated all fixes to match the released uIP 0.6.4.17 -+ -+ 2. Change: Modified source and Copyright info as preparation for upstream -+ submission -+ -+ -+uIP v0.7.0.2 (May. 03, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00048972 - brcm-iscsi.log has no max size and would grow -+ to consume all free space on hard disk -+ Cause: There was no mechanism to rotate the log -+ Change: Added logrotate entry and SIGUSR1 signal handling for log rotate -+ action -+ -+ 2. Problem: Cont00054996 - Multi-session, multi-protocol mtu stress -+ does not recover all sessions -+ Cause: A segfault was observed during the load/unload module. The -+ problem was caused by an illegal dereference of a pointer -+ when IPv6 couldn't find the longest match address from -+ the ARP (Neighbor) table. -+ Change: Fixed the dereferencing error -+ -+ 3. Problem: Cont00054900 - Linux uIP - Please add ability to connect -+ to routed target with static iface IPv6 -+ Cause: Static IPv6 never runs the IPv6 NDP router sol/adv engine. -+ Change: IPv6 NDP router sol/adv has now been added to static IPv6 -+ operation. -+ -+ 4. Problem: Cont00054996 - Multi-session, multi-protocol mtu stress -+ does not recover all sessions -+ Cause: Segfaults were observed caused by the accessing of the IPv6 -+ NDP structure while the nic is undergoing a reset either -+ due to a DHCPv4 request from iscsid or the handling of -+ if_down due to the NL handler from CNIC. -+ Change: The fix involves the following: -+ - Fixed the handling of staggered IPv4/v6 DHCP/static requests -+ - Fixed memory leak due to reallocation of IPv4 and IPv6 -+ DHCP structs -+ - Fixed the pthread join stuck problem in the handling -+ of the if_down NL message -+ -+ 5. Problem: Cont00054810 - Linux NMI - bnx2x_init_hw_common:PXP2 CFG -+ failed running iSCSI MTU stress test -+ Cause: This only happens in DHCPv4 mode. The problem was caused -+ by contention between the elongated window of performing -+ DHCP in the enable_nic thread while receiving the asynchronous -+ if_down NL message (from the MTU change event) from the -+ CNIC NL thread. The problem occurs when the enable_nic -+ thread tries to call bnx2x_open while the other thread -+ calls the bnx2x_close routine. -+ Change: Fixed mutex lock bugs for the enable_nic thread. Also -+ extended the nic_disable timeout to 10s to compensate for -+ the DHCP operation. -+ -+ 6. Problem: Cont00054818 - RH6.0 - Unable to logout of iSCSI session -+ after running PQA baseline scripts -+ Cause: This was caused by the call to cancel the enable_nic -+ thread when disabling the nic but failed to unlock the -+ nic mutex that the enable_nic thread held. -+ Change: Wake up the enable_nic thread and wait for it to complete -+ instead of canceling it in the nic_disable path. -+ -+ 7. Problem: Cont00054725 - Previous static HBA IP will be used after -+ a new static HBA IP has been created -+ Cause: There was an assumption in the code where if the same -+ nic_iface structure was found based on the nic/vlan pair, -+ the specified IP address would not be used. Instead, it -+ will continue to use the previous defined IP address. -+ Change: The previous IP address will now be compared against the -+ the specified IP address before finishing the parce -+ iface request from iscsid. If different, the current -+ nic will be disabled and then re-enabled with the newly -+ specified IP address. -+ -+ 8. Problem: Cont00054571 - Unable to connect to routed ipv6 target -+ with RA address and iface DHCPv6 -+ Cause: The default router address was not being employed for -+ the IPv6 neighbor negotiation. Additionally, the return -+ address of our neighbor advertisement was incorrect as -+ it should use the best matched src address instead. -+ Change: Fixed both the IPv6 neighbor solicitation and advertisement -+ transmission and handling. -+ -+ 9. Problem: Cont00054510 - fails to login to 32 session with blanket -+ login IPv6 -+ Cause: A bug was introduced in uIP 0.6.4.6 where the NIC_RUNNING -+ flag might not be set when entering the main loop under -+ certain situations depending on the nic bring up. -+ Change: A new NIC_STARTED_RUNNING flag is now defined to fix CQ53511. -+ -+ 10. Problem: Cont00053807 - RA and link local are unable to connect if DHCPv6 -+ fails -+ Cause: The host link local address was not being searched as one of -+ the host address to be replied to CNIC for the connect request. -+ Change: The path reply now includes the search of host link local -+ address as well. -+ -+ 11. Problem: Cont00054236 - iSCSI service must be restarted before an IPv6 -+ connection can be made to the Equalogic target -+ Cause: The problem was intermittent as it depends on which IPv6 address -+ the target was redirecting to. Since uIP was only extracting -+ the target's IPv6 address + MAC from the target's neighbor -+ advertisement packet itself and not from the ICMPv6 option, so -+ the wrong or no MAC address will get send down to CNIC for the -+ connection establishment; hence the no connect. -+ Change: Added the updating of the neighbor discovery table to also use -+ the Target IPv6 address + MAC specified in the incoming neighbor -+ advertisement's ICMPv6 option field. -+ -+ 12. Problem: Cont00053255 - bnx2x panic dump logging into multiple -+ discovered IPv6 nodes (Equalogic IPv6 target) -+ Cause: The bnx2x panic was fixed in the 10g fw 6.4.29. -+ A IPv6 connectivity issue was then found and led to different -+ kernel/uIP crashes. This was caused by the same IPv6 -+ connectivity problem mentioned above. -+ Change: Same as above -+ -+ 13. Problem: Cont00053728 - Sessions never recover after doing initiator-side -+ cable pull test with IPv6 traffic against Equalogic targets -+ Cause: It was discovered that the Equalogic would send out periodic -+ neighbor solicitation to maintain the connection to the -+ initiator. Since uIP was responding with the assigned IPv6 -+ link local address in the neighbor advertisement -+ unconditionally, the target was observed to stop transmitting on -+ the connection specified. -+ Change: The neighbor advertisement generated will now use the dst IPv6 -+ address from the input neighbor solicitation packet instead of -+ the assigned IPv6 link local address for both the packet and the -+ ICMPv6 source IPv6 address. -+ -+ 14. Problem: Compile error under 32-bit OS -+ Cause: A bug was introduced in the previous release 0.6.4.6 which -+ caused a compilation error in 32-bit OS (64-bit compiles -+ fine) -+ Change: Fixed the bug -+ -+ 15. Problem: Cont00053807 - RA and Link local are unable to connect if dhcpv6 -+ fails -+ Cause: There was a bug in the nl reply where the RA address will never -+ be sent back to CNIC for the connection request -+ Change: The best matched address to the dst will now be sent back to -+ CNIC in the path rsp. -+ -+ Enhancements -+ ------------ -+ 1. Change: Updated README to remove the 57713/E references -+ -+ 2. Change: Allow the ICMP option field in the IPv6 Neighbor Advertisement -+ response to be included without discrimination. This fixes -+ an issue connecting against the EQL via RA for DHCPv6. -+ -+ 3. Change: Updated README for the IPv6 operation, VLAN, and discovery. -+ -+ -+uIP v0.7.0.1 (Mar. 29, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00053511 - bnx2x panic dump during ifup/down stress with -+ iSCSI traffic -+ Cause: The panic dump was resolved by the driver's rq dbell size fix. -+ After that, uIP crashed due to the asynchronous if_down event -+ that took the chip resources away while the nic thread is still -+ continuing to try to send DHCP request. -+ Change: Added synchronization between the two threads so proper clean up -+ of the threads can occur. -+ -+ Enhancements -+ ------------ -+ 1. Change: Added support for E3 (57800, 57810, and 57840) -+ -+ -+uIP v0.6.4.5 (Mar. 23, 2011) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Optimized the double VLAN fix of CQ53870 to match -+ what will be submitted for RHELS5.7 and RHELS6.1 inbox -+ -+ -+uIP v0.6.4.4 (Mar. 17, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00053870 - Unable to login to iSCSI target via offload -+ through a Nexus 5020 switch with DCBx enabled -+ Cause: Double VLAN tagging was observed due to DCBx enabled. -+ The chip actually adds a VLAN tag if the txbd does not have -+ VLAN tag enabled under the DCBx environment for PRI setting. -+ Since uIP does not make use of hw assisted VLAN tagging, -+ 2 VLAN tag was observed in the data stream. -+ Change: Enabled hw assisted VLAN tagging in uIP for both 1g and 10g. -+ -+ 2. Problem: Cont00053792 - maxconnections intermittently fail and -+ recover using iface DHCPv4 -+ Cause: The DHCPv4 engine erroneously keeps on requesting for a -+ new lease which tremendously hamper normal path_req -+ operation. The problem is that the lease time parameter -+ has overflowed when converted to ticks count. -+ Change: Expanded the lease timer ticks count parameter from 16 to -+ 32 bits. -+ -+ 3. Problem: Cont00053807 - RA and link local are unable to connect if -+ DHCPv6 fails -+ Cause: The DHCPv6 engine does not have the failover to use RA -+ mechanism -+ Change: Expanded to use best match address instead regardless of -+ DHCPv6 success or not, or using static v6. -+ -+ Enhancements -+ ------------ -+ 1. Change: Cont00051823 - Added man page for brcm_iscsiuio -+ -+ -+uIP v0.6.4.3 (Mar. 15, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00053719 - intermittent logging into targets that -+ are not in the same subnet as defined in the iface -+ Cause: The default route was used erroneously due to a miscompare -+ Change: Fixed this comparison so if the requested dst is not in -+ in the same subnet, uIP would not even ARP out. -+ -+ 2. Problem: Cont00053580 - Unable to do iSCSI boot into Linux OS using -+ 57710 adapters -+ Cause: The E1 iro USTORM_RX_PROD_OFFSET doesn't match the t6.4 fw -+ Change: This is now fixed -+ -+ -+uIP v0.6.4.2 (Feb. 24, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00050343 - HBA does not follow RFC2131 spec for IPv4 -+ DHCP lease expiration -+ Cause: The dhcp engine did not have this feature implemented -+ Change: Added lease time tracking and renewal -+ -+ 2. Problem: Cont00050801 - Unable to connect to target after switching -+ between DHCPv4 to static v4 -+ Cause: The configuration flags got corrupted when switching between -+ dhcp and static or vice versa. -+ Change: Fixed the flag handling. Also needed to zero out the static -+ ip address in the host memory when switching to dhcp. -+ Otherwise, the static ip address will get used mistakenly. -+ -+ Enhancements -+ ------------ -+ 1. Change: Cont00051936 - Added IPv6 NDP and DHCPv6 support. -+ -+ -+uIP v0.6.4.1 (Jan. 27, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00049766 - segfault seen while stopping iscsi service -+ Cause: The logger output routine was accessing the log resource -+ while another thread calls fini_logger to free the same -+ resources -+ Change: Added pthread mutex lock to the logger routine to exclude -+ the initializer, user, and finisher -+ -+ Enhancements -+ ------------ -+ 1. Change: Added new t6.4 HSI and 57713 support. -+ -+ -+uIP v0.6.2.13 (Jan. 04, 2011) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00049665 - iscsiboot:linux failed to boot into iscsi -+ boot image in offload path after 5 iterations -+ Cause: The hw consumer index for the uIP ring got out of sync -+ with the producer index. This has led to the xmit mutex -+ lock be held forever so subsequent ARP requests will not -+ get transmitted to the wire -+ Change: Added this out of sync detection and rescue the xmit mutex -+ lock -+ -+uIP v0.6.2.12 (Dec. 21, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00051820 - Session fails to reconnect after gateway -+ fallback -+ Cause: Under the HSRP test scenario, it was found that an ARP -+ request from the SUT is required in order for the HSRP -+ router to begin sending packets downstream to the SUT. -+ The default ARP age was originally set to 20 minutes -+ before a new ARP request will get sent, -+ Change: Changed the ARP age default to Linux default at 5 minutes -+ -+uIP v0.6.2.11 (Dec. 17, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: For IPv4, the gateway route was not being utilized -+ when the subnet mask given or calculated does not -+ match. This resulted in many unwanted connection -+ attempts. -+ Cause: A bug was found in the default gateway calculation -+ logic which prevented the gateway address from being -+ used. -+ Change: Fixed the default gateway logic -+ -+ 2. Problem: For IPv6, there are scenarios where it won't connect -+ Cause: The IPv6 subnet mask as extracted from the CIDR -+ format might contain garbage data. This garbage data -+ was then used as part of the subnet mask which would -+ prevent the correct address mask. -+ Change: Fixed the subnet mask -+ -+uIP v0.6.2.10 (Dec. 15, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: IPv6 does not connect for non-CIDR iface.ipaddress -+ specification -+ Cause: A bug where all ones was used as the IPv6 netmask -+ instead of all zeroes. This prevented all IPv6 -+ path requests from being honored -+ Change: Fixed the subnet mask used -+ -+uIP v0.6.2.9 (Dec. 14, 2010) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Added IP address CIDR notation support for the -+ iface.ipaddress field in the iface file. -+ This will allow subnet mask to be defined and used. -+ -+uIP v0.6.2.8 (Dec. 9, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: ipv6 + ifup/down fails to reconnect -+ -+ Cause: There were 2 problems found: -+ - the xmit_mutex lock was being held indefinitely -+ - the nl_process_if_down flag for 10g doorbell ringing -+ did not get reinitialized -+ -+ Change: Fixed the xmit_mutex deadlock via trylock -+ Added nl_process_if_down initialization in the IF_DOWN -+ process -+ -+ 2. Problem: Added fix for the NPAR disabled for 57712 -+ -+ Cause: The mac address was not handled correctly -+ -+ Change: Fixed the mac address handling. Also requires corresponding -+ kernel component for the complete fix -+ -+uIP v0.6.2.7 (Dec. 7, 2010) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Use the gateway address from the DHCP server the -+ destination IP address is not in the current subnet. -+ -+uIP v0.6.2.6 (Nov. 16, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Warning message seen in the kernel logs, -+ "uio uio2: uevent: unsupported action string" -+ -+ Cause: The improper string was echo'ed into the UIO trigger -+ field. With an improper string, this message would -+ appear in the kernel logs. -+ -+ Change: uIP will now write the string "online" to the UIO -+ trigger field. This is the string expected by the -+ Linux kernel base driver. -+ -+ 2. Problem: uIP would segfault during a heavily login/logout -+ iSCSI subsystem reset senario -+ -+ Cause: A double free occurred in the logging portion of the -+ uIP code, but this was root cause to a double free when -+ manipulating the NetLink buffers. -+ -+ Change: Properly look at the return code from the routine which -+ will read NetLink messages. Also only free buffers -+ if they are allocated. -+ -+ Enhancements -+ ------------ -+ 1. Change: Add ability to print kernel version and machine -+ architecture to further help debug problems. -+ -+ 2. Change: Apply the netmask from DHCP if provided. -+ -+uIP v0.6.2.5 (Nov. 10, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: iscsid would try to conenct with unintended iSCSI -+ targets -+ -+ Cause: uIP would blindly return the iSCSI target MAC address -+ regardless if the iSCSI target is reachable via the -+ given port. -+ -+ Change: uIP will try to filter the requests coming from CNIC -+ by automatically generating a network mask based off -+ the configured IP addressed. Then this netmask is -+ masked with the destination IP address. If there is -+ a match, then the path_req is allowed through. -+ -+ 2. Problem: Problems reconnecting back to the target when running -+ MTU stress tests. -+ -+ Cause: cnic/bnx2i and uIP could possibly get out of sync when -+ an if_down message is sent. -+ -+ Change: uIP will now immediately react to the if_down message, -+ and flush all the path req's and then to process to -+ if_close. -+ -+ Enhancements -+ ------------ -+ 1. Change: Fix compile warnings for src/unix/nic_nl.c, -+ and src/unix/main.c -+ -+uIP v0.6.2.4 (Nov. 4, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: iSCSI HBA: brcm_iscsiuio segfault during ifdown -+ with many active sessions -+ -+ Cause: uIP will segfault when traversing the error path when -+ an iSCSI connection is starting but the sysfs entries -+ have not been created yet. -+ -+ Change: Use the errno value rather then the one from the file -+ descriptor because the file descriptor will be NULL and -+ the NULL dereference will cause a segfault. -+ -+ Enhancements -+ ------------ -+ 1. Change: Added initial changes for iSCSI multi-function support for -+ 10G NIC's. -+ 2. Change: Add more detailed messages for error pathes in nic_utils -+ -+uIP v0.6.2.3 (October 28, 2010) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Add support for bnx2x-1.62.x drivers -+ -+uIP v0.6.2.2 (October 18, 2010) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Only allow iSCSI connections with known bnx2x HSI's. -+ -+uIP v0.6.2.1 (October 7, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: After multiple MTU changes, the ethtool IOCTL used to -+ determine the bnx2x driver version fails and eventually -+ iSCSI connections would not reconnect. -+ -+ Cause: The socket file descriptor used during the ethtool IOCTL -+ call was never closed and leaked. -+ -+ Change: On the error path when calling the ethtool IOCTL, the -+ file descriptor is now properly closed. -+ -+uIP v0.5.39 (September 15, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Could not offload IPv4 VLAN connection when the target tries -+ to ARP the iSCSI initiator -+ -+ Cause: In the ARP reply, the ether field was incorrect. -+ -+ Change: Properly set the ether field to 802.1Q type (0x8100) -+ -+uIP v0.5.38 (September 14, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: uIP would cause a panic dump when the NIC was going down -+ -+ Cause: uIP and CNIC where not synchonized on NIC state -+ -+ Change: Check if the RX BD's which are zero'ed by CNIC when the -+ NIC is going down. If the BD addresses are zero, then -+ uIP will drop the TX packets. -+ -+uIP v0.5.37 (August 21, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: uIP would segfault on ifup/ifdown stress test when using -+ DHCP to determine local IP address. -+ -+ Cause: The uIP would use a NULL buffer during data transmission. -+ -+ Change: Drop packets when there are no buffer avaliable. -+ -+uIP v0.5.36 (August 21, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: iSCSI boot would not completely login after the pivot -+ root operation. -+ -+ Cause: The uIP would not properly start the NIC interface. -+ -+ Change: uIP should only check the NIC state to determine whether -+ to start the NIC thread or not. -+ -+ 2. Problem: uIP would segfault during if'up if'down testing. -+ -+ Cause: The uIP would improperly start 2 NIC threads for the -+ same NIC interface. -+ -+ Change: uIP should properly lock the NIC list when disabling/removing -+ the NIC threads. -+ -+ -+uIP v0.5.35 (August 20, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Sessions would hang with ethtool self-test -+ -+ Cause: The uIP would hang because the socket layer was stuck -+ because there is much contention for that socket. This -+ would hang the CNIC thread. -+ -+ Change: Remove any IOCTL calls in uIP which may colide with -+ the ethtool self test. The driver version is only -+ capture during uIP initialization. -+ -+ 2. Problem: There were session recovery issue when using DHCP -+ if up/down tests. -+ -+ Cause: The uIP would hang because the DHCP requests would -+ timeout if the network interface is downed which would -+ hang all the other uIP threads. -+ -+ Change: Ensure that the DHCP state machine had exit points -+ if the network interface was down'ed. -+ -+ -+uIP v0.5.34 (August 18, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Sessions would not recover with ethtool self-test -+ -+ Cause: The uIP would hang because either the NetLink buffer is -+ full or that any socket operations used to manipulate -+ multicast addresses would block. -+ -+ Change: Ensure that the socket used for multicast addressing is -+ set to nonblocking. Drain the NetLink buffer without -+ using the eventing, but with a more aggressive poll routine. -+ -+ 2. Problem: Sessions would not recover with L2 driver load/unload on -+ RHEL 6.0 SS9 -+ -+ Cause: The uIP would close the NIC thread too early and would -+ deadlock on cloing the NIC thread. -+ -+ Change: Ensure that the NIC thread is canceled/closed only in one -+ location, in the NIC remove routine. -+ -+ -+uIP v0.5.33 (August 17, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Error message seen from the uIP stack for valid packets. -+ -+ Cause: The uIP was incorrectly marking logging messages for valid -+ packets as errors because it didn't know how to parase them. -+ -+ Change: Changed the following from error to debug message -+ ipv6: invalid version -+ ipv4: invalid version or header length. -+ icmpv6: unknown ICMP message. -+ ip: neither tcp nor icmp -+ Changed the following from error to warn message -+ udp: bad checksum -+ tcp: bad checksum -+ tcp: got reset, aborting connection. -+ -+ 2. Problem: After multiple iterations the loading and unloading of -+ the Broadcom Linux drivers with active connections -+ would not cause the sessions to recover on RHEL 6.0 -+ snapshot 9. -+ -+ Cause: There was a deadlock in the nic mutex -+ -+ Change: Lock ordering for the nic mutex and nic list mutex must -+ be inforced. -+ -+ 3. Problem: After multiple iterations of running the ethtool selftest -+ the Broadcom Linux drivers with active connections -+ would not cause the sessions to recover on RHEL 5.5. -+ -+ Cause: The Netlink buffer between uIP and CNIC would get full. -+ -+ Change: Poll more regularly for packets in the Netlink buffer -+ from 4 times a second to 100 times a 1 second. -+ Drain packets during the PATH_REQ packet pull. -+ -+ -+uIP v0.5.32 (August 14, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Error message 'nic eth0: Didn't find type 0xaa bb' seen. -+ -+ Cause: Valid non-DIX Ethernet packets as being passed to the -+ uIP. uIP will drop these packets but should be logged -+ correctly. -+ -+ Change: These packets are valid, and should only be logged for -+ debugging purposes. -+ -+ 2. Problem: Error message 'Dropped previous transmitted packet' seen. -+ -+ Cause: The TX ring is full, and here uIP is trying to transmit a -+ packet which will be dropped. This is a valid state but -+ the log message is marked incorrectly -+ -+ Change: These messages are not warnings and should be logging when -+ debugging is enabled. -+ -+ 3. Problem: Error message: "iscsi_ipc eth0 Transport name is not -+ equal expected: got: bnx2i" seen. -+ -+ Cause: The iface_rec structure is different between iscsid version. -+ For RHEL 5.5, iscsid is versioned 871, for RHEL 6.0 is -+ versioned 872. -+ -+ Change: Allow uIP to compile against a different version of iscsid. -+ -+ -+uIP v0.5.31 (August 12, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Softlock would occur showing that the NetLink table -+ lock was taken but never released. -+ -+ Cause: NetLink socket buffer would fill with constant PATH_REQ -+ messages preventing PATH_REQ response from libiscsi -+ -+ Change: Now uIP will drain the NetLink buffer while looking for -+ a response. -+ -+ Enhancements -+ ------------ -+ 1. Change: Add documentation for VLAN configuration and restrictions. -+ -+ -+uIP v0.5.30 (August 6, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: iscsid thread will stall if closing the uio files nodes -+ is stuck -+ -+ Cause: uIP would indefinitely block waiting for the mutex shared -+ by the close routine. -+ -+ Change: Now uIP will try and poll a bit for the mutex. If it can't -+ get this mutex in the iscsid thread then an error is return -+ rather then hold the thread. -+ -+ 2. Problem: IPv6 Unicast Neighbor Adveriserments would have the -+ ICMPv6 option header specifying a MAC. -+ -+ Cause: uIP should use the source IPv6 address to detmine whether -+ to strip the option header or not and not the target address -+ in the ICMPv6 field. -+ -+ Change: The uIP stack return a unicast IPv6 Neighbor Advertisement -+ without the ICMPv6 option as a response to unicast -+ IPv6 Neighbor Solicitations. -+ -+ 3. Problem: There would be TCP SYN packets with improper MAC address. -+ -+ Cause: A zero'ed MAC address was not passed to CNIC to indicate an -+ error or if the IP address didn't resolve. -+ -+ Change: The uIP stack will now return a zero'ed MAC address if it -+ can't find any entries. -+ -+ -+uIP v0.5.29 (August 6, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: "uip udp: no matching connection found: lport: 35072" -+ seen numerous times in the brcm_iscsiuio log file -+ -+ Cause: This message was incorrectly marked as an error -+ -+ Change: These messages are valid log entries especially if the -+ packet was a broadcast UDP packet not destined for the SUT -+ I will change the code to mark these logs entries as debug. -+ -+ -+uIP v0.5.28 (August 5, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Can't login into a redirected Equilogic Target -+ -+ Cause: The Equilogic Target uses a unicast IPv6 Neighbor -+ Solicitation to test if the host is up. The uIP stack -+ would return a Neighbor Advertisement with an unneeded -+ ICMPv6 option. -+ -+ Change: Only have the uIP stack return a unicast IPv6 Neighbor -+ Advertisement without the ICMPv6 option. -+ -+ 2. Problem: With older bnx2/bnx2x/cnic/bnx2i driver combinations -+ uIP would segfault when these drivers were unloaded. -+ -+ Cause: When the older drivers were removed, the underlying uio -+ instance was removed causing uIP to have a stale file handle. -+ When uIP finally closes using this stale file handle, either -+ uIP would segfault, or there would be an error in the -+ uio_release() path. -+ -+ Change: Only have the uIP close if the UIO file node exists. -+ -+ -+uIP v0.5.27 (July 31, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: iSCSI HBA: Unable to use DHCP address for iSCSI interface -+ if a connection was previously made with a static address -+ on bnx2 devices. -+ -+ Cause: Because the device is closed and reopen'ed the TX consumer -+ indexes were not persisted -+ -+ Change: Only discard the TX consumer indexes only when the devices -+ will be discarded or closed -+ -+ Enhancements -+ ------------ -+ 1. Change: Change CNIC references to bnx2 in the bnx2 user space -+ driver. -+ -+ -+uIP v0.5.26 (July 30, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: iSCSI HBA: Unable to use DHCP address for iSCSI interface -+ if a connection was previously made with a static address on -+ bnx2x devices. -+ -+ Cause: Because the device is closed and reopen'ed the TX consumer -+ indexes were not persisted -+ -+ Change: Only discard the TX consumer indexes only when the devices -+ will be discarded -+ -+ 2. Problem: IPv6 using VLAN's didn't login -+ -+ Cause: The uIP code used to determine if the packet was an IPv6 -+ or not was not working. This VLAN packets for IPv6 were -+ being mis-interpreted. -+ -+ Change: Make the function is_ipv6() VLAN aware -+ -+ 3. Problem: Persistant targets was not loggin in during boot -+ -+ Cause: If udev was slow and the /dev/uio* were creatly slowly -+ uIP would fail. -+ -+ Change: Poll uIP waiting for /dev/uio* file nodes. -+ -+uIP v0.5.25 (July 27, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: When using IPv4 DHCP, there are no initial DHCP Discover -+ packets were not seen on the wire. -+ -+ Cause: Packets generated from the app handler from the uIP stack -+ were not placed on the wire. -+ -+ Change: Packets originating from the uIP stack are now always placed -+ on the wire. -+ -+uIP v0.5.24 (July 25, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: One would see invalid packet packets flow through the -+ uIP stack, where the logs would indicate there is a packet -+ with an invalid length -+ -+ Cause: The BD and CQE consumer indexes were not properly incremented -+ and masked. -+ -+ Change: The BD index is now properly masked. The CQE index is not -+ incremented using the CQE index rather the mistaken BD index. -+ -+ Impact: 10G only -+ -+ 2. Problem: uIP would segfault during the booting of the machine. -+ -+ Cause: uIP was using a NULL data pointer because there was an -+ incorrect packet passed to the stack. -+ -+ Change: Only allow uIP to process data if the packet exists. -+ -+ 3. Problem: uIP would stop processing packets -+ -+ Cause: The uIP code would not properly drain the CQE ring causing -+ it to eventually be full -+ -+ Change: Consume all the CQE elements even if they are ethernet types -+ or not. -+ -+ Impact: 10G only -+ -+ 4. Problem: uIP would stop after if/down of the network interface. -+ -+ Cause: uIP was not kick starting the NIC loop thread properly. -+ -+ Change: Ensure that the NIC loop thread is started by when iscsid -+ request that the interface start the offload. Mark the NIC -+ only if the thread is truly canceled. -+ -+ -+uIP v0.5.23 (July 20, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Segfault during brcm_iscsiuio initialization -+ -+ Cause: uIP was using a NULL data pointer, because a different -+ thread re-initialized the uIP stack -+ -+ Change: Properly synchronize the initialization of the stack -+ -+ 2. Problem: Deadlock during the printing of heavy debug messages -+ -+ Cause: The variable macro structures would point to invalid -+ data -+ -+ Change: With each invocation of va_copy() a corresponding -+ invocation of va_end() in the same function for the proper -+ cleanup -+ -+ 3. Problem: uIP would hang when the interface could go up/down -+ -+ Cause: uIP would get out of sync with the state of the network -+ interface -+ -+ Change: Instead of detriving state from the UIO file nodes, uIP -+ will take direction from iscsid on when interfaces will be -+ started. -+ -+uIP v0.5.22 (July 15, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Unable to reconnect via iSCSI offload after -+ ifup/ifdown -+ -+ Cause: uIP was stuck on the thread when closing the NIC main -+ loop -+ -+ Change: Properly synchronize the NetLink CNIC and uevent threads -+ -+ 2. Problem: uIP would crash during boot up. -+ -+ Cause: uIP would overwrite a memory location which was already -+ freed during nic_remove(). -+ -+ Change: Since the NIC is freed there is no need to write to -+ update the NIC flags -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Added IPv6 Link Local support -+ -+ -+uIP v0.5.21 (July 5, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Unable to connect via iSCSI offload after -+ changing L2 address -+ -+ Cause: uIP didn't notice the network inferface going down -+ -+ Change: Allow uIP to persist the stack's IP address after -+ a reset -+ -+ 2. Problem: Unable to connect via IPv4 and IPv6 concurrently -+ -+ Cause: uIP didn't notice the network inferface going down -+ -+ Change: Allow uIP to persist the stack's IP address after -+ a reset and properly bring up the interface -+ -+ 3. Problem: Unable to connect via VLAN -+ -+ Cause: IP address was no persisted after a device reset -+ -+ Change: When CNIC requests a path request, uIP will use the -+ VLAN passed by the CNIC. -+ -+ -+uIP v0.5.20 (June 24, 2010) -+ -+ -+uIP v0.5.20 (June 24, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Certain IPv6 addresses are not repsonded to by -+ the target. -+ -+ Cause: The MAC was generated from the target's IPv6 -+ address not the deterived multicast IPv6 address. -+ -+ Change: The destination MAC address should be deterived -+ from the packet's destination IPv6 address and -+ not the target. -+ -+ 2. Problem: brcm_iscsiuio would segfault when L2 interface is -+ bought up and down after being logged into -+ -+ Cause: The NIC thread was not stopped properly -+ -+ Change: When the UIO device is remove and when the -+ cooresponding NIC tracked by brcm_iscsiuio, the -+ daemon would properly wait for the NIC thread to -+ stop. -+ -+ -+uIP v0.5.19 (June 22, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Can't login after boot -+ -+ Cause: If NIC interfaces are brough up and down quickly -+ uIP wait on an invalid NIC thread -+ -+ Change: Only wait for the NIC thread if the NIC thread -+ exists. -+ -+uIP v0.5.18 (June 21, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Does not compile on SLES 11 SP1 -+ -+ Cause: Automake cached files were included as part of the -+ uIP-0.5.17 package -+ -+ Change: Remove automake cached files, and allow these files -+ to be generated each time the source is compiled -+ -+ 2. Problem: Does not always receive multicast packets -+ -+ Cause: Multicast bit was not set in SORT USER 2 register -+ -+ Change: brcm_iscsiuio will now set the SORT USER 2 registers -+ with both the broadcast and multicast bits. -+ -+ 3. Problem: Existing iSCSI connections do not reconnect after -+ operations which require equivalent driver -+ load/unload operations -+ -+ Cause: Multiple path requests would trample NIC configurations -+ -+ Change: Allow only one path request at a time -+ -+uIP v0.5.17 (June 16, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: IPv6 neighbor solicitations from brcm_iscsiuio could -+ not be responded to -+ -+ Cause: The IPv6 neighbor solicitation packet had an invalid -+ multicast MAC address -+ -+ Change: Properly set the MAC address multicast bit and OR -+ with the IPv6 destination address -+ -+ 2. Problem: NIC state was not properly synchronized and noticed -+ by Shyam Iyer -+ -+ Change: Properly lock the NIC device when changing state -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Listen for iscsid before daemonizing to close a timing -+ gap which might allow iscsid to start before uIP is -+ completely initialized. -+ -+uIP v0.5.16 (June 2, 2010) -+======================================================= -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Formally add IPv6 support. Only a static IPv6 address -+ is supported. -+ -+uIP v0.5.15 (May 20, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: brcm_iscsiuio would echo packets off the wire -+ -+ Cause: Stale packets from the uIP stack could potentially -+ make it onto the wire causing a network flood -+ -+ Change: Only place on the wire packets uIP intended to place -+ on the wire. Drop all other packets. -+ -+uIP v0.5.14 (May 18, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: brcm_iscsiuio would crash when offloading using a -+ bnx2x device /dev/mem could not be -+ opened, (ie. SE Linux enabled) -+ -+ Cause: /dev/mem could not be opened, (ie. SE Linux enabled) -+ and then the NIC would be improperly initialized. -+ -+ Change: If /dev/mem is not able to be opened, then the device -+ is closed -+ -+ 2. Problem: brcm_iscsiuio would crash when brcm_iscsiuio is -+ being shutdown -+ -+ Cause: The NIC mutex was deferenced imporperly when the NIC -+ is being closed -+ -+ Change: Take the NIC mutex lock only when the NIC is closed. -+ -+uIP v0.5.13 (May 16, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: brcm_iscsiuio would crash with heavy traffic directed -+ at the iSCSI traffic -+ -+ Cause: Packets which are sized between 1006-1024 bytes would -+ crash brcm_iscsiuio because brcm_iscsiuio is not sized -+ to handle such large packets -+ -+ Change: Drop large packets, properly hold the NIC mutex lock -+ for the duration when NIC fields are being used. -+ -+ -+uIP v0.5.12 (May 13, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: brcm_iscsiuio could crash on when L2 interface is -+ ifdown'ed -+ -+ Cause: The local NIC pointer was not initialized properly -+ in the routine parse_iface() -+ -+ Change: Properly initialize the NIC pointer -+ -+ 2. Problem: Documentation referred to older admin_client which -+ doesn't exist any more because brcm_iscsiuio uses -+ the iscsid iface file -+ -+ Change: Remove the stale references -+ -+ -+uIP v0.5.11 (May 11, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: brcm_iscsiuio could crash on invalid packet sizes -+ -+ Cause: The hardware BD could be a large value because of a -+ hardware error -+ -+ Change: Limit the size of the packet dumped to the MTU size -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: During the running of the configure script now -+ the script will check for ar and ranlib binaries -+ -+ -+uIP v0.5.10 (May 03, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: BCM57712 not recognized -+ -+ Cause: The PCI ID's in the bnx2x file were missing. -+ -+ Change: Added proper BCM57712, BCM57712E, BCM57713, BCM57713E -+ PCI ID's -+ -+ 2. Problem: (CQ 47481) brcm_iscsiuio not installed in correct location -+ -+ Cause: Default install path for autoconf is /usr/local -+ -+ Change: Change the default prefix to '/' so the brcm_iscsiuio -+ binary is installed to /sbin/ -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Remove dependency on Yacc and Lex -+ -+ -+uIP v0.5.9 (April 28, 2010) -+======================================================= -+ -+ Fixes -+ ----- -+ 1. Problem: bnx2x T6.0 driver would not login -+ -+ Cause: The bnx2x code was not using the T6.0 HSI offsets -+ -+ Change: Determine to bnx2x driver version eariler to properly use the -+ T4.8 or T6.0 HSI -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Collapse all the various locks to use the NIC lock to shrink -+ memory footprint -+ -+ 2. Change: Consolidate upper layer checksumming code -+ -+ -+uIP v0.5.5 (March 02, 2010) -+======================================================= -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Add support for T6.0 bnx2x HSI and 57712. -+ -+ 2. Change: Initial support for IPv6 -+ -+uIP v0.5.8 (April 22, 2010) -+======================================================= -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Add support for T6.0 bnx2x HSI and 57712. -+ -+ 2. Change: Initial support for IPv6 -+ -+uIP v0.5.7 (March 17, 2010) -+======================================================= -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Add to documentation on discovering on a particular -+ iface before logging in -+ -+uIP v0.5.6 (Mar 05, 2009) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: bnx2x panic dump would be seen when sending -+ traffic to uIP -+ -+ Cause: The TX producer index was not properly -+ incrementing when the wrapping occured -+ -+ Change: Do not skip the last TX producer index like the -+ TX BD's -+ -+ Impact: None. -+ -+uIP v0.5.5 (March 02, 2010) -+======================================================= -+ Initial release -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Add to documentation on debugging/logging for uIP -+ -+ -+uIP v0.5.4 (Feb 22, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Compile error where 'ETHERTYPE_VLAN' define -+ is missing -+ -+ Cause: Certain distributions do not define 'ETHERTYPE_VLAN' -+ in the header file "net/ethernet.h". -+ -+ Change: Added proper defines for ETHERTYPE_VLAN when necessary -+ -+ Impact: None. -+ -+ -+uIP v0.5.3 (Feb 18, 2010) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Using VLAN's on offloaded iSCSI connections -+ -+ Cause: (CQ45983) VLAN tags were not being properly inserted -+ when sending the ARP request packets -+ -+ Change: Added VLAN tags when sending ARP request packets -+ -+ Impact: None. -+ -+ -+uIP v0.5.2 (Dec 10, 2009) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Switching between 10G and 1G iSCSI offloaded -+ devices caused login connectivity problems -+ -+ Cause: The NIC devices within uIP were not cleanup -+ properly. -+ -+ Change: The NIC structure is not re-initialized and the -+ NIC thread is destroyed when the host network -+ interface is brought down. -+ -+ Impact: None. -+ -+ -+uIP v0.5.1 (Dec 9, 2009) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: 10G devices behind PCI bridges would not collect -+ -+ Cause: PCI bus:slot.func string was parsed incorrectly -+ because the bridge string was used -+ -+ Change: Parse the proper PCI bus:slot.func string. -+ -+ Impact: None. -+ -+ -+uIP v0.5.0b (Nov 24, 2009) -+======================================================= -+ Initial release -+ -+ Enhancements -+ ------------ -+ -+ 1. Change: Add Broadcom 10G iSCSI offload support -+ -+ Impact: Linux -diff --git a/iscsiuio/aclocal.m4 b/iscsiuio/aclocal.m4 -new file mode 100644 -index 0000000..1673344 ---- /dev/null -+++ b/iscsiuio/aclocal.m4 -@@ -0,0 +1,7276 @@ -+# generated automatically by aclocal 1.9.6 -*- Autoconf -*- -+ -+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -+# 2005 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. -+ -+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -+ -+# serial 48 AC_PROG_LIBTOOL -+ -+ -+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) -+# ----------------------------------------------------------- -+# If this macro is not defined by Autoconf, define it here. -+m4_ifdef([AC_PROVIDE_IFELSE], -+ [], -+ [m4_define([AC_PROVIDE_IFELSE], -+ [m4_ifdef([AC_PROVIDE_$1], -+ [$2], [$3])])]) -+ -+ -+# AC_PROG_LIBTOOL -+# --------------- -+AC_DEFUN([AC_PROG_LIBTOOL], -+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl -+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX -+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. -+ AC_PROVIDE_IFELSE([AC_PROG_CXX], -+ [AC_LIBTOOL_CXX], -+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX -+ ])]) -+dnl And a similar setup for Fortran 77 support -+ AC_PROVIDE_IFELSE([AC_PROG_F77], -+ [AC_LIBTOOL_F77], -+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 -+])]) -+ -+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. -+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run -+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. -+ AC_PROVIDE_IFELSE([AC_PROG_GCJ], -+ [AC_LIBTOOL_GCJ], -+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], -+ [AC_LIBTOOL_GCJ], -+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], -+ [AC_LIBTOOL_GCJ], -+ [ifdef([AC_PROG_GCJ], -+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) -+ ifdef([A][M_PROG_GCJ], -+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) -+ ifdef([LT_AC_PROG_GCJ], -+ [define([LT_AC_PROG_GCJ], -+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) -+])])# AC_PROG_LIBTOOL -+ -+ -+# _AC_PROG_LIBTOOL -+# ---------------- -+AC_DEFUN([_AC_PROG_LIBTOOL], -+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl -+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl -+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl -+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl -+ -+# This can be used to rebuild libtool when needed -+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" -+ -+# Always use our own libtool. -+LIBTOOL='$(SHELL) $(top_builddir)/libtool' -+AC_SUBST(LIBTOOL)dnl -+ -+# Prevent multiple expansion -+define([AC_PROG_LIBTOOL], []) -+])# _AC_PROG_LIBTOOL -+ -+ -+# AC_LIBTOOL_SETUP -+# ---------------- -+AC_DEFUN([AC_LIBTOOL_SETUP], -+[AC_PREREQ(2.50)dnl -+AC_REQUIRE([AC_ENABLE_SHARED])dnl -+AC_REQUIRE([AC_ENABLE_STATIC])dnl -+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -+AC_REQUIRE([AC_CANONICAL_HOST])dnl -+AC_REQUIRE([AC_CANONICAL_BUILD])dnl -+AC_REQUIRE([AC_PROG_CC])dnl -+AC_REQUIRE([AC_PROG_LD])dnl -+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl -+AC_REQUIRE([AC_PROG_NM])dnl -+ -+AC_REQUIRE([AC_PROG_LN_S])dnl -+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl -+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! -+AC_REQUIRE([AC_OBJEXT])dnl -+AC_REQUIRE([AC_EXEEXT])dnl -+dnl -+ -+AC_LIBTOOL_SYS_MAX_CMD_LEN -+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -+AC_LIBTOOL_OBJDIR -+ -+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -+_LT_AC_PROG_ECHO_BACKSLASH -+ -+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 -+ -+# 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 to delay expansion of an escaped shell variable in a -+# double_quote_subst'ed string. -+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' -+ -+# Sed substitution to avoid accidental globbing in evaled expressions -+no_glob_subst='s/\*/\\\*/g' -+ -+# Constants: -+rm="rm -f" -+ -+# Global variables: -+default_ofile=libtool -+can_build_shared=yes -+ -+# All known linkers require a `.a' archive for static linking (except MSVC, -+# which needs '.lib'). -+libext=a -+ltmain="$ac_aux_dir/ltmain.sh" -+ofile="$default_ofile" -+with_gnu_ld="$lt_cv_prog_gnu_ld" -+ -+AC_CHECK_TOOL(AR, ar, false) -+AC_CHECK_TOOL(RANLIB, ranlib, :) -+AC_CHECK_TOOL(STRIP, strip, :) -+ -+old_CC="$CC" -+old_CFLAGS="$CFLAGS" -+ -+# Set sane defaults for various variables -+test -z "$AR" && AR=ar -+test -z "$AR_FLAGS" && AR_FLAGS=cru -+test -z "$AS" && AS=as -+test -z "$CC" && CC=cc -+test -z "$LTCC" && LTCC=$CC -+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -+test -z "$DLLTOOL" && DLLTOOL=dlltool -+test -z "$LD" && LD=ld -+test -z "$LN_S" && LN_S="ln -s" -+test -z "$MAGIC_CMD" && MAGIC_CMD=file -+test -z "$NM" && NM=nm -+test -z "$SED" && SED=sed -+test -z "$OBJDUMP" && OBJDUMP=objdump -+test -z "$RANLIB" && RANLIB=: -+test -z "$STRIP" && STRIP=: -+test -z "$ac_objext" && ac_objext=o -+ -+# Determine commands to create old-style static archives. -+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -+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 \$oldlib" -+ ;; -+ *) -+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" -+ ;; -+ esac -+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -+fi -+ -+_LT_CC_BASENAME([$compiler]) -+ -+# Only perform the check for file, if the check method requires it -+case $deplibs_check_method in -+file_magic*) -+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then -+ AC_PATH_MAGIC -+ fi -+ ;; -+esac -+ -+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) -+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -+enable_win32_dll=yes, enable_win32_dll=no) -+ -+AC_ARG_ENABLE([libtool-lock], -+ [AC_HELP_STRING([--disable-libtool-lock], -+ [avoid locking (might break parallel builds)])]) -+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes -+ -+AC_ARG_WITH([pic], -+ [AC_HELP_STRING([--with-pic], -+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], -+ [pic_mode="$withval"], -+ [pic_mode=default]) -+test -z "$pic_mode" && pic_mode=default -+ -+# Use C for the default configuration in the libtool script -+tagname= -+AC_LIBTOOL_LANG_C_CONFIG -+_LT_AC_TAGCONFIG -+])# AC_LIBTOOL_SETUP -+ -+ -+# _LT_AC_SYS_COMPILER -+# ------------------- -+AC_DEFUN([_LT_AC_SYS_COMPILER], -+[AC_REQUIRE([AC_PROG_CC])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_AC_SYS_COMPILER -+ -+ -+# _LT_CC_BASENAME(CC) -+# ------------------- -+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -+AC_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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+]) -+ -+ -+# _LT_COMPILER_BOILERPLATE -+# ------------------------ -+# Check for compiler boilerplate output or warnings with -+# the simple compiler test code. -+AC_DEFUN([_LT_COMPILER_BOILERPLATE], -+[ac_outfile=conftest.$ac_objext -+printf "$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. -+AC_DEFUN([_LT_LINKER_BOILERPLATE], -+[ac_outfile=conftest.$ac_objext -+printf "$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 conftest* -+])# _LT_LINKER_BOILERPLATE -+ -+ -+# _LT_AC_SYS_LIBPATH_AIX -+# ---------------------- -+# 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. -+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], -+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi],[]) -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+])# _LT_AC_SYS_LIBPATH_AIX -+ -+ -+# _LT_AC_SHELL_INIT(ARG) -+# ---------------------- -+AC_DEFUN([_LT_AC_SHELL_INIT], -+[ifdef([AC_DIVERSION_NOTICE], -+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], -+ [AC_DIVERT_PUSH(NOTICE)]) -+$1 -+AC_DIVERT_POP -+])# _LT_AC_SHELL_INIT -+ -+ -+# _LT_AC_PROG_ECHO_BACKSLASH -+# -------------------------- -+# Add some code to the start of the generated configure script which -+# will find an echo command which doesn't interpret backslashes. -+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], -+[_LT_AC_SHELL_INIT([ -+# Check that we are running under the correct shell. -+SHELL=${CONFIG_SHELL-/bin/sh} -+ -+case X$ECHO in -+X*--fallback-echo) -+ # Remove one level of quotation (which was required for Make). -+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` -+ ;; -+esac -+ -+echo=${ECHO-echo} -+if test "X[$]1" = X--no-reexec; then -+ # Discard the --no-reexec flag, and continue. -+ shift -+elif test "X[$]1" = X--fallback-echo; then -+ # Avoid inline document here, it may be left over -+ : -+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then -+ # Yippee, $echo works! -+ : -+else -+ # Restart under the correct shell. -+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} -+fi -+ -+if test "X[$]1" = X--fallback-echo; then -+ # used as fallback echo -+ shift -+ cat </dev/null 2>&1 && unset CDPATH -+ -+if test -z "$ECHO"; then -+if test "X${echo_test_string+set}" != Xset; then -+# find a string as large as possible, as long as the shell can cope with it -+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do -+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... -+ if (echo_test_string=`eval $cmd`) 2>/dev/null && -+ echo_test_string=`eval $cmd` && -+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null -+ then -+ break -+ fi -+ done -+fi -+ -+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ : -+else -+ # The Solaris, AIX, and Digital Unix default echo programs unquote -+ # backslashes. This makes it impossible to quote backslashes using -+ # echo "$something" | sed 's/\\/\\\\/g' -+ # -+ # So, first we look for a working echo in the user's PATH. -+ -+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -+ for dir in $PATH /usr/ucb; do -+ IFS="$lt_save_ifs" -+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && -+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ echo="$dir/echo" -+ break -+ fi -+ done -+ IFS="$lt_save_ifs" -+ -+ if test "X$echo" = Xecho; then -+ # We didn't find a better echo, so look for alternatives. -+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ # This shell has a builtin print -r that does the trick. -+ echo='print -r' -+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && -+ test "X$CONFIG_SHELL" != X/bin/ksh; then -+ # If we have ksh, try running configure again with it. -+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} -+ export ORIGINAL_CONFIG_SHELL -+ CONFIG_SHELL=/bin/ksh -+ export CONFIG_SHELL -+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} -+ else -+ # Try using printf. -+ echo='printf %s\n' -+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ # Cool, printf works -+ : -+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && -+ test "X$echo_testing_string" = 'X\t' && -+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL -+ export CONFIG_SHELL -+ SHELL="$CONFIG_SHELL" -+ export SHELL -+ echo="$CONFIG_SHELL [$]0 --fallback-echo" -+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && -+ test "X$echo_testing_string" = 'X\t' && -+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ echo="$CONFIG_SHELL [$]0 --fallback-echo" -+ else -+ # maybe with a smaller string... -+ prev=: -+ -+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do -+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null -+ then -+ break -+ fi -+ prev="$cmd" -+ done -+ -+ if test "$prev" != 'sed 50q "[$]0"'; then -+ echo_test_string=`eval $prev` -+ export echo_test_string -+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} -+ else -+ # Oops. We lost completely, so just stick with echo. -+ echo=echo -+ fi -+ fi -+ fi -+ fi -+fi -+fi -+ -+# Copy echo and quote the copy suitably for passing to libtool from -+# the Makefile, instead of quoting the original, which is used later. -+ECHO=$echo -+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then -+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" -+fi -+ -+AC_SUBST(ECHO) -+])])# _LT_AC_PROG_ECHO_BACKSLASH -+ -+ -+# _LT_AC_LOCK -+# ----------- -+AC_DEFUN([_LT_AC_LOCK], -+[AC_ARG_ENABLE([libtool-lock], -+ [AC_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 __oline__ "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-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|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-*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-*linux*) -+ LD="${LD-ld} -m elf_x86_64" -+ ;; -+ ppc*-*linux*|powerpc*-*linux*) -+ LD="${LD-ld} -m elf64ppc" -+ ;; -+ s390*-*linux*) -+ 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_TRY_LINK([],[],[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 -+ ;; -+sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;; -+ *) LD="${LD-ld} -64" ;; -+ esac -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ -+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], -+[*-*-cygwin* | *-*-mingw* | *-*-pw32*) -+ AC_CHECK_TOOL(DLLTOOL, dlltool, false) -+ AC_CHECK_TOOL(AS, as, false) -+ AC_CHECK_TOOL(OBJDUMP, objdump, false) -+ ;; -+ ]) -+esac -+ -+need_locks="$enable_libtool_lock" -+ -+])# _LT_AC_LOCK -+ -+ -+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) -+# ---------------------------------------------------------------- -+# Check whether the given compiler option works -+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], -+[AC_REQUIRE([LT_AC_PROG_SED]) -+AC_CACHE_CHECK([$1], [$2], -+ [$2=no -+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) -+ printf "$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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&AS_MESSAGE_LOG_FD -+ echo "$as_me:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 -+ ifelse([$5], , :, [$5]) -+else -+ ifelse([$6], , :, [$6]) -+fi -+])# AC_LIBTOOL_COMPILER_OPTION -+ -+ -+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -+# [ACTION-SUCCESS], [ACTION-FAILURE]) -+# ------------------------------------------------------------ -+# Check whether the given compiler option works -+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], -+[AC_CACHE_CHECK([$1], [$2], -+ [$2=no -+ save_LDFLAGS="$LDFLAGS" -+ LDFLAGS="$LDFLAGS $3" -+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 conftest* -+ LDFLAGS="$save_LDFLAGS" -+]) -+ -+if test x"[$]$2" = xyes; then -+ ifelse([$4], , :, [$4]) -+else -+ ifelse([$5], , :, [$5]) -+fi -+])# AC_LIBTOOL_LINKER_OPTION -+ -+ -+# AC_LIBTOOL_SYS_MAX_CMD_LEN -+# -------------------------- -+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], -+[# 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*) -+ # 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; -+ ;; -+ -+ 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 -+ ;; -+ -+ 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 -+ ;; -+ *) -+ # 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. -+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} -+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ -+ = "XX$teststring") >/dev/null 2>&1 && -+ new_result=`expr "X$teststring" : ".*" 2>&1` && -+ lt_cv_sys_max_cmd_len=$new_result && -+ test $i != 17 # 1/2 MB should be enough -+ do -+ i=`expr $i + 1` -+ teststring=$teststring$teststring -+ done -+ 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` -+ ;; -+ 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 -+])# AC_LIBTOOL_SYS_MAX_CMD_LEN -+ -+ -+# _LT_AC_CHECK_DLFCN -+# ------------------ -+AC_DEFUN([_LT_AC_CHECK_DLFCN], -+[AC_CHECK_HEADERS(dlfcn.h)dnl -+])# _LT_AC_CHECK_DLFCN -+ -+ -+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -+# --------------------------------------------------------------------- -+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], -+[AC_REQUIRE([_LT_AC_CHECK_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 < -+#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 -+ -+#ifdef __cplusplus -+extern "C" void exit (int); -+#endif -+ -+void fnord() { int i=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; -+ /* dlclose (self); */ -+ } -+ else -+ puts (dlerror ()); -+ -+ exit (status); -+}] -+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_AC_TRY_DLOPEN_SELF -+ -+ -+# AC_LIBTOOL_DLOPEN_SELF -+# ---------------------- -+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], -+[AC_REQUIRE([_LT_AC_CHECK_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*) -+ 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="-dld"], -+ [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="-dld"]) -+ ]) -+ ]) -+ ]) -+ ]) -+ ]) -+ ;; -+ 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_AC_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_AC_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 -+])# AC_LIBTOOL_DLOPEN_SELF -+ -+ -+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) -+# --------------------------------- -+# Check to see if options -c and -o are simultaneously supported by compiler -+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], -+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], -+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], -+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no -+ $rm -r conftest 2>/dev/null -+ mkdir conftest -+ cd conftest -+ mkdir out -+ printf "$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:__oline__: $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:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_AC_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 .. -+ rmdir conftest -+ $rm conftest* -+]) -+])# AC_LIBTOOL_PROG_CC_C_O -+ -+ -+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) -+# ----------------------------------------- -+# Check to see if we can do hard links to lock some files if needed -+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], -+[AC_REQUIRE([_LT_AC_LOCK])dnl -+ -+hard_links="nottested" -+if test "$_LT_AC_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 -+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS -+ -+ -+# AC_LIBTOOL_OBJDIR -+# ----------------- -+AC_DEFUN([AC_LIBTOOL_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 -+])# AC_LIBTOOL_OBJDIR -+ -+ -+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) -+# ---------------------------------------------- -+# Check hardcoding attributes. -+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], -+[AC_MSG_CHECKING([how to hardcode library paths into programs]) -+_LT_AC_TAGVAR(hardcode_action, $1)= -+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ -+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ -+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then -+ -+ # We can hardcode non-existant directories. -+ if test "$_LT_AC_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_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && -+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then -+ # Linking always hardcodes the temporary library directory. -+ _LT_AC_TAGVAR(hardcode_action, $1)=relink -+ else -+ # We can link without hardcoding, and we can hardcode nonexisting dirs. -+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate -+ fi -+else -+ # We cannot hardcode anything, or else we can only hardcode existing -+ # directories. -+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported -+fi -+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) -+ -+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; 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 -+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH -+ -+ -+# AC_LIBTOOL_SYS_LIB_STRIP -+# ------------------------ -+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], -+[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" -+ AC_MSG_RESULT([yes]) -+ else -+ AC_MSG_RESULT([no]) -+fi -+ ;; -+ *) -+ AC_MSG_RESULT([no]) -+ ;; -+ esac -+fi -+])# AC_LIBTOOL_SYS_LIB_STRIP -+ -+ -+# AC_LIBTOOL_SYS_DYNAMIC_LINKER -+# ----------------------------- -+# PORTME Fill in your ld.so characteristics -+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], -+[AC_MSG_CHECKING([dynamic linker characteristics]) -+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" -+if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then -+ # 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. -+ 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 -+else -+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -+fi -+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 -+ 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' -+ ;; -+ -+aix4* | aix5*) -+ version_type=linux -+ 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*) -+ 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=`$echo "X$lib" | $Xsed -e '\''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' -+ ;; -+ -+beos*) -+ library_names_spec='${libname}${shared_ext}' -+ dynamic_linker="$host_os ld.so" -+ shlibpath_var=LIBRARY_PATH -+ ;; -+ -+bsdi[[45]]*) -+ version_type=linux -+ 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*) -+ version_type=windows -+ shrext_cmds=".dll" -+ need_version=no -+ need_lib_prefix=no -+ -+ case $GCC,$host_os in -+ yes,cygwin* | yes,mingw* | yes,pw32*) -+ 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' -+ 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="/usr/lib /lib/w32api /lib /usr/local/lib" -+ ;; -+ mingw*) -+ # MinGW DLLs use traditional 'lib' prefix -+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then -+ # It is most probably a Windows format PATH printed by -+ # mingw gcc, but we are running on Cygwin. Gcc prints its search -+ # path with ; separators, and with drive letters. We can handle the -+ # drive letters (cygwin fileutils understands them), so leave them, -+ # especially as we might pass files found there to a mingw objdump, -+ # which wouldn't understand a cygwinified path. Ahh. -+ 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 -+ ;; -+ 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 -+ ;; -+ -+ *) -+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' -+ ;; -+ esac -+ dynamic_linker='Win32 ld.exe' -+ # 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}${versuffix}$shared_ext ${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`' -+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. -+ if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` -+ else -+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' -+ fi -+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' -+ ;; -+ -+dgux*) -+ version_type=linux -+ 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 -+ ;; -+ -+freebsd1*) -+ dynamic_linker=no -+ ;; -+ -+kfreebsd*-gnu) -+ version_type=linux -+ 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='GNU ld.so' -+ ;; -+ -+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[[123]]*) 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 -+ ;; -+ freebsd*) # from 4.6 on -+ shlibpath_overrides_runpath=yes -+ hardcode_into_libs=yes -+ ;; -+ esac -+ ;; -+ -+gnu*) -+ version_type=linux -+ 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 -+ 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' -+ ;; -+ -+interix3*) -+ version_type=linux -+ 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 -+ 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 Linux ELF. -+linux*) -+ version_type=linux -+ 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 -+ # 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 -+ -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390x*|powerpc64*) -+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext -+ if AC_TRY_EVAL(ac_compile); then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ -+ # 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/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $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' -+ ;; -+ -+knetbsd*-gnu) -+ version_type=linux -+ 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='GNU 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 -+ 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=linux -+ 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 -+ ;; -+ -+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" -+ ;; -+ -+solaris*) -+ version_type=linux -+ 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 -+ 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 -+ export_dynamic_flag_spec='${wl}-Blargedynsym' -+ 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 -+ 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 -+ 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' -+ shlibpath_overrides_runpath=no -+ else -+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' -+ shlibpath_overrides_runpath=yes -+ 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' -+ ;; -+ -+uts4*) -+ version_type=linux -+ 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 -+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER -+ -+ -+# _LT_AC_TAGCONFIG -+# ---------------- -+AC_DEFUN([_LT_AC_TAGCONFIG], -+[AC_ARG_WITH([tags], -+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], -+ [include additional configurations @<:@automatic@:>@])], -+ [tagnames="$withval"]) -+ -+if test -f "$ltmain" && test -n "$tagnames"; then -+ if test ! -f "${ofile}"; then -+ AC_MSG_WARN([output file `$ofile' does not exist]) -+ fi -+ -+ if test -z "$LTCC"; then -+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`" -+ if test -z "$LTCC"; then -+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) -+ else -+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) -+ fi -+ fi -+ if test -z "$LTCFLAGS"; then -+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" -+ fi -+ -+ # Extract list of available tagged configurations in $ofile. -+ # Note that this assumes the entire list is on one line. -+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` -+ -+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -+ for tagname in $tagnames; do -+ IFS="$lt_save_ifs" -+ # Check whether tagname contains only valid characters -+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in -+ "") ;; -+ *) AC_MSG_ERROR([invalid tag name: $tagname]) -+ ;; -+ esac -+ -+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null -+ then -+ AC_MSG_ERROR([tag name \"$tagname\" already exists]) -+ fi -+ -+ # Update the list of available tags. -+ if test -n "$tagname"; then -+ echo appending configuration tag \"$tagname\" to $ofile -+ -+ case $tagname in -+ CXX) -+ if test -n "$CXX" && ( test "X$CXX" != "Xno" && -+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || -+ (test "X$CXX" != "Xg++"))) ; then -+ AC_LIBTOOL_LANG_CXX_CONFIG -+ else -+ tagname="" -+ fi -+ ;; -+ -+ F77) -+ if test -n "$F77" && test "X$F77" != "Xno"; then -+ AC_LIBTOOL_LANG_F77_CONFIG -+ else -+ tagname="" -+ fi -+ ;; -+ -+ GCJ) -+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then -+ AC_LIBTOOL_LANG_GCJ_CONFIG -+ else -+ tagname="" -+ fi -+ ;; -+ -+ RC) -+ AC_LIBTOOL_LANG_RC_CONFIG -+ ;; -+ -+ *) -+ AC_MSG_ERROR([Unsupported tag name: $tagname]) -+ ;; -+ esac -+ -+ # Append the new tag name to the list of available tags. -+ if test -n "$tagname" ; then -+ available_tags="$available_tags $tagname" -+ fi -+ fi -+ done -+ IFS="$lt_save_ifs" -+ -+ # Now substitute the updated list of available tags. -+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then -+ mv "${ofile}T" "$ofile" -+ chmod +x "$ofile" -+ else -+ rm -f "${ofile}T" -+ AC_MSG_ERROR([unable to update list of available tagged configurations.]) -+ fi -+fi -+])# _LT_AC_TAGCONFIG -+ -+ -+# AC_LIBTOOL_DLOPEN -+# ----------------- -+# enable checks for dlopen support -+AC_DEFUN([AC_LIBTOOL_DLOPEN], -+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) -+])# AC_LIBTOOL_DLOPEN -+ -+ -+# AC_LIBTOOL_WIN32_DLL -+# -------------------- -+# declare package support for building win32 DLLs -+AC_DEFUN([AC_LIBTOOL_WIN32_DLL], -+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) -+])# AC_LIBTOOL_WIN32_DLL -+ -+ -+# AC_ENABLE_SHARED([DEFAULT]) -+# --------------------------- -+# implement the --enable-shared flag -+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -+AC_DEFUN([AC_ENABLE_SHARED], -+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -+AC_ARG_ENABLE([shared], -+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], -+ [build shared libraries @<:@default=]AC_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=]AC_ENABLE_SHARED_DEFAULT) -+])# AC_ENABLE_SHARED -+ -+ -+# AC_DISABLE_SHARED -+# ----------------- -+# set the default shared flag to --disable-shared -+AC_DEFUN([AC_DISABLE_SHARED], -+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -+AC_ENABLE_SHARED(no) -+])# AC_DISABLE_SHARED -+ -+ -+# AC_ENABLE_STATIC([DEFAULT]) -+# --------------------------- -+# implement the --enable-static flag -+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -+AC_DEFUN([AC_ENABLE_STATIC], -+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -+AC_ARG_ENABLE([static], -+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], -+ [build static libraries @<:@default=]AC_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=]AC_ENABLE_STATIC_DEFAULT) -+])# AC_ENABLE_STATIC -+ -+ -+# AC_DISABLE_STATIC -+# ----------------- -+# set the default static flag to --disable-static -+AC_DEFUN([AC_DISABLE_STATIC], -+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -+AC_ENABLE_STATIC(no) -+])# AC_DISABLE_STATIC -+ -+ -+# AC_ENABLE_FAST_INSTALL([DEFAULT]) -+# --------------------------------- -+# implement the --enable-fast-install flag -+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -+AC_DEFUN([AC_ENABLE_FAST_INSTALL], -+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -+AC_ARG_ENABLE([fast-install], -+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], -+ [optimize for fast installation @<:@default=]AC_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=]AC_ENABLE_FAST_INSTALL_DEFAULT) -+])# AC_ENABLE_FAST_INSTALL -+ -+ -+# AC_DISABLE_FAST_INSTALL -+# ----------------------- -+# set the default to --disable-fast-install -+AC_DEFUN([AC_DISABLE_FAST_INSTALL], -+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -+AC_ENABLE_FAST_INSTALL(no) -+])# AC_DISABLE_FAST_INSTALL -+ -+ -+# AC_LIBTOOL_PICMODE([MODE]) -+# -------------------------- -+# implement the --with-pic flag -+# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -+AC_DEFUN([AC_LIBTOOL_PICMODE], -+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -+pic_mode=ifelse($#,1,$1,default) -+])# AC_LIBTOOL_PICMODE -+ -+ -+# AC_PROG_EGREP -+# ------------- -+# This is predefined starting with Autoconf 2.54, so this conditional -+# definition can be removed once we require Autoconf 2.54 or later. -+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], -+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], -+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 -+ then ac_cv_prog_egrep='grep -E' -+ else ac_cv_prog_egrep='egrep' -+ fi]) -+ EGREP=$ac_cv_prog_egrep -+ AC_SUBST([EGREP]) -+])]) -+ -+ -+# AC_PATH_TOOL_PREFIX -+# ------------------- -+# find a file program which can recognise shared library -+AC_DEFUN([AC_PATH_TOOL_PREFIX], -+[AC_REQUIRE([AC_PROG_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="ifelse([$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 <&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 -+ -+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 -+])# AC_PATH_TOOL_PREFIX -+ -+ -+# AC_PATH_MAGIC -+# ------------- -+# find a file program which can recognise a shared library -+AC_DEFUN([AC_PATH_MAGIC], -+[AC_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 -+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) -+ else -+ MAGIC_CMD=: -+ fi -+fi -+])# AC_PATH_MAGIC -+ -+ -+# AC_PROG_LD -+# ---------- -+# find the pathname to the GNU or non-GNU linker -+AC_DEFUN([AC_PROG_LD], -+[AC_ARG_WITH([gnu-ld], -+ [AC_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]) -+AC_REQUIRE([LT_AC_PROG_SED])dnl -+AC_REQUIRE([AC_PROG_CC])dnl -+AC_REQUIRE([AC_CANONICAL_HOST])dnl -+AC_REQUIRE([AC_CANONICAL_BUILD])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; 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 -+ ;; -+ -+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]) 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 -+ ;; -+ -+interix3*) -+ # 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 Linux ELF. -+linux*) -+ 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=unknown -+ ;; -+ -+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 -+ ;; -+ -+solaris*) -+ 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 -+ ;; -+ -+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) -+ lt_cv_deplibs_check_method=pass_all -+ ;; -+esac -+]) -+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 -+])# AC_DEPLIBS_CHECK_METHOD -+ -+ -+# AC_PROG_NM -+# ---------- -+# find the pathname to a BSD-compatible name lister -+AC_DEFUN([AC_PROG_NM], -+[AC_CACHE_CHECK([for BSD-compatible 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 -+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -+fi]) -+NM="$lt_cv_path_NM" -+])# AC_PROG_NM -+ -+ -+# AC_CHECK_LIBM -+# ------------- -+# check for math library -+AC_DEFUN([AC_CHECK_LIBM], -+[AC_REQUIRE([AC_CANONICAL_HOST])dnl -+LIBM= -+case $host in -+*-*-beos* | *-*-cygwin* | *-*-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_CHECK_LIBM -+ -+ -+# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) -+# ----------------------------------- -+# sets LIBLTDL to the link flags for the libltdl convenience library and -+# LTDLINCL to the include flags for the libltdl header and adds -+# --enable-ltdl-convenience to the configure arguments. Note that -+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, -+# it is assumed to be `libltdl'. LIBLTDL will be prefixed with -+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' -+# (note the single quotes!). If your package is not flat and you're not -+# using automake, define top_builddir and top_srcdir appropriately in -+# the Makefiles. -+AC_DEFUN([AC_LIBLTDL_CONVENIENCE], -+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -+ case $enable_ltdl_convenience in -+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; -+ "") enable_ltdl_convenience=yes -+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; -+ esac -+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la -+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) -+ # For backwards non-gettext consistent compatibility... -+ INCLTDL="$LTDLINCL" -+])# AC_LIBLTDL_CONVENIENCE -+ -+ -+# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) -+# ----------------------------------- -+# sets LIBLTDL to the link flags for the libltdl installable library and -+# LTDLINCL to the include flags for the libltdl header and adds -+# --enable-ltdl-install to the configure arguments. Note that -+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, -+# and an installed libltdl is not found, it is assumed to be `libltdl'. -+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with -+# '${top_srcdir}/' (note the single quotes!). If your package is not -+# flat and you're not using automake, define top_builddir and top_srcdir -+# appropriately in the Makefiles. -+# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -+AC_DEFUN([AC_LIBLTDL_INSTALLABLE], -+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -+ AC_CHECK_LIB(ltdl, lt_dlinit, -+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], -+ [if test x"$enable_ltdl_install" = xno; then -+ AC_MSG_WARN([libltdl not installed, but installation disabled]) -+ else -+ enable_ltdl_install=yes -+ fi -+ ]) -+ if test x"$enable_ltdl_install" = x"yes"; then -+ ac_configure_args="$ac_configure_args --enable-ltdl-install" -+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la -+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) -+ else -+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no" -+ LIBLTDL="-lltdl" -+ LTDLINCL= -+ fi -+ # For backwards non-gettext consistent compatibility... -+ INCLTDL="$LTDLINCL" -+])# AC_LIBLTDL_INSTALLABLE -+ -+ -+# AC_LIBTOOL_CXX -+# -------------- -+# enable support for C++ libraries -+AC_DEFUN([AC_LIBTOOL_CXX], -+[AC_REQUIRE([_LT_AC_LANG_CXX]) -+])# AC_LIBTOOL_CXX -+ -+ -+# _LT_AC_LANG_CXX -+# --------------- -+AC_DEFUN([_LT_AC_LANG_CXX], -+[AC_REQUIRE([AC_PROG_CXX]) -+AC_REQUIRE([_LT_AC_PROG_CXXCPP]) -+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) -+])# _LT_AC_LANG_CXX -+ -+# _LT_AC_PROG_CXXCPP -+# ------------------ -+AC_DEFUN([_LT_AC_PROG_CXXCPP], -+[ -+AC_REQUIRE([AC_PROG_CXX]) -+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 -+fi -+])# _LT_AC_PROG_CXXCPP -+ -+# AC_LIBTOOL_F77 -+# -------------- -+# enable support for Fortran 77 libraries -+AC_DEFUN([AC_LIBTOOL_F77], -+[AC_REQUIRE([_LT_AC_LANG_F77]) -+])# AC_LIBTOOL_F77 -+ -+ -+# _LT_AC_LANG_F77 -+# --------------- -+AC_DEFUN([_LT_AC_LANG_F77], -+[AC_REQUIRE([AC_PROG_F77]) -+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) -+])# _LT_AC_LANG_F77 -+ -+ -+# AC_LIBTOOL_GCJ -+# -------------- -+# enable support for GCJ libraries -+AC_DEFUN([AC_LIBTOOL_GCJ], -+[AC_REQUIRE([_LT_AC_LANG_GCJ]) -+])# AC_LIBTOOL_GCJ -+ -+ -+# _LT_AC_LANG_GCJ -+# --------------- -+AC_DEFUN([_LT_AC_LANG_GCJ], -+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], -+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], -+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], -+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], -+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], -+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) -+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) -+])# _LT_AC_LANG_GCJ -+ -+ -+# AC_LIBTOOL_RC -+# ------------- -+# enable support for Windows resource files -+AC_DEFUN([AC_LIBTOOL_RC], -+[AC_REQUIRE([LT_AC_PROG_RC]) -+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) -+])# AC_LIBTOOL_RC -+ -+ -+# AC_LIBTOOL_LANG_C_CONFIG -+# ------------------------ -+# Ensure that the configuration vars for the C compiler are -+# suitably defined. Those variables are subsequently used by -+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) -+AC_DEFUN([_LT_AC_LANG_C_CONFIG], -+[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_AC_TAGVAR(objext, $1)=$objext -+ -+# Code to be used in simple compile tests -+lt_simple_compile_test_code="int some_variable = 0;\n" -+ -+# Code to be used in simple link tests -+lt_simple_link_test_code='int main(){return(0);}\n' -+ -+_LT_AC_SYS_COMPILER -+ -+# save warnings/boilerplate of simple test code -+_LT_COMPILER_BOILERPLATE -+_LT_LINKER_BOILERPLATE -+ -+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) -+AC_LIBTOOL_PROG_COMPILER_PIC($1) -+AC_LIBTOOL_PROG_CC_C_O($1) -+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -+AC_LIBTOOL_PROG_LD_SHLIBS($1) -+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -+AC_LIBTOOL_SYS_LIB_STRIP -+AC_LIBTOOL_DLOPEN_SELF -+ -+# 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 -+ ;; -+ -+aix4* | aix5*) -+ 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]) -+ -+AC_LIBTOOL_CONFIG($1) -+ -+AC_LANG_POP -+CC="$lt_save_CC" -+])# AC_LIBTOOL_LANG_C_CONFIG -+ -+ -+# AC_LIBTOOL_LANG_CXX_CONFIG -+# -------------------------- -+# Ensure that the configuration vars for the C compiler are -+# suitably defined. Those variables are subsequently used by -+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. -+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) -+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], -+[AC_LANG_PUSH(C++) -+AC_REQUIRE([AC_PROG_CXX]) -+AC_REQUIRE([_LT_AC_PROG_CXXCPP]) -+ -+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+_LT_AC_TAGVAR(allow_undefined_flag, $1)= -+_LT_AC_TAGVAR(always_export_symbols, $1)=no -+_LT_AC_TAGVAR(archive_expsym_cmds, $1)= -+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -+_LT_AC_TAGVAR(hardcode_direct, $1)=no -+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= -+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no -+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -+_LT_AC_TAGVAR(hardcode_automatic, $1)=no -+_LT_AC_TAGVAR(module_cmds, $1)= -+_LT_AC_TAGVAR(module_expsym_cmds, $1)= -+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown -+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -+_LT_AC_TAGVAR(no_undefined_flag, $1)= -+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no -+ -+# Dependencies to place before and after the object being linked: -+_LT_AC_TAGVAR(predep_objects, $1)= -+_LT_AC_TAGVAR(postdep_objects, $1)= -+_LT_AC_TAGVAR(predeps, $1)= -+_LT_AC_TAGVAR(postdeps, $1)= -+_LT_AC_TAGVAR(compiler_lib_search_path, $1)= -+ -+# Source file extension for C++ test sources. -+ac_ext=cpp -+ -+# Object file extension for compiled C++ test sources. -+objext=o -+_LT_AC_TAGVAR(objext, $1)=$objext -+ -+# Code to be used in simple compile tests -+lt_simple_compile_test_code="int some_variable = 0;\n" -+ -+# Code to be used in simple link tests -+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' -+ -+# ltmain only uses $CC for tagged configurations so make sure $CC is set. -+_LT_AC_SYS_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_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++"} -+compiler=$CC -+_LT_AC_TAGVAR(compiler, $1)=$CC -+_LT_CC_BASENAME([$compiler]) -+ -+# We don't want -fno-exception wen compiling C++ code, so set the -+# no_builtin_flag separately -+if test "$GXX" = yes; then -+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' -+else -+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -+fi -+ -+if test "$GXX" = yes; then -+ # Set up default GNU C++ configuration -+ -+ AC_PROG_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' -+ _LT_AC_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_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ else -+ _LT_AC_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_AC_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 "\-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_AC_TAGVAR(ld_shlibs, $1)=yes -+case $host_os in -+ aix3*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ aix4* | aix5*) -+ 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]].*|aix5*) -+ 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_AC_TAGVAR(archive_cmds, $1)='' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ -+ 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 -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ else -+ # We have old collect2 -+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_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 -+ -+ # It seems that -bexpall does not export symbols beginning with -+ # underscore (_), so it is better to generate a list of symbols to export. -+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)='-berok' -+ # Determine the default libpath from the value encoded in an empty executable. -+ _LT_AC_SYS_LIBPATH_AIX -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" -+ -+ _LT_AC_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 echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" -+ else -+ if test "$host_cpu" = ia64; then -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" -+ _LT_AC_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_AC_SYS_LIBPATH_AIX -+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' -+ # Exported symbols can be pulled into shared objects from archives -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes -+ # This is similar to how AIX traditionally builds its shared libraries. -+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)=unsupported -+ # Joseph Beckenbach says some releases of gcc -+ # support --undefined. This deserves some investigation. FIXME -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ else -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ -+ chorus*) -+ case $cc_basename in -+ *) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, -+ # as there is no search path for DLLs. -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported -+ _LT_AC_TAGVAR(always_export_symbols, $1)=no -+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes -+ -+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then -+ _LT_AC_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_AC_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_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ darwin* | rhapsody*) -+ case $host_os in -+ rhapsody* | darwin1.[[012]]) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' -+ ;; -+ *) # Darwin 1.3 on -+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ else -+ case ${MACOSX_DEPLOYMENT_TARGET} in -+ 10.[[012]]) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ ;; -+ 10.*) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' -+ ;; -+ esac -+ fi -+ ;; -+ esac -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ -+ if test "$GXX" = yes ; then -+ lt_int_apple_cc_single_mod=no -+ output_verbose_link_cmd='echo' -+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then -+ lt_int_apple_cc_single_mod=yes -+ fi -+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' -+ else -+ _LT_AC_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' -+ fi -+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "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~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ fi -+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ case $cc_basename in -+ xlc*) -+ output_verbose_link_cmd='echo' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' -+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ ;; -+ *) -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ fi -+ ;; -+ -+ dgux*) -+ case $cc_basename in -+ ec++*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ ghcx*) -+ # Green Hills C++ Compiler -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ ;; -+ freebsd[[12]]*) -+ # C++ shared libraries reported to be fairly broken before switch to ELF -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ freebsd-elf*) -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ ;; -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF -+ # conventions -+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes -+ ;; -+ gnu*) -+ ;; -+ hpux9*) -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ aCC*) -+ _LT_AC_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) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ esac -+ ;; -+ hpux10*|hpux11*) -+ if test $with_gnu_ld = no; then -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ -+ case $host_cpu in -+ hppa*64*|ia64*) -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' -+ ;; -+ *) -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' -+ ;; -+ esac -+ fi -+ case $host_cpu in -+ hppa*64*|ia64*) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ *) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ aCC*) -+ case $host_cpu in -+ hppa*64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ ia64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ *) -+ _LT_AC_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; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes; then -+ if test $with_gnu_ld = no; then -+ case $host_cpu in -+ hppa*64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ ia64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ *) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${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_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ esac -+ ;; -+ interix3*) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ _LT_AC_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_AC_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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' -+ fi -+ fi -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ ;; -+ esac -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ ;; -+ linux*) -+ 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_AC_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_AC_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; echo $list' -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' -+ _LT_AC_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_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' -+ ;; -+ icpc*) -+ # 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_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_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_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' -+ ;; -+ pgCC*) -+ # Portland Group C++ compiler -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' -+ _LT_AC_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' -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' -+ ;; -+ cxx*) -+ # Compaq C++ -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' -+ _LT_AC_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=`echo $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; echo $list' -+ ;; -+ esac -+ ;; -+ lynxos*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ m88k*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ mvs*) -+ case $cc_basename in -+ cxx*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ ;; -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' -+ wlarc= -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_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::"' -+ ;; -+ openbsd2*) -+ # C++ shared libraries are fairly broken -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ openbsd*) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' -+ _LT_AC_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_AC_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_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ fi -+ output_verbose_link_cmd='echo' -+ ;; -+ osf3*) -+ 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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ -+ # Archives containing C++ object files must be created using -+ # "CC -Bstatic", where "CC" is the KAI C++ compiler. -+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' -+ -+ ;; -+ RCC*) -+ # Rational C++ 2.4.1 -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ cxx*) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_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=`echo $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; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' -+ _LT_AC_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" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_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 "\-L"' -+ -+ else -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ esac -+ ;; -+ 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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ -+ # Archives containing C++ object files must be created using -+ # the KAI C++ compiler. -+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' -+ ;; -+ RCC*) -+ # Rational C++ 2.4.1 -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ cxx*) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' -+ _LT_AC_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=`echo $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; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_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 "\-L"' -+ -+ else -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ esac -+ ;; -+ psos*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ sunos4*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.x -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ lcc*) -+ # Lucid -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ ;; -+ solaris*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.2, 5.x and Centerline C++ -+ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes -+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ case $host_os in -+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; -+ *) -+ # The C++ compiler is used as linker so we must use $wl -+ # flag to pass the commands to the underlying system -+ # linker. We must also pass each convience library through -+ # to the system linker between allextract/defaultextract. -+ # The C++ compiler will combine linker options so we -+ # cannot just pass the convience library names through -+ # without $wl. -+ # Supported since Solaris 2.6 (maybe 2.5.1?) -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' -+ ;; -+ esac -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ -+ output_verbose_link_cmd='echo' -+ -+ # 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_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' -+ ;; -+ gcx*) -+ # Green Hills C++ Compiler -+ _LT_AC_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_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' -+ if $CC --version | grep -v '^2\.7' > /dev/null; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ -+ $CC -shared -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 \"\-L\"" -+ else -+ # g++ 2.7 appears to require `-G' NOT `-shared' on this -+ # platform. -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' -+ _LT_AC_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 \"\-L\"" -+ fi -+ -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' -+ fi -+ ;; -+ esac -+ ;; -+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) -+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ runpath_var='LD_RUN_PATH' -+ -+ case $cc_basename in -+ CC*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_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. -+ # 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. -+ # So that behaviour is only enabled if SCOABSPATH is set to a -+ # non-empty value in the environment. Most likely only useful for -+ # creating official distributions of packages. -+ # This is a hack until libtool officially supports absolute path -+ # names for shared libraries. -+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' -+ runpath_var='LD_RUN_PATH' -+ -+ case $cc_basename in -+ CC*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ ;; -+ vxworks*) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+esac -+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no -+ -+_LT_AC_TAGVAR(GCC, $1)="$GXX" -+_LT_AC_TAGVAR(LD, $1)="$LD" -+ -+AC_LIBTOOL_POSTDEP_PREDEP($1) -+AC_LIBTOOL_PROG_COMPILER_PIC($1) -+AC_LIBTOOL_PROG_CC_C_O($1) -+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) -+AC_LIBTOOL_PROG_LD_SHLIBS($1) -+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) -+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) -+ -+AC_LIBTOOL_CONFIG($1) -+ -+AC_LANG_POP -+CC=$lt_save_CC -+LDCXX=$LD -+LD=$lt_save_LD -+GCC=$lt_save_GCC -+with_gnu_ldcxx=$with_gnu_ld -+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 -+])# AC_LIBTOOL_LANG_CXX_CONFIG -+ -+# AC_LIBTOOL_POSTDEP_PREDEP([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. -+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ -+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... -+ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" -+ifelse([$1], [], -+[#! $SHELL -+ -+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -+# NOTE: Changes made to this file will be lost: look at ltmain.sh. -+# -+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -+# Free Software Foundation, Inc. -+# -+# This file is part of GNU Libtool: -+# Originally by Gordon Matzigkeit , 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+# -+# 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. -+ -+# 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//" -+ -+# 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 -+ -+# The names of the tagged configurations supported by this script. -+available_tags= -+ -+# ### BEGIN LIBTOOL CONFIG], -+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) -+ -+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -+ -+# Shell to use when invoking shell scripts. -+SHELL=$lt_SHELL -+ -+# Whether or not to build shared libraries. -+build_libtool_libs=$enable_shared -+ -+# Whether or not to build static libraries. -+build_old_libs=$enable_static -+ -+# Whether or not to add -lc for building shared libraries. -+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) -+ -+# Whether or not to disallow shared libs when runtime libs are static -+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) -+ -+# Whether or not to optimize for fast installation. -+fast_install=$enable_fast_install -+ -+# 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 -+ -+# An echo program that does not interpret backslashes. -+echo=$lt_echo -+ -+# The archiver. -+AR=$lt_AR -+AR_FLAGS=$lt_AR_FLAGS -+ -+# A C compiler. -+LTCC=$lt_LTCC -+ -+# LTCC compiler flags. -+LTCFLAGS=$lt_LTCFLAGS -+ -+# A language-specific compiler. -+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) -+ -+# Is the compiler the GNU C compiler? -+with_gcc=$_LT_AC_TAGVAR(GCC, $1) -+ -+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` -+gcc_ver=\`gcc -dumpversion\` -+ -+# An ERE matcher. -+EGREP=$lt_EGREP -+ -+# The linker used to build libraries. -+LD=$lt_[]_LT_AC_TAGVAR(LD, $1) -+ -+# Whether we need hard or soft links. -+LN_S=$lt_LN_S -+ -+# A BSD-compatible nm program. -+NM=$lt_NM -+ -+# A symbol stripping program -+STRIP=$lt_STRIP -+ -+# Used to examine libraries when file_magic_cmd begins "file" -+MAGIC_CMD=$MAGIC_CMD -+ -+# Used on cygwin: DLL creation program. -+DLLTOOL="$DLLTOOL" -+ -+# Used on cygwin: object dumper. -+OBJDUMP="$OBJDUMP" -+ -+# Used on cygwin: assembler. -+AS="$AS" -+ -+# The name of the directory that contains temporary libtool files. -+objdir=$objdir -+ -+# How to create reloadable object files. -+reload_flag=$lt_reload_flag -+reload_cmds=$lt_reload_cmds -+ -+# How to pass a linker flag through the compiler. -+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) -+ -+# Object file suffix (normally "o"). -+objext="$ac_objext" -+ -+# Old archive suffix (normally "a"). -+libext="$libext" -+ -+# Shared library suffix (normally ".so"). -+shrext_cmds='$shrext_cmds' -+ -+# Executable file suffix (normally ""). -+exeext="$exeext" -+ -+# Additional compiler flags for building library objects. -+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -+pic_mode=$pic_mode -+ -+# What is the maximum length of a command? -+max_cmd_len=$lt_cv_sys_max_cmd_len -+ -+# Does compiler simultaneously support -c and -o options? -+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) -+ -+# Must we lock files when doing compilation? -+need_locks=$lt_need_locks -+ -+# 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 -+ -+# 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 -+ -+# Compiler flag to prevent dynamic linking. -+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) -+ -+# Compiler flag to turn off builtin functions. -+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -+ -+# Compiler flag to allow reflexive dlopens. -+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) -+ -+# Compiler flag to generate shared objects directly from archives. -+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) -+ -+# Compiler flag to generate thread-safe objects. -+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) -+ -+# Library versioning type. -+version_type=$version_type -+ -+# 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 -+ -+# Commands used to build and install an old-style archive. -+RANLIB=$lt_RANLIB -+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) -+old_postinstall_cmds=$lt_old_postinstall_cmds -+old_postuninstall_cmds=$lt_old_postuninstall_cmds -+ -+# Create an old-style archive from a shared archive. -+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) -+ -+# Create a temporary old-style archive to link instead of a shared archive. -+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) -+ -+# Commands used to build and install a shared archive. -+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) -+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) -+postinstall_cmds=$lt_postinstall_cmds -+postuninstall_cmds=$lt_postuninstall_cmds -+ -+# Commands used to build a loadable module (assumed same as above if empty) -+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) -+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) -+ -+# Commands to strip libraries. -+old_striplib=$lt_old_striplib -+striplib=$lt_striplib -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predep_objects=\`echo $lt_[]_LT_AC_TAGVAR(predep_objects, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdep_objects=\`echo $lt_[]_LT_AC_TAGVAR(postdep_objects, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) -+ -+# The library search path used internally by the compiler when linking -+# a shared library. -+compiler_lib_search_path=\`echo $lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# 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 -+ -+# Flag that allows shared libraries with undefined symbols to be built. -+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) -+ -+# Flag that forces no undefined symbols. -+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) -+ -+# Commands used to finish a libtool library installation in a directory. -+finish_cmds=$lt_finish_cmds -+ -+# Same as above, but a single script fragment to be evaled but not shown. -+finish_eval=$lt_finish_eval -+ -+# 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 -+ -+# This is the shared library runtime path variable. -+runpath_var=$runpath_var -+ -+# This is the shared library path variable. -+shlibpath_var=$shlibpath_var -+ -+# Is shlibpath searched before the hard-coded library search path? -+shlibpath_overrides_runpath=$shlibpath_overrides_runpath -+ -+# How to hardcode a shared library path into an executable. -+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) -+ -+# Whether we should hardcode library paths into libraries. -+hardcode_into_libs=$hardcode_into_libs -+ -+# Flag to hardcode \$libdir into a binary during linking. -+# This must work even if \$libdir does not exist. -+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) -+ -+# If ld is used when linking, flag to hardcode \$libdir into -+# a binary during linking. This must work even if \$libdir does -+# not exist. -+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) -+ -+# Whether we need a single -rpath flag with a separated argument. -+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) -+ -+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -+# resulting binary. -+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) -+ -+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -+# resulting binary. -+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) -+ -+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -+# the resulting binary. -+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) -+ -+# 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=$_LT_AC_TAGVAR(hardcode_automatic, $1) -+ -+# Variables whose values should be saved in libtool wrapper scripts and -+# restored at relink time. -+variables_saved_for_relink="$variables_saved_for_relink" -+ -+# Whether libtool must link a program against all its dependency libraries. -+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) -+ -+# Compile-time system search path for libraries -+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Run-time system search path for libraries -+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec -+ -+# Fix the shell variable \$srcfile for the compiler. -+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" -+ -+# Set to yes if exported symbols are required. -+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) -+ -+# The commands to list exported symbols. -+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) -+ -+# The commands to extract the exported symbol list from a shared archive. -+extract_expsyms_cmds=$lt_extract_expsyms_cmds -+ -+# Symbols that should not be listed in the preloaded symbols. -+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) -+ -+# Symbols that must always be exported. -+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) -+ -+ifelse([$1],[], -+[# ### END LIBTOOL CONFIG], -+[# ### END LIBTOOL TAG CONFIG: $tagname]) -+ -+__EOF__ -+ -+ifelse([$1],[], [ -+ case $host_os in -+ aix3*) -+ cat <<\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 -+EOF -+ ;; -+ esac -+ -+ # 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) -+ -+ mv -f "$cfgfile" "$ofile" || \ -+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") -+ chmod +x "$ofile" -+]) -+else -+ # If there is no Makefile yet, we rely on a make rule to execute -+ # `config.status --recheck' to rerun these tests and create the -+ # libtool script then. -+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` -+ if test -f "$ltmain_in"; then -+ test -f Makefile && make "$ltmain" -+ fi -+fi -+])# AC_LIBTOOL_CONFIG -+ -+ -+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) -+# ------------------------------------------- -+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], -+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl -+ -+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -+ -+if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' -+ -+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], -+ lt_cv_prog_compiler_rtti_exceptions, -+ [-fno-rtti -fno-exceptions], [], -+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) -+fi -+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI -+ -+ -+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -+# --------------------------------- -+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -+[AC_REQUIRE([AC_CANONICAL_HOST]) -+AC_REQUIRE([AC_PROG_NM]) -+AC_REQUIRE([AC_OBJEXT]) -+# 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]]*\)' -+ -+# Transform an extracted symbol line into a proper C declaration -+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \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\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" -+ -+# Define system-specific variables. -+case $host_os in -+aix*) -+ symcode='[[BCDT]]' -+ ;; -+cygwin* | mingw* | pw32*) -+ symcode='[[ABCDGISTW]]' -+ ;; -+hpux*) # Its linker distinguishes data from code symbols -+ if test "$host_cpu" = ia64; then -+ symcode='[[ABCDEGRST]]' -+ fi -+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" -+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" -+ ;; -+linux*) -+ if test "$host_cpu" = ia64; then -+ symcode='[[ABCDGIRSTW]]' -+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" -+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" -+ 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 -+ -+# 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 -+ -+# If we're using GNU nm, then use its standard symbol codes. -+case `$NM -V 2>&1` in -+*GNU* | *'with BFD'*) -+ symcode='[[ABCDGIRSTW]]' ;; -+esac -+ -+# Try without a prefix undercore, 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. -+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" -+ -+ # Check to see that the pipe works correctly. -+ pipe_works=no -+ -+ rm -f conftest* -+ cat > conftest.$ac_ext < $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 < conftest.$ac_ext -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+EOF -+ # Now generate the symbol file. -+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' -+ -+ cat <> conftest.$ac_ext -+#if defined (__STDC__) && __STDC__ -+# define lt_ptr_t void * -+#else -+# define lt_ptr_t char * -+# define const -+#endif -+ -+/* The mapping between symbol names and symbols. */ -+const struct { -+ const char *name; -+ lt_ptr_t address; -+} -+lt_preloaded_symbols[[]] = -+{ -+EOF -+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext -+ cat <<\EOF >> conftest.$ac_ext -+ {0, (lt_ptr_t) 0} -+}; -+ -+#ifdef __cplusplus -+} -+#endif -+EOF -+ # Now try linking the two files. -+ mv conftest.$ac_objext conftstm.$ac_objext -+ lt_save_LIBS="$LIBS" -+ lt_save_CFLAGS="$CFLAGS" -+ LIBS="conftstm.$ac_objext" -+ CFLAGS="$CFLAGS$_LT_AC_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_save_LIBS" -+ CFLAGS="$lt_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 -f 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 -+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -+ -+ -+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) -+# --------------------------------------- -+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], -+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= -+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= -+ -+AC_MSG_CHECKING([for $compiler option to produce PIC]) -+ ifelse([$1],[CXX],[ -+ # C++ specific cases for pic, static, wl, etc. -+ if test "$GXX" = yes; then -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ fi -+ ;; -+ amigaos*) -+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' -+ ;; -+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) -+ # PIC is the default for these OSes. -+ ;; -+ mingw* | os2* | pw32*) -+ # 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_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' -+ ;; -+ *djgpp*) -+ # DJGPP does not support shared libraries at all -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -+ ;; -+ interix3*) -+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic -+ fi -+ ;; -+ hpux*) -+ # 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*) -+ ;; -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' -+ ;; -+ esac -+ ;; -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' -+ ;; -+ esac -+ else -+ case $host_os in -+ aix4* | aix5*) -+ # All AIX code is PIC. -+ if test "$host_cpu" = ia64; then -+ # AIX 5 now supports IA64 processor -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ else -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' -+ fi -+ ;; -+ chorus*) -+ case $cc_basename in -+ cxch68*) -+ # Green Hills C++ Compiler -+ # _LT_AC_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 -+ ;; -+ darwin*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ case $cc_basename in -+ xlc*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ ;; -+ esac -+ ;; -+ dgux*) -+ case $cc_basename in -+ ec++*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ ;; -+ ghcx*) -+ # Green Hills C++ Compiler -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ # FreeBSD uses GNU C++ -+ ;; -+ hpux9* | hpux10* | hpux11*) -+ case $cc_basename in -+ CC*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' -+ if test "$host_cpu" != ia64; then -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' -+ fi -+ ;; -+ aCC*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' -+ case $host_cpu in -+ hppa*64*|ia64*) -+ # +Z the default -+ ;; -+ *) -+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' -+ # CC pic flag -KPIC is the default. -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ linux*) -+ case $cc_basename in -+ KCC*) -+ # KAI C++ Compiler -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' -+ ;; -+ icpc* | ecpc*) -+ # Intel C++ -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' -+ ;; -+ pgCC*) -+ # Portland Group C++ compiler. -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' -+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)= -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ lynxos*) -+ ;; -+ m88k*) -+ ;; -+ mvs*) -+ case $cc_basename in -+ cxx*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ netbsd*) -+ ;; -+ osf3* | osf4* | osf5*) -+ case $cc_basename in -+ KCC*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' -+ ;; -+ RCC*) -+ # Rational C++ 2.4.1 -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' -+ ;; -+ cxx*) -+ # Digital/Compaq C++ -+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)= -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ psos*) -+ ;; -+ solaris*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.2, 5.x and Centerline C++ -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' -+ ;; -+ gcx*) -+ # Green Hills C++ Compiler -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ sunos4*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.x -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ lcc*) -+ # Lucid -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ tandem*) -+ case $cc_basename in -+ NCC*) -+ # NonStop-UX NCC 3.20 -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) -+ case $cc_basename in -+ CC*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ esac -+ ;; -+ vxworks*) -+ ;; -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no -+ ;; -+ esac -+ fi -+], -+[ -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ fi -+ ;; -+ -+ amigaos*) -+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' -+ ;; -+ -+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) -+ # PIC is the default for these OSes. -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' -+ ;; -+ -+ interix3*) -+ # 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_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no -+ enable_shared=no -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic -+ fi -+ ;; -+ -+ hpux*) -+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' -+ ;; -+ esac -+ ;; -+ -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' -+ ;; -+ esac -+ else -+ # PORTME Check for flag to pass linker flags through the system compiler. -+ case $host_os in -+ aix*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ if test "$host_cpu" = ia64; then -+ # AIX 5 now supports IA64 processor -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ else -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' -+ fi -+ ;; -+ darwin*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ case $cc_basename in -+ xlc*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ ;; -+ esac -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' -+ ;; -+ -+ hpux9* | hpux10* | hpux11*) -+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' -+ ;; -+ esac -+ # Is there a better lt_prog_compiler_static that works with the bundled CC? -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' -+ ;; -+ -+ irix5* | irix6* | nonstopux*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ # PIC (with -KPIC) is the default. -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' -+ ;; -+ -+ newsos6) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ -+ linux*) -+ case $cc_basename in -+ icc* | ecc*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' -+ ;; -+ pgcc* | pgf77* | pgf90* | pgf95*) -+ # Portland Group compilers (*not* the Pentium gcc compiler, -+ # which looks to be a dead project) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ ccc*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ # All Alpha code is PIC. -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' -+ ;; -+ esac -+ ;; -+ -+ osf3* | osf4* | osf5*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ # All OSF/1 code is PIC. -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' -+ ;; -+ -+ solaris*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ case $cc_basename in -+ f77* | f90* | f95*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; -+ esac -+ ;; -+ -+ sunos4*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ -+ sysv4 | sysv4.2uw2* | sysv4.3*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec ;then -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ fi -+ ;; -+ -+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ -+ unicos*) -+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' -+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no -+ ;; -+ -+ uts4*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' -+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' -+ ;; -+ -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no -+ ;; -+ esac -+ fi -+]) -+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) -+ -+# -+# Check to make sure the PIC flag actually works. -+# -+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then -+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], -+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), -+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], -+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in -+ "" | " "*) ;; -+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; -+ esac], -+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) -+fi -+case $host_os in -+ # For platforms which do not support PIC, -DPIC is meaningless: -+ *djgpp*) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= -+ ;; -+ *) -+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" -+ ;; -+esac -+ -+# -+# Check to make sure the static flag actually works. -+# -+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" -+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], -+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), -+ $lt_tmp_static_flag, -+ [], -+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) -+]) -+ -+ -+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) -+# ------------------------------------ -+# See if the linker supports building shared libraries. -+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], -+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -+ifelse([$1],[CXX],[ -+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ case $host_os in -+ aix4* | aix5*) -+ # 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 -+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then -+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' -+ else -+ _LT_AC_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_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" -+ ;; -+ cygwin* | mingw*) -+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' -+ ;; -+ *) -+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ ;; -+ esac -+],[ -+ runpath_var= -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)= -+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no -+ _LT_AC_TAGVAR(archive_cmds, $1)= -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)= -+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= -+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown -+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no -+ _LT_AC_TAGVAR(module_cmds, $1)= -+ _LT_AC_TAGVAR(module_expsym_cmds, $1)= -+ _LT_AC_TAGVAR(always_export_symbols, $1)=no -+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ # include_expsyms should be a list of space-separated symbols to be *always* -+ # included in the symbol list -+ _LT_AC_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_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" -+ # 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. -+ extract_expsyms_cmds= -+ # Just being paranoid about ensuring that cc_basename is set. -+ _LT_CC_BASENAME([$compiler]) -+ case $host_os in -+ cygwin* | mingw* | pw32*) -+ # 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_AC_TAGVAR(ld_shlibs, $1)=yes -+ if test "$with_gnu_ld" = 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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' -+ _LT_AC_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_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ else -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= -+ fi -+ supports_anon_versioning=no -+ case `$LD -v 2>/dev/null` in -+ *\ [[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 -+ aix3* | aix4* | aix5*) -+ # On AIX/PPC, the GNU linker is very broken -+ if test "$host_cpu" != ia64; then -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ cat <&2 -+ -+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH -+*** so that a non-GNU linker is found, and then restart. -+ -+EOF -+ fi -+ ;; -+ -+ amigaos*) -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ -+ # Samuel A. Falvo II reports -+ # that the semantics of dynamic libraries on AmigaOS, at least up -+ # to version 4, is to share data among multiple programs linked -+ # with the same dynamic library. Since this doesn't match the -+ # behavior of shared libraries on other platforms, we can't use -+ # them. -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ -+ beos*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported -+ # Joseph Beckenbach says some releases of gcc -+ # support --undefined. This deserves some investigation. FIXME -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ else -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, -+ # as there is no search path for DLLs. -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported -+ _LT_AC_TAGVAR(always_export_symbols, $1)=no -+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes -+ _LT_AC_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' -+ -+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then -+ _LT_AC_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_AC_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_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ -+ interix3*) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ _LT_AC_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_AC_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_AC_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' -+ ;; -+ -+ linux*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ tmp_addflag= -+ case $cc_basename,$host_cpu in -+ pgcc*) # Portland Group C compiler -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' -+ tmp_addflag=' $pic_flag' -+ ;; -+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;; -+ esac -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ -+ if test $supports_anon_versioning = yes; then -+ _LT_AC_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 -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' -+ fi -+ else -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' -+ wlarc= -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $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_AC_TAGVAR(ld_shlibs, $1)=no -+ cat <&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. -+ -+EOF -+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_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_AC_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_AC_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 -+ ;; -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' -+ else -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ esac -+ ;; -+ -+ sunos4*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ wlarc= -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no -+ fi -+ ;; -+ esac -+ -+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then -+ runpath_var= -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= -+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)=unsupported -+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes -+ _LT_AC_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_AC_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_AC_TAGVAR(hardcode_direct, $1)=unsupported -+ fi -+ ;; -+ -+ aix4* | aix5*) -+ 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 -+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then -+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' -+ else -+ _LT_AC_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]].*|aix5*) -+ 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_AC_TAGVAR(archive_cmds, $1)='' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ -+ 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 -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ else -+ # We have old collect2 -+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_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 -+ -+ # It seems that -bexpall does not export symbols beginning with -+ # underscore (_), so it is better to generate a list of symbols to export. -+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)='-berok' -+ # Determine the default libpath from the value encoded in an empty executable. -+ _LT_AC_SYS_LIBPATH_AIX -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" -+ _LT_AC_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 echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" -+ else -+ if test "$host_cpu" = ia64; then -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" -+ _LT_AC_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_AC_SYS_LIBPATH_AIX -+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' -+ # Exported symbols can be pulled into shared objects from archives -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes -+ # This is similar to how AIX traditionally builds its shared libraries. -+ _LT_AC_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*) -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ # see comment about different semantics on the GNU ld section -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ -+ bsdi[[45]]*) -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # 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. -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' -+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' -+ # The linker will automatically build a .lib file if we build a DLL. -+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' -+ # FIXME: Should let the user specify the lib program. -+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' -+ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' -+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes -+ ;; -+ -+ darwin* | rhapsody*) -+ case $host_os in -+ rhapsody* | darwin1.[[012]]) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' -+ ;; -+ *) # Darwin 1.3 on -+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ else -+ case ${MACOSX_DEPLOYMENT_TARGET} in -+ 10.[[012]]) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ ;; -+ 10.*) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' -+ ;; -+ esac -+ fi -+ ;; -+ esac -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ if test "$GCC" = yes ; then -+ output_verbose_link_cmd='echo' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' -+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ case $cc_basename in -+ xlc*) -+ output_verbose_link_cmd='echo' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' -+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ ;; -+ *) -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ fi -+ ;; -+ -+ dgux*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ freebsd1*) -+ _LT_AC_TAGVAR(ld_shlibs, $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_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ # Unfortunately, older versions of FreeBSD 2 do not have this feature. -+ freebsd2*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ hpux9*) -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' -+ ;; -+ -+ hpux10*) -+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ fi -+ ;; -+ -+ hpux11*) -+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then -+ case $host_cpu in -+ hppa*64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ ia64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ esac -+ else -+ case $host_cpu in -+ hppa*64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ ia64*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ -+ case $host_cpu in -+ hppa*64*|ia64*) -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ *) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ ;; -+ esac -+ fi -+ ;; -+ -+ irix5* | irix6* | nonstopux*) -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' -+ fi -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ ;; -+ -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF -+ fi -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ newsos6) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ openbsd*) -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' -+ else -+ case $host_os in -+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ ;; -+ *) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' -+ ;; -+ esac -+ fi -+ ;; -+ -+ os2*) -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported -+ _LT_AC_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_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' -+ ;; -+ -+ osf3*) -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ fi -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ ;; -+ -+ osf4* | osf5*) # as osf3* with the addition of -msym flag -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' -+ else -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ _LT_AC_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~ -+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' -+ fi -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: -+ ;; -+ -+ solaris*) -+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' -+ if test "$GCC" = yes; then -+ wlarc='${wl}' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ -+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' -+ else -+ wlarc='' -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_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' -+ fi -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ case $host_os in -+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; -+ *) -+ # The compiler driver will combine linker options so we -+ # cannot just pass the convience library names through -+ # without $wl, iff we do not link with $LD. -+ # Luckily, gcc supports the same syntax we need for Sun Studio. -+ # Supported since Solaris 2.6 (maybe 2.5.1?) -+ case $wlarc in -+ '') -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; -+ *) -+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; -+ esac ;; -+ esac -+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' -+ fi -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes -+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ sysv4) -+ case $host_vendor in -+ sni) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? -+ ;; -+ siemens) -+ ## LD is ld it makes a PLAMLIB -+ ## CC just makes a GrossModule. -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no -+ ;; -+ motorola) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie -+ ;; -+ esac -+ runpath_var='LD_RUN_PATH' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ sysv4.3*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ runpath_var=LD_RUN_PATH -+ hardcode_runpath_var=yes -+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes -+ fi -+ ;; -+ -+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) -+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ runpath_var='LD_RUN_PATH' -+ -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' -+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' -+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes -+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' -+ runpath_var='LD_RUN_PATH' -+ -+ if test "$GCC" = yes; then -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ fi -+ ;; -+ -+ uts4*) -+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' -+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no -+ ;; -+ -+ *) -+ _LT_AC_TAGVAR(ld_shlibs, $1)=no -+ ;; -+ esac -+ fi -+]) -+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) -+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no -+ -+# -+# Do we need to explicitly link libc? -+# -+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in -+x|xyes) -+ # Assume -lc should be added -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes -+ -+ if test "$enable_shared" = yes && test "$GCC" = yes; then -+ case $_LT_AC_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_MSG_CHECKING([whether -lc should be explicitly linked in]) -+ $rm conftest* -+ printf "$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_AC_TAGVAR(lt_prog_compiler_wl, $1) -+ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -+ compiler_flags=-v -+ linker_flags=-v -+ verstring= -+ output_objdir=. -+ libname=conftest -+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)= -+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) -+ then -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no -+ else -+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes -+ fi -+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag -+ else -+ cat conftest.err 1>&5 -+ fi -+ $rm conftest* -+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) -+ ;; -+ esac -+ fi -+ ;; -+esac -+])# AC_LIBTOOL_PROG_LD_SHLIBS -+ -+ -+# _LT_AC_FILE_LTDLL_C -+# ------------------- -+# Be careful that the start marker always follows a newline. -+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ -+# /* ltdll.c starts here */ -+# #define WIN32_LEAN_AND_MEAN -+# #include -+# #undef WIN32_LEAN_AND_MEAN -+# #include -+# -+# #ifndef __CYGWIN__ -+# # ifdef __CYGWIN32__ -+# # define __CYGWIN__ __CYGWIN32__ -+# # endif -+# #endif -+# -+# #ifdef __cplusplus -+# extern "C" { -+# #endif -+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); -+# #ifdef __cplusplus -+# } -+# #endif -+# -+# #ifdef __CYGWIN__ -+# #include -+# DECLARE_CYGWIN_DLL( DllMain ); -+# #endif -+# HINSTANCE __hDllInstance_base; -+# -+# BOOL APIENTRY -+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) -+# { -+# __hDllInstance_base = hInst; -+# return TRUE; -+# } -+# /* ltdll.c ends here */ -+])# _LT_AC_FILE_LTDLL_C -+ -+ -+# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) -+# --------------------------------- -+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) -+ -+ -+# old names -+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) -+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) -+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) -+ -+# This is just to silence aclocal about the macro not being used -+ifelse([AC_DISABLE_FAST_INSTALL]) -+ -+AC_DEFUN([LT_AC_PROG_GCJ], -+[AC_CHECK_TOOL(GCJ, gcj, no) -+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" -+ AC_SUBST(GCJFLAGS) -+]) -+ -+AC_DEFUN([LT_AC_PROG_RC], -+[AC_CHECK_TOOL(RC, windres, no) -+]) -+ -+# 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. # -+# LT_AC_PROG_SED -+# -------------- -+# Check for a fully-functional sed program, that truncates -+# as few characters as possible. Prefer GNU sed if found. -+AC_DEFUN([LT_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]) -+]) -+ -+# Copyright (C) 2002, 2003, 2005 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. -+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) -+ -+# AM_SET_CURRENT_AUTOMAKE_VERSION -+# ------------------------------- -+# Call AM_AUTOMAKE_VERSION so it can be traced. -+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. -+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -+ [AM_AUTOMAKE_VERSION([1.9.6])]) -+ -+# AM_AUX_DIR_EXPAND -*- Autoconf -*- -+ -+# Copyright (C) 2001, 2003, 2005 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, 2000, 2001, 2003, 2004, 2005 -+# 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. -+ -+# serial 7 -+ -+# AM_CONDITIONAL(NAME, SHELL-CONDITION) -+# ------------------------------------- -+# Define a conditional. -+AC_DEFUN([AM_CONDITIONAL], -+[AC_PREREQ(2.52)dnl -+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], -+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -+AC_SUBST([$1_TRUE]) -+AC_SUBST([$1_FALSE]) -+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, 2000, 2001, 2002, 2003, 2004, 2005 -+# 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. -+ -+# serial 8 -+ -+# 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", "GCJ", or "OBJC". -+# 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 -+ -+ifelse([$1], CC, [depcc="$CC" am_compiler_list=], -+ [$1], CXX, [depcc="$CXX" am_compiler_list=], -+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], -+ [$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'. -+ 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 -+ 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 8's {/usr,}/bin/sh. -+ touch sub/conftst$i.h -+ done -+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf -+ -+ case $depmode in -+ 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 -+ ;; -+ none) break ;; -+ esac -+ # 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. -+ if depmode=$depmode \ -+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ -+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ -+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ -+ >/dev/null 2>conftest.err && -+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && -+ grep sub/conftest.${OBJEXT-o} 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, -+[ --disable-dependency-tracking speeds up one-time build -+ --enable-dependency-tracking do not reject slow dependency extractors]) -+if test "x$enable_dependency_tracking" != xno; then -+ am_depcomp="$ac_aux_dir/depcomp" -+ AMDEPBACKSLASH='\' -+fi -+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -+AC_SUBST([AMDEPBACKSLASH]) -+]) -+ -+# Generate code to set up dependency tracking. -*- Autoconf -*- -+ -+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -+# 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. -+ -+#serial 3 -+ -+# _AM_OUTPUT_DEPENDENCY_COMMANDS -+# ------------------------------ -+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -+[for mf in $CONFIG_FILES; 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. -+ # So let's grep whole file. -+ if grep '^#.*generated by automake' $mf > /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"` -+ # When using ansi2knr, U may be empty or an underscore; expand it -+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -+# 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. -+ -+# serial 12 -+ -+# 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. -+ -+# 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.58])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 -+# test to see if srcdir already configured -+if test "`cd $srcdir && pwd`" != "`pwd`" && -+ test -f $srcdir/config.status; then -+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -+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], -+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl -+ AC_SUBST([PACKAGE], [$1])dnl -+ AC_SUBST([VERSION], [$2])], -+[_AM_SET_OPTIONS([$1])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) -+AM_PROG_INSTALL_SH -+AM_PROG_INSTALL_STRIP -+AC_REQUIRE([AM_PROG_MKDIR_P])dnl -+# 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)], -+ [define([AC_PROG_CC], -+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -+AC_PROVIDE_IFELSE([AC_PROG_CXX], -+ [_AM_DEPENDENCIES(CXX)], -+ [define([AC_PROG_CXX], -+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -+]) -+]) -+ -+ -+# 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_stamp_count=1 -+for _am_header in $config_headers :; do -+ case $_am_header in -+ $1 | $1:* ) -+ break ;; -+ * ) -+ _am_stamp_count=`expr $_am_stamp_count + 1` ;; -+ esac -+done -+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) -+ -+# Copyright (C) 2001, 2003, 2005 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 -+install_sh=${install_sh-"$am_aux_dir/install-sh"} -+AC_SUBST(install_sh)]) -+ -+# Copyright (C) 2003, 2005 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. -+ -+# serial 2 -+ -+# 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, 2002, 2003, 2005 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. -+ -+# serial 3 -+ -+# 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 done -+.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 -+# We grep out `Entering directory' and `Leaving directory' -+# messages which can occur if `w' ends up in MAKEFLAGS. -+# In particular we don't look at `^make:' because GNU make might -+# be invoked under some other name (usually "gmake"), in which -+# case it prints its new name instead of `make'. -+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then -+ am__include=include -+ am__quote= -+ _am_result=GNU -+fi -+# Now try BSD make style include. -+if test "$am__include" = "#"; then -+ echo '.include "confinc"' > confmf -+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then -+ am__include=.include -+ am__quote="\"" -+ _am_result=BSD -+ fi -+fi -+AC_SUBST([am__include]) -+AC_SUBST([am__quote]) -+AC_MSG_RESULT([$_am_result]) -+rm -f confinc confmf -+]) -+ -+# Copyright (C) 1999, 2000, 2001, 2003, 2005 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. -+ -+# serial 3 -+ -+# AM_PROG_CC_C_O -+# -------------- -+# Like AC_PROG_CC_C_O, but changed for automake. -+AC_DEFUN([AM_PROG_CC_C_O], -+[AC_REQUIRE([AC_PROG_CC_C_O])dnl -+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -+# FIXME: we rely on the cache variable name because -+# there is no other way. -+set dummy $CC -+ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -+if eval "test \"`echo '$ac_cv_prog_cc_'${ac_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 -+]) -+ -+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -+ -+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 -+# 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. -+ -+# serial 4 -+ -+# 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 supports --run. -+# If it does, set am_missing_run to use it, otherwise, to nothing. -+AC_DEFUN([AM_MISSING_HAS_RUN], -+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -+# Use eval to expand $SHELL -+if eval "$MISSING --run true"; then -+ am_missing_run="$MISSING --run " -+else -+ am_missing_run= -+ AC_MSG_WARN([`missing' script is too old or missing]) -+fi -+]) -+ -+# Copyright (C) 2003, 2004, 2005 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_MKDIR_P -+# --------------- -+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -+# -+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -+# created by `make install' are always world readable, even if the -+# installer happens to have an overly restrictive umask (e.g. 077). -+# This was a mistake. There are at least two reasons why we must not -+# use `-m 0755': -+# - it causes special bits like SGID to be ignored, -+# - it may be too restrictive (some setups expect 775 directories). -+# -+# Do not use -m 0755 and let people choose whatever they expect by -+# setting umask. -+# -+# We cannot accept any implementation of `mkdir' that recognizes `-p'. -+# Some implementations (such as Solaris 8's) are not thread-safe: if a -+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -+# concurrently, both version can detect that a/ is missing, but only -+# one can create it and the other will error out. Consequently we -+# restrict ourselves to GNU make (using the --version option ensures -+# this.) -+AC_DEFUN([AM_PROG_MKDIR_P], -+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then -+ # We used to keeping the `.' as first argument, in order to -+ # allow $(mkdir_p) to be used without argument. As in -+ # $(mkdir_p) $(somedir) -+ # where $(somedir) is conditionally defined. However this is wrong -+ # for two reasons: -+ # 1. if the package is installed by a user who cannot write `.' -+ # make install will fail, -+ # 2. the above comment should most certainly read -+ # $(mkdir_p) $(DESTDIR)$(somedir) -+ # so it does not work when $(somedir) is undefined and -+ # $(DESTDIR) is not. -+ # To support the latter case, we have to write -+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), -+ # so the `.' trick is pointless. -+ mkdir_p='mkdir -p --' -+else -+ # On NextStep and OpenStep, the `mkdir' command does not -+ # recognize any option. It will interpret all options as -+ # directories to create, and then abort because `.' already -+ # exists. -+ for d in ./-p ./--version; -+ do -+ test -d $d && rmdir $d -+ done -+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. -+ if test -f "$ac_aux_dir/mkinstalldirs"; then -+ mkdir_p='$(mkinstalldirs)' -+ else -+ mkdir_p='$(install_sh) -d' -+ fi -+fi -+AC_SUBST([mkdir_p])]) -+ -+# Helper functions for option handling. -*- Autoconf -*- -+ -+# Copyright (C) 2001, 2002, 2003, 2005 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. -+ -+# serial 3 -+ -+# _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], -+[AC_FOREACH([_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])]) -+ -+# Check to make sure that the build environment is sane. -*- Autoconf -*- -+ -+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -+# 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. -+ -+# serial 4 -+ -+# AM_SANITY_CHECK -+# --------------- -+AC_DEFUN([AM_SANITY_CHECK], -+[AC_MSG_CHECKING([whether build environment is sane]) -+# Just in case -+sleep 1 -+echo timestamp > conftest.file -+# 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 ( -+ 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 -+ rm -f conftest.file -+ 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 -+ -+ 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)]) -+ -+# Copyright (C) 2001, 2003, 2005 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="\${SHELL} \$(install_sh) -c -s" -+AC_SUBST([INSTALL_STRIP_PROGRAM])]) -+ -+# Check how to create a tarball. -*- Autoconf -*- -+ -+# Copyright (C) 2004, 2005 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. -+ -+# serial 2 -+ -+# _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. -+AM_MISSING_PROG([AMTAR], [tar]) -+m4_if([$1], [v7], -+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], -+ [m4_case([$1], [ustar],, [pax],, -+ [m4_fatal([Unknown tar format])]) -+AC_MSG_CHECKING([how to create a $1 tar archive]) -+# Loop over all known methods to create a tar archive until one works. -+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -+_am_tools=${am_cv_prog_tar_$1-$_am_tools} -+# Do not fold the above two line into one, because Tru64 sh and -+# Solaris sh will not grok spaces in the rhs of `-'. -+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 -diff --git a/iscsiuio/compile b/iscsiuio/compile -new file mode 100755 -index 0000000..1b1d232 ---- /dev/null -+++ b/iscsiuio/compile -@@ -0,0 +1,142 @@ -+#! /bin/sh -+# Wrapper for compilers which do not understand `-c -o'. -+ -+scriptversion=2005-05-14.22 -+ -+# Copyright (C) 1999, 2000, 2003, 2004, 2005 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, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+ -+# 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 -+# . -+ -+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 $? -+ ;; -+esac -+ -+ofile= -+cfile= -+eat= -+ -+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 -e 's|^.*/||' -e '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 -+ mv "$cofile" "$ofile" -+elif test -f "${cofile}bj"; then -+ 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-end: "$" -+# End: -diff --git a/iscsiuio/config.guess b/iscsiuio/config.guess -new file mode 100755 -index 0000000..48b8941 ---- /dev/null -+++ b/iscsiuio/config.guess -@@ -0,0 +1,1548 @@ -+#! /bin/sh -+# Attempt to guess a canonical system name. -+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 -+# Free Software Foundation, Inc. -+ -+timestamp='2008-09-28' -+ -+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA -+# 02110-1301, USA. -+# -+# 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 Per Bothner . -+# Please send patches to . Submit a context -+# diff and a properly formatted ChangeLog entry. -+# -+# This script attempts to guess a canonical system name similar to -+# config.sub. If it succeeds, it prints the system name on stdout, and -+# exits with 0. Otherwise, it exits with 1. -+# -+# The plan is that this can be called by configure scripts if you -+# don't specify an explicit build system type. -+ -+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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -+2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -+ -+if [ "${UNAME_SYSTEM}" = "Linux" ] ; then -+ eval $set_cc_for_build -+ cat << EOF > $dummy.c -+ #include -+ #ifdef __UCLIBC__ -+ # ifdef __UCLIBC_CONFIG_VERSION__ -+ LIBC=uclibc __UCLIBC_CONFIG_VERSION__ -+ # else -+ LIBC=uclibc -+ # endif -+ #else -+ LIBC=gnu -+ #endif -+EOF -+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` -+fi -+ -+# 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 tupples: *-*-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 __ELF__ >/dev/null -+ 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 ;; -+ *: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'` -+ exit ;; -+ 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 ;; -+ 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:SunOS:5.*:* | i86xen:SunOS:5.*:*) -+ echo i386-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:*:[456]) -+ 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 __LP64__ >/dev/null -+ 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:*:*) -+ case ${UNAME_MACHINE} in -+ pc98) -+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; -+ amd64) -+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; -+ *) -+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; -+ esac -+ exit ;; -+ i*:CYGWIN*:*) -+ echo ${UNAME_MACHINE}-pc-cygwin -+ exit ;; -+ *:MINGW*:*) -+ echo ${UNAME_MACHINE}-pc-mingw32 -+ exit ;; -+ i*:windows32*:*) -+ # uname -m includes "-pc" on this system. -+ echo ${UNAME_MACHINE}-mingw32 -+ exit ;; -+ i*:PW*:*) -+ echo ${UNAME_MACHINE}-pc-pw32 -+ exit ;; -+ *:Interix*:[3456]*) -+ case ${UNAME_MACHINE} in -+ x86) -+ echo i586-pc-interix${UNAME_RELEASE} -+ exit ;; -+ EM64T | authenticamd | genuineintel) -+ 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 ;; -+ 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-gnu`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/[-(].*//'`-gnu -+ exit ;; -+ i*86:Minix:*:*) -+ echo ${UNAME_MACHINE}-pc-minix -+ 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 -+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi -+ fi -+ exit ;; -+ avr32*:Linux:*:*) -+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} -+ exit ;; -+ cris:Linux:*:*) -+ echo cris-axis-linux-${LIBC} -+ exit ;; -+ crisv32:Linux:*:*) -+ echo crisv32-axis-linux-${LIBC} -+ exit ;; -+ frv:Linux:*:*) -+ echo frv-unknown-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:*:*) -+ eval $set_cc_for_build -+ sed 's/^ //' << EOF >$dummy.c -+ #undef CPU -+ #undef mips -+ #undef mipsel -+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) -+ CPU=mipsel -+ #else -+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) -+ CPU=mips -+ #else -+ CPU= -+ #endif -+ #endif -+EOF -+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' -+ /^CPU/{ -+ s: ::g -+ p -+ }'`" -+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } -+ ;; -+ mips64:Linux:*:*) -+ eval $set_cc_for_build -+ sed 's/^ //' << EOF >$dummy.c -+ #undef CPU -+ #undef mips64 -+ #undef mips64el -+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) -+ CPU=mips64el -+ #else -+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) -+ CPU=mips64 -+ #else -+ CPU= -+ #endif -+ #endif -+EOF -+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' -+ /^CPU/{ -+ s: ::g -+ p -+ }'`" -+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } -+ ;; -+ or32:Linux:*:*) -+ echo or32-unknown-linux-${LIBC} -+ exit ;; -+ ppc:Linux:*:*) -+ echo powerpc-unknown-linux-${LIBC} -+ exit ;; -+ ppc64:Linux:*:*) -+ echo powerpc64-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 ld.so.1 >/dev/null -+ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi -+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} -+ exit ;; -+ padre:Linux:*:*) -+ echo sparc-unknown-linux-gnu -+ 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 ;; -+ parisc64:Linux:*:* | hppa64:Linux:*:*) -+ echo hppa64-unknown-linux-${LIBC} -+ exit ;; -+ s390:Linux:*:* | s390x:Linux:*:*) -+ echo ${UNAME_MACHINE}-ibm-linux -+ 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 ;; -+ vax:Linux:*:*) -+ echo ${UNAME_MACHINE}-dec-linux-${LIBC} -+ exit ;; -+ x86_64:Linux:*:*) -+ echo x86_64-unknown-linux-${LIBC} -+ exit ;; -+ xtensa*:Linux:*:*) -+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} -+ exit ;; -+ i*86:Linux:*:*) -+ # The BFD linker knows what the default object file format is, so -+ # first see if it will tell us. cd to the root directory to prevent -+ # problems with other programs or directories called `ld' in the path. -+ # Set LC_ALL=C to ensure ld outputs messages in English. -+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ -+ | sed -ne '/supported targets:/!d -+ s/[ ][ ]*/ /g -+ s/.*supported targets: *// -+ s/ .*// -+ p'` -+ case "$ld_supported_targets" in -+ elf32-i386) -+ TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" -+ ;; -+ a.out-i386-linux) -+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" -+ exit ;; -+ "") -+ # Either a pre-BFD a.out linker (linux-gnuoldld) or -+ # one that does not give us useful --help. -+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" -+ exit ;; -+ esac -+ # This should get integrated into the C code below, but now we hack -+ if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi -+ # Determine whether the default compiler is a.out or elf -+ eval $set_cc_for_build -+ sed 's/^ //' << EOF >$dummy.c -+ #include -+ #ifdef __ELF__ -+ # ifdef __GLIBC__ -+ # if __GLIBC__ >= 2 -+ LIBC=gnu -+ # else -+ LIBC=gnulibc1 -+ # endif -+ # else -+ LIBC=gnulibc1 -+ # endif -+ #else -+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) -+ LIBC=gnu -+ #else -+ LIBC=gnuaout -+ #endif -+ #endif -+ #ifdef __dietlibc__ -+ LIBC=dietlibc -+ #endif -+EOF -+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' -+ /^LIBC/{ -+ s: ::g -+ p -+ }'`" -+ test x"${LIBC}" != x && { -+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}" -+ exit -+ } -+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*) -+ 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 i386. -+ echo i386-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; } ;; -+ 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.0*:*) -+ 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 ;; -+ 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 -+ case $UNAME_PROCESSOR in -+ unknown) UNAME_PROCESSOR=powerpc ;; -+ esac -+ 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 ;; -+ 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 ;; -+esac -+ -+#echo '(No uname command or uname output not recognized.)' 1>&2 -+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 -+ -+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: -diff --git a/iscsiuio/config.h.in b/iscsiuio/config.h.in -new file mode 100644 -index 0000000..1628456 ---- /dev/null -+++ b/iscsiuio/config.h.in -@@ -0,0 +1,111 @@ -+/* config.h.in. Generated from configure.ac by autoheader. */ -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_DLFCN_H -+ -+/* Define to 1 if the system has the type `int16_t'. */ -+#undef HAVE_INT16_T -+ -+/* Define to 1 if the system has the type `int32_t'. */ -+#undef HAVE_INT32_T -+ -+/* Define to 1 if the system has the type `int64_t'. */ -+#undef HAVE_INT64_T -+ -+/* Define to 1 if the system has the type `int8_t'. */ -+#undef HAVE_INT8_T -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_INTTYPES_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_MEMORY_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 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 header file. */ -+#undef HAVE_SYS_STAT_H -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_SYS_TYPES_H -+ -+/* Define to 1 if the system has the type `uint16_t'. */ -+#undef HAVE_UINT16_T -+ -+/* Define to 1 if the system has the type `uint32_t'. */ -+#undef HAVE_UINT32_T -+ -+/* Define to 1 if the system has the type `uint64_t'. */ -+#undef HAVE_UINT64_T -+ -+/* Define to 1 if the system has the type `uint8_t'. */ -+#undef HAVE_UINT8_T -+ -+/* Define to 1 if you have the header file. */ -+#undef HAVE_UNISTD_H -+ -+/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -+#undef NO_MINUS_C_MINUS_O -+ -+/* 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 version of this package. */ -+#undef PACKAGE_VERSION -+ -+/* The size of a `int', as computed by sizeof. */ -+#undef SIZEOF_INT -+ -+/* The size of a `long', as computed by sizeof. */ -+#undef SIZEOF_LONG -+ -+/* The size of a `short', as computed by sizeof. */ -+#undef SIZEOF_SHORT -+ -+/* Define to 1 if you have the ANSI C header files. */ -+#undef STDC_HEADERS -+ -+/* Version number of package */ -+#undef VERSION -+ -+/* Enable GNU extensions on systems that have them. */ -+#ifndef _GNU_SOURCE -+# undef _GNU_SOURCE -+#endif -+ -+/* Define to empty if `const' does not conform to ANSI C. */ -+#undef const -+ -+/* Define to `__inline__' or `__inline' if that's what the C compiler -+ calls it, or to nothing if 'inline' is not supported under any name. */ -+#ifndef __cplusplus -+#undef inline -+#endif -+ -+/* Define to `long' if does not define. */ -+#undef off_t -+ -+/* Define to `unsigned' if does not define. */ -+#undef size_t -diff --git a/iscsiuio/config.status b/iscsiuio/config.status -new file mode 100644 -index 0000000..3408489 ---- /dev/null -+++ b/iscsiuio/config.status -@@ -0,0 +1,1236 @@ -+#! /bin/sh -+# Generated by configure. -+# 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-/bin/sh} -+## --------------------- ## -+## M4sh Initialization. ## -+## --------------------- ## -+ -+# 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+"$@"}'='"$@"' -+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then -+ set -o posix -+fi -+DUALCASE=1; export DUALCASE # for MKS sh -+ -+# Support unset when possible. -+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -+ as_unset=unset -+else -+ as_unset=false -+fi -+ -+ -+# Work around bugs in pre-3.0 UWIN ksh. -+$as_unset ENV MAIL MAILPATH -+PS1='$ ' -+PS2='> ' -+PS4='+ ' -+ -+# NLS nuisances. -+for as_var in \ -+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -+ LC_TELEPHONE LC_TIME -+do -+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -+ eval $as_var=C; export $as_var -+ else -+ $as_unset $as_var -+ fi -+done -+ -+# Required to use basename. -+if expr a : '\(a\)' >/dev/null 2>&1; 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 -+ -+ -+# Name of the executable. -+as_me=`$as_basename "$0" || -+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)$' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -+ /^X\/\(\/\/\)$/{ s//\1/; q; } -+ /^X\/\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ -+ -+# PATH needs CR, and LINENO needs CR and PATH. -+# 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 -+ -+# The user is always right. -+if test "${PATH_SEPARATOR+set}" != set; then -+ echo "#! /bin/sh" >conf$$.sh -+ echo "exit 0" >>conf$$.sh -+ chmod +x conf$$.sh -+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -+ PATH_SEPARATOR=';' -+ else -+ PATH_SEPARATOR=: -+ fi -+ rm -f conf$$.sh -+fi -+ -+ -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x$as_lineno_3" = "x$as_lineno_2" || { -+ # Find who we are. Look in the path if we contain no path at all -+ # relative or not. -+ 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 -+ -+ ;; -+ 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 -+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+ case $CONFIG_SHELL in -+ '') -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for as_base in sh bash ksh sh5; do -+ case $as_dir in -+ /*) -+ if ("$as_dir/$as_base" -c ' -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then -+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } -+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } -+ CONFIG_SHELL=$as_dir/$as_base -+ export CONFIG_SHELL -+ exec "$CONFIG_SHELL" "$0" ${1+"$@"} -+ fi;; -+ esac -+ done -+done -+;; -+ esac -+ -+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO -+ # uniformly replaced by the line number. The first 'sed' inserts a -+ # line-number line before each line; the second 'sed' does the real -+ # work. The second script uses 'N' to pair each line-number line -+ # with the numbered line, and appends trailing '-' during -+ # substitution so that $LINENO is not a special case at line end. -+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) -+ sed '=' <$as_myself | -+ sed ' -+ N -+ s,$,-, -+ : loop -+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, -+ t loop -+ s,-$,, -+ s,^['$as_cr_digits']*\n,, -+ ' >$as_me.lineno && -+ chmod +x $as_me.lineno || -+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} -+ { (exit 1); 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 sensible to this). -+ . ./$as_me.lineno -+ # Exit status is that of the last command. -+ exit -+} -+ -+ -+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in -+ *c*,-n*) ECHO_N= ECHO_C=' -+' ECHO_T=' ' ;; -+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; -+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -+esac -+ -+if expr a : '\(a\)' >/dev/null 2>&1; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+rm -f conf$$ conf$$.exe conf$$.file -+echo >conf$$.file -+if ln -s conf$$.file conf$$ 2>/dev/null; then -+ # We could just check for DJGPP; but this test a) works b) is more generic -+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). -+ if test -f conf$$.exe; then -+ # Don't use ln at all; we don't have any links -+ as_ln_s='cp -p' -+ else -+ as_ln_s='ln -s' -+ fi -+elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+else -+ as_ln_s='cp -p' -+fi -+rm -f conf$$ conf$$.exe conf$$.file -+ -+if mkdir -p . 2>/dev/null; then -+ as_mkdir_p=: -+else -+ test -d ./-p && rmdir ./-p -+ as_mkdir_p=false -+fi -+ -+as_executable_p="test -f" -+ -+# 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'" -+ -+ -+# IFS -+# We need space, tab and new line, in precisely that order. -+as_nl=' -+' -+IFS=" $as_nl" -+ -+# CDPATH. -+$as_unset CDPATH -+ -+exec 6>&1 -+ -+# Open the log real soon, to keep \$[0] and so on meaningful, and to -+# report actual input values of CONFIG_FILES etc. instead of their -+# values after options handling. Logging --version etc. is OK. -+exec 5>>config.log -+{ -+ echo -+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -+## Running $as_me. ## -+_ASBOX -+} >&5 -+cat >&5 <<_CSEOF -+ -+This file was extended by iscsiuio $as_me 0.7.4.2k, which was -+generated by GNU Autoconf 2.59. Invocation command line was -+ -+ CONFIG_FILES = $CONFIG_FILES -+ CONFIG_HEADERS = $CONFIG_HEADERS -+ CONFIG_LINKS = $CONFIG_LINKS -+ CONFIG_COMMANDS = $CONFIG_COMMANDS -+ $ $0 $@ -+ -+_CSEOF -+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -+echo >&5 -+config_files=" Makefile src/Makefile src/apps/Makefile src/apps/dhcpc/Makefile src/apps/brcm-iscsi/Makefile src/uip/Makefile src/unix/Makefile src/unix/libs/Makefile" -+config_headers=" config.h" -+config_commands=" depfiles default" -+ -+ac_cs_usage="\ -+\`$as_me' instantiates files from templates according to the -+current configuration. -+ -+Usage: $0 [OPTIONS] [FILE]... -+ -+ -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 -+ --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 ." -+ac_cs_version="\ -+iscsiuio config.status 0.7.4.2k -+configured by ./configure, generated by GNU Autoconf 2.59, -+ with options \"\" -+ -+Copyright (C) 2003 Free Software Foundation, Inc. -+This config.status script is free software; the Free Software Foundation -+gives unlimited permission to copy, distribute and modify it." -+srcdir=. -+INSTALL="/usr/bin/install -c" -+# If no file are specified by the user, then we need to provide default -+# value. By we need to know if files were specified by the user. -+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=$1 -+ ac_optarg=$2 -+ ac_shift=shift -+ ;; -+ *) # This is not an option, so the user has probably given explicit -+ # arguments. -+ ac_option=$1 -+ ac_need_defaults=false;; -+ esac -+ -+ case $ac_option in -+ # Handling of the options. -+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) -+ ac_cs_recheck=: ;; -+ --version | --vers* | -V ) -+ echo "$ac_cs_version"; exit 0 ;; -+ --he | --h) -+ # Conflict between --help and --header -+ { { echo "$as_me:$LINENO: error: ambiguous option: $1 -+Try \`$0 --help' for more information." >&5 -+echo "$as_me: error: ambiguous option: $1 -+Try \`$0 --help' for more information." >&2;} -+ { (exit 1); exit 1; }; };; -+ --help | --hel | -h ) -+ echo "$ac_cs_usage"; exit 0 ;; -+ --debug | --d* | -d ) -+ debug=: ;; -+ --file | --fil | --fi | --f ) -+ $ac_shift -+ CONFIG_FILES="$CONFIG_FILES $ac_optarg" -+ ac_need_defaults=false;; -+ --header | --heade | --head | --hea ) -+ $ac_shift -+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" -+ ac_need_defaults=false;; -+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ -+ | -silent | --silent | --silen | --sile | --sil | --si | --s) -+ ac_cs_silent=: ;; -+ -+ # This is an error. -+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -+Try \`$0 --help' for more information." >&5 -+echo "$as_me: error: unrecognized option: $1 -+Try \`$0 --help' for more information." >&2;} -+ { (exit 1); exit 1; }; } ;; -+ -+ *) ac_config_targets="$ac_config_targets $1" ;; -+ -+ 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 -+ -+if $ac_cs_recheck; then -+ echo "running /bin/sh ./configure " $ac_configure_extra_args " --no-create --no-recursion" >&6 -+ exec /bin/sh ./configure $ac_configure_extra_args --no-create --no-recursion -+fi -+ -+# -+# INIT-COMMANDS section. -+# -+ -+AMDEP_TRUE="" ac_aux_dir="." -+ -+ -+for ac_config_target in $ac_config_targets -+do -+ case "$ac_config_target" in -+ # Handling of arguments. -+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; -+ "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; -+ "src/apps/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/Makefile" ;; -+ "src/apps/dhcpc/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/dhcpc/Makefile" ;; -+ "src/apps/brcm-iscsi/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/brcm-iscsi/Makefile" ;; -+ "src/uip/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/uip/Makefile" ;; -+ "src/unix/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/unix/Makefile" ;; -+ "src/unix/libs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/unix/libs/Makefile" ;; -+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; -+ "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; -+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; -+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -+echo "$as_me: error: invalid argument: $ac_config_target" >&2;} -+ { (exit 1); exit 1; }; };; -+ 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 to put it here, and in addition, -+# creating and moving files from /tmp can sometimes cause problems. -+# Create a temporary directory, and hook for its removal unless debugging. -+$debug || -+{ -+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 -+ trap '{ (exit 1); exit 1; }' 1 2 13 15 -+} -+ -+# Create a (secure) tmp directory for tmp files. -+ -+{ -+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && -+ test -n "$tmp" && test -d "$tmp" -+} || -+{ -+ tmp=./confstat$$-$RANDOM -+ (umask 077 && mkdir $tmp) -+} || -+{ -+ echo "$me: cannot create a temporary directory in ." >&2 -+ { (exit 1); exit 1; } -+} -+ -+ -+# -+# CONFIG_FILES section. -+# -+ -+# No need to generate the scripts if there are no CONFIG_FILES. -+# This happens for instance when ./config.status config.h -+if test -n "$CONFIG_FILES"; then -+ # Protect against being on the right side of a sed subst in config.status. -+ sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g; -+ s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF -+s,@SHELL@,/bin/sh,;t t -+s,@PATH_SEPARATOR@,:,;t t -+s,@PACKAGE_NAME@,iscsiuio,;t t -+s,@PACKAGE_TARNAME@,iscsiuio,;t t -+s,@PACKAGE_VERSION@,0.7.4.2k,;t t -+s,@PACKAGE_STRING@,iscsiuio 0.7.4.2k,;t t -+s,@PACKAGE_BUGREPORT@,eddie.wai@broadcom.com,;t t -+s,@exec_prefix@,${prefix},;t t -+s,@prefix@,,;t t -+s,@program_transform_name@,s,x,x,,;t t -+s,@bindir@,${exec_prefix}/bin,;t t -+s,@sbindir@,${exec_prefix}/sbin,;t t -+s,@libexecdir@,${exec_prefix}/libexec,;t t -+s,@datadir@,${prefix}/share,;t t -+s,@sysconfdir@,${prefix}/etc,;t t -+s,@sharedstatedir@,${prefix}/com,;t t -+s,@localstatedir@,${prefix}/var,;t t -+s,@libdir@,${exec_prefix}/lib,;t t -+s,@includedir@,${prefix}/include,;t t -+s,@oldincludedir@,/usr/include,;t t -+s,@infodir@,${prefix}/info,;t t -+s,@mandir@,${prefix}/man,;t t -+s,@build_alias@,,;t t -+s,@host_alias@,,;t t -+s,@target_alias@,,;t t -+s,@DEFS@,-DHAVE_CONFIG_H,;t t -+s,@ECHO_C@,,;t t -+s,@ECHO_N@,-n,;t t -+s,@ECHO_T@,,;t t -+s,@LIBS@,,;t t -+s,@INSTALL_PROGRAM@,${INSTALL},;t t -+s,@INSTALL_SCRIPT@,${INSTALL},;t t -+s,@INSTALL_DATA@,${INSTALL} -m 644,;t t -+s,@CYGPATH_W@,echo,;t t -+s,@PACKAGE@,,;t t -+s,@VERSION@,,;t t -+s,@ACLOCAL@,${SHELL} /home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/missing --run aclocal-1.9,;t t -+s,@AUTOCONF@,${SHELL} /home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/missing --run autoconf,;t t -+s,@AUTOMAKE@,${SHELL} /home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/missing --run automake-1.9,;t t -+s,@AUTOHEADER@,${SHELL} /home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/missing --run autoheader,;t t -+s,@MAKEINFO@,${SHELL} /home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/missing --run makeinfo,;t t -+s,@install_sh@,/home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/install-sh,;t t -+s,@STRIP@,strip,;t t -+s,@ac_ct_STRIP@,strip,;t t -+s,@INSTALL_STRIP_PROGRAM@,${SHELL} $(install_sh) -c -s,;t t -+s,@mkdir_p@,mkdir -p --,;t t -+s,@AWK@,gawk,;t t -+s,@SET_MAKE@,,;t t -+s,@am__leading_dot@,.,;t t -+s,@AMTAR@,${SHELL} /home/share/source/open-iscsi/main/open-iscsi-iscsiuio/iscsiuio/missing --run tar,;t t -+s,@am__tar@,${AMTAR} chof - "$$tardir",;t t -+s,@am__untar@,${AMTAR} xf -,;t t -+s,@BASH@,/bin/sh,;t t -+s,@CC@,gcc,;t t -+s,@CFLAGS@,-O2 -Wall,;t t -+s,@LDFLAGS@,,;t t -+s,@CPPFLAGS@,,;t t -+s,@ac_ct_CC@,gcc,;t t -+s,@EXEEXT@,,;t t -+s,@OBJEXT@,o,;t t -+s,@DEPDIR@,.deps,;t t -+s,@am__include@,include,;t t -+s,@am__quote@,,;t t -+s,@AMDEP_TRUE@,,;t t -+s,@AMDEP_FALSE@,#,;t t -+s,@AMDEPBACKSLASH@,\,;t t -+s,@CCDEPMODE@,depmode=gcc3,;t t -+s,@am__fastdepCC_TRUE@,,;t t -+s,@am__fastdepCC_FALSE@,#,;t t -+s,@RANLIB@,ranlib,;t t -+s,@ac_ct_RANLIB@,ranlib,;t t -+s,@CPP@,gcc -E,;t t -+s,@EGREP@,grep -E,;t t -+s,@ENDIAN@,LITTLE,;t t -+s,@build@,x86_64-unknown-linux-gnu,;t t -+s,@build_cpu@,x86_64,;t t -+s,@build_vendor@,unknown,;t t -+s,@build_os@,linux-gnu,;t t -+s,@host@,x86_64-unknown-linux-gnu,;t t -+s,@host_cpu@,x86_64,;t t -+s,@host_vendor@,unknown,;t t -+s,@host_os@,linux-gnu,;t t -+s,@SED@,/bin/sed,;t t -+s,@LN_S@,ln -s,;t t -+s,@ECHO@,echo,;t t -+s,@AR@,ar,;t t -+s,@ac_ct_AR@,ar,;t t -+s,@CXX@,g++,;t t -+s,@CXXFLAGS@,-g -O2,;t t -+s,@ac_ct_CXX@,g++,;t t -+s,@CXXDEPMODE@,depmode=gcc3,;t t -+s,@am__fastdepCXX_TRUE@,,;t t -+s,@am__fastdepCXX_FALSE@,#,;t t -+s,@CXXCPP@,g++ -E,;t t -+s,@F77@,f95,;t t -+s,@FFLAGS@,-g -O2,;t t -+s,@ac_ct_F77@,f95,;t t -+s,@LIBTOOL@,$(SHELL) $(top_builddir)/libtool,;t t -+s,@DEBUG_TRUE@,#,;t t -+s,@DEBUG_FALSE@,,;t t -+s,@LIBOBJS@,,;t t -+s,@LTLIBOBJS@,,;t t -+CEOF -+ -+ # Split the substitutions into bite-sized pieces for seds with -+ # small command number limits, like on Digital OSF/1 and HP-UX. -+ ac_max_sed_lines=48 -+ ac_sed_frag=1 # Number of current file. -+ ac_beg=1 # First line for current file. -+ ac_end=$ac_max_sed_lines # Line after last line for current file. -+ ac_more_lines=: -+ ac_sed_cmds= -+ while $ac_more_lines; do -+ if test $ac_beg -gt 1; then -+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag -+ else -+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag -+ fi -+ if test ! -s $tmp/subs.frag; then -+ ac_more_lines=false -+ else -+ # The purpose of the label and of the branching condition is to -+ # speed up the sed processing (if there are no `@' at all, there -+ # is no need to browse any of the substitutions). -+ # These are the two extra sed commands mentioned above. -+ (echo ':t -+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed -+ if test -z "$ac_sed_cmds"; then -+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" -+ else -+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" -+ fi -+ ac_sed_frag=`expr $ac_sed_frag + 1` -+ ac_beg=$ac_end -+ ac_end=`expr $ac_end + $ac_max_sed_lines` -+ fi -+ done -+ if test -z "$ac_sed_cmds"; then -+ ac_sed_cmds=cat -+ fi -+fi # test -n "$CONFIG_FILES" -+ -+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue -+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". -+ case $ac_file in -+ - | *:- | *:-:* ) # input from stdin -+ cat >$tmp/stdin -+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ * ) ac_file_in=$ac_file.in ;; -+ esac -+ -+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. -+ ac_dir=`(dirname "$ac_file") 2>/dev/null || -+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_file" : 'X\(//\)[^/]' \| \ -+ X"$ac_file" : 'X\(//\)$' \| \ -+ X"$ac_file" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$ac_file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p "$ac_dir" -+ else -+ as_dir="$ac_dir" -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ ac_builddir=. -+ -+if test "$ac_dir" != .; then -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A "../" for each directory in $ac_dir_suffix. -+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -+else -+ ac_dir_suffix= ac_top_builddir= -+fi -+ -+case $srcdir in -+ .) # No --srcdir option. We are building in place. -+ ac_srcdir=. -+ if test -z "$ac_top_builddir"; then -+ ac_top_srcdir=. -+ else -+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -+ fi ;; -+ [\\/]* | ?:[\\/]* ) # Absolute path. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir ;; -+ *) # Relative path. -+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_builddir$srcdir ;; -+esac -+ -+# Do not use `cd foo && pwd` to compute absolute paths, because -+# the directories may not exist. -+case `pwd` in -+.) ac_abs_builddir="$ac_dir";; -+*) -+ case "$ac_dir" in -+ .) ac_abs_builddir=`pwd`;; -+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -+ *) ac_abs_builddir=`pwd`/"$ac_dir";; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_builddir=${ac_top_builddir}.;; -+*) -+ case ${ac_top_builddir}. in -+ .) ac_abs_top_builddir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_srcdir=$ac_srcdir;; -+*) -+ case $ac_srcdir in -+ .) ac_abs_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_srcdir=$ac_top_srcdir;; -+*) -+ case $ac_top_srcdir in -+ .) ac_abs_top_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -+ esac;; -+esac -+ -+ -+ case $INSTALL in -+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; -+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;; -+ esac -+ -+ if test x"$ac_file" != x-; then -+ { echo "$as_me:$LINENO: creating $ac_file" >&5 -+echo "$as_me: creating $ac_file" >&6;} -+ rm -f "$ac_file" -+ fi -+ # 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. */ -+ if test x"$ac_file" = x-; then -+ configure_input= -+ else -+ configure_input="$ac_file. " -+ fi -+ configure_input=$configure_input"Generated from `echo $ac_file_in | -+ sed 's,.*/,,'` by configure." -+ -+ # First look for the input files in the build tree, otherwise in the -+ # src tree. -+ ac_file_inputs=`IFS=: -+ for f in $ac_file_in; do -+ case $f in -+ -) echo $tmp/stdin ;; -+ [\\/$]*) -+ # Absolute (can't be DOS-style, as IFS=:) -+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ echo "$f";; -+ *) # Relative -+ if test -f "$f"; then -+ # Build tree -+ echo "$f" -+ elif test -f "$srcdir/$f"; then -+ # Source tree -+ echo "$srcdir/$f" -+ else -+ # /dev/null tree -+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ fi;; -+ esac -+ done` || { (exit 1); exit 1; } -+ sed "/^[ ]*VPATH[ ]*=/{ -+s/:*\$(srcdir):*/:/; -+s/:*\${srcdir}:*/:/; -+s/:*@srcdir@:*/:/; -+s/^\([^=]*=[ ]*\):*/\1/; -+s/:*$//; -+s/^[^=]*=[ ]*$//; -+} -+ -+:t -+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -+s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t -+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -+s,@INSTALL@,$ac_INSTALL,;t t -+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out -+ rm -f $tmp/stdin -+ if test x"$ac_file" != x-; then -+ mv $tmp/out $ac_file -+ else -+ cat $tmp/out -+ rm -f $tmp/out -+ fi -+ -+done -+ -+# -+# CONFIG_HEADER section. -+# -+ -+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -+# NAME is the cpp macro being defined and VALUE is the value it is being given. -+# -+# ac_d sets the value in "#define NAME VALUE" lines. -+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -+ac_dB='[ ].*$,\1#\2' -+ac_dC=' ' -+ac_dD=',;t' -+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -+ac_uB='$,\1#\2define\3' -+ac_uC=' ' -+ac_uD=',;t' -+ -+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue -+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". -+ case $ac_file in -+ - | *:- | *:-:* ) # input from stdin -+ cat >$tmp/stdin -+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ * ) ac_file_in=$ac_file.in ;; -+ esac -+ -+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -+echo "$as_me: creating $ac_file" >&6;} -+ -+ # First look for the input files in the build tree, otherwise in the -+ # src tree. -+ ac_file_inputs=`IFS=: -+ for f in $ac_file_in; do -+ case $f in -+ -) echo $tmp/stdin ;; -+ [\\/$]*) -+ # Absolute (can't be DOS-style, as IFS=:) -+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ # Do quote $f, to prevent DOS paths from being IFS'd. -+ echo "$f";; -+ *) # Relative -+ if test -f "$f"; then -+ # Build tree -+ echo "$f" -+ elif test -f "$srcdir/$f"; then -+ # Source tree -+ echo "$srcdir/$f" -+ else -+ # /dev/null tree -+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ fi;; -+ esac -+ done` || { (exit 1); exit 1; } -+ # Remove the trailing spaces. -+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in -+ -+ # Handle all the #define templates only if necessary. -+ if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then -+ # If there are no defines, we may have an empty if/fi -+ : -+ cat >$tmp/defines.sed <$tmp/out -+ rm -f $tmp/in -+ mv $tmp/out $tmp/in -+ -+ fi # grep -+ -+ # Handle all the #undef templates -+ cat >$tmp/undefs.sed <$tmp/out -+ rm -f $tmp/in -+ mv $tmp/out $tmp/in -+ -+ # 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. */ -+ if test x"$ac_file" = x-; then -+ echo "/* Generated by configure. */" >$tmp/config.h -+ else -+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h -+ fi -+ cat $tmp/in >>$tmp/config.h -+ rm -f $tmp/in -+ if test x"$ac_file" != x-; then -+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then -+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -+echo "$as_me: $ac_file is unchanged" >&6;} -+ else -+ ac_dir=`(dirname "$ac_file") 2>/dev/null || -+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_file" : 'X\(//\)[^/]' \| \ -+ X"$ac_file" : 'X\(//\)$' \| \ -+ X"$ac_file" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$ac_file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p "$ac_dir" -+ else -+ as_dir="$ac_dir" -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ rm -f $ac_file -+ mv $tmp/config.h $ac_file -+ fi -+ else -+ cat $tmp/config.h -+ rm -f $tmp/config.h -+ fi -+# Compute $ac_file's index in $config_headers. -+_am_stamp_count=1 -+for _am_header in $config_headers :; do -+ case $_am_header in -+ $ac_file | $ac_file:* ) -+ break ;; -+ * ) -+ _am_stamp_count=`expr $_am_stamp_count + 1` ;; -+ esac -+done -+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || -+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X$ac_file : 'X\(//\)[^/]' \| \ -+ X$ac_file : 'X\(//\)$' \| \ -+ X$ac_file : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X$ac_file | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'`/stamp-h$_am_stamp_count -+done -+ -+# -+# CONFIG_COMMANDS section. -+# -+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue -+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'` -+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_dir=`(dirname "$ac_dest") 2>/dev/null || -+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_dest" : 'X\(//\)[^/]' \| \ -+ X"$ac_dest" : 'X\(//\)$' \| \ -+ X"$ac_dest" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$ac_dest" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p "$ac_dir" -+ else -+ as_dir="$ac_dir" -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ ac_builddir=. -+ -+if test "$ac_dir" != .; then -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A "../" for each directory in $ac_dir_suffix. -+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -+else -+ ac_dir_suffix= ac_top_builddir= -+fi -+ -+case $srcdir in -+ .) # No --srcdir option. We are building in place. -+ ac_srcdir=. -+ if test -z "$ac_top_builddir"; then -+ ac_top_srcdir=. -+ else -+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -+ fi ;; -+ [\\/]* | ?:[\\/]* ) # Absolute path. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir ;; -+ *) # Relative path. -+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_builddir$srcdir ;; -+esac -+ -+# Do not use `cd foo && pwd` to compute absolute paths, because -+# the directories may not exist. -+case `pwd` in -+.) ac_abs_builddir="$ac_dir";; -+*) -+ case "$ac_dir" in -+ .) ac_abs_builddir=`pwd`;; -+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -+ *) ac_abs_builddir=`pwd`/"$ac_dir";; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_builddir=${ac_top_builddir}.;; -+*) -+ case ${ac_top_builddir}. in -+ .) ac_abs_top_builddir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_srcdir=$ac_srcdir;; -+*) -+ case $ac_srcdir in -+ .) ac_abs_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_srcdir=$ac_top_srcdir;; -+*) -+ case $ac_top_srcdir in -+ .) ac_abs_top_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -+ esac;; -+esac -+ -+ -+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -+echo "$as_me: executing $ac_dest commands" >&6;} -+ case $ac_dest in -+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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. -+ # So let's grep whole file. -+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then -+ dirpart=`(dirname "$mf") 2>/dev/null || -+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$mf" : 'X\(//\)[^/]' \| \ -+ X"$mf" : 'X\(//\)$' \| \ -+ X"$mf" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+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"` -+ # When using ansi2knr, U may be empty or an underscore; expand it -+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/g'`; do -+ # Make sure the directory exists. -+ test -f "$dirpart/$file" && continue -+ fdir=`(dirname "$file") 2>/dev/null || -+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$file" : 'X\(//\)[^/]' \| \ -+ X"$file" : 'X\(//\)$' \| \ -+ X"$file" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p $dirpart/$fdir -+ else -+ as_dir=$dirpart/$fdir -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ # echo "creating $dirpart/$file" -+ echo '# dummy' > "$dirpart/$file" -+ done -+done -+ ;; -+ default ) echo 'char *build_date ="'`date`'";' > src/unix/build_date.c && echo 'char *build_date; '> src/unix/build_date.h ;; -+ esac -+done -+ -+{ (exit 0); exit 0; } -diff --git a/iscsiuio/config.sub b/iscsiuio/config.sub -new file mode 100755 -index 0000000..1a7a1e6 ---- /dev/null -+++ b/iscsiuio/config.sub -@@ -0,0 +1,1695 @@ -+#! /bin/sh -+# Configuration validation subroutine script. -+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 -+# Free Software Foundation, Inc. -+ -+timestamp='2008-09-08' -+ -+# This file is (in principle) common to ALL GNU software. -+# The presence of a machine in this file suggests that SOME GNU software -+# can handle that machine. It does not imply ALL GNU software can. -+# -+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA -+# 02110-1301, USA. -+# -+# 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. -+ -+ -+# Please send patches to . Submit a context -+# diff and a properly formatted ChangeLog entry. -+# -+# 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. -+ -+# 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -+2002, 2003, 2004, 2005, 2006, 2007, 2008 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-dietlibc | linux-newlib* | linux-uclibc* | \ -+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ -+ storm-chaos* | os2-emx* | rtmk-nova*) -+ os=-$maybe_os -+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` -+ ;; -+ *) -+ 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) -+ os= -+ basic_machine=$1 -+ ;; -+ -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*) -+ 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 \ -+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ -+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ -+ | am33_2.0 \ -+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ -+ | bfin \ -+ | c4x | clipper \ -+ | d10v | d30v | dlx | dsp16xx | dvp \ -+ | fido | fr30 | frv \ -+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ -+ | i370 | i860 | i960 | ia64 \ -+ | ip2k | iq2000 \ -+ | m32c | m32r | m32rle | m68000 | m68k | m88k \ -+ | maxq | mb | microblaze | 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 \ -+ | mipstx39 | mipstx39el \ -+ | mn10200 | mn10300 \ -+ | mt \ -+ | msp430 \ -+ | nios | nios2 \ -+ | ns16k | ns32k \ -+ | or32 \ -+ | pdp10 | pdp11 | pj | pjl \ -+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ -+ | pyramid \ -+ | score \ -+ | sh | sh[1234] | sh[24]a | sh[24]a*eb | 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 | strongarm \ -+ | tahoe | thumb | tic4x | tic80 | tron \ -+ | v850 | v850e \ -+ | we32k \ -+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ -+ | z8k | z80) -+ basic_machine=$basic_machine-unknown -+ ;; -+ m6811 | m68hc11 | m6812 | m68hc12) -+ # Motorola 68HC11/12. -+ basic_machine=$basic_machine-unknown -+ os=-none -+ ;; -+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) -+ ;; -+ ms1) -+ basic_machine=mt-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-* \ -+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ -+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ -+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ -+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ -+ | avr-* | avr32-* \ -+ | bfin-* | bs2000-* \ -+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ -+ | 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-* \ -+ | i*86-* | i860-* | i960-* | ia64-* \ -+ | ip2k-* | iq2000-* \ -+ | m32c-* | m32r-* | m32rle-* \ -+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ -+ | m88110-* | m88k-* | maxq-* | mcore-* | 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-* \ -+ | mipstx39-* | mipstx39el-* \ -+ | mmix-* \ -+ | mt-* \ -+ | msp430-* \ -+ | nios-* | nios2-* \ -+ | none-* | np1-* | ns16k-* | ns32k-* \ -+ | orion-* \ -+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ -+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ -+ | pyramid-* \ -+ | romp-* | rs6000-* \ -+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | 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-* | strongarm-* | sv1-* | sx?-* \ -+ | tahoe-* | thumb-* \ -+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ -+ | tron-* \ -+ | v850-* | v850e-* | vax-* \ -+ | we32k-* \ -+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ -+ | 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 -+ ;; -+ 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 -+ ;; -+ 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) -+ 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'm not sure what "Sysv32" means. Should this be sysv3.2? -+ 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 -+ ;; -+ 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 -+ ;; -+ mipsEE* | ee | ps2) -+ basic_machine=mips64r5900el-scei -+ case $os in -+ -linux*) -+ ;; -+ *) -+ os=-elf -+ ;; -+ esac -+ ;; -+ iop) -+ basic_machine=mipsel-scei -+ os=-irx -+ ;; -+ dvp) -+ basic_machine=dvp-scei -+ os=-elf -+ ;; -+ 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-/'` -+ ;; -+ mvs) -+ basic_machine=i370-ibm -+ os=-mvs -+ ;; -+ 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 -+ ;; -+ 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) basic_machine=powerpc-unknown -+ ;; -+ ppc-*) 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) -+ 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 -+ ;; -+ 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 -+ ;; -+ tic54x | c54x*) -+ basic_machine=tic54x-unknown -+ os=-coff -+ ;; -+ tic55x | c55x*) -+ basic_machine=tic55x-unknown -+ os=-coff -+ ;; -+ tic6x | c6x*) -+ basic_machine=tic6x-unknown -+ os=-coff -+ ;; -+ tile*) -+ basic_machine=tile-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 -+ ;; -+ 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[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. -+ -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* | -sunos | -sunos[34]*\ -+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ -+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ -+ | -aos* \ -+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ -+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ -+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ -+ | -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* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ -+ | -mingw32* | -linux-gnu* | -linux-newlib* | -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* | -irx*) -+ # 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 -+ ;; -+ -kaos*) -+ os=-kaos -+ ;; -+ -zvmoe) -+ os=-zvmoe -+ ;; -+ -dicos*) -+ os=-dicos -+ ;; -+ -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 -+ ;; -+ # 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 -+ # This also exists in the configure program, but was not the -+ # default. -+ # os=-sunos4 -+ ;; -+ m68*-cisco) -+ os=-aout -+ ;; -+ mep-*) -+ os=-elf -+ ;; -+ mips*-cisco) -+ os=-elf -+ ;; -+ mips*-*) -+ 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 -+ ;; -+ -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: -diff --git a/iscsiuio/configure b/iscsiuio/configure -new file mode 100755 -index 0000000..1852551 ---- /dev/null -+++ b/iscsiuio/configure -@@ -0,0 +1,22765 @@ -+#! /bin/sh -+# Guess values for system-dependent variables and create Makefiles. -+# Generated by GNU Autoconf 2.59 for iscsiuio 0.7.6.1g. -+# -+# Report bugs to . -+# -+# Copyright (C) 2003 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 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+"$@"}'='"$@"' -+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then -+ set -o posix -+fi -+DUALCASE=1; export DUALCASE # for MKS sh -+ -+# Support unset when possible. -+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -+ as_unset=unset -+else -+ as_unset=false -+fi -+ -+ -+# Work around bugs in pre-3.0 UWIN ksh. -+$as_unset ENV MAIL MAILPATH -+PS1='$ ' -+PS2='> ' -+PS4='+ ' -+ -+# NLS nuisances. -+for as_var in \ -+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -+ LC_TELEPHONE LC_TIME -+do -+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -+ eval $as_var=C; export $as_var -+ else -+ $as_unset $as_var -+ fi -+done -+ -+# Required to use basename. -+if expr a : '\(a\)' >/dev/null 2>&1; 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 -+ -+ -+# Name of the executable. -+as_me=`$as_basename "$0" || -+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)$' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -+ /^X\/\(\/\/\)$/{ s//\1/; q; } -+ /^X\/\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ -+ -+# PATH needs CR, and LINENO needs CR and PATH. -+# 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 -+ -+# The user is always right. -+if test "${PATH_SEPARATOR+set}" != set; then -+ echo "#! /bin/sh" >conf$$.sh -+ echo "exit 0" >>conf$$.sh -+ chmod +x conf$$.sh -+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -+ PATH_SEPARATOR=';' -+ else -+ PATH_SEPARATOR=: -+ fi -+ rm -f conf$$.sh -+fi -+ -+ -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x$as_lineno_3" = "x$as_lineno_2" || { -+ # Find who we are. Look in the path if we contain no path at all -+ # relative or not. -+ 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 -+ -+ ;; -+ 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 -+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 -+ { (exit 1); exit 1; }; } -+ fi -+ case $CONFIG_SHELL in -+ '') -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for as_base in sh bash ksh sh5; do -+ case $as_dir in -+ /*) -+ if ("$as_dir/$as_base" -c ' -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then -+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } -+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } -+ CONFIG_SHELL=$as_dir/$as_base -+ export CONFIG_SHELL -+ exec "$CONFIG_SHELL" "$0" ${1+"$@"} -+ fi;; -+ esac -+ done -+done -+;; -+ esac -+ -+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO -+ # uniformly replaced by the line number. The first 'sed' inserts a -+ # line-number line before each line; the second 'sed' does the real -+ # work. The second script uses 'N' to pair each line-number line -+ # with the numbered line, and appends trailing '-' during -+ # substitution so that $LINENO is not a special case at line end. -+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) -+ sed '=' <$as_myself | -+ sed ' -+ N -+ s,$,-, -+ : loop -+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, -+ t loop -+ s,-$,, -+ s,^['$as_cr_digits']*\n,, -+ ' >$as_me.lineno && -+ chmod +x $as_me.lineno || -+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 -+ { (exit 1); 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 sensible to this). -+ . ./$as_me.lineno -+ # Exit status is that of the last command. -+ exit -+} -+ -+ -+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in -+ *c*,-n*) ECHO_N= ECHO_C=' -+' ECHO_T=' ' ;; -+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; -+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -+esac -+ -+if expr a : '\(a\)' >/dev/null 2>&1; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+rm -f conf$$ conf$$.exe conf$$.file -+echo >conf$$.file -+if ln -s conf$$.file conf$$ 2>/dev/null; then -+ # We could just check for DJGPP; but this test a) works b) is more generic -+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). -+ if test -f conf$$.exe; then -+ # Don't use ln at all; we don't have any links -+ as_ln_s='cp -p' -+ else -+ as_ln_s='ln -s' -+ fi -+elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+else -+ as_ln_s='cp -p' -+fi -+rm -f conf$$ conf$$.exe conf$$.file -+ -+if mkdir -p . 2>/dev/null; then -+ as_mkdir_p=: -+else -+ test -d ./-p && rmdir ./-p -+ as_mkdir_p=false -+fi -+ -+as_executable_p="test -f" -+ -+# 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'" -+ -+ -+# IFS -+# We need space, tab and new line, in precisely that order. -+as_nl=' -+' -+IFS=" $as_nl" -+ -+# CDPATH. -+$as_unset CDPATH -+ -+ -+ -+# Check that we are running under the correct shell. -+SHELL=${CONFIG_SHELL-/bin/sh} -+ -+case X$ECHO in -+X*--fallback-echo) -+ # Remove one level of quotation (which was required for Make). -+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` -+ ;; -+esac -+ -+echo=${ECHO-echo} -+if test "X$1" = X--no-reexec; then -+ # Discard the --no-reexec flag, and continue. -+ shift -+elif test "X$1" = X--fallback-echo; then -+ # Avoid inline document here, it may be left over -+ : -+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then -+ # Yippee, $echo works! -+ : -+else -+ # Restart under the correct shell. -+ exec $SHELL "$0" --no-reexec ${1+"$@"} -+fi -+ -+if test "X$1" = X--fallback-echo; then -+ # used as fallback echo -+ shift -+ cat </dev/null 2>&1 && unset CDPATH -+ -+if test -z "$ECHO"; then -+if test "X${echo_test_string+set}" != Xset; then -+# find a string as large as possible, as long as the shell can cope with it -+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do -+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... -+ if (echo_test_string=`eval $cmd`) 2>/dev/null && -+ echo_test_string=`eval $cmd` && -+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null -+ then -+ break -+ fi -+ done -+fi -+ -+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ : -+else -+ # The Solaris, AIX, and Digital Unix default echo programs unquote -+ # backslashes. This makes it impossible to quote backslashes using -+ # echo "$something" | sed 's/\\/\\\\/g' -+ # -+ # So, first we look for a working echo in the user's PATH. -+ -+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -+ for dir in $PATH /usr/ucb; do -+ IFS="$lt_save_ifs" -+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && -+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ echo="$dir/echo" -+ break -+ fi -+ done -+ IFS="$lt_save_ifs" -+ -+ if test "X$echo" = Xecho; then -+ # We didn't find a better echo, so look for alternatives. -+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ # This shell has a builtin print -r that does the trick. -+ echo='print -r' -+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && -+ test "X$CONFIG_SHELL" != X/bin/ksh; then -+ # If we have ksh, try running configure again with it. -+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} -+ export ORIGINAL_CONFIG_SHELL -+ CONFIG_SHELL=/bin/ksh -+ export CONFIG_SHELL -+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} -+ else -+ # Try using printf. -+ echo='printf %s\n' -+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && -+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ # Cool, printf works -+ : -+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && -+ test "X$echo_testing_string" = 'X\t' && -+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL -+ export CONFIG_SHELL -+ SHELL="$CONFIG_SHELL" -+ export SHELL -+ echo="$CONFIG_SHELL $0 --fallback-echo" -+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && -+ test "X$echo_testing_string" = 'X\t' && -+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && -+ test "X$echo_testing_string" = "X$echo_test_string"; then -+ echo="$CONFIG_SHELL $0 --fallback-echo" -+ else -+ # maybe with a smaller string... -+ prev=: -+ -+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do -+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null -+ then -+ break -+ fi -+ prev="$cmd" -+ done -+ -+ if test "$prev" != 'sed 50q "$0"'; then -+ echo_test_string=`eval $prev` -+ export echo_test_string -+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} -+ else -+ # Oops. We lost completely, so just stick with echo. -+ echo=echo -+ fi -+ fi -+ fi -+ fi -+fi -+fi -+ -+# Copy echo and quote the copy suitably for passing to libtool from -+# the Makefile, instead of quoting the original, which is used later. -+ECHO=$echo -+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then -+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" -+fi -+ -+ -+ -+ -+tagnames=${tagnames+${tagnames},}CXX -+ -+tagnames=${tagnames+${tagnames},}F77 -+ -+# Name of the host. -+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -+# so uname gets run too. -+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -+ -+exec 6>&1 -+ -+# -+# Initializations. -+# -+ac_default_prefix=/usr/local -+ac_config_libobj_dir=. -+cross_compiling=no -+subdirs= -+MFLAGS= -+MAKEFLAGS= -+SHELL=${CONFIG_SHELL-/bin/sh} -+ -+# Maximum number of lines to put in a shell here document. -+# This variable seems obsolete. It should probably be removed, and -+# only ac_max_sed_lines should be used. -+: ${ac_max_here_lines=38} -+ -+# Identity of this package. -+PACKAGE_NAME='iscsiuio' -+PACKAGE_TARNAME='iscsiuio' -+PACKAGE_VERSION='0.7.6.1g' -+PACKAGE_STRING='iscsiuio 0.7.6.1g' -+PACKAGE_BUGREPORT='eddie.wai@broadcom.com' -+ -+# Factoring default headers for most tests. -+ac_includes_default="\ -+#include -+#if HAVE_SYS_TYPES_H -+# include -+#endif -+#if HAVE_SYS_STAT_H -+# include -+#endif -+#if STDC_HEADERS -+# include -+# include -+#else -+# if HAVE_STDLIB_H -+# include -+# endif -+#endif -+#if HAVE_STRING_H -+# if !STDC_HEADERS && HAVE_MEMORY_H -+# include -+# endif -+# include -+#endif -+#if HAVE_STRINGS_H -+# include -+#endif -+#if HAVE_INTTYPES_H -+# include -+#else -+# if HAVE_STDINT_H -+# include -+# endif -+#endif -+#if HAVE_UNISTD_H -+# include -+#endif" -+ -+ac_default_prefix= -+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar BASH CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE RANLIB ac_ct_RANLIB CPP EGREP ENDIAN build build_cpu build_vendor build_os host host_cpu host_vendor host_os SED LN_S ECHO AR ac_ct_AR CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL DEBUG_TRUE DEBUG_FALSE LIBOBJS LTLIBOBJS' -+ac_subst_files='' -+ -+# Initialize some variables set by options. -+ac_init_help= -+ac_init_version=false -+# 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. -+bindir='${exec_prefix}/bin' -+sbindir='${exec_prefix}/sbin' -+libexecdir='${exec_prefix}/libexec' -+datadir='${prefix}/share' -+sysconfdir='${prefix}/etc' -+sharedstatedir='${prefix}/com' -+localstatedir='${prefix}/var' -+libdir='${exec_prefix}/lib' -+includedir='${prefix}/include' -+oldincludedir='/usr/include' -+infodir='${prefix}/info' -+mandir='${prefix}/man' -+ -+ac_prev= -+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 -+ -+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` -+ -+ # Accept the important Cygnus configure options, so we can diagnose typos. -+ -+ case $ac_option in -+ -+ -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 | --data | --dat | --da) -+ ac_prev=datadir ;; -+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ -+ | --da=*) -+ datadir=$ac_optarg ;; -+ -+ -disable-* | --disable-*) -+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 -+ { (exit 1); exit 1; }; } -+ ac_feature=`echo $ac_feature | sed 's/-/_/g'` -+ eval "enable_$ac_feature=no" ;; -+ -+ -enable-* | --enable-*) -+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2 -+ { (exit 1); exit 1; }; } -+ ac_feature=`echo $ac_feature | sed 's/-/_/g'` -+ case $ac_option in -+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; -+ *) ac_optarg=yes ;; -+ esac -+ eval "enable_$ac_feature='$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 ;; -+ -+ -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 ;; -+ -+ -localstatedir | --localstatedir | --localstatedi | --localstated \ -+ | --localstate | --localstat | --localsta | --localst \ -+ | --locals | --local | --loca | --loc | --lo) -+ ac_prev=localstatedir ;; -+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ -+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ -+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) -+ 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 ;; -+ -+ -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid package name: $ac_package" >&2 -+ { (exit 1); exit 1; }; } -+ ac_package=`echo $ac_package| sed 's/-/_/g'` -+ case $ac_option in -+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; -+ *) ac_optarg=yes ;; -+ esac -+ eval "with_$ac_package='$ac_optarg'" ;; -+ -+ -without-* | --without-*) -+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid package name: $ac_package" >&2 -+ { (exit 1); exit 1; }; } -+ ac_package=`echo $ac_package | sed 's/-/_/g'` -+ eval "with_$ac_package=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 ;; -+ -+ -*) { echo "$as_me: error: unrecognized option: $ac_option -+Try \`$0 --help' for more information." >&2 -+ { (exit 1); exit 1; }; } -+ ;; -+ -+ *=*) -+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` -+ # Reject names that are not valid shell variable names. -+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && -+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 -+ { (exit 1); exit 1; }; } -+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` -+ eval "$ac_envvar='$ac_optarg'" -+ export $ac_envvar ;; -+ -+ *) -+ # FIXME: should be removed in autoconf 3.0. -+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2 -+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && -+ 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'` -+ { echo "$as_me: error: missing argument to $ac_option" >&2 -+ { (exit 1); exit 1; }; } -+fi -+ -+# Be sure to have absolute paths. -+for ac_var in exec_prefix prefix -+do -+ eval ac_val=$`echo $ac_var` -+ case $ac_val in -+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;; -+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 -+ { (exit 1); exit 1; }; };; -+ esac -+done -+ -+# Be sure to have absolute paths. -+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ -+ localstatedir libdir includedir oldincludedir infodir mandir -+do -+ eval ac_val=$`echo $ac_var` -+ case $ac_val in -+ [\\/$]* | ?:[\\/]* ) ;; -+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 -+ { (exit 1); exit 1; }; };; -+ esac -+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 -+ 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 -+ -+ -+# 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 its parent. -+ ac_confdir=`(dirname "$0") 2>/dev/null || -+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$0" : 'X\(//\)[^/]' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$0" | -+ 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 -+ if test "$ac_srcdir_defaulted" = yes; then -+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 -+ { (exit 1); exit 1; }; } -+ else -+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 -+ { (exit 1); exit 1; }; } -+ fi -+fi -+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || -+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 -+ { (exit 1); exit 1; }; } -+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -+ac_env_build_alias_set=${build_alias+set} -+ac_env_build_alias_value=$build_alias -+ac_cv_env_build_alias_set=${build_alias+set} -+ac_cv_env_build_alias_value=$build_alias -+ac_env_host_alias_set=${host_alias+set} -+ac_env_host_alias_value=$host_alias -+ac_cv_env_host_alias_set=${host_alias+set} -+ac_cv_env_host_alias_value=$host_alias -+ac_env_target_alias_set=${target_alias+set} -+ac_env_target_alias_value=$target_alias -+ac_cv_env_target_alias_set=${target_alias+set} -+ac_cv_env_target_alias_value=$target_alias -+ac_env_CC_set=${CC+set} -+ac_env_CC_value=$CC -+ac_cv_env_CC_set=${CC+set} -+ac_cv_env_CC_value=$CC -+ac_env_CFLAGS_set=${CFLAGS+set} -+ac_env_CFLAGS_value=$CFLAGS -+ac_cv_env_CFLAGS_set=${CFLAGS+set} -+ac_cv_env_CFLAGS_value=$CFLAGS -+ac_env_LDFLAGS_set=${LDFLAGS+set} -+ac_env_LDFLAGS_value=$LDFLAGS -+ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -+ac_cv_env_LDFLAGS_value=$LDFLAGS -+ac_env_CPPFLAGS_set=${CPPFLAGS+set} -+ac_env_CPPFLAGS_value=$CPPFLAGS -+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -+ac_cv_env_CPPFLAGS_value=$CPPFLAGS -+ac_env_CPP_set=${CPP+set} -+ac_env_CPP_value=$CPP -+ac_cv_env_CPP_set=${CPP+set} -+ac_cv_env_CPP_value=$CPP -+ac_env_CXX_set=${CXX+set} -+ac_env_CXX_value=$CXX -+ac_cv_env_CXX_set=${CXX+set} -+ac_cv_env_CXX_value=$CXX -+ac_env_CXXFLAGS_set=${CXXFLAGS+set} -+ac_env_CXXFLAGS_value=$CXXFLAGS -+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -+ac_cv_env_CXXFLAGS_value=$CXXFLAGS -+ac_env_CXXCPP_set=${CXXCPP+set} -+ac_env_CXXCPP_value=$CXXCPP -+ac_cv_env_CXXCPP_set=${CXXCPP+set} -+ac_cv_env_CXXCPP_value=$CXXCPP -+ac_env_F77_set=${F77+set} -+ac_env_F77_value=$F77 -+ac_cv_env_F77_set=${F77+set} -+ac_cv_env_F77_value=$F77 -+ac_env_FFLAGS_set=${FFLAGS+set} -+ac_env_FFLAGS_value=$FFLAGS -+ac_cv_env_FFLAGS_set=${FFLAGS+set} -+ac_cv_env_FFLAGS_value=$FFLAGS -+ -+# -+# 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 iscsiuio 0.7.6.1g 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 \`..'] -+ -+_ACEOF -+ -+ cat <<_ACEOF -+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] -+ --datadir=DIR read-only architecture-independent data [PREFIX/share] -+ --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] -+ --infodir=DIR info documentation [PREFIX/info] -+ --mandir=DIR man documentation [PREFIX/man] -+_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 iscsiuio 0.7.6.1g:";; -+ esac -+ cat <<\_ACEOF -+ -+Optional Features: -+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) -+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] -+ --disable-dependency-tracking speeds up one-time build -+ --enable-dependency-tracking do not reject slow dependency extractors -+ --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] -+ --disable-libtool-lock avoid locking (might break parallel builds) -+ --enable-debug Turn on compiler debugging information (default=no) -+ -+Optional Packages: -+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] -+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) -+ --with-gnu-ld assume the C compiler uses GNU ld [default=no] -+ --with-pic try to use only PIC/non-PIC objects [default=use -+ both] -+ --with-tags[=TAGS] -+ include additional configurations [automatic] -+ -+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 -+ CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have -+ headers in a nonstandard directory -+ CPP C preprocessor -+ CXX C++ compiler command -+ CXXFLAGS C++ compiler flags -+ CXXCPP C++ preprocessor -+ F77 Fortran 77 compiler command -+ FFLAGS Fortran 77 compiler flags -+ -+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 -+fi -+ -+if test "$ac_init_help" = "recursive"; then -+ # If there are subdirs, report their specific --help. -+ ac_popdir=`pwd` -+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue -+ test -d $ac_dir || continue -+ ac_builddir=. -+ -+if test "$ac_dir" != .; then -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A "../" for each directory in $ac_dir_suffix. -+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -+else -+ ac_dir_suffix= ac_top_builddir= -+fi -+ -+case $srcdir in -+ .) # No --srcdir option. We are building in place. -+ ac_srcdir=. -+ if test -z "$ac_top_builddir"; then -+ ac_top_srcdir=. -+ else -+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -+ fi ;; -+ [\\/]* | ?:[\\/]* ) # Absolute path. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir ;; -+ *) # Relative path. -+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_builddir$srcdir ;; -+esac -+ -+# Do not use `cd foo && pwd` to compute absolute paths, because -+# the directories may not exist. -+case `pwd` in -+.) ac_abs_builddir="$ac_dir";; -+*) -+ case "$ac_dir" in -+ .) ac_abs_builddir=`pwd`;; -+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -+ *) ac_abs_builddir=`pwd`/"$ac_dir";; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_builddir=${ac_top_builddir}.;; -+*) -+ case ${ac_top_builddir}. in -+ .) ac_abs_top_builddir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_srcdir=$ac_srcdir;; -+*) -+ case $ac_srcdir in -+ .) ac_abs_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_srcdir=$ac_top_srcdir;; -+*) -+ case $ac_top_srcdir in -+ .) ac_abs_top_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -+ esac;; -+esac -+ -+ cd $ac_dir -+ # Check for guested configure; otherwise get Cygnus style 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 -+ elif test -f $ac_srcdir/configure.ac || -+ test -f $ac_srcdir/configure.in; then -+ echo -+ $ac_configure --help -+ else -+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 -+ fi -+ cd $ac_popdir -+ done -+fi -+ -+test -n "$ac_init_help" && exit 0 -+if $ac_init_version; then -+ cat <<\_ACEOF -+iscsiuio configure 0.7.6.1g -+generated by GNU Autoconf 2.59 -+ -+Copyright (C) 2003 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 0 -+fi -+exec 5>config.log -+cat >&5 <<_ACEOF -+This file contains any messages produced by compilers while -+running configure, to aid debugging if configure makes a mistake. -+ -+It was created by iscsiuio $as_me 0.7.6.1g, which was -+generated by GNU Autoconf 2.59. Invocation command line was -+ -+ $ $0 $@ -+ -+_ACEOF -+{ -+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` -+hostinfo = `(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=. -+ echo "PATH: $as_dir" -+done -+ -+} >&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_sep= -+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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; -+ esac -+ case $ac_pass in -+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; -+ 2) -+ ac_configure_args1="$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 -+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" -+ # Get rid of the leading space. -+ ac_sep=" " -+ ;; -+ esac -+ done -+done -+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, -+# such as our DU 5.0 friend, will then `close' the trap. -+trap 'exit_status=$? -+ # Save into config.log some information that might help in debugging. -+ { -+ echo -+ -+ cat <<\_ASBOX -+## ---------------- ## -+## Cache variables. ## -+## ---------------- ## -+_ASBOX -+ echo -+ # The following way of writing the cache mishandles newlines in values, -+{ -+ (set) 2>&1 | -+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in -+ *ac_space=\ *) -+ sed -n \ -+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; -+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" -+ ;; -+ *) -+ sed -n \ -+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" -+ ;; -+ esac; -+} -+ echo -+ -+ cat <<\_ASBOX -+## ----------------- ## -+## Output variables. ## -+## ----------------- ## -+_ASBOX -+ echo -+ for ac_var in $ac_subst_vars -+ do -+ eval ac_val=$`echo $ac_var` -+ echo "$ac_var='"'"'$ac_val'"'"'" -+ done | sort -+ echo -+ -+ if test -n "$ac_subst_files"; then -+ cat <<\_ASBOX -+## ------------- ## -+## Output files. ## -+## ------------- ## -+_ASBOX -+ echo -+ for ac_var in $ac_subst_files -+ do -+ eval ac_val=$`echo $ac_var` -+ echo "$ac_var='"'"'$ac_val'"'"'" -+ done | sort -+ echo -+ fi -+ -+ if test -s confdefs.h; then -+ cat <<\_ASBOX -+## ----------- ## -+## confdefs.h. ## -+## ----------- ## -+_ASBOX -+ echo -+ sed "/^$/d" confdefs.h | sort -+ echo -+ fi -+ test "$ac_signal" != 0 && -+ echo "$as_me: caught signal $ac_signal" -+ echo "$as_me: exit $exit_status" -+ } >&5 -+ rm -f core *.core && -+ rm -rf conftest* confdefs* conf$$* $ac_clean_files && -+ exit $exit_status -+ ' 0 -+for ac_signal in 1 2 13 15; do -+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -+done -+ac_signal=0 -+ -+# confdefs.h avoids OS command line length limits that DEFS can exceed. -+rm -rf conftest* confdefs.h -+# AIX cpp loses on an empty file, so make sure it contains at least a newline. -+echo >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 -+ -+ -+# Let the site file select an alternate cache file if it wants to. -+# Prefer explicitly selected file to automatically selected ones. -+if test -z "$CONFIG_SITE"; then -+ if test "x$prefix" != xNONE; then -+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" -+ else -+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" -+ fi -+fi -+for ac_site_file in $CONFIG_SITE; do -+ if test -r "$ac_site_file"; then -+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -+echo "$as_me: loading site script $ac_site_file" >&6;} -+ sed 's/^/| /' "$ac_site_file" >&5 -+ . "$ac_site_file" -+ 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. -+ if test -f "$cache_file"; then -+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -+echo "$as_me: loading cache $cache_file" >&6;} -+ case $cache_file in -+ [\\/]* | ?:[\\/]* ) . $cache_file;; -+ *) . ./$cache_file;; -+ esac -+ fi -+else -+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -+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 `(set) 2>&1 | -+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) -+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} -+ ac_cache_corrupted=: ;; -+ ,set) -+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -+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 -+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} -+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -+echo "$as_me: former value: $ac_old_val" >&2;} -+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -+echo "$as_me: current value: $ac_new_val" >&2;} -+ ac_cache_corrupted=: -+ fi;; -+ esac -+ # Pass precious variables to config.status. -+ if test "$ac_new_set" = set; then -+ case $ac_new_val in -+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) -+ ac_arg=$ac_var=`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. -+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; -+ esac -+ fi -+done -+if $ac_cache_corrupted; then -+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -+echo "$as_me: error: changes in the environment can compromise the build" >&2;} -+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} -+ { (exit 1); exit 1; }; } -+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 -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+am__api_version="1.9" -+ac_aux_dir= -+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; 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 -+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ac_config_guess="$SHELL $ac_aux_dir/config.guess" -+ac_config_sub="$SHELL $ac_aux_dir/config.sub" -+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. -+ -+# 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. -+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 -+if test -z "$INSTALL"; then -+if test "${ac_cv_path_install+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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 -+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -+ break 3 -+ fi -+ fi -+ done -+ done -+ ;; -+esac -+done -+ -+ -+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. We don't cache a -+ # path for INSTALL within a source directory, because that will -+ # break other packages using the cache if that directory is -+ # removed, or if the path is relative. -+ INSTALL=$ac_install_sh -+ fi -+fi -+echo "$as_me:$LINENO: result: $INSTALL" >&5 -+echo "${ECHO_T}$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' -+ -+echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 -+# Just in case -+sleep 1 -+echo timestamp > conftest.file -+# 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 ( -+ 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 -+ rm -f conftest.file -+ 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". -+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -+alias in your environment" >&5 -+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -+alias in your environment" >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+ -+ test "$2" = conftest.file -+ ) -+then -+ # Ok. -+ : -+else -+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -+Check your system clock" >&5 -+echo "$as_me: error: newly created file is older than distributed files! -+Check your system clock" >&2;} -+ { (exit 1); exit 1; }; } -+fi -+echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6 -+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 $. echo might interpret backslashes. -+# By default was `s,x,x', remove it if useless. -+cat <<\_ACEOF >conftest.sed -+s/[\\$]/&&/g;s/;s,x,x,$// -+_ACEOF -+program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -+rm conftest.sed -+ -+# expand $ac_aux_dir to an absolute path -+am_aux_dir=`cd $ac_aux_dir && pwd` -+ -+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -+# Use eval to expand $SHELL -+if eval "$MISSING --run true"; then -+ am_missing_run="$MISSING --run " -+else -+ am_missing_run= -+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -+fi -+ -+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then -+ # We used to keeping the `.' as first argument, in order to -+ # allow $(mkdir_p) to be used without argument. As in -+ # $(mkdir_p) $(somedir) -+ # where $(somedir) is conditionally defined. However this is wrong -+ # for two reasons: -+ # 1. if the package is installed by a user who cannot write `.' -+ # make install will fail, -+ # 2. the above comment should most certainly read -+ # $(mkdir_p) $(DESTDIR)$(somedir) -+ # so it does not work when $(somedir) is undefined and -+ # $(DESTDIR) is not. -+ # To support the latter case, we have to write -+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), -+ # so the `.' trick is pointless. -+ mkdir_p='mkdir -p --' -+else -+ # On NextStep and OpenStep, the `mkdir' command does not -+ # recognize any option. It will interpret all options as -+ # directories to create, and then abort because `.' already -+ # exists. -+ for d in ./-p ./--version; -+ do -+ test -d $d && rmdir $d -+ done -+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. -+ if test -f "$ac_aux_dir/mkinstalldirs"; then -+ mkdir_p='$(mkinstalldirs)' -+ else -+ mkdir_p='$(install_sh) -d' -+ fi -+fi -+ -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_AWK+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_AWK="$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+AWK=$ac_cv_prog_AWK -+if test -n "$AWK"; then -+ echo "$as_me:$LINENO: result: $AWK" >&5 -+echo "${ECHO_T}$AWK" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$AWK" && break -+done -+ -+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.make <<\_ACEOF -+all: -+ @echo 'ac_maketemp="$(MAKE)"' -+_ACEOF -+# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -+if test -n "$ac_maketemp"; then -+ eval ac_cv_prog_make_${ac_make}_set=yes -+else -+ eval ac_cv_prog_make_${ac_make}_set=no -+fi -+rm -f conftest.make -+fi -+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then -+ echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6 -+ SET_MAKE= -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}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 -+ -+# test to see if srcdir already configured -+if test "`cd $srcdir && pwd`" != "`pwd`" && -+ test -f $srcdir/config.status; then -+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} -+ { (exit 1); exit 1; }; } -+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=$PACKAGE -+ VERSION=$VERSION -+ -+ -+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"} -+ -+install_sh=${install_sh-"$am_aux_dir/install-sh"} -+ -+# 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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_STRIP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_STRIP="${ac_tool_prefix}strip" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+STRIP=$ac_cv_prog_STRIP -+if test -n "$STRIP"; then -+ echo "$as_me:$LINENO: result: $STRIP" >&5 -+echo "${ECHO_T}$STRIP" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_STRIP="strip" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" -+fi -+fi -+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -+if test -n "$ac_ct_STRIP"; then -+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -+echo "${ECHO_T}$ac_ct_STRIP" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ STRIP=$ac_ct_STRIP -+else -+ STRIP="$ac_cv_prog_STRIP" -+fi -+ -+fi -+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" -+ -+# We need awk for the "check" target. The system "awk" is bad on -+# some platforms. -+# Always define AMTAR for backward compatibility. -+ -+AMTAR=${AMTAR-"${am_missing_run}tar"} -+ -+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' -+ -+ -+ -+ -+ -+ ac_config_headers="$ac_config_headers config.h" -+ -+for ac_prog in bash -+do -+ # Extract the first word of "$ac_prog", so it can be a program name with args. -+set dummy $ac_prog; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_path_BASH+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ case $BASH in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_BASH="$BASH" # Let the user override the test with a path. -+ ;; -+ *) -+ 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_path_BASH="$as_dir/$ac_word$ac_exec_ext" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+ ;; -+esac -+fi -+BASH=$ac_cv_path_BASH -+ -+if test -n "$BASH"; then -+ echo "$as_me:$LINENO: result: $BASH" >&5 -+echo "${ECHO_T}$BASH" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$BASH" && break -+done -+ -+ -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CC="${ac_tool_prefix}gcc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_CC="gcc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+ac_ct_CC=$ac_cv_prog_ac_ct_CC -+if test -n "$ac_ct_CC"; then -+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+echo "${ECHO_T}$ac_ct_CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ CC=$ac_ct_CC -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CC="${ac_tool_prefix}cc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+fi -+if test -z "$ac_cv_prog_CC"; then -+ ac_ct_CC=$CC -+ # Extract the first word of "cc", so it can be a program name with args. -+set dummy cc; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_CC="cc" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+ac_ct_CC=$ac_cv_prog_ac_ct_CC -+if test -n "$ac_ct_CC"; then -+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+echo "${ECHO_T}$ac_ct_CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ CC=$ac_ct_CC -+else -+ CC="$ac_cv_prog_CC" -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+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 -+ echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+fi -+if test -z "$CC"; then -+ if test -n "$ac_tool_prefix"; then -+ for ac_prog in cl -+ 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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+CC=$ac_cv_prog_CC -+if test -n "$CC"; then -+ echo "$as_me:$LINENO: result: $CC" >&5 -+echo "${ECHO_T}$CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$CC" && break -+ done -+fi -+if test -z "$CC"; then -+ ac_ct_CC=$CC -+ for ac_prog in cl -+do -+ # Extract the first word of "$ac_prog", so it can be a program name with args. -+set dummy $ac_prog; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_CC="$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+ac_ct_CC=$ac_cv_prog_ac_ct_CC -+if test -n "$ac_ct_CC"; then -+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+echo "${ECHO_T}$ac_ct_CC" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$ac_ct_CC" && break -+done -+ -+ CC=$ac_ct_CC -+fi -+ -+fi -+ -+ -+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -+See \`config.log' for more details." >&5 -+echo "$as_me: error: no acceptable C compiler found in \$PATH -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+ -+# Provide some information about the compiler. -+echo "$as_me:$LINENO:" \ -+ "checking for C compiler version" >&5 -+ac_compiler=`set X $ac_compile; echo $2` -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 -+ (eval $ac_compiler --version &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 -+ (eval $ac_compiler -v &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 -+ (eval $ac_compiler -V &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+ac_clean_files_save=$ac_clean_files -+ac_clean_files="$ac_clean_files a.out 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. -+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 -+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 -+ (eval $ac_link_default) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ # Find the output, starting from the most likely. This scheme is -+# not robust to junk in `.', hence go to wildcards (a.*) only as a last -+# resort. -+ -+# Be careful to initialize this variable, since it used to be cached. -+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -+ac_cv_exeext= -+# b.out is created by i960 compilers. -+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out -+do -+ test -f "$ac_file" || continue -+ case $ac_file in -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) -+ ;; -+ conftest.$ac_ext ) -+ # This is the source file. -+ ;; -+ [ab].out ) -+ # We found the default executable, but exeext='' is most -+ # certainly right. -+ break;; -+ *.* ) -+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` -+ # FIXME: I believe we export ac_cv_exeext for Libtool, -+ # but it would be cool to find out if it's true. Does anybody -+ # maintain Libtool? --akim. -+ export ac_cv_exeext -+ break;; -+ * ) -+ break;; -+ esac -+done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -+See \`config.log' for more details." >&5 -+echo "$as_me: error: C compiler cannot create executables -+See \`config.log' for more details." >&2;} -+ { (exit 77); exit 77; }; } -+fi -+ -+ac_exeext=$ac_cv_exeext -+echo "$as_me:$LINENO: result: $ac_file" >&5 -+echo "${ECHO_T}$ac_file" >&6 -+ -+# Check the compiler produces executables we can run. If not, either -+# the compiler is broken, or we cross compile. -+echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -+# If not cross compiling, check that we can run a simple program. -+if test "$cross_compiling" != yes; then -+ if { ac_try='./$ac_file' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ cross_compiling=no -+ else -+ if test "$cross_compiling" = maybe; then -+ cross_compiling=yes -+ else -+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -+If you meant to cross compile, use \`--host'. -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot run C compiled programs. -+If you meant to cross compile, use \`--host'. -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+ fi -+fi -+echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6 -+ -+rm -f a.out a.exe conftest$ac_cv_exeext b.out -+ac_clean_files=$ac_clean_files_save -+# Check the compiler produces executables we can run. If not, either -+# the compiler is broken, or we cross compile. -+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -+echo "$as_me:$LINENO: result: $cross_compiling" >&5 -+echo "${ECHO_T}$cross_compiling" >&6 -+ -+echo "$as_me:$LINENO: checking for suffix of executables" >&5 -+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; 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 | *.o | *.obj ) ;; -+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` -+ export ac_cv_exeext -+ break;; -+ * ) break;; -+ esac -+done -+else -+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+rm -f conftest$ac_cv_exeext -+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -+echo "${ECHO_T}$ac_cv_exeext" >&6 -+ -+rm -f conftest.$ac_ext -+EXEEXT=$ac_cv_exeext -+ac_exeext=$EXEEXT -+echo "$as_me:$LINENO: checking for suffix of object files" >&5 -+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -+if test "${ac_cv_objext+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.o conftest.obj -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do -+ case $ac_file in -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; -+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` -+ break;; -+ esac -+done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute suffix of object files: cannot compile -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+rm -f conftest.$ac_cv_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -+echo "${ECHO_T}$ac_cv_objext" >&6 -+OBJEXT=$ac_cv_objext -+ac_objext=$OBJEXT -+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -+if test "${ac_cv_c_compiler_gnu+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+#ifndef __GNUC__ -+ choke me -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_compiler_gnu=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_compiler_gnu=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ac_cv_c_compiler_gnu=$ac_compiler_gnu -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -+GCC=`test $ac_compiler_gnu = yes && echo yes` -+ac_test_CFLAGS=${CFLAGS+set} -+ac_save_CFLAGS=$CFLAGS -+CFLAGS="-g" -+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -+if test "${ac_cv_prog_cc_g+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_prog_cc_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_prog_cc_g=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -+echo "${ECHO_T}$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 -+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -+if test "${ac_cv_prog_cc_stdc+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_prog_cc_stdc=no -+ac_save_CC=$CC -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* 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 -std1 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 -std1. */ -+int osf4_cc_array ['\x00' == 0 ? 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 -+# Don't try gcc -ansi; that turns off useful extensions and -+# breaks some systems' header files. -+# AIX -qlanglvl=ansi -+# Ultrix and OSF/1 -std1 -+# HP-UX 10.20 and later -Ae -+# HP-UX older versions -Aa -D_HPUX_SOURCE -+# SVR4 -Xc -D__EXTENSIONS__ -+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -+do -+ CC="$ac_save_CC $ac_arg" -+ rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_prog_cc_stdc=$ac_arg -+break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext -+done -+rm -f conftest.$ac_ext conftest.$ac_objext -+CC=$ac_save_CC -+ -+fi -+ -+case "x$ac_cv_prog_cc_stdc" in -+ x|xno) -+ echo "$as_me:$LINENO: result: none needed" >&5 -+echo "${ECHO_T}none needed" >&6 ;; -+ *) -+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 -+ CC="$CC $ac_cv_prog_cc_stdc" ;; -+esac -+ -+# Some people use a C++ compiler to compile C. Since we use `exit', -+# in C++ we need to declare it. In case someone uses the same compiler -+# for both compiling C and C++ we need to have the C++ compiler decide -+# the declaration of exit, since it's the most demanding environment. -+cat >conftest.$ac_ext <<_ACEOF -+#ifndef __cplusplus -+ choke me -+#endif -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ for ac_declaration in \ -+ '' \ -+ 'extern "C" void std::exit (int) throw (); using std::exit;' \ -+ 'extern "C" void std::exit (int); using std::exit;' \ -+ 'extern "C" void exit (int) throw ();' \ -+ 'extern "C" void exit (int);' \ -+ 'void exit (int);' -+do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_declaration -+#include -+int -+main () -+{ -+exit (42); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+continue -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_declaration -+int -+main () -+{ -+exit (42); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+done -+rm -f conftest* -+if test -n "$ac_declaration"; then -+ echo '#ifdef __cplusplus' >>confdefs.h -+ echo $ac_declaration >>confdefs.h -+ echo '#endif' >>confdefs.h -+fi -+ -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext 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 -+DEPDIR="${am__leading_dot}deps" -+ -+ ac_config_commands="$ac_config_commands depfiles" -+ -+ -+am_make=${MAKE-make} -+cat > confinc << 'END' -+am__doit: -+ @echo done -+.PHONY: am__doit -+END -+# If we don't find an include directive, just comment out the code. -+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 -+am__include="#" -+am__quote= -+_am_result=none -+# First try GNU make style include. -+echo "include confinc" > confmf -+# We grep out `Entering directory' and `Leaving directory' -+# messages which can occur if `w' ends up in MAKEFLAGS. -+# In particular we don't look at `^make:' because GNU make might -+# be invoked under some other name (usually "gmake"), in which -+# case it prints its new name instead of `make'. -+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then -+ am__include=include -+ am__quote= -+ _am_result=GNU -+fi -+# Now try BSD make style include. -+if test "$am__include" = "#"; then -+ echo '.include "confinc"' > confmf -+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then -+ am__include=.include -+ am__quote="\"" -+ _am_result=BSD -+ fi -+fi -+ -+ -+echo "$as_me:$LINENO: result: $_am_result" >&5 -+echo "${ECHO_T}$_am_result" >&6 -+rm -f confinc confmf -+ -+# Check whether --enable-dependency-tracking or --disable-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='\' -+fi -+ -+ -+if test "x$enable_dependency_tracking" != xno; then -+ AMDEP_TRUE= -+ AMDEP_FALSE='#' -+else -+ AMDEP_TRUE='#' -+ AMDEP_FALSE= -+fi -+ -+ -+ -+ -+depcc="$CC" am_compiler_list= -+ -+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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'. -+ 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 -+ 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 8's {/usr,}/bin/sh. -+ touch sub/conftst$i.h -+ done -+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf -+ -+ case $depmode in -+ 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 -+ ;; -+ none) break ;; -+ esac -+ # 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. -+ if depmode=$depmode \ -+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ -+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ -+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ -+ >/dev/null 2>conftest.err && -+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && -+ grep sub/conftest.${OBJEXT-o} 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 -+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -+echo "${ECHO_T}$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 "x$CC" != xcc; then -+ echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 -+echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6 -+else -+ echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 -+echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6 -+fi -+set dummy $CC; ac_cc=`echo $2 | -+ sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -+if eval "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\" = set"; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+# Make sure it works both with $CC and with simple cc. -+# We do the test twice because some compilers refuse to overwrite an -+# existing .o file with -o, though they will create one. -+ac_try='$CC -c conftest.$ac_ext -o conftest.$ac_objext >&5' -+if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; -+then -+ eval ac_cv_prog_cc_${ac_cc}_c_o=yes -+ if test "x$CC" != xcc; then -+ # Test first that cc exists at all. -+ if { ac_try='cc -c conftest.$ac_ext >&5' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_try='cc -c conftest.$ac_ext -o conftest.$ac_objext >&5' -+ if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; -+ then -+ # cc works too. -+ : -+ else -+ # cc exists but doesn't like -o. -+ eval ac_cv_prog_cc_${ac_cc}_c_o=no -+ fi -+ fi -+ fi -+else -+ eval ac_cv_prog_cc_${ac_cc}_c_o=no -+fi -+rm -f conftest* -+ -+fi -+if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then -+ echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+ -+cat >>confdefs.h <<\_ACEOF -+#define NO_MINUS_C_MINUS_O 1 -+_ACEOF -+ -+fi -+ -+# FIXME: we rely on the cache variable name because -+# there is no other way. -+set dummy $CC -+ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -+if eval "test \"`echo '$ac_cv_prog_cc_'${ac_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 -+ -+ -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_RANLIB+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+RANLIB=$ac_cv_prog_RANLIB -+if test -n "$RANLIB"; then -+ echo "$as_me:$LINENO: result: $RANLIB" >&5 -+echo "${ECHO_T}$RANLIB" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_RANLIB="ranlib" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" -+fi -+fi -+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -+if test -n "$ac_ct_RANLIB"; then -+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -+echo "${ECHO_T}$ac_ct_RANLIB" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ RANLIB=$ac_ct_RANLIB -+else -+ RANLIB="$ac_cv_prog_RANLIB" -+fi -+ -+ -+ -+cat >>confdefs.h <<\_ACEOF -+#define _GNU_SOURCE 1 -+_ACEOF -+ -+ -+# 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. -+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 -+if test -z "$INSTALL"; then -+if test "${ac_cv_path_install+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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 -+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -+ break 3 -+ fi -+ fi -+ done -+ done -+ ;; -+esac -+done -+ -+ -+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. We don't cache a -+ # path for INSTALL within a source directory, because that will -+ # break other packages using the cache if that directory is -+ # removed, or if the path is relative. -+ INSTALL=$ac_install_sh -+ fi -+fi -+echo "$as_me:$LINENO: result: $INSTALL" >&5 -+echo "${ECHO_T}$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' -+ -+ -+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 -+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&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 -+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ Syntax error -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_c_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Broken: fails on valid input. -+continue -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether non-existent headers -+ # can be detected and how. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_c_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ # Broken: success on invalid input. -+continue -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Passes both tests. -+ac_preproc_ok=: -+break -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+done -+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+rm -f 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 -+echo "$as_me:$LINENO: result: $CPP" >&5 -+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ Syntax error -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_c_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Broken: fails on valid input. -+continue -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether non-existent headers -+ # can be detected and how. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_c_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ # Broken: success on invalid input. -+continue -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Passes both tests. -+ac_preproc_ok=: -+break -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+done -+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+rm -f conftest.err conftest.$ac_ext -+if $ac_preproc_ok; then -+ : -+else -+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -+See \`config.log' for more details." >&5 -+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+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 -+ -+ -+echo "$as_me:$LINENO: checking for egrep" >&5 -+echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -+if test "${ac_cv_prog_egrep+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1 -+ then ac_cv_prog_egrep='grep -E' -+ else ac_cv_prog_egrep='egrep' -+ fi -+fi -+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -+echo "${ECHO_T}$ac_cv_prog_egrep" >&6 -+ EGREP=$ac_cv_prog_egrep -+ -+ -+if test $ac_cv_c_compiler_gnu = yes; then -+ echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 -+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 -+if test "${ac_cv_prog_gcc_traditional+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_pattern="Autoconf.*'x'" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+Autoconf TIOCGETP -+_ACEOF -+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | -+ $EGREP "$ac_pattern" >/dev/null 2>&1; then -+ ac_cv_prog_gcc_traditional=yes -+else -+ ac_cv_prog_gcc_traditional=no -+fi -+rm -f conftest* -+ -+ -+ if test $ac_cv_prog_gcc_traditional = no; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+Autoconf TCGETA -+_ACEOF -+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | -+ $EGREP "$ac_pattern" >/dev/null 2>&1; then -+ ac_cv_prog_gcc_traditional=yes -+fi -+rm -f conftest* -+ -+ fi -+fi -+echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 -+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 -+ if test $ac_cv_prog_gcc_traditional = yes; then -+ CC="$CC -traditional" -+ fi -+fi -+ -+ -+# Checks for typedefs, structures, and compiler characteristics. -+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 -+if test "${ac_cv_c_const+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+/* FIXME: Include the comments suggested by Paul. */ -+#ifndef __cplusplus -+ /* Ultrix mips cc rejects this. */ -+ typedef int charset[2]; -+ const charset x; -+ /* SunOS 4.1.1 cc rejects this. */ -+ char const *const *ccp; -+ char **p; -+ /* NEC SVR4.0.2 mips cc rejects this. */ -+ struct point {int x, y;}; -+ static struct point const zero = {0,0}; -+ /* AIX XL C 1.02.0.0 rejects this. -+ It does not let you subtract one const X* pointer from another in -+ an arm of an if-expression whose if-part is not a constant -+ expression */ -+ const char *g = "string"; -+ ccp = &g + (g ? g-g : 0); -+ /* HPUX 7.0 cc rejects these. */ -+ ++ccp; -+ p = (char**) ccp; -+ ccp = (char const *const *) p; -+ { /* SCO 3.2v4 cc rejects this. */ -+ char *t; -+ char const *s = 0 ? (char *) 0 : (char const *) 0; -+ -+ *t++ = 0; -+ } -+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ -+ int x[] = {25, 17}; -+ const int *foo = &x[0]; -+ ++foo; -+ } -+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ -+ typedef const int *iptr; -+ iptr p = 0; -+ ++p; -+ } -+ { /* AIX XL C 1.02.0.0 rejects this saying -+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ -+ struct s { int j; const int *ap[3]; }; -+ struct s *b; b->j = 5; -+ } -+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ -+ const int foo = 10; -+ } -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_c_const=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_c_const=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -+echo "${ECHO_T}$ac_cv_c_const" >&6 -+if test $ac_cv_c_const = no; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define const -+_ACEOF -+ -+fi -+ -+echo "$as_me:$LINENO: checking for inline" >&5 -+echo $ECHO_N "checking for inline... $ECHO_C" >&6 -+if test "${ac_cv_c_inline+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_c_inline=no -+for ac_kw in inline __inline__ __inline; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifndef __cplusplus -+typedef int foo_t; -+static $ac_kw foo_t static_foo () {return 0; } -+$ac_kw foo_t foo () {return 0; } -+#endif -+ -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_c_inline=$ac_kw; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+done -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 -+echo "${ECHO_T}$ac_cv_c_inline" >&6 -+ -+ -+case $ac_cv_c_inline in -+ inline | yes) ;; -+ *) -+ case $ac_cv_c_inline in -+ no) ac_val=;; -+ *) ac_val=$ac_cv_c_inline;; -+ esac -+ cat >>confdefs.h <<_ACEOF -+#ifndef __cplusplus -+#define inline $ac_val -+#endif -+_ACEOF -+ ;; -+esac -+ -+echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -+if test "${ac_cv_header_stdc+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+#include -+#include -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_header_stdc=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_header_stdc=no -+fi -+rm -f 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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* 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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* 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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#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)) -+ exit(2); -+ exit (0); -+} -+_ACEOF -+rm -f conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ : -+else -+ echo "$as_me: program exited with status $ac_status" >&5 -+echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+ac_cv_header_stdc=no -+fi -+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+fi -+fi -+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -+echo "${ECHO_T}$ac_cv_header_stdc" >&6 -+if test $ac_cv_header_stdc = yes; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define STDC_HEADERS 1 -+_ACEOF -+ -+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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -+echo "$as_me:$LINENO: checking for $ac_header" >&5 -+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -+if eval "test \"\${$as_ac_Header+set}\" = set"; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+ -+#include <$ac_header> -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ eval "$as_ac_Header=yes" -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+eval "$as_ac_Header=no" -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -+if test `eval echo '${'$as_ac_Header'}'` = yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+ -+done -+ -+ -+echo "$as_me:$LINENO: checking for off_t" >&5 -+echo $ECHO_N "checking for off_t... $ECHO_C" >&6 -+if test "${ac_cv_type_off_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((off_t *) 0) -+ return 0; -+if (sizeof (off_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_off_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_off_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 -+echo "${ECHO_T}$ac_cv_type_off_t" >&6 -+if test $ac_cv_type_off_t = yes; then -+ : -+else -+ -+cat >>confdefs.h <<_ACEOF -+#define off_t long -+_ACEOF -+ -+fi -+ -+echo "$as_me:$LINENO: checking for size_t" >&5 -+echo $ECHO_N "checking for size_t... $ECHO_C" >&6 -+if test "${ac_cv_type_size_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((size_t *) 0) -+ return 0; -+if (sizeof (size_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_size_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_size_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -+echo "${ECHO_T}$ac_cv_type_size_t" >&6 -+if test $ac_cv_type_size_t = yes; then -+ : -+else -+ -+cat >>confdefs.h <<_ACEOF -+#define size_t unsigned -+_ACEOF -+ -+fi -+ -+echo "$as_me:$LINENO: checking for int8_t" >&5 -+echo $ECHO_N "checking for int8_t... $ECHO_C" >&6 -+if test "${ac_cv_type_int8_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((int8_t *) 0) -+ return 0; -+if (sizeof (int8_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_int8_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_int8_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -+echo "${ECHO_T}$ac_cv_type_int8_t" >&6 -+if test $ac_cv_type_int8_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_INT8_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for uint8_t" >&5 -+echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6 -+if test "${ac_cv_type_uint8_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((uint8_t *) 0) -+ return 0; -+if (sizeof (uint8_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_uint8_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_uint8_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 -+echo "${ECHO_T}$ac_cv_type_uint8_t" >&6 -+if test $ac_cv_type_uint8_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_UINT8_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for int16_t" >&5 -+echo $ECHO_N "checking for int16_t... $ECHO_C" >&6 -+if test "${ac_cv_type_int16_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((int16_t *) 0) -+ return 0; -+if (sizeof (int16_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_int16_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_int16_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -+echo "${ECHO_T}$ac_cv_type_int16_t" >&6 -+if test $ac_cv_type_int16_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_INT16_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for uint16_t" >&5 -+echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6 -+if test "${ac_cv_type_uint16_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((uint16_t *) 0) -+ return 0; -+if (sizeof (uint16_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_uint16_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_uint16_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 -+echo "${ECHO_T}$ac_cv_type_uint16_t" >&6 -+if test $ac_cv_type_uint16_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_UINT16_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for int32_t" >&5 -+echo $ECHO_N "checking for int32_t... $ECHO_C" >&6 -+if test "${ac_cv_type_int32_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((int32_t *) 0) -+ return 0; -+if (sizeof (int32_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_int32_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_int32_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -+echo "${ECHO_T}$ac_cv_type_int32_t" >&6 -+if test $ac_cv_type_int32_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_INT32_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for uint32_t" >&5 -+echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6 -+if test "${ac_cv_type_uint32_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((uint32_t *) 0) -+ return 0; -+if (sizeof (uint32_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_uint32_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_uint32_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 -+echo "${ECHO_T}$ac_cv_type_uint32_t" >&6 -+if test $ac_cv_type_uint32_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_UINT32_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for int64_t" >&5 -+echo $ECHO_N "checking for int64_t... $ECHO_C" >&6 -+if test "${ac_cv_type_int64_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((int64_t *) 0) -+ return 0; -+if (sizeof (int64_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_int64_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_int64_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5 -+echo "${ECHO_T}$ac_cv_type_int64_t" >&6 -+if test $ac_cv_type_int64_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_INT64_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for uint64_t" >&5 -+echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6 -+if test "${ac_cv_type_uint64_t+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((uint64_t *) 0) -+ return 0; -+if (sizeof (uint64_t)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_uint64_t=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_uint64_t=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5 -+echo "${ECHO_T}$ac_cv_type_uint64_t" >&6 -+if test $ac_cv_type_uint64_t = yes; then -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_UINT64_T 1 -+_ACEOF -+ -+ -+fi -+ -+echo "$as_me:$LINENO: checking for short" >&5 -+echo $ECHO_N "checking for short... $ECHO_C" >&6 -+if test "${ac_cv_type_short+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((short *) 0) -+ return 0; -+if (sizeof (short)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_short=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_short=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -+echo "${ECHO_T}$ac_cv_type_short" >&6 -+ -+echo "$as_me:$LINENO: checking size of short" >&5 -+echo $ECHO_N "checking size of short... $ECHO_C" >&6 -+if test "${ac_cv_sizeof_short+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test "$ac_cv_type_short" = yes; then -+ # The cast to unsigned long works around a bug in the HP C Compiler -+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -+ # This bug is HP SR number 8606223364. -+ if test "$cross_compiling" = yes; then -+ # Depending upon the size, compute the lo and hi bounds. -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_lo=0 ac_mid=0 -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=$ac_mid; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo=`expr $ac_mid + 1` -+ if test $ac_lo -le $ac_mid; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid + 1` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=-1 ac_mid=-1 -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_lo=$ac_mid; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_hi=`expr '(' $ac_mid ')' - 1` -+ if test $ac_mid -le $ac_hi; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo= ac_hi= -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+# Binary search between lo and hi bounds. -+while test "x$ac_lo" != "x$ac_hi"; do -+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=$ac_mid -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo=`expr '(' $ac_mid ')' + 1` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+done -+case $ac_lo in -+?*) ac_cv_sizeof_short=$ac_lo;; -+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute sizeof (short), 77 -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } ;; -+esac -+else -+ if test "$cross_compiling" = yes; then -+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot run test program while cross compiling -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+long longval () { return (long) (sizeof (short)); } -+unsigned long ulongval () { return (long) (sizeof (short)); } -+#include -+#include -+int -+main () -+{ -+ -+ FILE *f = fopen ("conftest.val", "w"); -+ if (! f) -+ exit (1); -+ if (((long) (sizeof (short))) < 0) -+ { -+ long i = longval (); -+ if (i != ((long) (sizeof (short)))) -+ exit (1); -+ fprintf (f, "%ld\n", i); -+ } -+ else -+ { -+ unsigned long i = ulongval (); -+ if (i != ((long) (sizeof (short)))) -+ exit (1); -+ fprintf (f, "%lu\n", i); -+ } -+ exit (ferror (f) || fclose (f) != 0); -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_sizeof_short=`cat conftest.val` -+else -+ echo "$as_me: program exited with status $ac_status" >&5 -+echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute sizeof (short), 77 -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+fi -+rm -f conftest.val -+else -+ ac_cv_sizeof_short=0 -+fi -+fi -+echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -+echo "${ECHO_T}$ac_cv_sizeof_short" >&6 -+cat >>confdefs.h <<_ACEOF -+#define SIZEOF_SHORT $ac_cv_sizeof_short -+_ACEOF -+ -+ -+echo "$as_me:$LINENO: checking for int" >&5 -+echo $ECHO_N "checking for int... $ECHO_C" >&6 -+if test "${ac_cv_type_int+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((int *) 0) -+ return 0; -+if (sizeof (int)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_int=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_int=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -+echo "${ECHO_T}$ac_cv_type_int" >&6 -+ -+echo "$as_me:$LINENO: checking size of int" >&5 -+echo $ECHO_N "checking size of int... $ECHO_C" >&6 -+if test "${ac_cv_sizeof_int+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test "$ac_cv_type_int" = yes; then -+ # The cast to unsigned long works around a bug in the HP C Compiler -+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -+ # This bug is HP SR number 8606223364. -+ if test "$cross_compiling" = yes; then -+ # Depending upon the size, compute the lo and hi bounds. -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_lo=0 ac_mid=0 -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=$ac_mid; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo=`expr $ac_mid + 1` -+ if test $ac_lo -le $ac_mid; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid + 1` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=-1 ac_mid=-1 -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_lo=$ac_mid; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_hi=`expr '(' $ac_mid ')' - 1` -+ if test $ac_mid -le $ac_hi; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo= ac_hi= -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+# Binary search between lo and hi bounds. -+while test "x$ac_lo" != "x$ac_hi"; do -+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=$ac_mid -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo=`expr '(' $ac_mid ')' + 1` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+done -+case $ac_lo in -+?*) ac_cv_sizeof_int=$ac_lo;; -+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute sizeof (int), 77 -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } ;; -+esac -+else -+ if test "$cross_compiling" = yes; then -+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot run test program while cross compiling -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+long longval () { return (long) (sizeof (int)); } -+unsigned long ulongval () { return (long) (sizeof (int)); } -+#include -+#include -+int -+main () -+{ -+ -+ FILE *f = fopen ("conftest.val", "w"); -+ if (! f) -+ exit (1); -+ if (((long) (sizeof (int))) < 0) -+ { -+ long i = longval (); -+ if (i != ((long) (sizeof (int)))) -+ exit (1); -+ fprintf (f, "%ld\n", i); -+ } -+ else -+ { -+ unsigned long i = ulongval (); -+ if (i != ((long) (sizeof (int)))) -+ exit (1); -+ fprintf (f, "%lu\n", i); -+ } -+ exit (ferror (f) || fclose (f) != 0); -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_sizeof_int=`cat conftest.val` -+else -+ echo "$as_me: program exited with status $ac_status" >&5 -+echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute sizeof (int), 77 -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+fi -+rm -f conftest.val -+else -+ ac_cv_sizeof_int=0 -+fi -+fi -+echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -+echo "${ECHO_T}$ac_cv_sizeof_int" >&6 -+cat >>confdefs.h <<_ACEOF -+#define SIZEOF_INT $ac_cv_sizeof_int -+_ACEOF -+ -+ -+echo "$as_me:$LINENO: checking for long" >&5 -+echo $ECHO_N "checking for long... $ECHO_C" >&6 -+if test "${ac_cv_type_long+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if ((long *) 0) -+ return 0; -+if (sizeof (long)) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_type_long=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_type_long=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -+echo "${ECHO_T}$ac_cv_type_long" >&6 -+ -+echo "$as_me:$LINENO: checking size of long" >&5 -+echo $ECHO_N "checking size of long... $ECHO_C" >&6 -+if test "${ac_cv_sizeof_long+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test "$ac_cv_type_long" = yes; then -+ # The cast to unsigned long works around a bug in the HP C Compiler -+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -+ # This bug is HP SR number 8606223364. -+ if test "$cross_compiling" = yes; then -+ # Depending upon the size, compute the lo and hi bounds. -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_lo=0 ac_mid=0 -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=$ac_mid; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo=`expr $ac_mid + 1` -+ if test $ac_lo -le $ac_mid; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid + 1` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=-1 ac_mid=-1 -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_lo=$ac_mid; break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_hi=`expr '(' $ac_mid ')' - 1` -+ if test $ac_mid -le $ac_hi; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ done -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo= ac_hi= -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+# Binary search between lo and hi bounds. -+while test "x$ac_lo" != "x$ac_hi"; do -+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -+test_array [0] = 0 -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_hi=$ac_mid -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_lo=`expr '(' $ac_mid ')' + 1` -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+done -+case $ac_lo in -+?*) ac_cv_sizeof_long=$ac_lo;; -+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute sizeof (long), 77 -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } ;; -+esac -+else -+ if test "$cross_compiling" = yes; then -+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot run test program while cross compiling -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+long longval () { return (long) (sizeof (long)); } -+unsigned long ulongval () { return (long) (sizeof (long)); } -+#include -+#include -+int -+main () -+{ -+ -+ FILE *f = fopen ("conftest.val", "w"); -+ if (! f) -+ exit (1); -+ if (((long) (sizeof (long))) < 0) -+ { -+ long i = longval (); -+ if (i != ((long) (sizeof (long)))) -+ exit (1); -+ fprintf (f, "%ld\n", i); -+ } -+ else -+ { -+ unsigned long i = ulongval (); -+ if (i != ((long) (sizeof (long)))) -+ exit (1); -+ fprintf (f, "%lu\n", i); -+ } -+ exit (ferror (f) || fclose (f) != 0); -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_sizeof_long=`cat conftest.val` -+else -+ echo "$as_me: program exited with status $ac_status" >&5 -+echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -+See \`config.log' for more details." >&5 -+echo "$as_me: error: cannot compute sizeof (long), 77 -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+fi -+rm -f conftest.val -+else -+ ac_cv_sizeof_long=0 -+fi -+fi -+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -+echo "${ECHO_T}$ac_cv_sizeof_long" >&6 -+cat >>confdefs.h <<_ACEOF -+#define SIZEOF_LONG $ac_cv_sizeof_long -+_ACEOF -+ -+ -+ -+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 -+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 -+if test "${ac_cv_c_bigendian+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # See if sys/param.h defines the BYTE_ORDER macro. -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+ -+int -+main () -+{ -+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN -+ bogus endian macros -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ # It does; now see whether it defined to BIG_ENDIAN or not. -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+ -+int -+main () -+{ -+#if BYTE_ORDER != BIG_ENDIAN -+ not big endian -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_c_bigendian=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_c_bigendian=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+# It does not; compile a test program. -+if test "$cross_compiling" = yes; then -+ # try to guess the endianness by grepping values into an object file -+ ac_cv_c_bigendian=unknown -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } -+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } -+int -+main () -+{ -+ _ascii (); _ebcdic (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then -+ ac_cv_c_bigendian=yes -+fi -+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then -+ if test "$ac_cv_c_bigendian" = unknown; then -+ ac_cv_c_bigendian=no -+ else -+ # finding both strings is unlikely to happen, but who knows? -+ ac_cv_c_bigendian=unknown -+ fi -+fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+int -+main () -+{ -+ /* Are we little or big endian? From Harbison&Steele. */ -+ union -+ { -+ long l; -+ char c[sizeof (long)]; -+ } u; -+ u.l = 1; -+ exit (u.c[sizeof (long) - 1] == 1); -+} -+_ACEOF -+rm -f conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_c_bigendian=no -+else -+ echo "$as_me: program exited with status $ac_status" >&5 -+echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+ac_cv_c_bigendian=yes -+fi -+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 -+echo "${ECHO_T}$ac_cv_c_bigendian" >&6 -+case $ac_cv_c_bigendian in -+ yes) -+ ENDIAN=BIG -+ ;; -+ no) -+ ENDIAN=LITTLE -+ ;; -+ *) -+ { { echo "$as_me:$LINENO: error: unknown endianness -+presetting ac_cv_c_bigendian=no (or yes) will help" >&5 -+echo "$as_me: error: unknown endianness -+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} -+ { (exit 1); exit 1; }; } ;; -+esac -+ -+ -+ -+ -+ -+# libtool stuff -+# Check whether --enable-shared or --disable-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 or --disable-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 --enable-fast-install or --disable-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; -+ -+# Make sure we can run config.sub. -+$ac_config_sub sun4 >/dev/null 2>&1 || -+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -+echo "$as_me: error: cannot run $ac_config_sub" >&2;} -+ { (exit 1); exit 1; }; } -+ -+echo "$as_me:$LINENO: checking build system type" >&5 -+echo $ECHO_N "checking build system type... $ECHO_C" >&6 -+if test "${ac_cv_build+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_build_alias=$build_alias -+test -z "$ac_cv_build_alias" && -+ ac_cv_build_alias=`$ac_config_guess` -+test -z "$ac_cv_build_alias" && -+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -+echo "$as_me: error: cannot guess build type; you must specify one" >&2;} -+ { (exit 1); exit 1; }; } -+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || -+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} -+ { (exit 1); exit 1; }; } -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -+echo "${ECHO_T}$ac_cv_build" >&6 -+build=$ac_cv_build -+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -+ -+ -+echo "$as_me:$LINENO: checking host system type" >&5 -+echo $ECHO_N "checking host system type... $ECHO_C" >&6 -+if test "${ac_cv_host+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_cv_host_alias=$host_alias -+test -z "$ac_cv_host_alias" && -+ ac_cv_host_alias=$ac_cv_build_alias -+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || -+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} -+ { (exit 1); exit 1; }; } -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -+echo "${ECHO_T}$ac_cv_host" >&6 -+host=$ac_cv_host -+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -+ -+ -+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -+if test "${lt_cv_path_SED+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # 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 -+ -+fi -+ -+SED=$lt_cv_path_SED -+ -+echo "$as_me:$LINENO: result: $SED" >&5 -+echo "${ECHO_T}$SED" >&6 -+ -+ -+# Check whether --with-gnu-ld or --without-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. -+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&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 -+ echo "$as_me:$LINENO: checking for GNU ld" >&5 -+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -+else -+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -+fi -+if test "${lt_cv_path_LD+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 -+echo "${ECHO_T}$LD" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} -+ { (exit 1); exit 1; }; } -+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -+if test "${lt_cv_prog_gnu_ld+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # I'd rather use --version here, but apparently some GNU lds only accept -v. -+case `$LD -v 2>&1 &5 -+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -+with_gnu_ld=$lt_cv_prog_gnu_ld -+ -+ -+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 -+if test "${lt_cv_ld_reload_flag+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_ld_reload_flag='-r' -+fi -+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -+echo "${ECHO_T}$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 -+ 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 -+ -+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 -+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 -+if test "${lt_cv_path_NM+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 -+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm -+fi -+fi -+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -+echo "${ECHO_T}$lt_cv_path_NM" >&6 -+NM="$lt_cv_path_NM" -+ -+echo "$as_me:$LINENO: checking whether ln -s works" >&5 -+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 -+LN_S=$as_ln_s -+if test "$LN_S" = "ln -s"; then -+ echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6 -+else -+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -+echo "${ECHO_T}no, using $LN_S" >&6 -+fi -+ -+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 -+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 -+if test "${lt_cv_deplibs_check_method+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 -+aix4* | aix5*) -+ 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'. -+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' -+ lt_cv_file_magic_cmd='$OBJDUMP -f' -+ ;; -+ -+darwin* | rhapsody*) -+ lt_cv_deplibs_check_method=pass_all -+ ;; -+ -+freebsd* | kfreebsd*-gnu | 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 -+ ;; -+ -+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]) 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 -+ ;; -+ -+interix3*) -+ # 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 Linux ELF. -+linux*) -+ 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=unknown -+ ;; -+ -+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 -+ ;; -+ -+solaris*) -+ 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 -+ ;; -+ -+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) -+ lt_cv_deplibs_check_method=pass_all -+ ;; -+esac -+ -+fi -+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 -+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 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 whether --enable-libtool-lock or --disable-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:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; 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 6825 "configure"' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; 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-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) -+ # Find out which ABI we are using. -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.o` in -+ *32-bit*) -+ case $host in -+ 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-*linux*) -+ LD="${LD-ld} -m elf_x86_64" -+ ;; -+ ppc*-*linux*|powerpc*-*linux*) -+ LD="${LD-ld} -m elf64ppc" -+ ;; -+ s390*-*linux*) -+ 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" -+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 -+if test "${lt_cv_cc_needs_belf+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ lt_cv_cc_needs_belf=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+lt_cv_cc_needs_belf=no -+fi -+rm -f 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 -+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -+echo "${ECHO_T}$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 -+ ;; -+sparc*-*solaris*) -+ # Find out which ABI we are using. -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.o` in -+ *64-bit*) -+ case $lt_cv_prog_gnu_ld in -+ yes*) LD="${LD-ld} -m elf64_sparc" ;; -+ *) LD="${LD-ld} -64" ;; -+ esac -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ -+ -+esac -+ -+need_locks="$enable_libtool_lock" -+ -+ -+ -+for ac_header in dlfcn.h -+do -+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -+if eval "test \"\${$as_ac_Header+set}\" = set"; then -+ echo "$as_me:$LINENO: checking for $ac_header" >&5 -+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -+if eval "test \"\${$as_ac_Header+set}\" = set"; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+fi -+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -+else -+ # Is the header compilable? -+echo "$as_me:$LINENO: checking $ac_header usability" >&5 -+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+#include <$ac_header> -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_header_compiler=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_header_compiler=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -+echo "${ECHO_T}$ac_header_compiler" >&6 -+ -+# Is the header present? -+echo "$as_me:$LINENO: checking $ac_header presence" >&5 -+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include <$ac_header> -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_c_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ ac_header_preproc=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_header_preproc=no -+fi -+rm -f conftest.err conftest.$ac_ext -+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -+echo "${ECHO_T}$ac_header_preproc" >&6 -+ -+# So? What about this header? -+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in -+ yes:no: ) -+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} -+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} -+ ac_header_preproc=yes -+ ;; -+ no:yes:* ) -+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} -+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} -+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} -+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} -+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} -+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} -+ ( -+ cat <<\_ASBOX -+## ------------------------------------- ## -+## Report this to eddie.wai@broadcom.com ## -+## ------------------------------------- ## -+_ASBOX -+ ) | -+ sed "s/^/$as_me: WARNING: /" >&2 -+ ;; -+esac -+echo "$as_me:$LINENO: checking for $ac_header" >&5 -+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -+if eval "test \"\${$as_ac_Header+set}\" = set"; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ eval "$as_ac_Header=\$ac_header_preproc" -+fi -+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -+ -+fi -+if test `eval echo '${'$as_ac_Header'}'` = yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+ -+done -+ -+ac_ext=cc -+ac_cpp='$CXXCPP $CPPFLAGS' -+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -+if test -n "$ac_tool_prefix"; then -+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -+ 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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$CXX"; then -+ ac_cv_prog_CXX="$CXX" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+CXX=$ac_cv_prog_CXX -+if test -n "$CXX"; then -+ echo "$as_me:$LINENO: result: $CXX" >&5 -+echo "${ECHO_T}$CXX" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$CXX" && break -+ done -+fi -+if test -z "$CXX"; then -+ ac_ct_CXX=$CXX -+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -+do -+ # Extract the first word of "$ac_prog", so it can be a program name with args. -+set dummy $ac_prog; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$ac_ct_CXX"; then -+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_CXX="$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -+if test -n "$ac_ct_CXX"; then -+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -+echo "${ECHO_T}$ac_ct_CXX" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$ac_ct_CXX" && break -+done -+test -n "$ac_ct_CXX" || ac_ct_CXX="g++" -+ -+ CXX=$ac_ct_CXX -+fi -+ -+ -+# Provide some information about the compiler. -+echo "$as_me:$LINENO:" \ -+ "checking for C++ compiler version" >&5 -+ac_compiler=`set X $ac_compile; echo $2` -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 -+ (eval $ac_compiler --version &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 -+ (eval $ac_compiler -v &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 -+ (eval $ac_compiler -V &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ -+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 -+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+#ifndef __GNUC__ -+ choke me -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_cxx_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_compiler_gnu=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_compiler_gnu=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 -+GXX=`test $ac_compiler_gnu = yes && echo yes` -+ac_test_CXXFLAGS=${CXXFLAGS+set} -+ac_save_CXXFLAGS=$CXXFLAGS -+CXXFLAGS="-g" -+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 -+if test "${ac_cv_prog_cxx_g+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_cxx_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_prog_cxx_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_prog_cxx_g=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -+if test "$ac_test_CXXFLAGS" = set; then -+ CXXFLAGS=$ac_save_CXXFLAGS -+elif test $ac_cv_prog_cxx_g = yes; then -+ if test "$GXX" = yes; then -+ CXXFLAGS="-g -O2" -+ else -+ CXXFLAGS="-g" -+ fi -+else -+ if test "$GXX" = yes; then -+ CXXFLAGS="-O2" -+ else -+ CXXFLAGS= -+ fi -+fi -+for ac_declaration in \ -+ '' \ -+ 'extern "C" void std::exit (int) throw (); using std::exit;' \ -+ 'extern "C" void std::exit (int); using std::exit;' \ -+ 'extern "C" void exit (int) throw ();' \ -+ 'extern "C" void exit (int);' \ -+ 'void exit (int);' -+do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_declaration -+#include -+int -+main () -+{ -+exit (42); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_cxx_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+continue -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_declaration -+int -+main () -+{ -+exit (42); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_cxx_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ break -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+done -+rm -f conftest* -+if test -n "$ac_declaration"; then -+ echo '#ifdef __cplusplus' >>confdefs.h -+ echo $ac_declaration >>confdefs.h -+ echo '#endif' >>confdefs.h -+fi -+ -+ac_ext=cc -+ac_cpp='$CXXCPP $CPPFLAGS' -+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -+ -+depcc="$CXX" am_compiler_list= -+ -+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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'. -+ 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_CXX_dependencies_compiler_type=none -+ if test "$am_compiler_list" = ""; then -+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` -+ fi -+ 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 8's {/usr,}/bin/sh. -+ touch sub/conftst$i.h -+ done -+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf -+ -+ case $depmode in -+ 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 -+ ;; -+ none) break ;; -+ esac -+ # 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. -+ if depmode=$depmode \ -+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ -+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ -+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ -+ >/dev/null 2>conftest.err && -+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && -+ grep sub/conftest.${OBJEXT-o} 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_CXX_dependencies_compiler_type=$depmode -+ break -+ fi -+ fi -+ done -+ -+ cd .. -+ rm -rf conftest.dir -+else -+ am_cv_CXX_dependencies_compiler_type=none -+fi -+ -+fi -+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 -+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type -+ -+ -+ -+if -+ test "x$enable_dependency_tracking" != xno \ -+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then -+ am__fastdepCXX_TRUE= -+ am__fastdepCXX_FALSE='#' -+else -+ am__fastdepCXX_TRUE='#' -+ am__fastdepCXX_FALSE= -+fi -+ -+ -+ -+ -+if test -n "$CXX" && ( test "X$CXX" != "Xno" && -+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || -+ (test "X$CXX" != "Xg++"))) ; then -+ ac_ext=cc -+ac_cpp='$CXXCPP $CPPFLAGS' -+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 -+if test -z "$CXXCPP"; then -+ if test "${ac_cv_prog_CXXCPP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # Double quotes because CXXCPP needs to be expanded -+ for CXXCPP in "$CXX -E" "/lib/cpp" -+ do -+ ac_preproc_ok=false -+for ac_cxx_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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ Syntax error -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_cxx_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Broken: fails on valid input. -+continue -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether non-existent headers -+ # can be detected and how. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_cxx_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ # Broken: success on invalid input. -+continue -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Passes both tests. -+ac_preproc_ok=: -+break -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+done -+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+rm -f conftest.err conftest.$ac_ext -+if $ac_preproc_ok; then -+ break -+fi -+ -+ done -+ ac_cv_prog_CXXCPP=$CXXCPP -+ -+fi -+ CXXCPP=$ac_cv_prog_CXXCPP -+else -+ ac_cv_prog_CXXCPP=$CXXCPP -+fi -+echo "$as_me:$LINENO: result: $CXXCPP" >&5 -+echo "${ECHO_T}$CXXCPP" >&6 -+ac_preproc_ok=false -+for ac_cxx_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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ Syntax error -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_cxx_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ : -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Broken: fails on valid input. -+continue -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+ # OK, works on sane cases. Now check whether non-existent headers -+ # can be detected and how. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null; then -+ if test -s conftest.err; then -+ ac_cpp_err=$ac_cxx_preproc_warn_flag -+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -+ else -+ ac_cpp_err= -+ fi -+else -+ ac_cpp_err=yes -+fi -+if test -z "$ac_cpp_err"; then -+ # Broken: success on invalid input. -+continue -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ # Passes both tests. -+ac_preproc_ok=: -+break -+fi -+rm -f conftest.err conftest.$ac_ext -+ -+done -+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -+rm -f conftest.err conftest.$ac_ext -+if $ac_preproc_ok; then -+ : -+else -+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -+See \`config.log' for more details." >&5 -+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -+See \`config.log' for more details." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+ac_ext=cc -+ac_cpp='$CXXCPP $CPPFLAGS' -+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -+ -+fi -+ -+ -+ac_ext=f -+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_f77_compiler_gnu -+if test -n "$ac_tool_prefix"; then -+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -+ 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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_F77+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$F77"; then -+ ac_cv_prog_F77="$F77" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_F77="$ac_tool_prefix$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+F77=$ac_cv_prog_F77 -+if test -n "$F77"; then -+ echo "$as_me:$LINENO: result: $F77" >&5 -+echo "${ECHO_T}$F77" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$F77" && break -+ done -+fi -+if test -z "$F77"; then -+ ac_ct_F77=$F77 -+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -+do -+ # Extract the first word of "$ac_prog", so it can be a program name with args. -+set dummy $ac_prog; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ if test -n "$ac_ct_F77"; then -+ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_F77="$ac_prog" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+ac_ct_F77=$ac_cv_prog_ac_ct_F77 -+if test -n "$ac_ct_F77"; then -+ echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -+echo "${ECHO_T}$ac_ct_F77" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ test -n "$ac_ct_F77" && break -+done -+ -+ F77=$ac_ct_F77 -+fi -+ -+ -+# Provide some information about the compiler. -+echo "$as_me:7951:" \ -+ "checking for Fortran 77 compiler version" >&5 -+ac_compiler=`set X $ac_compile; echo $2` -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 -+ (eval $ac_compiler --version &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 -+ (eval $ac_compiler -v &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 -+ (eval $ac_compiler -V &5) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+rm -f a.out -+ -+# If we don't use `.F' as extension, the preprocessor is not run on the -+# input file. (Note that this only needs to work for GNU compilers.) -+ac_save_ext=$ac_ext -+ac_ext=F -+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 -+if test "${ac_cv_f77_compiler_gnu+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+ program main -+#ifndef __GNUC__ -+ choke me -+#endif -+ -+ end -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_f77_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_compiler_gnu=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_compiler_gnu=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ac_cv_f77_compiler_gnu=$ac_compiler_gnu -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 -+ac_ext=$ac_save_ext -+ac_test_FFLAGS=${FFLAGS+set} -+ac_save_FFLAGS=$FFLAGS -+FFLAGS= -+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 -+if test "${ac_cv_prog_f77_g+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ FFLAGS=-g -+cat >conftest.$ac_ext <<_ACEOF -+ program main -+ -+ end -+_ACEOF -+rm -f conftest.$ac_objext -+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_f77_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest.$ac_objext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_prog_f77_g=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_prog_f77_g=no -+fi -+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+fi -+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 -+if test "$ac_test_FFLAGS" = set; then -+ FFLAGS=$ac_save_FFLAGS -+elif test $ac_cv_prog_f77_g = yes; then -+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then -+ FFLAGS="-g -O2" -+ else -+ FFLAGS="-g" -+ fi -+else -+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then -+ FFLAGS="-O2" -+ else -+ FFLAGS= -+ fi -+fi -+ -+G77=`test $ac_compiler_gnu = yes && echo yes` -+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 -+ -+ -+ -+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! -+ -+# find the maximum length of command line arguments -+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 -+if test "${lt_cv_sys_max_cmd_len+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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*) -+ # 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; -+ ;; -+ -+ 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 -+ ;; -+ -+ 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 -+ ;; -+ *) -+ # 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. -+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} -+ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ -+ = "XX$teststring") >/dev/null 2>&1 && -+ new_result=`expr "X$teststring" : ".*" 2>&1` && -+ lt_cv_sys_max_cmd_len=$new_result && -+ test $i != 17 # 1/2 MB should be enough -+ do -+ i=`expr $i + 1` -+ teststring=$teststring$teststring -+ done -+ 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` -+ ;; -+ esac -+ -+fi -+ -+if test -n $lt_cv_sys_max_cmd_len ; then -+ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 -+else -+ echo "$as_me:$LINENO: result: none" >&5 -+echo "${ECHO_T}none" >&6 -+fi -+ -+ -+ -+ -+# Check for command to grab the raw symbol name followed by C symbol from nm. -+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 -+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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]*\)' -+ -+# Transform an extracted symbol line into a proper C declaration -+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \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\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" -+ -+# Define system-specific variables. -+case $host_os in -+aix*) -+ symcode='[BCDT]' -+ ;; -+cygwin* | mingw* | pw32*) -+ symcode='[ABCDGISTW]' -+ ;; -+hpux*) # Its linker distinguishes data from code symbols -+ if test "$host_cpu" = ia64; then -+ symcode='[ABCDEGRST]' -+ fi -+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" -+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" -+ ;; -+linux*) -+ if test "$host_cpu" = ia64; then -+ symcode='[ABCDGIRSTW]' -+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" -+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" -+ 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 -+ -+# 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 -+ -+# If we're using GNU nm, then use its standard symbol codes. -+case `$NM -V 2>&1` in -+*GNU* | *'with BFD'*) -+ symcode='[ABCDGIRSTW]' ;; -+esac -+ -+# Try without a prefix undercore, 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. -+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" -+ -+ # Check to see that the pipe works correctly. -+ pipe_works=no -+ -+ rm -f conftest* -+ cat > conftest.$ac_ext <&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ # Now try to grab the symbols. -+ nlist=conftest.nm -+ if { (eval echo "$as_me:$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=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && 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 < conftest.$ac_ext -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+EOF -+ # Now generate the symbol file. -+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' -+ -+ cat <> conftest.$ac_ext -+#if defined (__STDC__) && __STDC__ -+# define lt_ptr_t void * -+#else -+# define lt_ptr_t char * -+# define const -+#endif -+ -+/* The mapping between symbol names and symbols. */ -+const struct { -+ const char *name; -+ lt_ptr_t address; -+} -+lt_preloaded_symbols[] = -+{ -+EOF -+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext -+ cat <<\EOF >> conftest.$ac_ext -+ {0, (lt_ptr_t) 0} -+}; -+ -+#ifdef __cplusplus -+} -+#endif -+EOF -+ # Now try linking the two files. -+ mv conftest.$ac_objext conftstm.$ac_objext -+ lt_save_LIBS="$LIBS" -+ lt_save_CFLAGS="$CFLAGS" -+ LIBS="conftstm.$ac_objext" -+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" -+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && test -s conftest${ac_exeext}; then -+ pipe_works=yes -+ fi -+ LIBS="$lt_save_LIBS" -+ CFLAGS="$lt_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 -f 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 -+ echo "$as_me:$LINENO: result: failed" >&5 -+echo "${ECHO_T}failed" >&6 -+else -+ echo "$as_me:$LINENO: result: ok" >&5 -+echo "${ECHO_T}ok" >&6 -+fi -+ -+echo "$as_me:$LINENO: checking for objdir" >&5 -+echo $ECHO_N "checking for objdir... $ECHO_C" >&6 -+if test "${lt_cv_objdir+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 -+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -+echo "${ECHO_T}$lt_cv_objdir" >&6 -+objdir=$lt_cv_objdir -+ -+ -+ -+ -+ -+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 -+ -+# 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 to delay expansion of an escaped shell variable in a -+# double_quote_subst'ed string. -+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' -+ -+# Sed substitution to avoid accidental globbing in evaled expressions -+no_glob_subst='s/\*/\\\*/g' -+ -+# Constants: -+rm="rm -f" -+ -+# Global variables: -+default_ofile=libtool -+can_build_shared=yes -+ -+# All known linkers require a `.a' archive for static linking (except MSVC, -+# which needs '.lib'). -+libext=a -+ltmain="$ac_aux_dir/ltmain.sh" -+ofile="$default_ofile" -+with_gnu_ld="$lt_cv_prog_gnu_ld" -+ -+if test -n "$ac_tool_prefix"; then -+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -+set dummy ${ac_tool_prefix}ar; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_AR+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_AR="${ac_tool_prefix}ar" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+AR=$ac_cv_prog_AR -+if test -n "$AR"; then -+ echo "$as_me:$LINENO: result: $AR" >&5 -+echo "${ECHO_T}$AR" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+fi -+if test -z "$ac_cv_prog_AR"; then -+ ac_ct_AR=$AR -+ # Extract the first word of "ar", so it can be a program name with args. -+set dummy ar; ac_word=$2 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_AR="ar" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" -+fi -+fi -+ac_ct_AR=$ac_cv_prog_ac_ct_AR -+if test -n "$ac_ct_AR"; then -+ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -+echo "${ECHO_T}$ac_ct_AR" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ AR=$ac_ct_AR -+else -+ AR="$ac_cv_prog_AR" -+fi -+ -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_RANLIB+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+RANLIB=$ac_cv_prog_RANLIB -+if test -n "$RANLIB"; then -+ echo "$as_me:$LINENO: result: $RANLIB" >&5 -+echo "${ECHO_T}$RANLIB" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_RANLIB="ranlib" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" -+fi -+fi -+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -+if test -n "$ac_ct_RANLIB"; then -+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -+echo "${ECHO_T}$ac_ct_RANLIB" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ RANLIB=$ac_ct_RANLIB -+else -+ RANLIB="$ac_cv_prog_RANLIB" -+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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_STRIP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_STRIP="${ac_tool_prefix}strip" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+fi -+fi -+STRIP=$ac_cv_prog_STRIP -+if test -n "$STRIP"; then -+ echo "$as_me:$LINENO: result: $STRIP" >&5 -+echo "${ECHO_T}$STRIP" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}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 -+echo "$as_me:$LINENO: checking for $ac_word" >&5 -+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ ac_cv_prog_ac_ct_STRIP="strip" -+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+ -+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" -+fi -+fi -+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -+if test -n "$ac_ct_STRIP"; then -+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -+echo "${ECHO_T}$ac_ct_STRIP" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ STRIP=$ac_ct_STRIP -+else -+ STRIP="$ac_cv_prog_STRIP" -+fi -+ -+ -+old_CC="$CC" -+old_CFLAGS="$CFLAGS" -+ -+# Set sane defaults for various variables -+test -z "$AR" && AR=ar -+test -z "$AR_FLAGS" && AR_FLAGS=cru -+test -z "$AS" && AS=as -+test -z "$CC" && CC=cc -+test -z "$LTCC" && LTCC=$CC -+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -+test -z "$DLLTOOL" && DLLTOOL=dlltool -+test -z "$LD" && LD=ld -+test -z "$LN_S" && LN_S="ln -s" -+test -z "$MAGIC_CMD" && MAGIC_CMD=file -+test -z "$NM" && NM=nm -+test -z "$SED" && SED=sed -+test -z "$OBJDUMP" && OBJDUMP=objdump -+test -z "$RANLIB" && RANLIB=: -+test -z "$STRIP" && STRIP=: -+test -z "$ac_objext" && ac_objext=o -+ -+# Determine commands to create old-style static archives. -+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' -+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 \$oldlib" -+ ;; -+ *) -+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" -+ ;; -+ esac -+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" -+fi -+ -+for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ -+# Only perform the check for file, if the check method requires it -+case $deplibs_check_method in -+file_magic*) -+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then -+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 -+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 <&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 -+ -+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 -+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -+echo "${ECHO_T}$MAGIC_CMD" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+if test -z "$lt_cv_path_MAGIC_CMD"; then -+ if test -n "$ac_tool_prefix"; then -+ echo "$as_me:$LINENO: checking for file" >&5 -+echo $ECHO_N "checking for file... $ECHO_C" >&6 -+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 <&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 -+ -+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 -+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -+echo "${ECHO_T}$MAGIC_CMD" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ -+ else -+ MAGIC_CMD=: -+ fi -+fi -+ -+ fi -+ ;; -+esac -+ -+enable_dlopen=yes -+enable_win32_dll=no -+ -+# Check whether --enable-libtool-lock or --disable-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 -+ -+ -+# Check whether --with-pic or --without-pic was given. -+if test "${with_pic+set}" = set; then -+ withval="$with_pic" -+ pic_mode="$withval" -+else -+ pic_mode=default -+fi; -+test -z "$pic_mode" && pic_mode=default -+ -+# Use C for the default configuration in the libtool script -+tagname= -+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;\n" -+ -+# Code to be used in simple link tests -+lt_simple_link_test_code='int main(){return(0);}\n' -+ -+ -+# 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 warnings/boilerplate of simple test code -+ac_outfile=conftest.$ac_objext -+printf "$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 -+printf "$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 conftest* -+ -+ -+ -+lt_prog_compiler_no_builtin_flag= -+ -+if test "$GCC" = yes; then -+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' -+ -+ -+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_prog_compiler_rtti_exceptions=no -+ ac_outfile=conftest.$ac_objext -+ printf "$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:9014: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&5 -+ echo "$as_me:9018: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 -+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -+echo "${ECHO_T}$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= -+ -+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+ -+ 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*) -+ # 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' -+ ;; -+ -+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) -+ # PIC is the default for these OSes. -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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' -+ ;; -+ -+ darwin* | rhapsody*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ lt_prog_compiler_pic='-fno-common' -+ ;; -+ -+ interix3*) -+ # 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 -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ lt_prog_compiler_pic=-Kconform_pic -+ fi -+ ;; -+ -+ hpux*) -+ # 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='-fPIC' -+ ;; -+ esac -+ ;; -+ -+ *) -+ lt_prog_compiler_pic='-fPIC' -+ ;; -+ 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 -+ ;; -+ darwin*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ case $cc_basename in -+ xlc*) -+ lt_prog_compiler_pic='-qnocommon' -+ lt_prog_compiler_wl='-Wl,' -+ ;; -+ esac -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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' -+ ;; -+ -+ newsos6) -+ lt_prog_compiler_pic='-KPIC' -+ lt_prog_compiler_static='-Bstatic' -+ ;; -+ -+ linux*) -+ case $cc_basename in -+ icc* | ecc*) -+ lt_prog_compiler_wl='-Wl,' -+ lt_prog_compiler_pic='-KPIC' -+ lt_prog_compiler_static='-static' -+ ;; -+ pgcc* | pgf77* | pgf90* | pgf95*) -+ # 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' -+ ;; -+ esac -+ ;; -+ -+ osf3* | osf4* | osf5*) -+ lt_prog_compiler_wl='-Wl,' -+ # All OSF/1 code is PIC. -+ lt_prog_compiler_static='-non_shared' -+ ;; -+ -+ solaris*) -+ lt_prog_compiler_pic='-KPIC' -+ lt_prog_compiler_static='-Bstatic' -+ case $cc_basename in -+ f77* | f90* | f95*) -+ 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 -+ -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic" >&6 -+ -+# -+# Check to make sure the PIC flag actually works. -+# -+if test -n "$lt_prog_compiler_pic"; then -+ -+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_pic_works+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_pic_works=no -+ ac_outfile=conftest.$ac_objext -+ printf "$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:9282: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&5 -+ echo "$as_me:9286: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_pic_works=yes -+ fi -+ fi -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 -+ -+if test x"$lt_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 -+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 -+ -+# -+# Check to make sure the static flag actually works. -+# -+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_static_works+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_static_works=no -+ save_LDFLAGS="$LDFLAGS" -+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" -+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_static_works=yes -+ fi -+ else -+ lt_prog_compiler_static_works=yes -+ fi -+ fi -+ $rm conftest* -+ LDFLAGS="$save_LDFLAGS" -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 -+ -+if test x"$lt_prog_compiler_static_works" = xyes; then -+ : -+else -+ lt_prog_compiler_static= -+fi -+ -+ -+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+if test "${lt_cv_prog_compiler_c_o+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_prog_compiler_c_o=no -+ $rm -r conftest 2>/dev/null -+ mkdir conftest -+ cd conftest -+ mkdir out -+ printf "$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:9386: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>out/conftest.err) -+ ac_status=$? -+ cat out/conftest.err >&5 -+ echo "$as_me:9390: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 .. -+ rmdir conftest -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -+echo "${ECHO_T}$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 -+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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 -+ echo "$as_me:$LINENO: result: $hard_links" >&5 -+echo "${ECHO_T}$hard_links" >&6 -+ if test "$hard_links" = no; then -+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -+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 -+ -+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+ -+ runpath_var= -+ allow_undefined_flag= -+ enable_shared_with_static_runtimes=no -+ archive_cmds= -+ archive_expsym_cmds= -+ old_archive_From_new_cmds= -+ old_archive_from_expsyms_cmds= -+ export_dynamic_flag_spec= -+ whole_archive_flag_spec= -+ thread_safe_flag_spec= -+ hardcode_libdir_flag_spec= -+ hardcode_libdir_flag_spec_ld= -+ hardcode_libdir_separator= -+ hardcode_direct=no -+ hardcode_minus_L=no -+ hardcode_shlibpath_var=unsupported -+ link_all_deplibs=unknown -+ hardcode_automatic=no -+ module_cmds= -+ module_expsym_cmds= -+ always_export_symbols=no -+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ # 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_" -+ # 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. -+ extract_expsyms_cmds= -+ # Just being paranoid about ensuring that cc_basename is set. -+ for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ case $host_os in -+ cygwin* | mingw* | pw32*) -+ # 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 -+ if test "$with_gnu_ld" = 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>/dev/null` in -+ *\ [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 -+ aix3* | aix4* | aix5*) -+ # On AIX/PPC, the GNU linker is very broken -+ if test "$host_cpu" != ia64; then -+ ld_shlibs=no -+ cat <&2 -+ -+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH -+*** so that a non-GNU linker is found, and then restart. -+ -+EOF -+ fi -+ ;; -+ -+ amigaos*) -+ 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 -+ -+ # Samuel A. Falvo II reports -+ # that the semantics of dynamic libraries on AmigaOS, at least up -+ # to version 4, is to share data among multiple programs linked -+ # with the same dynamic library. Since this doesn't match the -+ # behavior of shared libraries on other platforms, we can't use -+ # them. -+ ld_shlibs=no -+ ;; -+ -+ 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*) -+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, -+ # as there is no search path for DLLs. -+ hardcode_libdir_flag_spec='-L$libdir' -+ 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/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' -+ -+ 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 -+ ;; -+ -+ interix3*) -+ 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' -+ ;; -+ -+ linux*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ tmp_addflag= -+ 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; $echo \"$new_convenience\"` ${wl}--no-whole-archive' -+ tmp_addflag=' $pic_flag' -+ ;; -+ pgf77* | pgf90* | pgf95*) # 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; $echo \"$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' ;; -+ esac -+ archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ -+ if test $supports_anon_versioning = yes; 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 -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' -+ fi -+ 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 $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' -+ fi -+ ;; -+ -+ solaris*) -+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then -+ ld_shlibs=no -+ cat <&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. -+ -+EOF -+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ 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 -+ ;; -+ -+ 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 -+ ;; -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' -+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' -+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$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 $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 -+ -+ 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 -+ ;; -+ -+ aix4* | aix5*) -+ 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 -+ 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")) && (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].*|aix5*) -+ 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_libdir_separator=':' -+ link_all_deplibs=yes -+ -+ 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 -+ hardcode_direct=yes -+ 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 -+ -+ # 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. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 echo "${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. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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' -+ # Exported symbols can be pulled into shared objects from archives -+ whole_archive_flag_spec='$convenience' -+ 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*) -+ 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 -+ # see comment about different semantics on the GNU ld section -+ ld_shlibs=no -+ ;; -+ -+ bsdi[45]*) -+ export_dynamic_flag_spec=-rdynamic -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # 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. -+ 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 `echo "$deplibs" | $SED -e '\''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' -+ fix_srcfile_path='`cygpath -w "$srcfile"`' -+ enable_shared_with_static_runtimes=yes -+ ;; -+ -+ darwin* | rhapsody*) -+ case $host_os in -+ rhapsody* | darwin1.[012]) -+ allow_undefined_flag='${wl}-undefined ${wl}suppress' -+ ;; -+ *) # Darwin 1.3 on -+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then -+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ else -+ case ${MACOSX_DEPLOYMENT_TARGET} in -+ 10.[012]) -+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ ;; -+ 10.*) -+ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' -+ ;; -+ esac -+ fi -+ ;; -+ esac -+ archive_cmds_need_lc=no -+ hardcode_direct=no -+ hardcode_automatic=yes -+ hardcode_shlibpath_var=unsupported -+ whole_archive_flag_spec='' -+ link_all_deplibs=yes -+ if test "$GCC" = yes ; then -+ output_verbose_link_cmd='echo' -+ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' -+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ case $cc_basename in -+ xlc*) -+ output_verbose_link_cmd='echo' -+ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' -+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ ;; -+ *) -+ ld_shlibs=no -+ ;; -+ esac -+ fi -+ ;; -+ -+ dgux*) -+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec='-L$libdir' -+ hardcode_shlibpath_var=no -+ ;; -+ -+ freebsd1*) -+ ld_shlibs=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* | kfreebsd*-gnu | dragonfly*) -+ archive_cmds='$CC -shared -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 -fPIC ${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 -a "$with_gnu_ld" = no; then -+ archive_cmds='$CC -shared -fPIC ${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 -+ 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 -a "$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 ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds='$CC -shared -fPIC ${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' -+ ;; -+ *) -+ archive_cmds='$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 -+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator=: -+ -+ case $host_cpu in -+ hppa*64*|ia64*) -+ hardcode_libdir_flag_spec_ld='+b $libdir' -+ hardcode_direct=no -+ hardcode_shlibpath_var=no -+ ;; -+ *) -+ hardcode_direct=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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ hardcode_libdir_flag_spec_ld='-rpath $libdir' -+ fi -+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator=: -+ 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 -+ ;; -+ -+ openbsd*) -+ hardcode_direct=yes -+ hardcode_shlibpath_var=no -+ 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 -+ ;; -+ -+ 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" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ allow_undefined_flag=' -expect_unresolved \*' -+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ fi -+ 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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${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='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -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; echo "-hidden">> $lib.exp~ -+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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 -+ hardcode_libdir_separator=: -+ ;; -+ -+ solaris*) -+ no_undefined_flag=' -z text' -+ if test "$GCC" = yes; then -+ wlarc='${wl}' -+ archive_cmds='$CC -shared ${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 ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' -+ else -+ 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' -+ 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 linker options so we -+ # cannot just pass the convience library names through -+ # without $wl, iff we do not link with $LD. -+ # Luckily, gcc supports the same syntax we need for Sun Studio. -+ # Supported since Solaris 2.6 (maybe 2.5.1?) -+ case $wlarc in -+ '') -+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; -+ *) -+ whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; -+ esac ;; -+ 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*) -+ 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='`test -z "$SCOABSPATH" && echo ${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,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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 -+ fi -+ -+echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -+echo "${ECHO_T}$ld_shlibs" >&6 -+test "$ld_shlibs" = no && can_build_shared=no -+ -+# -+# 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. -+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ $rm conftest* -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } 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:$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=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ then -+ archive_cmds_need_lc=no -+ else -+ archive_cmds_need_lc=yes -+ fi -+ allow_undefined_flag=$lt_save_allow_undefined_flag -+ else -+ cat conftest.err 1>&5 -+ fi -+ $rm conftest* -+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -+echo "${ECHO_T}$archive_cmds_need_lc" >&6 -+ ;; -+ esac -+ fi -+ ;; -+esac -+ -+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+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" -+if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then -+ # 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. -+ 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 -+else -+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -+fi -+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 -+ 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' -+ ;; -+ -+aix4* | aix5*) -+ version_type=linux -+ 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*) -+ 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=`$echo "X$lib" | $Xsed -e '\''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' -+ ;; -+ -+beos*) -+ library_names_spec='${libname}${shared_ext}' -+ dynamic_linker="$host_os ld.so" -+ shlibpath_var=LIBRARY_PATH -+ ;; -+ -+bsdi[45]*) -+ version_type=linux -+ 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*) -+ version_type=windows -+ shrext_cmds=".dll" -+ need_version=no -+ need_lib_prefix=no -+ -+ case $GCC,$host_os in -+ yes,cygwin* | yes,mingw* | yes,pw32*) -+ 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' -+ 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="/usr/lib /lib/w32api /lib /usr/local/lib" -+ ;; -+ mingw*) -+ # MinGW DLLs use traditional 'lib' prefix -+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then -+ # It is most probably a Windows format PATH printed by -+ # mingw gcc, but we are running on Cygwin. Gcc prints its search -+ # path with ; separators, and with drive letters. We can handle the -+ # drive letters (cygwin fileutils understands them), so leave them, -+ # especially as we might pass files found there to a mingw objdump, -+ # which wouldn't understand a cygwinified path. Ahh. -+ 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 -+ ;; -+ 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 -+ ;; -+ -+ *) -+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' -+ ;; -+ esac -+ dynamic_linker='Win32 ld.exe' -+ # 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}${versuffix}$shared_ext ${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`' -+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. -+ if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` -+ else -+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' -+ fi -+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' -+ ;; -+ -+dgux*) -+ version_type=linux -+ 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 -+ ;; -+ -+freebsd1*) -+ dynamic_linker=no -+ ;; -+ -+kfreebsd*-gnu) -+ version_type=linux -+ 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='GNU ld.so' -+ ;; -+ -+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[123]*) 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 -+ ;; -+ freebsd*) # from 4.6 on -+ shlibpath_overrides_runpath=yes -+ hardcode_into_libs=yes -+ ;; -+ esac -+ ;; -+ -+gnu*) -+ version_type=linux -+ 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 -+ 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' -+ ;; -+ -+interix3*) -+ version_type=linux -+ 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 -+ 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 Linux ELF. -+linux*) -+ version_type=linux -+ 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 -+ # 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 -+ -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390x*|powerpc64*) -+ echo '#line 10855 "configure"' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ -+ # 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/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $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' -+ ;; -+ -+knetbsd*-gnu) -+ version_type=linux -+ 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='GNU 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 -+ 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=linux -+ 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 -+ ;; -+ -+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" -+ ;; -+ -+solaris*) -+ version_type=linux -+ 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 -+ 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 -+ export_dynamic_flag_spec='${wl}-Blargedynsym' -+ 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 -+ 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 -+ 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' -+ shlibpath_overrides_runpath=no -+ else -+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' -+ shlibpath_overrides_runpath=yes -+ 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' -+ ;; -+ -+uts4*) -+ version_type=linux -+ 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 -+echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -+echo "${ECHO_T}$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 -+ -+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+hardcode_action= -+if test -n "$hardcode_libdir_flag_spec" || \ -+ test -n "$runpath_var" || \ -+ test "X$hardcode_automatic" = "Xyes" ; then -+ -+ # We can hardcode non-existant 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_AC_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 -+echo "$as_me:$LINENO: result: $hardcode_action" >&5 -+echo "${ECHO_T}$hardcode_action" >&6 -+ -+if test "$hardcode_action" = relink; 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 -+ -+striplib= -+old_striplib= -+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&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" -+ echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}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" -+ echo "$as_me:$LINENO: result: yes" >&5 -+echo "${ECHO_T}yes" >&6 -+ else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+ ;; -+ *) -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+ ;; -+ esac -+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*) -+ 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 -+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -+if test "${ac_cv_lib_dl_dlopen+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-ldl $LIBS" -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char dlopen (); -+int -+main () -+{ -+dlopen (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_lib_dl_dlopen=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_lib_dl_dlopen=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -+if test $ac_cv_lib_dl_dlopen = 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 -+ -+ ;; -+ -+ *) -+ echo "$as_me:$LINENO: checking for shl_load" >&5 -+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -+if test "${ac_cv_func_shl_load+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+/* Define shl_load to an innocuous variant, in case declares shl_load. -+ For example, HP-UX 11i declares gettimeofday. */ -+#define shl_load innocuous_shl_load -+ -+/* System header to define __stub macros and hopefully few prototypes, -+ which can conflict with char shl_load (); below. -+ Prefer to if __STDC__ is defined, since -+ exists even on freestanding compilers. */ -+ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ -+#undef shl_load -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+{ -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char shl_load (); -+/* 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_shl_load) || defined (__stub___shl_load) -+choke me -+#else -+char (*f) () = shl_load; -+#endif -+#ifdef __cplusplus -+} -+#endif -+ -+int -+main () -+{ -+return f != shl_load; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_func_shl_load=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_func_shl_load=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -+echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -+if test $ac_cv_func_shl_load = yes; then -+ lt_cv_dlopen="shl_load" -+else -+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -+if test "${ac_cv_lib_dld_shl_load+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-ldld $LIBS" -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char shl_load (); -+int -+main () -+{ -+shl_load (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_lib_dld_shl_load=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_lib_dld_shl_load=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -+if test $ac_cv_lib_dld_shl_load = yes; then -+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -+else -+ echo "$as_me:$LINENO: checking for dlopen" >&5 -+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -+if test "${ac_cv_func_dlopen+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+/* Define dlopen to an innocuous variant, in case declares dlopen. -+ For example, HP-UX 11i declares gettimeofday. */ -+#define dlopen innocuous_dlopen -+ -+/* System header to define __stub macros and hopefully few prototypes, -+ which can conflict with char dlopen (); below. -+ Prefer to if __STDC__ is defined, since -+ exists even on freestanding compilers. */ -+ -+#ifdef __STDC__ -+# include -+#else -+# include -+#endif -+ -+#undef dlopen -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+{ -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char dlopen (); -+/* 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_dlopen) || defined (__stub___dlopen) -+choke me -+#else -+char (*f) () = dlopen; -+#endif -+#ifdef __cplusplus -+} -+#endif -+ -+int -+main () -+{ -+return f != dlopen; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_func_dlopen=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_func_dlopen=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+fi -+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -+echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -+if test $ac_cv_func_dlopen = yes; then -+ lt_cv_dlopen="dlopen" -+else -+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -+if test "${ac_cv_lib_dl_dlopen+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-ldl $LIBS" -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char dlopen (); -+int -+main () -+{ -+dlopen (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_lib_dl_dlopen=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_lib_dl_dlopen=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -+if test $ac_cv_lib_dl_dlopen = yes; then -+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -+else -+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -+if test "${ac_cv_lib_svld_dlopen+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-lsvld $LIBS" -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char dlopen (); -+int -+main () -+{ -+dlopen (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_lib_svld_dlopen=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_lib_svld_dlopen=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -+if test $ac_cv_lib_svld_dlopen = yes; then -+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -+else -+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -+if test "${ac_cv_lib_dld_dld_link+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-ldld $LIBS" -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+/* Override any gcc2 internal prototype to avoid an error. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+/* We use char because int might match the return type of a gcc2 -+ builtin and then its argument prototype would still apply. */ -+char dld_link (); -+int -+main () -+{ -+dld_link (); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_lib_dld_dld_link=yes -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ac_cv_lib_dld_dld_link=no -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -+if test $ac_cv_lib_dld_dld_link = yes; then -+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -+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" -+ -+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -+if test "${lt_cv_dlopen_self+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 < -+#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 -+ -+#ifdef __cplusplus -+extern "C" void exit (int); -+#endif -+ -+void fnord() { int i=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; -+ /* dlclose (self); */ -+ } -+ else -+ puts (dlerror ()); -+ -+ exit (status); -+} -+EOF -+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && 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 -+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -+echo "${ECHO_T}$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\" -+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -+if test "${lt_cv_dlopen_self_static+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 < -+#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 -+ -+#ifdef __cplusplus -+extern "C" void exit (int); -+#endif -+ -+void fnord() { int i=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; -+ /* dlclose (self); */ -+ } -+ else -+ puts (dlerror ()); -+ -+ exit (status); -+} -+EOF -+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && 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 -+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -+echo "${ECHO_T}$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 -+ -+ -+# Report which library types will actually be built -+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -+echo "$as_me:$LINENO: result: $can_build_shared" >&5 -+echo "${ECHO_T}$can_build_shared" >&6 -+ -+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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 -+ ;; -+ -+aix4* | aix5*) -+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then -+ test "$enable_shared" = yes && enable_static=no -+ fi -+ ;; -+esac -+echo "$as_me:$LINENO: result: $enable_shared" >&5 -+echo "${ECHO_T}$enable_shared" >&6 -+ -+echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -+# Make sure either enable_shared or enable_static is yes. -+test "$enable_shared" = yes || enable_static=yes -+echo "$as_me:$LINENO: result: $enable_static" >&5 -+echo "${ECHO_T}$enable_static" >&6 -+ -+# The else clause should only fire when bootstrapping the -+# libtool distribution, otherwise you forgot to ship ltmain.sh -+# with your package, and you will get complaints that there are -+# no rules to generate ltmain.sh. -+if test -f "$ltmain"; then -+ # 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 -+ # Now quote all the things that may contain metacharacters while being -+ # careful not to overquote the AC_SUBSTed values. We take copies of the -+ # variables and quote the copies for generation of the libtool script. -+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ -+ SED SHELL STRIP \ -+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ -+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ -+ deplibs_check_method reload_flag reload_cmds need_locks \ -+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ -+ lt_cv_sys_global_symbol_to_c_name_address \ -+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ -+ old_postinstall_cmds old_postuninstall_cmds \ -+ compiler \ -+ CC \ -+ LD \ -+ lt_prog_compiler_wl \ -+ lt_prog_compiler_pic \ -+ lt_prog_compiler_static \ -+ lt_prog_compiler_no_builtin_flag \ -+ export_dynamic_flag_spec \ -+ thread_safe_flag_spec \ -+ whole_archive_flag_spec \ -+ enable_shared_with_static_runtimes \ -+ old_archive_cmds \ -+ old_archive_from_new_cmds \ -+ predep_objects \ -+ postdep_objects \ -+ predeps \ -+ postdeps \ -+ compiler_lib_search_path \ -+ archive_cmds \ -+ archive_expsym_cmds \ -+ postinstall_cmds \ -+ postuninstall_cmds \ -+ old_archive_from_expsyms_cmds \ -+ allow_undefined_flag \ -+ no_undefined_flag \ -+ export_symbols_cmds \ -+ hardcode_libdir_flag_spec \ -+ hardcode_libdir_flag_spec_ld \ -+ hardcode_libdir_separator \ -+ hardcode_automatic \ -+ module_cmds \ -+ module_expsym_cmds \ -+ lt_cv_prog_compiler_c_o \ -+ exclude_expsyms \ -+ include_expsyms; do -+ -+ case $var in -+ old_archive_cmds | \ -+ old_archive_from_new_cmds | \ -+ archive_cmds | \ -+ archive_expsym_cmds | \ -+ module_cmds | \ -+ module_expsym_cmds | \ -+ old_archive_from_expsyms_cmds | \ -+ export_symbols_cmds | \ -+ extract_expsyms_cmds | reload_cmds | finish_cmds | \ -+ postinstall_cmds | postuninstall_cmds | \ -+ old_postinstall_cmds | old_postuninstall_cmds | \ -+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) -+ # Double-quote double-evaled strings. -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" -+ ;; -+ *) -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" -+ ;; -+ esac -+ done -+ -+ case $lt_echo in -+ *'\$0 --fallback-echo"') -+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` -+ ;; -+ esac -+ -+cfgfile="${ofile}T" -+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15 -+ $rm -f "$cfgfile" -+ { echo "$as_me:$LINENO: creating $ofile" >&5 -+echo "$as_me: creating $ofile" >&6;} -+ -+ cat <<__EOF__ >> "$cfgfile" -+#! $SHELL -+ -+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -+# NOTE: Changes made to this file will be lost: look at ltmain.sh. -+# -+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -+# Free Software Foundation, Inc. -+# -+# This file is part of GNU Libtool: -+# Originally by Gordon Matzigkeit , 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+# -+# 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. -+ -+# 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//" -+ -+# 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 -+ -+# The names of the tagged configurations supported by this script. -+available_tags= -+ -+# ### BEGIN LIBTOOL CONFIG -+ -+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -+ -+# Shell to use when invoking shell scripts. -+SHELL=$lt_SHELL -+ -+# Whether or not to build shared libraries. -+build_libtool_libs=$enable_shared -+ -+# Whether or not to build static libraries. -+build_old_libs=$enable_static -+ -+# 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 -+ -+# Whether or not to optimize for fast installation. -+fast_install=$enable_fast_install -+ -+# 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 -+ -+# An echo program that does not interpret backslashes. -+echo=$lt_echo -+ -+# The archiver. -+AR=$lt_AR -+AR_FLAGS=$lt_AR_FLAGS -+ -+# A C compiler. -+LTCC=$lt_LTCC -+ -+# LTCC compiler flags. -+LTCFLAGS=$lt_LTCFLAGS -+ -+# A language-specific compiler. -+CC=$lt_compiler -+ -+# Is the compiler the GNU C compiler? -+with_gcc=$GCC -+ -+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` -+gcc_ver=\`gcc -dumpversion\` -+ -+# An ERE matcher. -+EGREP=$lt_EGREP -+ -+# The linker used to build libraries. -+LD=$lt_LD -+ -+# Whether we need hard or soft links. -+LN_S=$lt_LN_S -+ -+# A BSD-compatible nm program. -+NM=$lt_NM -+ -+# A symbol stripping program -+STRIP=$lt_STRIP -+ -+# Used to examine libraries when file_magic_cmd begins "file" -+MAGIC_CMD=$MAGIC_CMD -+ -+# Used on cygwin: DLL creation program. -+DLLTOOL="$DLLTOOL" -+ -+# Used on cygwin: object dumper. -+OBJDUMP="$OBJDUMP" -+ -+# Used on cygwin: assembler. -+AS="$AS" -+ -+# The name of the directory that contains temporary libtool files. -+objdir=$objdir -+ -+# How to create reloadable object files. -+reload_flag=$lt_reload_flag -+reload_cmds=$lt_reload_cmds -+ -+# How to pass a linker flag through the compiler. -+wl=$lt_lt_prog_compiler_wl -+ -+# Object file suffix (normally "o"). -+objext="$ac_objext" -+ -+# Old archive suffix (normally "a"). -+libext="$libext" -+ -+# Shared library suffix (normally ".so"). -+shrext_cmds='$shrext_cmds' -+ -+# Executable file suffix (normally ""). -+exeext="$exeext" -+ -+# Additional compiler flags for building library objects. -+pic_flag=$lt_lt_prog_compiler_pic -+pic_mode=$pic_mode -+ -+# What is the maximum length of a command? -+max_cmd_len=$lt_cv_sys_max_cmd_len -+ -+# Does compiler simultaneously support -c and -o options? -+compiler_c_o=$lt_lt_cv_prog_compiler_c_o -+ -+# Must we lock files when doing compilation? -+need_locks=$lt_need_locks -+ -+# 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 -+ -+# 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 -+ -+# Compiler flag to prevent dynamic linking. -+link_static_flag=$lt_lt_prog_compiler_static -+ -+# Compiler flag to turn off builtin functions. -+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag -+ -+# 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 -+ -+# Compiler flag to generate thread-safe objects. -+thread_safe_flag_spec=$lt_thread_safe_flag_spec -+ -+# Library versioning type. -+version_type=$version_type -+ -+# 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 -+ -+# Commands used to build and install an old-style archive. -+RANLIB=$lt_RANLIB -+old_archive_cmds=$lt_old_archive_cmds -+old_postinstall_cmds=$lt_old_postinstall_cmds -+old_postuninstall_cmds=$lt_old_postuninstall_cmds -+ -+# 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 and install a shared archive. -+archive_cmds=$lt_archive_cmds -+archive_expsym_cmds=$lt_archive_expsym_cmds -+postinstall_cmds=$lt_postinstall_cmds -+postuninstall_cmds=$lt_postuninstall_cmds -+ -+# Commands used to build a loadable module (assumed same as above if empty) -+module_cmds=$lt_module_cmds -+module_expsym_cmds=$lt_module_expsym_cmds -+ -+# Commands to strip libraries. -+old_striplib=$lt_old_striplib -+striplib=$lt_striplib -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predep_objects=\`echo $lt_predep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdep_objects=\`echo $lt_postdep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predeps=$lt_predeps -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdeps=$lt_postdeps -+ -+# The library search path used internally by the compiler when linking -+# a shared library. -+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# 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 -+ -+# Flag that allows shared libraries with undefined symbols to be built. -+allow_undefined_flag=$lt_allow_undefined_flag -+ -+# Flag that forces no undefined symbols. -+no_undefined_flag=$lt_no_undefined_flag -+ -+# Commands used to finish a libtool library installation in a directory. -+finish_cmds=$lt_finish_cmds -+ -+# Same as above, but a single script fragment to be evaled but not shown. -+finish_eval=$lt_finish_eval -+ -+# 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 -+ -+# This is the shared library runtime path variable. -+runpath_var=$runpath_var -+ -+# This is the shared library path variable. -+shlibpath_var=$shlibpath_var -+ -+# Is shlibpath searched before the hard-coded library search path? -+shlibpath_overrides_runpath=$shlibpath_overrides_runpath -+ -+# How to hardcode a shared library path into an executable. -+hardcode_action=$hardcode_action -+ -+# Whether we should hardcode library paths into libraries. -+hardcode_into_libs=$hardcode_into_libs -+ -+# 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 -+ -+# If ld is used when linking, flag to hardcode \$libdir into -+# a binary during linking. This must work even if \$libdir does -+# not exist. -+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld -+ -+# 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 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 -+ -+# Variables whose values should be saved in libtool wrapper scripts and -+# restored at relink time. -+variables_saved_for_relink="$variables_saved_for_relink" -+ -+# Whether libtool must link a program against all its dependency libraries. -+link_all_deplibs=$link_all_deplibs -+ -+# Compile-time system search path for libraries -+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Run-time system search path for libraries -+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec -+ -+# Fix the shell variable \$srcfile for the compiler. -+fix_srcfile_path="$fix_srcfile_path" -+ -+# 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 -+ -+# The commands to extract the exported symbol list from a shared archive. -+extract_expsyms_cmds=$lt_extract_expsyms_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 -+ -+# ### END LIBTOOL CONFIG -+ -+__EOF__ -+ -+ -+ case $host_os in -+ aix3*) -+ cat <<\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 -+EOF -+ ;; -+ esac -+ -+ # 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) -+ -+ mv -f "$cfgfile" "$ofile" || \ -+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") -+ chmod +x "$ofile" -+ -+else -+ # If there is no Makefile yet, we rely on a make rule to execute -+ # `config.status --recheck' to rerun these tests and create the -+ # libtool script then. -+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` -+ if test -f "$ltmain_in"; then -+ test -f Makefile && make "$ltmain" -+ 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 -+ -+CC="$lt_save_CC" -+ -+ -+# Check whether --with-tags or --without-tags was given. -+if test "${with_tags+set}" = set; then -+ withval="$with_tags" -+ tagnames="$withval" -+fi; -+ -+if test -f "$ltmain" && test -n "$tagnames"; then -+ if test ! -f "${ofile}"; then -+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 -+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} -+ fi -+ -+ if test -z "$LTCC"; then -+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`" -+ if test -z "$LTCC"; then -+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 -+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} -+ else -+ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 -+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} -+ fi -+ fi -+ if test -z "$LTCFLAGS"; then -+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" -+ fi -+ -+ # Extract list of available tagged configurations in $ofile. -+ # Note that this assumes the entire list is on one line. -+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` -+ -+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -+ for tagname in $tagnames; do -+ IFS="$lt_save_ifs" -+ # Check whether tagname contains only valid characters -+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in -+ "") ;; -+ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 -+echo "$as_me: error: invalid tag name: $tagname" >&2;} -+ { (exit 1); exit 1; }; } -+ ;; -+ esac -+ -+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null -+ then -+ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 -+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+ -+ # Update the list of available tags. -+ if test -n "$tagname"; then -+ echo appending configuration tag \"$tagname\" to $ofile -+ -+ case $tagname in -+ CXX) -+ if test -n "$CXX" && ( test "X$CXX" != "Xno" && -+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || -+ (test "X$CXX" != "Xg++"))) ; then -+ ac_ext=cc -+ac_cpp='$CXXCPP $CPPFLAGS' -+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -+ -+ -+ -+ -+archive_cmds_need_lc_CXX=no -+allow_undefined_flag_CXX= -+always_export_symbols_CXX=no -+archive_expsym_cmds_CXX= -+export_dynamic_flag_spec_CXX= -+hardcode_direct_CXX=no -+hardcode_libdir_flag_spec_CXX= -+hardcode_libdir_flag_spec_ld_CXX= -+hardcode_libdir_separator_CXX= -+hardcode_minus_L_CXX=no -+hardcode_shlibpath_var_CXX=unsupported -+hardcode_automatic_CXX=no -+module_cmds_CXX= -+module_expsym_cmds_CXX= -+link_all_deplibs_CXX=unknown -+old_archive_cmds_CXX=$old_archive_cmds -+no_undefined_flag_CXX= -+whole_archive_flag_spec_CXX= -+enable_shared_with_static_runtimes_CXX=no -+ -+# Dependencies to place before and after the object being linked: -+predep_objects_CXX= -+postdep_objects_CXX= -+predeps_CXX= -+postdeps_CXX= -+compiler_lib_search_path_CXX= -+ -+# Source file extension for C++ test sources. -+ac_ext=cpp -+ -+# Object file extension for compiled C++ test sources. -+objext=o -+objext_CXX=$objext -+ -+# Code to be used in simple compile tests -+lt_simple_compile_test_code="int some_variable = 0;\n" -+ -+# Code to be used in simple link tests -+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' -+ -+# ltmain only uses $CC for tagged configurations so make sure $CC is set. -+ -+# 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 warnings/boilerplate of simple test code -+ac_outfile=conftest.$ac_objext -+printf "$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 -+printf "$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 conftest* -+ -+ -+# Allow CC to be a program name with arguments. -+lt_save_CC=$CC -+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++"} -+compiler=$CC -+compiler_CXX=$CC -+for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ -+# We don't want -fno-exception wen compiling C++ code, so set the -+# no_builtin_flag separately -+if test "$GXX" = yes; then -+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' -+else -+ lt_prog_compiler_no_builtin_flag_CXX= -+fi -+ -+if test "$GXX" = yes; then -+ # Set up default GNU C++ configuration -+ -+ -+# Check whether --with-gnu-ld or --without-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. -+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&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 -+ echo "$as_me:$LINENO: checking for GNU ld" >&5 -+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -+else -+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -+fi -+if test "${lt_cv_path_LD+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&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 -+echo "${ECHO_T}$LD" >&6 -+else -+ echo "$as_me:$LINENO: result: no" >&5 -+echo "${ECHO_T}no" >&6 -+fi -+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} -+ { (exit 1); exit 1; }; } -+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -+if test "${lt_cv_prog_gnu_ld+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ # I'd rather use --version here, but apparently some GNU lds only accept -v. -+case `$LD -v 2>&1 &5 -+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -+with_gnu_ld=$lt_cv_prog_gnu_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 -+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' -+ export_dynamic_flag_spec_CXX='${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 -+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ else -+ whole_archive_flag_spec_CXX= -+ 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. -+ archive_cmds_CXX='$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 "\-L"' -+ -+else -+ GXX=no -+ with_gnu_ld=no -+ wlarc= -+fi -+ -+# PORTME: fill in a description of your system's C++ link characteristics -+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+ld_shlibs_CXX=yes -+case $host_os in -+ aix3*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ aix4* | aix5*) -+ 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].*|aix5*) -+ 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. -+ -+ archive_cmds_CXX='' -+ hardcode_direct_CXX=yes -+ hardcode_libdir_separator_CXX=':' -+ link_all_deplibs_CXX=yes -+ -+ 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 -+ hardcode_direct_CXX=yes -+ else -+ # We have old collect2 -+ hardcode_direct_CXX=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_CXX=yes -+ hardcode_libdir_flag_spec_CXX='-L$libdir' -+ hardcode_libdir_separator_CXX= -+ 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 -+ -+ # 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_CXX=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_CXX='-berok' -+ # Determine the default libpath from the value encoded in an empty executable. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_cxx_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" -+ -+ archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_CXX='${wl}-R $libdir:/usr/lib:/lib' -+ allow_undefined_flag_CXX="-z nodefs" -+ archive_expsym_cmds_CXX="\$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. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_cxx_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ -+ hardcode_libdir_flag_spec_CXX='${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_CXX=' ${wl}-bernotok' -+ allow_undefined_flag_CXX=' ${wl}-berok' -+ # Exported symbols can be pulled into shared objects from archives -+ whole_archive_flag_spec_CXX='$convenience' -+ archive_cmds_need_lc_CXX=yes -+ # This is similar to how AIX traditionally builds its shared libraries. -+ archive_expsym_cmds_CXX="\$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 -+ allow_undefined_flag_CXX=unsupported -+ # Joseph Beckenbach says some releases of gcc -+ # support --undefined. This deserves some investigation. FIXME -+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ else -+ ld_shlibs_CXX=no -+ fi -+ ;; -+ -+ chorus*) -+ case $cc_basename in -+ *) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ esac -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, -+ # as there is no search path for DLLs. -+ hardcode_libdir_flag_spec_CXX='-L$libdir' -+ allow_undefined_flag_CXX=unsupported -+ always_export_symbols_CXX=no -+ enable_shared_with_static_runtimes_CXX=yes -+ -+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then -+ archive_cmds_CXX='$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... -+ archive_expsym_cmds_CXX='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 -+ ld_shlibs_CXX=no -+ fi -+ ;; -+ darwin* | rhapsody*) -+ case $host_os in -+ rhapsody* | darwin1.[012]) -+ allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' -+ ;; -+ *) # Darwin 1.3 on -+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then -+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ else -+ case ${MACOSX_DEPLOYMENT_TARGET} in -+ 10.[012]) -+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ ;; -+ 10.*) -+ allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' -+ ;; -+ esac -+ fi -+ ;; -+ esac -+ archive_cmds_need_lc_CXX=no -+ hardcode_direct_CXX=no -+ hardcode_automatic_CXX=yes -+ hardcode_shlibpath_var_CXX=unsupported -+ whole_archive_flag_spec_CXX='' -+ link_all_deplibs_CXX=yes -+ -+ if test "$GXX" = yes ; then -+ lt_int_apple_cc_single_mod=no -+ output_verbose_link_cmd='echo' -+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then -+ lt_int_apple_cc_single_mod=yes -+ fi -+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then -+ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' -+ else -+ archive_cmds_CXX='$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' -+ fi -+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then -+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "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~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ fi -+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ case $cc_basename in -+ xlc*) -+ output_verbose_link_cmd='echo' -+ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' -+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ ;; -+ *) -+ ld_shlibs_CXX=no -+ ;; -+ esac -+ fi -+ ;; -+ -+ dgux*) -+ case $cc_basename in -+ ec++*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ ghcx*) -+ # Green Hills C++ Compiler -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ esac -+ ;; -+ freebsd[12]*) -+ # C++ shared libraries reported to be fairly broken before switch to ELF -+ ld_shlibs_CXX=no -+ ;; -+ freebsd-elf*) -+ archive_cmds_need_lc_CXX=no -+ ;; -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF -+ # conventions -+ ld_shlibs_CXX=yes -+ ;; -+ gnu*) -+ ;; -+ hpux9*) -+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_CXX=: -+ export_dynamic_flag_spec_CXX='${wl}-E' -+ hardcode_direct_CXX=yes -+ hardcode_minus_L_CXX=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 -+ ld_shlibs_CXX=no -+ ;; -+ aCC*) -+ archive_cmds_CXX='$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) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes; then -+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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 -+ ld_shlibs_CXX=no -+ fi -+ ;; -+ esac -+ ;; -+ hpux10*|hpux11*) -+ if test $with_gnu_ld = no; then -+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ case $host_cpu in -+ hppa*64*|ia64*) -+ hardcode_libdir_flag_spec_ld_CXX='+b $libdir' -+ ;; -+ *) -+ export_dynamic_flag_spec_CXX='${wl}-E' -+ ;; -+ esac -+ fi -+ case $host_cpu in -+ hppa*64*|ia64*) -+ hardcode_direct_CXX=no -+ hardcode_shlibpath_var_CXX=no -+ ;; -+ *) -+ hardcode_direct_CXX=yes -+ hardcode_minus_L_CXX=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 -+ ld_shlibs_CXX=no -+ ;; -+ aCC*) -+ case $host_cpu in -+ hppa*64*) -+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ ia64*) -+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ *) -+ archive_cmds_CXX='$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; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes; then -+ if test $with_gnu_ld = no; then -+ case $host_cpu in -+ hppa*64*) -+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ ia64*) -+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ ;; -+ *) -+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${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 -+ ld_shlibs_CXX=no -+ fi -+ ;; -+ esac -+ ;; -+ interix3*) -+ hardcode_direct_CXX=no -+ hardcode_shlibpath_var_CXX=no -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' -+ export_dynamic_flag_spec_CXX='${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_CXX='$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_CXX='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++ -+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -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. -+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' -+ ;; -+ *) -+ if test "$GXX" = yes; then -+ if test "$with_gnu_ld" = no; then -+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' -+ fi -+ fi -+ link_all_deplibs_CXX=yes -+ ;; -+ esac -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_CXX=: -+ ;; -+ linux*) -+ 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. -+ archive_cmds_CXX='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' -+ archive_expsym_cmds_CXX='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; echo $list' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' -+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' -+ -+ # Archives containing C++ object files must be created using -+ # "CC -Bstatic", where "CC" is the KAI C++ compiler. -+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' -+ ;; -+ icpc*) -+ # 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."*) -+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_CXX='$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 -+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ ;; -+ esac -+ archive_cmds_need_lc_CXX=no -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' -+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' -+ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' -+ ;; -+ pgCC*) -+ # Portland Group C++ compiler -+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' -+ archive_expsym_cmds_CXX='$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' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' -+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' -+ whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' -+ ;; -+ cxx*) -+ # Compaq C++ -+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_CXX='$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 -+ hardcode_libdir_flag_spec_CXX='-rpath $libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # 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=`echo $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; echo $list' -+ ;; -+ esac -+ ;; -+ lynxos*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ m88k*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ mvs*) -+ case $cc_basename in -+ cxx*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ esac -+ ;; -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' -+ wlarc= -+ hardcode_libdir_flag_spec_CXX='-R$libdir' -+ hardcode_direct_CXX=yes -+ hardcode_shlibpath_var_CXX=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::"' -+ ;; -+ openbsd2*) -+ # C++ shared libraries are fairly broken -+ ld_shlibs_CXX=no -+ ;; -+ openbsd*) -+ hardcode_direct_CXX=yes -+ hardcode_shlibpath_var_CXX=no -+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' -+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then -+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' -+ export_dynamic_flag_spec_CXX='${wl}-E' -+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ fi -+ output_verbose_link_cmd='echo' -+ ;; -+ osf3*) -+ 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. -+ archive_cmds_CXX='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' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # Archives containing C++ object files must be created using -+ # "CC -Bstatic", where "CC" is the KAI C++ compiler. -+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' -+ -+ ;; -+ RCC*) -+ # Rational C++ 2.4.1 -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ cxx*) -+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # 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=`echo $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; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then -+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # 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 "\-L"' -+ -+ else -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ fi -+ ;; -+ esac -+ ;; -+ 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. -+ archive_cmds_CXX='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' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # Archives containing C++ object files must be created using -+ # the KAI C++ compiler. -+ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' -+ ;; -+ RCC*) -+ # Rational C++ 2.4.1 -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ cxx*) -+ allow_undefined_flag_CXX=' -expect_unresolved \*' -+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ archive_expsym_cmds_CXX='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' -+ -+ hardcode_libdir_flag_spec_CXX='-rpath $libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # 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=`echo $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; echo $list' -+ ;; -+ *) -+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then -+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_CXX=: -+ -+ # 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 "\-L"' -+ -+ else -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ fi -+ ;; -+ esac -+ ;; -+ psos*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ sunos4*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.x -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ lcc*) -+ # Lucid -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ esac -+ ;; -+ solaris*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.2, 5.x and Centerline C++ -+ archive_cmds_need_lc_CXX=yes -+ no_undefined_flag_CXX=' -zdefs' -+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' -+ archive_expsym_cmds_CXX='$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' -+ -+ hardcode_libdir_flag_spec_CXX='-R$libdir' -+ hardcode_shlibpath_var_CXX=no -+ case $host_os in -+ solaris2.[0-5] | solaris2.[0-5].*) ;; -+ *) -+ # The C++ compiler is used as linker so we must use $wl -+ # flag to pass the commands to the underlying system -+ # linker. We must also pass each convience library through -+ # to the system linker between allextract/defaultextract. -+ # The C++ compiler will combine linker options so we -+ # cannot just pass the convience library names through -+ # without $wl. -+ # Supported since Solaris 2.6 (maybe 2.5.1?) -+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' -+ ;; -+ esac -+ link_all_deplibs_CXX=yes -+ -+ output_verbose_link_cmd='echo' -+ -+ # 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. -+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' -+ ;; -+ gcx*) -+ # Green Hills C++ Compiler -+ archive_cmds_CXX='$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. -+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' -+ ;; -+ *) -+ # GNU C++ compiler with Solaris linker -+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then -+ no_undefined_flag_CXX=' ${wl}-z ${wl}defs' -+ if $CC --version | grep -v '^2\.7' > /dev/null; then -+ archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' -+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ -+ $CC -shared -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 \"\-L\"" -+ else -+ # g++ 2.7 appears to require `-G' NOT `-shared' on this -+ # platform. -+ archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' -+ archive_expsym_cmds_CXX='$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 \"\-L\"" -+ fi -+ -+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' -+ fi -+ ;; -+ esac -+ ;; -+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) -+ no_undefined_flag_CXX='${wl}-z,text' -+ archive_cmds_need_lc_CXX=no -+ hardcode_shlibpath_var_CXX=no -+ runpath_var='LD_RUN_PATH' -+ -+ case $cc_basename in -+ CC*) -+ archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_CXX='$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. -+ # 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. -+ # So that behaviour is only enabled if SCOABSPATH is set to a -+ # non-empty value in the environment. Most likely only useful for -+ # creating official distributions of packages. -+ # This is a hack until libtool officially supports absolute path -+ # names for shared libraries. -+ no_undefined_flag_CXX='${wl}-z,text' -+ allow_undefined_flag_CXX='${wl}-z,nodefs' -+ archive_cmds_need_lc_CXX=no -+ hardcode_shlibpath_var_CXX=no -+ hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' -+ hardcode_libdir_separator_CXX=':' -+ link_all_deplibs_CXX=yes -+ export_dynamic_flag_spec_CXX='${wl}-Bexport' -+ runpath_var='LD_RUN_PATH' -+ -+ case $cc_basename in -+ CC*) -+ archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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 -+ ld_shlibs_CXX=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ esac -+ ;; -+ vxworks*) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+ *) -+ # FIXME: insert proper C++ library support -+ ld_shlibs_CXX=no -+ ;; -+esac -+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -+echo "${ECHO_T}$ld_shlibs_CXX" >&6 -+test "$ld_shlibs_CXX" = no && can_build_shared=no -+ -+GCC_CXX="$GXX" -+LD_CXX="$LD" -+ -+ -+cat > conftest.$ac_ext <&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; 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 -+ -+ # The `*' in the case matches for architectures that use `case' in -+ # $output_verbose_cmd can trigger glob expansion during the loop -+ # eval without this substitution. -+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` -+ -+ for p in `eval $output_verbose_link_cmd`; do -+ case $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 -+ else -+ prev= -+ fi -+ -+ if test "$pre_test_object_deps_done" = no; then -+ case $p 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 "$compiler_lib_search_path_CXX"; then -+ compiler_lib_search_path_CXX="${prev}${p}" -+ else -+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${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 "$postdeps_CXX"; then -+ postdeps_CXX="${prev}${p}" -+ else -+ postdeps_CXX="${postdeps_CXX} ${prev}${p}" -+ fi -+ fi -+ ;; -+ -+ *.$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 "$predep_objects_CXX"; then -+ predep_objects_CXX="$p" -+ else -+ predep_objects_CXX="$predep_objects_CXX $p" -+ fi -+ else -+ if test -z "$postdep_objects_CXX"; then -+ postdep_objects_CXX="$p" -+ else -+ postdep_objects_CXX="$postdep_objects_CXX $p" -+ fi -+ fi -+ ;; -+ -+ *) ;; # Ignore the rest. -+ -+ esac -+ done -+ -+ # Clean up. -+ rm -f a.out a.exe -+else -+ echo "libtool.m4: error: problem compiling CXX test program" -+fi -+ -+$rm -f confest.$objext -+ -+# PORTME: override above test on systems where it is broken -+case $host_os in -+interix3*) -+ # Interix 3.5 installs completely hosed .la files for C++, so rather than -+ # hack all around it, let's just trust "g++" to DTRT. -+ predep_objects_CXX= -+ postdep_objects_CXX= -+ postdeps_CXX= -+ ;; -+ -+solaris*) -+ case $cc_basename in -+ CC*) -+ # 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. -+ postdeps_CXX='-lCstd -lCrun' -+ ;; -+ esac -+ ;; -+esac -+ -+ -+case " $postdeps_CXX " in -+*" -lc "*) archive_cmds_need_lc_CXX=no ;; -+esac -+ -+lt_prog_compiler_wl_CXX= -+lt_prog_compiler_pic_CXX= -+lt_prog_compiler_static_CXX= -+ -+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+ -+ # C++ specific cases for pic, static, wl, etc. -+ if test "$GXX" = yes; then -+ lt_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_static_CXX='-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_CXX='-Bstatic' -+ fi -+ ;; -+ amigaos*) -+ # 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_CXX='-m68020 -resident32 -malways-restore-a4' -+ ;; -+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) -+ # PIC is the default for these OSes. -+ ;; -+ mingw* | os2* | pw32*) -+ # 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_CXX='-DDLL_EXPORT' -+ ;; -+ darwin* | rhapsody*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ lt_prog_compiler_pic_CXX='-fno-common' -+ ;; -+ *djgpp*) -+ # DJGPP does not support shared libraries at all -+ lt_prog_compiler_pic_CXX= -+ ;; -+ interix3*) -+ # 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_prog_compiler_pic_CXX=-Kconform_pic -+ fi -+ ;; -+ hpux*) -+ # 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*) -+ ;; -+ *) -+ lt_prog_compiler_pic_CXX='-fPIC' -+ ;; -+ esac -+ ;; -+ *) -+ lt_prog_compiler_pic_CXX='-fPIC' -+ ;; -+ esac -+ else -+ case $host_os in -+ aix4* | aix5*) -+ # All AIX code is PIC. -+ if test "$host_cpu" = ia64; then -+ # AIX 5 now supports IA64 processor -+ lt_prog_compiler_static_CXX='-Bstatic' -+ else -+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' -+ fi -+ ;; -+ chorus*) -+ case $cc_basename in -+ cxch68*) -+ # Green Hills C++ Compiler -+ # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--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 -+ ;; -+ darwin*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ case $cc_basename in -+ xlc*) -+ lt_prog_compiler_pic_CXX='-qnocommon' -+ lt_prog_compiler_wl_CXX='-Wl,' -+ ;; -+ esac -+ ;; -+ dgux*) -+ case $cc_basename in -+ ec++*) -+ lt_prog_compiler_pic_CXX='-KPIC' -+ ;; -+ ghcx*) -+ # Green Hills C++ Compiler -+ lt_prog_compiler_pic_CXX='-pic' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ # FreeBSD uses GNU C++ -+ ;; -+ hpux9* | hpux10* | hpux11*) -+ case $cc_basename in -+ CC*) -+ lt_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' -+ if test "$host_cpu" != ia64; then -+ lt_prog_compiler_pic_CXX='+Z' -+ fi -+ ;; -+ aCC*) -+ lt_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' -+ case $host_cpu in -+ hppa*64*|ia64*) -+ # +Z the default -+ ;; -+ *) -+ lt_prog_compiler_pic_CXX='+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_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_static_CXX='-non_shared' -+ # CC pic flag -KPIC is the default. -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ linux*) -+ case $cc_basename in -+ KCC*) -+ # KAI C++ Compiler -+ lt_prog_compiler_wl_CXX='--backend -Wl,' -+ lt_prog_compiler_pic_CXX='-fPIC' -+ ;; -+ icpc* | ecpc*) -+ # Intel C++ -+ lt_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_pic_CXX='-KPIC' -+ lt_prog_compiler_static_CXX='-static' -+ ;; -+ pgCC*) -+ # Portland Group C++ compiler. -+ lt_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_pic_CXX='-fpic' -+ lt_prog_compiler_static_CXX='-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_prog_compiler_pic_CXX= -+ lt_prog_compiler_static_CXX='-non_shared' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ lynxos*) -+ ;; -+ m88k*) -+ ;; -+ mvs*) -+ case $cc_basename in -+ cxx*) -+ lt_prog_compiler_pic_CXX='-W c,exportall' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ netbsd*) -+ ;; -+ osf3* | osf4* | osf5*) -+ case $cc_basename in -+ KCC*) -+ lt_prog_compiler_wl_CXX='--backend -Wl,' -+ ;; -+ RCC*) -+ # Rational C++ 2.4.1 -+ lt_prog_compiler_pic_CXX='-pic' -+ ;; -+ cxx*) -+ # Digital/Compaq C++ -+ lt_prog_compiler_wl_CXX='-Wl,' -+ # Make sure the PIC flag is empty. It appears that all Alpha -+ # Linux and Compaq Tru64 Unix objects are PIC. -+ lt_prog_compiler_pic_CXX= -+ lt_prog_compiler_static_CXX='-non_shared' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ psos*) -+ ;; -+ solaris*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.2, 5.x and Centerline C++ -+ lt_prog_compiler_pic_CXX='-KPIC' -+ lt_prog_compiler_static_CXX='-Bstatic' -+ lt_prog_compiler_wl_CXX='-Qoption ld ' -+ ;; -+ gcx*) -+ # Green Hills C++ Compiler -+ lt_prog_compiler_pic_CXX='-PIC' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ sunos4*) -+ case $cc_basename in -+ CC*) -+ # Sun C++ 4.x -+ lt_prog_compiler_pic_CXX='-pic' -+ lt_prog_compiler_static_CXX='-Bstatic' -+ ;; -+ lcc*) -+ # Lucid -+ lt_prog_compiler_pic_CXX='-pic' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ tandem*) -+ case $cc_basename in -+ NCC*) -+ # NonStop-UX NCC 3.20 -+ lt_prog_compiler_pic_CXX='-KPIC' -+ ;; -+ *) -+ ;; -+ esac -+ ;; -+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) -+ case $cc_basename in -+ CC*) -+ lt_prog_compiler_wl_CXX='-Wl,' -+ lt_prog_compiler_pic_CXX='-KPIC' -+ lt_prog_compiler_static_CXX='-Bstatic' -+ ;; -+ esac -+ ;; -+ vxworks*) -+ ;; -+ *) -+ lt_prog_compiler_can_build_shared_CXX=no -+ ;; -+ esac -+ fi -+ -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 -+ -+# -+# Check to make sure the PIC flag actually works. -+# -+if test -n "$lt_prog_compiler_pic_CXX"; then -+ -+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_pic_works_CXX=no -+ ac_outfile=conftest.$ac_objext -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -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:14195: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&5 -+ echo "$as_me:14199: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_pic_works_CXX=yes -+ fi -+ fi -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 -+ -+if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then -+ case $lt_prog_compiler_pic_CXX in -+ "" | " "*) ;; -+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; -+ esac -+else -+ lt_prog_compiler_pic_CXX= -+ lt_prog_compiler_can_build_shared_CXX=no -+fi -+ -+fi -+case $host_os in -+ # For platforms which do not support PIC, -DPIC is meaningless: -+ *djgpp*) -+ lt_prog_compiler_pic_CXX= -+ ;; -+ *) -+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" -+ ;; -+esac -+ -+# -+# Check to make sure the static flag actually works. -+# -+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_static_works_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_static_works_CXX=no -+ save_LDFLAGS="$LDFLAGS" -+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" -+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_static_works_CXX=yes -+ fi -+ else -+ lt_prog_compiler_static_works_CXX=yes -+ fi -+ fi -+ $rm conftest* -+ LDFLAGS="$save_LDFLAGS" -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 -+echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 -+ -+if test x"$lt_prog_compiler_static_works_CXX" = xyes; then -+ : -+else -+ lt_prog_compiler_static_CXX= -+fi -+ -+ -+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_prog_compiler_c_o_CXX=no -+ $rm -r conftest 2>/dev/null -+ mkdir conftest -+ cd conftest -+ mkdir out -+ printf "$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:14299: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>out/conftest.err) -+ ac_status=$? -+ cat out/conftest.err >&5 -+ echo "$as_me:14303: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_CXX=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 .. -+ rmdir conftest -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 -+ -+ -+hard_links="nottested" -+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then -+ # do not overwrite the value of need_locks provided by the user -+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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 -+ echo "$as_me:$LINENO: result: $hard_links" >&5 -+echo "${ECHO_T}$hard_links" >&6 -+ if test "$hard_links" = no; then -+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -+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 -+ -+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+ -+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ case $host_os in -+ aix4* | aix5*) -+ # 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 -+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then -+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' -+ else -+ export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' -+ fi -+ ;; -+ pw32*) -+ export_symbols_cmds_CXX="$ltdll_cmds" -+ ;; -+ cygwin* | mingw*) -+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' -+ ;; -+ *) -+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ ;; -+ esac -+ -+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -+echo "${ECHO_T}$ld_shlibs_CXX" >&6 -+test "$ld_shlibs_CXX" = no && can_build_shared=no -+ -+# -+# Do we need to explicitly link libc? -+# -+case "x$archive_cmds_need_lc_CXX" in -+x|xyes) -+ # Assume -lc should be added -+ archive_cmds_need_lc_CXX=yes -+ -+ if test "$enable_shared" = yes && test "$GCC" = yes; then -+ case $archive_cmds_CXX 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. -+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ $rm conftest* -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } 2>conftest.err; then -+ soname=conftest -+ lib=conftest -+ libobjs=conftest.$ac_objext -+ deplibs= -+ wl=$lt_prog_compiler_wl_CXX -+ pic_flag=$lt_prog_compiler_pic_CXX -+ compiler_flags=-v -+ linker_flags=-v -+ verstring= -+ output_objdir=. -+ libname=conftest -+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX -+ allow_undefined_flag_CXX= -+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 -+ (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ then -+ archive_cmds_need_lc_CXX=no -+ else -+ archive_cmds_need_lc_CXX=yes -+ fi -+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag -+ else -+ cat conftest.err 1>&5 -+ fi -+ $rm conftest* -+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 -+ ;; -+ esac -+ fi -+ ;; -+esac -+ -+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+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" -+if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then -+ # 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. -+ 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 -+else -+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -+fi -+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 -+ 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' -+ ;; -+ -+aix4* | aix5*) -+ version_type=linux -+ 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*) -+ 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=`$echo "X$lib" | $Xsed -e '\''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' -+ ;; -+ -+beos*) -+ library_names_spec='${libname}${shared_ext}' -+ dynamic_linker="$host_os ld.so" -+ shlibpath_var=LIBRARY_PATH -+ ;; -+ -+bsdi[45]*) -+ version_type=linux -+ 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*) -+ version_type=windows -+ shrext_cmds=".dll" -+ need_version=no -+ need_lib_prefix=no -+ -+ case $GCC,$host_os in -+ yes,cygwin* | yes,mingw* | yes,pw32*) -+ 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' -+ 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="/usr/lib /lib/w32api /lib /usr/local/lib" -+ ;; -+ mingw*) -+ # MinGW DLLs use traditional 'lib' prefix -+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then -+ # It is most probably a Windows format PATH printed by -+ # mingw gcc, but we are running on Cygwin. Gcc prints its search -+ # path with ; separators, and with drive letters. We can handle the -+ # drive letters (cygwin fileutils understands them), so leave them, -+ # especially as we might pass files found there to a mingw objdump, -+ # which wouldn't understand a cygwinified path. Ahh. -+ 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 -+ ;; -+ 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 -+ ;; -+ -+ *) -+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' -+ ;; -+ esac -+ dynamic_linker='Win32 ld.exe' -+ # 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}${versuffix}$shared_ext ${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`' -+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. -+ if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` -+ else -+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' -+ fi -+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' -+ ;; -+ -+dgux*) -+ version_type=linux -+ 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 -+ ;; -+ -+freebsd1*) -+ dynamic_linker=no -+ ;; -+ -+kfreebsd*-gnu) -+ version_type=linux -+ 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='GNU ld.so' -+ ;; -+ -+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[123]*) 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 -+ ;; -+ freebsd*) # from 4.6 on -+ shlibpath_overrides_runpath=yes -+ hardcode_into_libs=yes -+ ;; -+ esac -+ ;; -+ -+gnu*) -+ version_type=linux -+ 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 -+ 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' -+ ;; -+ -+interix3*) -+ version_type=linux -+ 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 -+ 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 Linux ELF. -+linux*) -+ version_type=linux -+ 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 -+ # 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 -+ -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390x*|powerpc64*) -+ echo '#line 14835 "configure"' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ -+ # 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/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $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' -+ ;; -+ -+knetbsd*-gnu) -+ version_type=linux -+ 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='GNU 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 -+ 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=linux -+ 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 -+ ;; -+ -+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" -+ ;; -+ -+solaris*) -+ version_type=linux -+ 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 -+ 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 -+ export_dynamic_flag_spec='${wl}-Blargedynsym' -+ 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 -+ 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 -+ 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' -+ shlibpath_overrides_runpath=no -+ else -+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' -+ shlibpath_overrides_runpath=yes -+ 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' -+ ;; -+ -+uts4*) -+ version_type=linux -+ 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 -+echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -+echo "${ECHO_T}$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 -+ -+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+hardcode_action_CXX= -+if test -n "$hardcode_libdir_flag_spec_CXX" || \ -+ test -n "$runpath_var_CXX" || \ -+ test "X$hardcode_automatic_CXX" = "Xyes" ; then -+ -+ # We can hardcode non-existant directories. -+ if test "$hardcode_direct_CXX" != 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_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && -+ test "$hardcode_minus_L_CXX" != no; then -+ # Linking always hardcodes the temporary library directory. -+ hardcode_action_CXX=relink -+ else -+ # We can link without hardcoding, and we can hardcode nonexisting dirs. -+ hardcode_action_CXX=immediate -+ fi -+else -+ # We cannot hardcode anything, or else we can only hardcode existing -+ # directories. -+ hardcode_action_CXX=unsupported -+fi -+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -+echo "${ECHO_T}$hardcode_action_CXX" >&6 -+ -+if test "$hardcode_action_CXX" = relink; 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 -+ -+ -+# The else clause should only fire when bootstrapping the -+# libtool distribution, otherwise you forgot to ship ltmain.sh -+# with your package, and you will get complaints that there are -+# no rules to generate ltmain.sh. -+if test -f "$ltmain"; then -+ # 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 -+ # Now quote all the things that may contain metacharacters while being -+ # careful not to overquote the AC_SUBSTed values. We take copies of the -+ # variables and quote the copies for generation of the libtool script. -+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ -+ SED SHELL STRIP \ -+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ -+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ -+ deplibs_check_method reload_flag reload_cmds need_locks \ -+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ -+ lt_cv_sys_global_symbol_to_c_name_address \ -+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ -+ old_postinstall_cmds old_postuninstall_cmds \ -+ compiler_CXX \ -+ CC_CXX \ -+ LD_CXX \ -+ lt_prog_compiler_wl_CXX \ -+ lt_prog_compiler_pic_CXX \ -+ lt_prog_compiler_static_CXX \ -+ lt_prog_compiler_no_builtin_flag_CXX \ -+ export_dynamic_flag_spec_CXX \ -+ thread_safe_flag_spec_CXX \ -+ whole_archive_flag_spec_CXX \ -+ enable_shared_with_static_runtimes_CXX \ -+ old_archive_cmds_CXX \ -+ old_archive_from_new_cmds_CXX \ -+ predep_objects_CXX \ -+ postdep_objects_CXX \ -+ predeps_CXX \ -+ postdeps_CXX \ -+ compiler_lib_search_path_CXX \ -+ archive_cmds_CXX \ -+ archive_expsym_cmds_CXX \ -+ postinstall_cmds_CXX \ -+ postuninstall_cmds_CXX \ -+ old_archive_from_expsyms_cmds_CXX \ -+ allow_undefined_flag_CXX \ -+ no_undefined_flag_CXX \ -+ export_symbols_cmds_CXX \ -+ hardcode_libdir_flag_spec_CXX \ -+ hardcode_libdir_flag_spec_ld_CXX \ -+ hardcode_libdir_separator_CXX \ -+ hardcode_automatic_CXX \ -+ module_cmds_CXX \ -+ module_expsym_cmds_CXX \ -+ lt_cv_prog_compiler_c_o_CXX \ -+ exclude_expsyms_CXX \ -+ include_expsyms_CXX; do -+ -+ case $var in -+ old_archive_cmds_CXX | \ -+ old_archive_from_new_cmds_CXX | \ -+ archive_cmds_CXX | \ -+ archive_expsym_cmds_CXX | \ -+ module_cmds_CXX | \ -+ module_expsym_cmds_CXX | \ -+ old_archive_from_expsyms_cmds_CXX | \ -+ export_symbols_cmds_CXX | \ -+ extract_expsyms_cmds | reload_cmds | finish_cmds | \ -+ postinstall_cmds | postuninstall_cmds | \ -+ old_postinstall_cmds | old_postuninstall_cmds | \ -+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) -+ # Double-quote double-evaled strings. -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" -+ ;; -+ *) -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" -+ ;; -+ esac -+ done -+ -+ case $lt_echo in -+ *'\$0 --fallback-echo"') -+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` -+ ;; -+ esac -+ -+cfgfile="$ofile" -+ -+ cat <<__EOF__ >> "$cfgfile" -+# ### BEGIN LIBTOOL TAG CONFIG: $tagname -+ -+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -+ -+# Shell to use when invoking shell scripts. -+SHELL=$lt_SHELL -+ -+# Whether or not to build shared libraries. -+build_libtool_libs=$enable_shared -+ -+# Whether or not to build static libraries. -+build_old_libs=$enable_static -+ -+# Whether or not to add -lc for building shared libraries. -+build_libtool_need_lc=$archive_cmds_need_lc_CXX -+ -+# Whether or not to disallow shared libs when runtime libs are static -+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX -+ -+# Whether or not to optimize for fast installation. -+fast_install=$enable_fast_install -+ -+# 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 -+ -+# An echo program that does not interpret backslashes. -+echo=$lt_echo -+ -+# The archiver. -+AR=$lt_AR -+AR_FLAGS=$lt_AR_FLAGS -+ -+# A C compiler. -+LTCC=$lt_LTCC -+ -+# LTCC compiler flags. -+LTCFLAGS=$lt_LTCFLAGS -+ -+# A language-specific compiler. -+CC=$lt_compiler_CXX -+ -+# Is the compiler the GNU C compiler? -+with_gcc=$GCC_CXX -+ -+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` -+gcc_ver=\`gcc -dumpversion\` -+ -+# An ERE matcher. -+EGREP=$lt_EGREP -+ -+# The linker used to build libraries. -+LD=$lt_LD_CXX -+ -+# Whether we need hard or soft links. -+LN_S=$lt_LN_S -+ -+# A BSD-compatible nm program. -+NM=$lt_NM -+ -+# A symbol stripping program -+STRIP=$lt_STRIP -+ -+# Used to examine libraries when file_magic_cmd begins "file" -+MAGIC_CMD=$MAGIC_CMD -+ -+# Used on cygwin: DLL creation program. -+DLLTOOL="$DLLTOOL" -+ -+# Used on cygwin: object dumper. -+OBJDUMP="$OBJDUMP" -+ -+# Used on cygwin: assembler. -+AS="$AS" -+ -+# The name of the directory that contains temporary libtool files. -+objdir=$objdir -+ -+# How to create reloadable object files. -+reload_flag=$lt_reload_flag -+reload_cmds=$lt_reload_cmds -+ -+# How to pass a linker flag through the compiler. -+wl=$lt_lt_prog_compiler_wl_CXX -+ -+# Object file suffix (normally "o"). -+objext="$ac_objext" -+ -+# Old archive suffix (normally "a"). -+libext="$libext" -+ -+# Shared library suffix (normally ".so"). -+shrext_cmds='$shrext_cmds' -+ -+# Executable file suffix (normally ""). -+exeext="$exeext" -+ -+# Additional compiler flags for building library objects. -+pic_flag=$lt_lt_prog_compiler_pic_CXX -+pic_mode=$pic_mode -+ -+# What is the maximum length of a command? -+max_cmd_len=$lt_cv_sys_max_cmd_len -+ -+# Does compiler simultaneously support -c and -o options? -+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX -+ -+# Must we lock files when doing compilation? -+need_locks=$lt_need_locks -+ -+# 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 -+ -+# 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 -+ -+# Compiler flag to prevent dynamic linking. -+link_static_flag=$lt_lt_prog_compiler_static_CXX -+ -+# Compiler flag to turn off builtin functions. -+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX -+ -+# Compiler flag to allow reflexive dlopens. -+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX -+ -+# Compiler flag to generate shared objects directly from archives. -+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX -+ -+# Compiler flag to generate thread-safe objects. -+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX -+ -+# Library versioning type. -+version_type=$version_type -+ -+# 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 -+ -+# Commands used to build and install an old-style archive. -+RANLIB=$lt_RANLIB -+old_archive_cmds=$lt_old_archive_cmds_CXX -+old_postinstall_cmds=$lt_old_postinstall_cmds -+old_postuninstall_cmds=$lt_old_postuninstall_cmds -+ -+# Create an old-style archive from a shared archive. -+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX -+ -+# Create a temporary old-style archive to link instead of a shared archive. -+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX -+ -+# Commands used to build and install a shared archive. -+archive_cmds=$lt_archive_cmds_CXX -+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX -+postinstall_cmds=$lt_postinstall_cmds -+postuninstall_cmds=$lt_postuninstall_cmds -+ -+# Commands used to build a loadable module (assumed same as above if empty) -+module_cmds=$lt_module_cmds_CXX -+module_expsym_cmds=$lt_module_expsym_cmds_CXX -+ -+# Commands to strip libraries. -+old_striplib=$lt_old_striplib -+striplib=$lt_striplib -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predep_objects=\`echo $lt_predep_objects_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdep_objects=\`echo $lt_postdep_objects_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predeps=$lt_predeps_CXX -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdeps=$lt_postdeps_CXX -+ -+# The library search path used internally by the compiler when linking -+# a shared library. -+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# 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 -+ -+# Flag that allows shared libraries with undefined symbols to be built. -+allow_undefined_flag=$lt_allow_undefined_flag_CXX -+ -+# Flag that forces no undefined symbols. -+no_undefined_flag=$lt_no_undefined_flag_CXX -+ -+# Commands used to finish a libtool library installation in a directory. -+finish_cmds=$lt_finish_cmds -+ -+# Same as above, but a single script fragment to be evaled but not shown. -+finish_eval=$lt_finish_eval -+ -+# 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 -+ -+# This is the shared library runtime path variable. -+runpath_var=$runpath_var -+ -+# This is the shared library path variable. -+shlibpath_var=$shlibpath_var -+ -+# Is shlibpath searched before the hard-coded library search path? -+shlibpath_overrides_runpath=$shlibpath_overrides_runpath -+ -+# How to hardcode a shared library path into an executable. -+hardcode_action=$hardcode_action_CXX -+ -+# Whether we should hardcode library paths into libraries. -+hardcode_into_libs=$hardcode_into_libs -+ -+# 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_CXX -+ -+# If ld is used when linking, flag to hardcode \$libdir into -+# a binary during linking. This must work even if \$libdir does -+# not exist. -+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX -+ -+# Whether we need a single -rpath flag with a separated argument. -+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX -+ -+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -+# resulting binary. -+hardcode_direct=$hardcode_direct_CXX -+ -+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -+# resulting binary. -+hardcode_minus_L=$hardcode_minus_L_CXX -+ -+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -+# the resulting binary. -+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX -+ -+# 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_CXX -+ -+# Variables whose values should be saved in libtool wrapper scripts and -+# restored at relink time. -+variables_saved_for_relink="$variables_saved_for_relink" -+ -+# Whether libtool must link a program against all its dependency libraries. -+link_all_deplibs=$link_all_deplibs_CXX -+ -+# Compile-time system search path for libraries -+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Run-time system search path for libraries -+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec -+ -+# Fix the shell variable \$srcfile for the compiler. -+fix_srcfile_path="$fix_srcfile_path_CXX" -+ -+# Set to yes if exported symbols are required. -+always_export_symbols=$always_export_symbols_CXX -+ -+# The commands to list exported symbols. -+export_symbols_cmds=$lt_export_symbols_cmds_CXX -+ -+# The commands to extract the exported symbol list from a shared archive. -+extract_expsyms_cmds=$lt_extract_expsyms_cmds -+ -+# Symbols that should not be listed in the preloaded symbols. -+exclude_expsyms=$lt_exclude_expsyms_CXX -+ -+# Symbols that must always be exported. -+include_expsyms=$lt_include_expsyms_CXX -+ -+# ### END LIBTOOL TAG CONFIG: $tagname -+ -+__EOF__ -+ -+ -+else -+ # If there is no Makefile yet, we rely on a make rule to execute -+ # `config.status --recheck' to rerun these tests and create the -+ # libtool script then. -+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` -+ if test -f "$ltmain_in"; then -+ test -f Makefile && make "$ltmain" -+ 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 -+ -+CC=$lt_save_CC -+LDCXX=$LD -+LD=$lt_save_LD -+GCC=$lt_save_GCC -+with_gnu_ldcxx=$with_gnu_ld -+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 -+ -+ else -+ tagname="" -+ fi -+ ;; -+ -+ F77) -+ if test -n "$F77" && test "X$F77" != "Xno"; then -+ -+ac_ext=f -+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_f77_compiler_gnu -+ -+ -+archive_cmds_need_lc_F77=no -+allow_undefined_flag_F77= -+always_export_symbols_F77=no -+archive_expsym_cmds_F77= -+export_dynamic_flag_spec_F77= -+hardcode_direct_F77=no -+hardcode_libdir_flag_spec_F77= -+hardcode_libdir_flag_spec_ld_F77= -+hardcode_libdir_separator_F77= -+hardcode_minus_L_F77=no -+hardcode_automatic_F77=no -+module_cmds_F77= -+module_expsym_cmds_F77= -+link_all_deplibs_F77=unknown -+old_archive_cmds_F77=$old_archive_cmds -+no_undefined_flag_F77= -+whole_archive_flag_spec_F77= -+enable_shared_with_static_runtimes_F77=no -+ -+# Source file extension for f77 test sources. -+ac_ext=f -+ -+# Object file extension for compiled f77 test sources. -+objext=o -+objext_F77=$objext -+ -+# Code to be used in simple compile tests -+lt_simple_compile_test_code=" subroutine t\n return\n end\n" -+ -+# Code to be used in simple link tests -+lt_simple_link_test_code=" program t\n end\n" -+ -+# ltmain only uses $CC for tagged configurations so make sure $CC is set. -+ -+# 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 warnings/boilerplate of simple test code -+ac_outfile=conftest.$ac_objext -+printf "$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 -+printf "$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 conftest* -+ -+ -+# Allow CC to be a program name with arguments. -+lt_save_CC="$CC" -+CC=${F77-"f77"} -+compiler=$CC -+compiler_F77=$CC -+for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ -+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -+echo "$as_me:$LINENO: result: $can_build_shared" >&5 -+echo "${ECHO_T}$can_build_shared" >&6 -+ -+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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 -+ ;; -+aix4* | aix5*) -+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then -+ test "$enable_shared" = yes && enable_static=no -+ fi -+ ;; -+esac -+echo "$as_me:$LINENO: result: $enable_shared" >&5 -+echo "${ECHO_T}$enable_shared" >&6 -+ -+echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -+# Make sure either enable_shared or enable_static is yes. -+test "$enable_shared" = yes || enable_static=yes -+echo "$as_me:$LINENO: result: $enable_static" >&5 -+echo "${ECHO_T}$enable_static" >&6 -+ -+GCC_F77="$G77" -+LD_F77="$LD" -+ -+lt_prog_compiler_wl_F77= -+lt_prog_compiler_pic_F77= -+lt_prog_compiler_static_F77= -+ -+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+ -+ if test "$GCC" = yes; then -+ lt_prog_compiler_wl_F77='-Wl,' -+ lt_prog_compiler_static_F77='-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_F77='-Bstatic' -+ fi -+ ;; -+ -+ amigaos*) -+ # 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_F77='-m68020 -resident32 -malways-restore-a4' -+ ;; -+ -+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) -+ # PIC is the default for these OSes. -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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_F77='-DDLL_EXPORT' -+ ;; -+ -+ darwin* | rhapsody*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ lt_prog_compiler_pic_F77='-fno-common' -+ ;; -+ -+ interix3*) -+ # 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_F77=no -+ enable_shared=no -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ lt_prog_compiler_pic_F77=-Kconform_pic -+ fi -+ ;; -+ -+ hpux*) -+ # 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_F77='-fPIC' -+ ;; -+ esac -+ ;; -+ -+ *) -+ lt_prog_compiler_pic_F77='-fPIC' -+ ;; -+ esac -+ else -+ # PORTME Check for flag to pass linker flags through the system compiler. -+ case $host_os in -+ aix*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ if test "$host_cpu" = ia64; then -+ # AIX 5 now supports IA64 processor -+ lt_prog_compiler_static_F77='-Bstatic' -+ else -+ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' -+ fi -+ ;; -+ darwin*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ case $cc_basename in -+ xlc*) -+ lt_prog_compiler_pic_F77='-qnocommon' -+ lt_prog_compiler_wl_F77='-Wl,' -+ ;; -+ esac -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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_F77='-DDLL_EXPORT' -+ ;; -+ -+ hpux9* | hpux10* | hpux11*) -+ lt_prog_compiler_wl_F77='-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_F77='+Z' -+ ;; -+ esac -+ # Is there a better lt_prog_compiler_static that works with the bundled CC? -+ lt_prog_compiler_static_F77='${wl}-a ${wl}archive' -+ ;; -+ -+ irix5* | irix6* | nonstopux*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ # PIC (with -KPIC) is the default. -+ lt_prog_compiler_static_F77='-non_shared' -+ ;; -+ -+ newsos6) -+ lt_prog_compiler_pic_F77='-KPIC' -+ lt_prog_compiler_static_F77='-Bstatic' -+ ;; -+ -+ linux*) -+ case $cc_basename in -+ icc* | ecc*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ lt_prog_compiler_pic_F77='-KPIC' -+ lt_prog_compiler_static_F77='-static' -+ ;; -+ pgcc* | pgf77* | pgf90* | pgf95*) -+ # Portland Group compilers (*not* the Pentium gcc compiler, -+ # which looks to be a dead project) -+ lt_prog_compiler_wl_F77='-Wl,' -+ lt_prog_compiler_pic_F77='-fpic' -+ lt_prog_compiler_static_F77='-Bstatic' -+ ;; -+ ccc*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ # All Alpha code is PIC. -+ lt_prog_compiler_static_F77='-non_shared' -+ ;; -+ esac -+ ;; -+ -+ osf3* | osf4* | osf5*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ # All OSF/1 code is PIC. -+ lt_prog_compiler_static_F77='-non_shared' -+ ;; -+ -+ solaris*) -+ lt_prog_compiler_pic_F77='-KPIC' -+ lt_prog_compiler_static_F77='-Bstatic' -+ case $cc_basename in -+ f77* | f90* | f95*) -+ lt_prog_compiler_wl_F77='-Qoption ld ';; -+ *) -+ lt_prog_compiler_wl_F77='-Wl,';; -+ esac -+ ;; -+ -+ sunos4*) -+ lt_prog_compiler_wl_F77='-Qoption ld ' -+ lt_prog_compiler_pic_F77='-PIC' -+ lt_prog_compiler_static_F77='-Bstatic' -+ ;; -+ -+ sysv4 | sysv4.2uw2* | sysv4.3*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ lt_prog_compiler_pic_F77='-KPIC' -+ lt_prog_compiler_static_F77='-Bstatic' -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec ;then -+ lt_prog_compiler_pic_F77='-Kconform_pic' -+ lt_prog_compiler_static_F77='-Bstatic' -+ fi -+ ;; -+ -+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ lt_prog_compiler_pic_F77='-KPIC' -+ lt_prog_compiler_static_F77='-Bstatic' -+ ;; -+ -+ unicos*) -+ lt_prog_compiler_wl_F77='-Wl,' -+ lt_prog_compiler_can_build_shared_F77=no -+ ;; -+ -+ uts4*) -+ lt_prog_compiler_pic_F77='-pic' -+ lt_prog_compiler_static_F77='-Bstatic' -+ ;; -+ -+ *) -+ lt_prog_compiler_can_build_shared_F77=no -+ ;; -+ esac -+ fi -+ -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 -+ -+# -+# Check to make sure the PIC flag actually works. -+# -+if test -n "$lt_prog_compiler_pic_F77"; then -+ -+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_pic_works_F77=no -+ ac_outfile=conftest.$ac_objext -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ lt_compiler_flag="$lt_prog_compiler_pic_F77" -+ # 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:15893: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&5 -+ echo "$as_me:15897: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_pic_works_F77=yes -+ fi -+ fi -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 -+ -+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then -+ case $lt_prog_compiler_pic_F77 in -+ "" | " "*) ;; -+ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; -+ esac -+else -+ lt_prog_compiler_pic_F77= -+ lt_prog_compiler_can_build_shared_F77=no -+fi -+ -+fi -+case $host_os in -+ # For platforms which do not support PIC, -DPIC is meaningless: -+ *djgpp*) -+ lt_prog_compiler_pic_F77= -+ ;; -+ *) -+ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" -+ ;; -+esac -+ -+# -+# Check to make sure the static flag actually works. -+# -+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" -+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_static_works_F77+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_static_works_F77=no -+ save_LDFLAGS="$LDFLAGS" -+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" -+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_static_works_F77=yes -+ fi -+ else -+ lt_prog_compiler_static_works_F77=yes -+ fi -+ fi -+ $rm conftest* -+ LDFLAGS="$save_LDFLAGS" -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 -+echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6 -+ -+if test x"$lt_prog_compiler_static_works_F77" = xyes; then -+ : -+else -+ lt_prog_compiler_static_F77= -+fi -+ -+ -+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_prog_compiler_c_o_F77=no -+ $rm -r conftest 2>/dev/null -+ mkdir conftest -+ cd conftest -+ mkdir out -+ printf "$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:15997: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>out/conftest.err) -+ ac_status=$? -+ cat out/conftest.err >&5 -+ echo "$as_me:16001: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_F77=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 .. -+ rmdir conftest -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 -+ -+ -+hard_links="nottested" -+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then -+ # do not overwrite the value of need_locks provided by the user -+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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 -+ echo "$as_me:$LINENO: result: $hard_links" >&5 -+echo "${ECHO_T}$hard_links" >&6 -+ if test "$hard_links" = no; then -+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -+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 -+ -+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+ -+ runpath_var= -+ allow_undefined_flag_F77= -+ enable_shared_with_static_runtimes_F77=no -+ archive_cmds_F77= -+ archive_expsym_cmds_F77= -+ old_archive_From_new_cmds_F77= -+ old_archive_from_expsyms_cmds_F77= -+ export_dynamic_flag_spec_F77= -+ whole_archive_flag_spec_F77= -+ thread_safe_flag_spec_F77= -+ hardcode_libdir_flag_spec_F77= -+ hardcode_libdir_flag_spec_ld_F77= -+ hardcode_libdir_separator_F77= -+ hardcode_direct_F77=no -+ hardcode_minus_L_F77=no -+ hardcode_shlibpath_var_F77=unsupported -+ link_all_deplibs_F77=unknown -+ hardcode_automatic_F77=no -+ module_cmds_F77= -+ module_expsym_cmds_F77= -+ always_export_symbols_F77=no -+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ # include_expsyms should be a list of space-separated symbols to be *always* -+ # included in the symbol list -+ include_expsyms_F77= -+ # 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_F77="_GLOBAL_OFFSET_TABLE_" -+ # 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. -+ extract_expsyms_cmds= -+ # Just being paranoid about ensuring that cc_basename is set. -+ for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ case $host_os in -+ cygwin* | mingw* | pw32*) -+ # 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_F77=yes -+ if test "$with_gnu_ld" = 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_F77='${wl}--rpath ${wl}$libdir' -+ export_dynamic_flag_spec_F77='${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_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ else -+ whole_archive_flag_spec_F77= -+ fi -+ supports_anon_versioning=no -+ case `$LD -v 2>/dev/null` in -+ *\ [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 -+ aix3* | aix4* | aix5*) -+ # On AIX/PPC, the GNU linker is very broken -+ if test "$host_cpu" != ia64; then -+ ld_shlibs_F77=no -+ cat <&2 -+ -+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH -+*** so that a non-GNU linker is found, and then restart. -+ -+EOF -+ fi -+ ;; -+ -+ amigaos*) -+ archive_cmds_F77='$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_F77='-L$libdir' -+ hardcode_minus_L_F77=yes -+ -+ # Samuel A. Falvo II reports -+ # that the semantics of dynamic libraries on AmigaOS, at least up -+ # to version 4, is to share data among multiple programs linked -+ # with the same dynamic library. Since this doesn't match the -+ # behavior of shared libraries on other platforms, we can't use -+ # them. -+ ld_shlibs_F77=no -+ ;; -+ -+ beos*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ allow_undefined_flag_F77=unsupported -+ # Joseph Beckenbach says some releases of gcc -+ # support --undefined. This deserves some investigation. FIXME -+ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ else -+ ld_shlibs_F77=no -+ fi -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, -+ # as there is no search path for DLLs. -+ hardcode_libdir_flag_spec_F77='-L$libdir' -+ allow_undefined_flag_F77=unsupported -+ always_export_symbols_F77=no -+ enable_shared_with_static_runtimes_F77=yes -+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' -+ -+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then -+ archive_cmds_F77='$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_F77='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_F77=no -+ fi -+ ;; -+ -+ interix3*) -+ hardcode_direct_F77=no -+ hardcode_shlibpath_var_F77=no -+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' -+ export_dynamic_flag_spec_F77='${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_F77='$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_F77='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' -+ ;; -+ -+ linux*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ tmp_addflag= -+ case $cc_basename,$host_cpu in -+ pgcc*) # Portland Group C compiler -+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' -+ tmp_addflag=' $pic_flag' -+ ;; -+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers -+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;; -+ esac -+ archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ -+ if test $supports_anon_versioning = yes; then -+ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ -+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -+ $echo "local: *; };" >> $output_objdir/$libname.ver~ -+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' -+ fi -+ else -+ ld_shlibs_F77=no -+ fi -+ ;; -+ -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' -+ wlarc= -+ else -+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_F77='$CC -shared $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_F77=no -+ cat <&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. -+ -+EOF -+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ else -+ ld_shlibs_F77=no -+ fi -+ ;; -+ -+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) -+ case `$LD -v 2>&1` in -+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) -+ ld_shlibs_F77=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 -+ ;; -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' -+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' -+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' -+ else -+ ld_shlibs_F77=no -+ fi -+ ;; -+ esac -+ ;; -+ -+ sunos4*) -+ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ wlarc= -+ hardcode_direct_F77=yes -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ else -+ ld_shlibs_F77=no -+ fi -+ ;; -+ esac -+ -+ if test "$ld_shlibs_F77" = no; then -+ runpath_var= -+ hardcode_libdir_flag_spec_F77= -+ export_dynamic_flag_spec_F77= -+ whole_archive_flag_spec_F77= -+ fi -+ else -+ # PORTME fill in a description of your system's linker (not GNU ld) -+ case $host_os in -+ aix3*) -+ allow_undefined_flag_F77=unsupported -+ always_export_symbols_F77=yes -+ archive_expsym_cmds_F77='$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_F77=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_F77=unsupported -+ fi -+ ;; -+ -+ aix4* | aix5*) -+ 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 -+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then -+ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' -+ else -+ export_symbols_cmds_F77='$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].*|aix5*) -+ 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_F77='' -+ hardcode_direct_F77=yes -+ hardcode_libdir_separator_F77=':' -+ link_all_deplibs_F77=yes -+ -+ 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 -+ hardcode_direct_F77=yes -+ else -+ # We have old collect2 -+ hardcode_direct_F77=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_F77=yes -+ hardcode_libdir_flag_spec_F77='-L$libdir' -+ hardcode_libdir_separator_F77= -+ 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 -+ -+ # 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_F77=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_F77='-berok' -+ # Determine the default libpath from the value encoded in an empty executable. -+ cat >conftest.$ac_ext <<_ACEOF -+ program main -+ -+ end -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_f77_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ -+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" -+ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_F77='${wl}-R $libdir:/usr/lib:/lib' -+ allow_undefined_flag_F77="-z nodefs" -+ archive_expsym_cmds_F77="\$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. -+ cat >conftest.$ac_ext <<_ACEOF -+ program main -+ -+ end -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_f77_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ -+ hardcode_libdir_flag_spec_F77='${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_F77=' ${wl}-bernotok' -+ allow_undefined_flag_F77=' ${wl}-berok' -+ # Exported symbols can be pulled into shared objects from archives -+ whole_archive_flag_spec_F77='$convenience' -+ archive_cmds_need_lc_F77=yes -+ # This is similar to how AIX traditionally builds its shared libraries. -+ archive_expsym_cmds_F77="\$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*) -+ archive_cmds_F77='$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_F77='-L$libdir' -+ hardcode_minus_L_F77=yes -+ # see comment about different semantics on the GNU ld section -+ ld_shlibs_F77=no -+ ;; -+ -+ bsdi[45]*) -+ export_dynamic_flag_spec_F77=-rdynamic -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # 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. -+ hardcode_libdir_flag_spec_F77=' ' -+ allow_undefined_flag_F77=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_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' -+ # The linker will automatically build a .lib file if we build a DLL. -+ old_archive_From_new_cmds_F77='true' -+ # FIXME: Should let the user specify the lib program. -+ old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' -+ fix_srcfile_path_F77='`cygpath -w "$srcfile"`' -+ enable_shared_with_static_runtimes_F77=yes -+ ;; -+ -+ darwin* | rhapsody*) -+ case $host_os in -+ rhapsody* | darwin1.[012]) -+ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' -+ ;; -+ *) # Darwin 1.3 on -+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then -+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ else -+ case ${MACOSX_DEPLOYMENT_TARGET} in -+ 10.[012]) -+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ ;; -+ 10.*) -+ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' -+ ;; -+ esac -+ fi -+ ;; -+ esac -+ archive_cmds_need_lc_F77=no -+ hardcode_direct_F77=no -+ hardcode_automatic_F77=yes -+ hardcode_shlibpath_var_F77=unsupported -+ whole_archive_flag_spec_F77='' -+ link_all_deplibs_F77=yes -+ if test "$GCC" = yes ; then -+ output_verbose_link_cmd='echo' -+ archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' -+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ case $cc_basename in -+ xlc*) -+ output_verbose_link_cmd='echo' -+ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' -+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ ;; -+ *) -+ ld_shlibs_F77=no -+ ;; -+ esac -+ fi -+ ;; -+ -+ dgux*) -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec_F77='-L$libdir' -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ freebsd1*) -+ ld_shlibs_F77=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_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' -+ hardcode_libdir_flag_spec_F77='-R$libdir' -+ hardcode_direct_F77=yes -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ # Unfortunately, older versions of FreeBSD 2 do not have this feature. -+ freebsd2*) -+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_F77=yes -+ hardcode_minus_L_F77=yes -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' -+ hardcode_libdir_flag_spec_F77='-R$libdir' -+ hardcode_direct_F77=yes -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ hpux9*) -+ if test "$GCC" = yes; then -+ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_F77='$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_F77='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_F77=: -+ hardcode_direct_F77=yes -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ hardcode_minus_L_F77=yes -+ export_dynamic_flag_spec_F77='${wl}-E' -+ ;; -+ -+ hpux10*) -+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then -+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_F77='$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_F77='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_F77=: -+ -+ hardcode_direct_F77=yes -+ export_dynamic_flag_spec_F77='${wl}-E' -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ hardcode_minus_L_F77=yes -+ fi -+ ;; -+ -+ hpux11*) -+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then -+ case $host_cpu in -+ hppa*64*) -+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ ia64*) -+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds_F77='$CC -shared -fPIC ${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_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ ia64*) -+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds_F77='$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 -+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_F77=: -+ -+ case $host_cpu in -+ hppa*64*|ia64*) -+ hardcode_libdir_flag_spec_ld_F77='+b $libdir' -+ hardcode_direct_F77=no -+ hardcode_shlibpath_var_F77=no -+ ;; -+ *) -+ hardcode_direct_F77=yes -+ export_dynamic_flag_spec_F77='${wl}-E' -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ hardcode_minus_L_F77=yes -+ ;; -+ esac -+ fi -+ ;; -+ -+ irix5* | irix6* | nonstopux*) -+ if test "$GCC" = yes; then -+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' -+ fi -+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_F77=: -+ link_all_deplibs_F77=yes -+ ;; -+ -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out -+ else -+ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF -+ fi -+ hardcode_libdir_flag_spec_F77='-R$libdir' -+ hardcode_direct_F77=yes -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ newsos6) -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_F77=yes -+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_F77=: -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ openbsd*) -+ hardcode_direct_F77=yes -+ hardcode_shlibpath_var_F77=no -+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then -+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' -+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' -+ export_dynamic_flag_spec_F77='${wl}-E' -+ else -+ case $host_os in -+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) -+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec_F77='-R$libdir' -+ ;; -+ *) -+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' -+ ;; -+ esac -+ fi -+ ;; -+ -+ os2*) -+ hardcode_libdir_flag_spec_F77='-L$libdir' -+ hardcode_minus_L_F77=yes -+ allow_undefined_flag_F77=unsupported -+ archive_cmds_F77='$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_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' -+ ;; -+ -+ osf3*) -+ if test "$GCC" = yes; then -+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ allow_undefined_flag_F77=' -expect_unresolved \*' -+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ fi -+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_F77=: -+ ;; -+ -+ osf4* | osf5*) # as osf3* with the addition of -msym flag -+ if test "$GCC" = yes; then -+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' -+ else -+ allow_undefined_flag_F77=' -expect_unresolved \*' -+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ -+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_F77='-rpath $libdir' -+ fi -+ hardcode_libdir_separator_F77=: -+ ;; -+ -+ solaris*) -+ no_undefined_flag_F77=' -z text' -+ if test "$GCC" = yes; then -+ wlarc='${wl}' -+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ -+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' -+ else -+ wlarc='' -+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ archive_expsym_cmds_F77='$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' -+ fi -+ hardcode_libdir_flag_spec_F77='-R$libdir' -+ hardcode_shlibpath_var_F77=no -+ case $host_os in -+ solaris2.[0-5] | solaris2.[0-5].*) ;; -+ *) -+ # The compiler driver will combine linker options so we -+ # cannot just pass the convience library names through -+ # without $wl, iff we do not link with $LD. -+ # Luckily, gcc supports the same syntax we need for Sun Studio. -+ # Supported since Solaris 2.6 (maybe 2.5.1?) -+ case $wlarc in -+ '') -+ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; -+ *) -+ whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; -+ esac ;; -+ esac -+ link_all_deplibs_F77=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_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' -+ fi -+ hardcode_libdir_flag_spec_F77='-L$libdir' -+ hardcode_direct_F77=yes -+ hardcode_minus_L_F77=yes -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ sysv4) -+ case $host_vendor in -+ sni) -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_F77=yes # is this really true??? -+ ;; -+ siemens) -+ ## LD is ld it makes a PLAMLIB -+ ## CC just makes a GrossModule. -+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' -+ reload_cmds_F77='$CC -r -o $output$reload_objs' -+ hardcode_direct_F77=no -+ ;; -+ motorola) -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie -+ ;; -+ esac -+ runpath_var='LD_RUN_PATH' -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ sysv4.3*) -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_shlibpath_var_F77=no -+ export_dynamic_flag_spec_F77='-Bexport' -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_shlibpath_var_F77=no -+ runpath_var=LD_RUN_PATH -+ hardcode_runpath_var=yes -+ ld_shlibs_F77=yes -+ fi -+ ;; -+ -+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) -+ no_undefined_flag_F77='${wl}-z,text' -+ archive_cmds_need_lc_F77=no -+ hardcode_shlibpath_var_F77=no -+ runpath_var='LD_RUN_PATH' -+ -+ if test "$GCC" = yes; then -+ archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_F77='$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_F77='${wl}-z,text' -+ allow_undefined_flag_F77='${wl}-z,nodefs' -+ archive_cmds_need_lc_F77=no -+ hardcode_shlibpath_var_F77=no -+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' -+ hardcode_libdir_separator_F77=':' -+ link_all_deplibs_F77=yes -+ export_dynamic_flag_spec_F77='${wl}-Bexport' -+ runpath_var='LD_RUN_PATH' -+ -+ if test "$GCC" = yes; then -+ archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ fi -+ ;; -+ -+ uts4*) -+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec_F77='-L$libdir' -+ hardcode_shlibpath_var_F77=no -+ ;; -+ -+ *) -+ ld_shlibs_F77=no -+ ;; -+ esac -+ fi -+ -+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -+echo "${ECHO_T}$ld_shlibs_F77" >&6 -+test "$ld_shlibs_F77" = no && can_build_shared=no -+ -+# -+# Do we need to explicitly link libc? -+# -+case "x$archive_cmds_need_lc_F77" in -+x|xyes) -+ # Assume -lc should be added -+ archive_cmds_need_lc_F77=yes -+ -+ if test "$enable_shared" = yes && test "$GCC" = yes; then -+ case $archive_cmds_F77 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. -+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ $rm conftest* -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } 2>conftest.err; then -+ soname=conftest -+ lib=conftest -+ libobjs=conftest.$ac_objext -+ deplibs= -+ wl=$lt_prog_compiler_wl_F77 -+ pic_flag=$lt_prog_compiler_pic_F77 -+ compiler_flags=-v -+ linker_flags=-v -+ verstring= -+ output_objdir=. -+ libname=conftest -+ lt_save_allow_undefined_flag=$allow_undefined_flag_F77 -+ allow_undefined_flag_F77= -+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 -+ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ then -+ archive_cmds_need_lc_F77=no -+ else -+ archive_cmds_need_lc_F77=yes -+ fi -+ allow_undefined_flag_F77=$lt_save_allow_undefined_flag -+ else -+ cat conftest.err 1>&5 -+ fi -+ $rm conftest* -+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 -+ ;; -+ esac -+ fi -+ ;; -+esac -+ -+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+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" -+if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then -+ # 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. -+ 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 -+else -+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -+fi -+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 -+ 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' -+ ;; -+ -+aix4* | aix5*) -+ version_type=linux -+ 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*) -+ 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=`$echo "X$lib" | $Xsed -e '\''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' -+ ;; -+ -+beos*) -+ library_names_spec='${libname}${shared_ext}' -+ dynamic_linker="$host_os ld.so" -+ shlibpath_var=LIBRARY_PATH -+ ;; -+ -+bsdi[45]*) -+ version_type=linux -+ 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*) -+ version_type=windows -+ shrext_cmds=".dll" -+ need_version=no -+ need_lib_prefix=no -+ -+ case $GCC,$host_os in -+ yes,cygwin* | yes,mingw* | yes,pw32*) -+ 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' -+ 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="/usr/lib /lib/w32api /lib /usr/local/lib" -+ ;; -+ mingw*) -+ # MinGW DLLs use traditional 'lib' prefix -+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then -+ # It is most probably a Windows format PATH printed by -+ # mingw gcc, but we are running on Cygwin. Gcc prints its search -+ # path with ; separators, and with drive letters. We can handle the -+ # drive letters (cygwin fileutils understands them), so leave them, -+ # especially as we might pass files found there to a mingw objdump, -+ # which wouldn't understand a cygwinified path. Ahh. -+ 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 -+ ;; -+ 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 -+ ;; -+ -+ *) -+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' -+ ;; -+ esac -+ dynamic_linker='Win32 ld.exe' -+ # 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}${versuffix}$shared_ext ${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`' -+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. -+ if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` -+ else -+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' -+ fi -+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' -+ ;; -+ -+dgux*) -+ version_type=linux -+ 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 -+ ;; -+ -+freebsd1*) -+ dynamic_linker=no -+ ;; -+ -+kfreebsd*-gnu) -+ version_type=linux -+ 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='GNU ld.so' -+ ;; -+ -+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[123]*) 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 -+ ;; -+ freebsd*) # from 4.6 on -+ shlibpath_overrides_runpath=yes -+ hardcode_into_libs=yes -+ ;; -+ esac -+ ;; -+ -+gnu*) -+ version_type=linux -+ 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 -+ 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' -+ ;; -+ -+interix3*) -+ version_type=linux -+ 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 -+ 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 Linux ELF. -+linux*) -+ version_type=linux -+ 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 -+ # 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 -+ -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390x*|powerpc64*) -+ echo '#line 17446 "configure"' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ -+ # 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/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $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' -+ ;; -+ -+knetbsd*-gnu) -+ version_type=linux -+ 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='GNU 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 -+ 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=linux -+ 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 -+ ;; -+ -+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" -+ ;; -+ -+solaris*) -+ version_type=linux -+ 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 -+ 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 -+ export_dynamic_flag_spec='${wl}-Blargedynsym' -+ 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 -+ 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 -+ 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' -+ shlibpath_overrides_runpath=no -+ else -+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' -+ shlibpath_overrides_runpath=yes -+ 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' -+ ;; -+ -+uts4*) -+ version_type=linux -+ 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 -+echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -+echo "${ECHO_T}$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 -+ -+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+hardcode_action_F77= -+if test -n "$hardcode_libdir_flag_spec_F77" || \ -+ test -n "$runpath_var_F77" || \ -+ test "X$hardcode_automatic_F77" = "Xyes" ; then -+ -+ # We can hardcode non-existant directories. -+ if test "$hardcode_direct_F77" != 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_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && -+ test "$hardcode_minus_L_F77" != no; then -+ # Linking always hardcodes the temporary library directory. -+ hardcode_action_F77=relink -+ else -+ # We can link without hardcoding, and we can hardcode nonexisting dirs. -+ hardcode_action_F77=immediate -+ fi -+else -+ # We cannot hardcode anything, or else we can only hardcode existing -+ # directories. -+ hardcode_action_F77=unsupported -+fi -+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -+echo "${ECHO_T}$hardcode_action_F77" >&6 -+ -+if test "$hardcode_action_F77" = relink; 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 -+ -+ -+# The else clause should only fire when bootstrapping the -+# libtool distribution, otherwise you forgot to ship ltmain.sh -+# with your package, and you will get complaints that there are -+# no rules to generate ltmain.sh. -+if test -f "$ltmain"; then -+ # 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 -+ # Now quote all the things that may contain metacharacters while being -+ # careful not to overquote the AC_SUBSTed values. We take copies of the -+ # variables and quote the copies for generation of the libtool script. -+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ -+ SED SHELL STRIP \ -+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ -+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ -+ deplibs_check_method reload_flag reload_cmds need_locks \ -+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ -+ lt_cv_sys_global_symbol_to_c_name_address \ -+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ -+ old_postinstall_cmds old_postuninstall_cmds \ -+ compiler_F77 \ -+ CC_F77 \ -+ LD_F77 \ -+ lt_prog_compiler_wl_F77 \ -+ lt_prog_compiler_pic_F77 \ -+ lt_prog_compiler_static_F77 \ -+ lt_prog_compiler_no_builtin_flag_F77 \ -+ export_dynamic_flag_spec_F77 \ -+ thread_safe_flag_spec_F77 \ -+ whole_archive_flag_spec_F77 \ -+ enable_shared_with_static_runtimes_F77 \ -+ old_archive_cmds_F77 \ -+ old_archive_from_new_cmds_F77 \ -+ predep_objects_F77 \ -+ postdep_objects_F77 \ -+ predeps_F77 \ -+ postdeps_F77 \ -+ compiler_lib_search_path_F77 \ -+ archive_cmds_F77 \ -+ archive_expsym_cmds_F77 \ -+ postinstall_cmds_F77 \ -+ postuninstall_cmds_F77 \ -+ old_archive_from_expsyms_cmds_F77 \ -+ allow_undefined_flag_F77 \ -+ no_undefined_flag_F77 \ -+ export_symbols_cmds_F77 \ -+ hardcode_libdir_flag_spec_F77 \ -+ hardcode_libdir_flag_spec_ld_F77 \ -+ hardcode_libdir_separator_F77 \ -+ hardcode_automatic_F77 \ -+ module_cmds_F77 \ -+ module_expsym_cmds_F77 \ -+ lt_cv_prog_compiler_c_o_F77 \ -+ exclude_expsyms_F77 \ -+ include_expsyms_F77; do -+ -+ case $var in -+ old_archive_cmds_F77 | \ -+ old_archive_from_new_cmds_F77 | \ -+ archive_cmds_F77 | \ -+ archive_expsym_cmds_F77 | \ -+ module_cmds_F77 | \ -+ module_expsym_cmds_F77 | \ -+ old_archive_from_expsyms_cmds_F77 | \ -+ export_symbols_cmds_F77 | \ -+ extract_expsyms_cmds | reload_cmds | finish_cmds | \ -+ postinstall_cmds | postuninstall_cmds | \ -+ old_postinstall_cmds | old_postuninstall_cmds | \ -+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) -+ # Double-quote double-evaled strings. -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" -+ ;; -+ *) -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" -+ ;; -+ esac -+ done -+ -+ case $lt_echo in -+ *'\$0 --fallback-echo"') -+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` -+ ;; -+ esac -+ -+cfgfile="$ofile" -+ -+ cat <<__EOF__ >> "$cfgfile" -+# ### BEGIN LIBTOOL TAG CONFIG: $tagname -+ -+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -+ -+# Shell to use when invoking shell scripts. -+SHELL=$lt_SHELL -+ -+# Whether or not to build shared libraries. -+build_libtool_libs=$enable_shared -+ -+# Whether or not to build static libraries. -+build_old_libs=$enable_static -+ -+# Whether or not to add -lc for building shared libraries. -+build_libtool_need_lc=$archive_cmds_need_lc_F77 -+ -+# Whether or not to disallow shared libs when runtime libs are static -+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 -+ -+# Whether or not to optimize for fast installation. -+fast_install=$enable_fast_install -+ -+# 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 -+ -+# An echo program that does not interpret backslashes. -+echo=$lt_echo -+ -+# The archiver. -+AR=$lt_AR -+AR_FLAGS=$lt_AR_FLAGS -+ -+# A C compiler. -+LTCC=$lt_LTCC -+ -+# LTCC compiler flags. -+LTCFLAGS=$lt_LTCFLAGS -+ -+# A language-specific compiler. -+CC=$lt_compiler_F77 -+ -+# Is the compiler the GNU C compiler? -+with_gcc=$GCC_F77 -+ -+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` -+gcc_ver=\`gcc -dumpversion\` -+ -+# An ERE matcher. -+EGREP=$lt_EGREP -+ -+# The linker used to build libraries. -+LD=$lt_LD_F77 -+ -+# Whether we need hard or soft links. -+LN_S=$lt_LN_S -+ -+# A BSD-compatible nm program. -+NM=$lt_NM -+ -+# A symbol stripping program -+STRIP=$lt_STRIP -+ -+# Used to examine libraries when file_magic_cmd begins "file" -+MAGIC_CMD=$MAGIC_CMD -+ -+# Used on cygwin: DLL creation program. -+DLLTOOL="$DLLTOOL" -+ -+# Used on cygwin: object dumper. -+OBJDUMP="$OBJDUMP" -+ -+# Used on cygwin: assembler. -+AS="$AS" -+ -+# The name of the directory that contains temporary libtool files. -+objdir=$objdir -+ -+# How to create reloadable object files. -+reload_flag=$lt_reload_flag -+reload_cmds=$lt_reload_cmds -+ -+# How to pass a linker flag through the compiler. -+wl=$lt_lt_prog_compiler_wl_F77 -+ -+# Object file suffix (normally "o"). -+objext="$ac_objext" -+ -+# Old archive suffix (normally "a"). -+libext="$libext" -+ -+# Shared library suffix (normally ".so"). -+shrext_cmds='$shrext_cmds' -+ -+# Executable file suffix (normally ""). -+exeext="$exeext" -+ -+# Additional compiler flags for building library objects. -+pic_flag=$lt_lt_prog_compiler_pic_F77 -+pic_mode=$pic_mode -+ -+# What is the maximum length of a command? -+max_cmd_len=$lt_cv_sys_max_cmd_len -+ -+# Does compiler simultaneously support -c and -o options? -+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 -+ -+# Must we lock files when doing compilation? -+need_locks=$lt_need_locks -+ -+# 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 -+ -+# 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 -+ -+# Compiler flag to prevent dynamic linking. -+link_static_flag=$lt_lt_prog_compiler_static_F77 -+ -+# Compiler flag to turn off builtin functions. -+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 -+ -+# Compiler flag to allow reflexive dlopens. -+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 -+ -+# Compiler flag to generate shared objects directly from archives. -+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 -+ -+# Compiler flag to generate thread-safe objects. -+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 -+ -+# Library versioning type. -+version_type=$version_type -+ -+# 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 -+ -+# Commands used to build and install an old-style archive. -+RANLIB=$lt_RANLIB -+old_archive_cmds=$lt_old_archive_cmds_F77 -+old_postinstall_cmds=$lt_old_postinstall_cmds -+old_postuninstall_cmds=$lt_old_postuninstall_cmds -+ -+# Create an old-style archive from a shared archive. -+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 -+ -+# Create a temporary old-style archive to link instead of a shared archive. -+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 -+ -+# Commands used to build and install a shared archive. -+archive_cmds=$lt_archive_cmds_F77 -+archive_expsym_cmds=$lt_archive_expsym_cmds_F77 -+postinstall_cmds=$lt_postinstall_cmds -+postuninstall_cmds=$lt_postuninstall_cmds -+ -+# Commands used to build a loadable module (assumed same as above if empty) -+module_cmds=$lt_module_cmds_F77 -+module_expsym_cmds=$lt_module_expsym_cmds_F77 -+ -+# Commands to strip libraries. -+old_striplib=$lt_old_striplib -+striplib=$lt_striplib -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predep_objects=\`echo $lt_predep_objects_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdep_objects=\`echo $lt_postdep_objects_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predeps=$lt_predeps_F77 -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdeps=$lt_postdeps_F77 -+ -+# The library search path used internally by the compiler when linking -+# a shared library. -+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# 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 -+ -+# Flag that allows shared libraries with undefined symbols to be built. -+allow_undefined_flag=$lt_allow_undefined_flag_F77 -+ -+# Flag that forces no undefined symbols. -+no_undefined_flag=$lt_no_undefined_flag_F77 -+ -+# Commands used to finish a libtool library installation in a directory. -+finish_cmds=$lt_finish_cmds -+ -+# Same as above, but a single script fragment to be evaled but not shown. -+finish_eval=$lt_finish_eval -+ -+# 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 -+ -+# This is the shared library runtime path variable. -+runpath_var=$runpath_var -+ -+# This is the shared library path variable. -+shlibpath_var=$shlibpath_var -+ -+# Is shlibpath searched before the hard-coded library search path? -+shlibpath_overrides_runpath=$shlibpath_overrides_runpath -+ -+# How to hardcode a shared library path into an executable. -+hardcode_action=$hardcode_action_F77 -+ -+# Whether we should hardcode library paths into libraries. -+hardcode_into_libs=$hardcode_into_libs -+ -+# 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_F77 -+ -+# If ld is used when linking, flag to hardcode \$libdir into -+# a binary during linking. This must work even if \$libdir does -+# not exist. -+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 -+ -+# Whether we need a single -rpath flag with a separated argument. -+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 -+ -+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -+# resulting binary. -+hardcode_direct=$hardcode_direct_F77 -+ -+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -+# resulting binary. -+hardcode_minus_L=$hardcode_minus_L_F77 -+ -+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -+# the resulting binary. -+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 -+ -+# 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_F77 -+ -+# Variables whose values should be saved in libtool wrapper scripts and -+# restored at relink time. -+variables_saved_for_relink="$variables_saved_for_relink" -+ -+# Whether libtool must link a program against all its dependency libraries. -+link_all_deplibs=$link_all_deplibs_F77 -+ -+# Compile-time system search path for libraries -+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Run-time system search path for libraries -+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec -+ -+# Fix the shell variable \$srcfile for the compiler. -+fix_srcfile_path="$fix_srcfile_path_F77" -+ -+# Set to yes if exported symbols are required. -+always_export_symbols=$always_export_symbols_F77 -+ -+# The commands to list exported symbols. -+export_symbols_cmds=$lt_export_symbols_cmds_F77 -+ -+# The commands to extract the exported symbol list from a shared archive. -+extract_expsyms_cmds=$lt_extract_expsyms_cmds -+ -+# Symbols that should not be listed in the preloaded symbols. -+exclude_expsyms=$lt_exclude_expsyms_F77 -+ -+# Symbols that must always be exported. -+include_expsyms=$lt_include_expsyms_F77 -+ -+# ### END LIBTOOL TAG CONFIG: $tagname -+ -+__EOF__ -+ -+ -+else -+ # If there is no Makefile yet, we rely on a make rule to execute -+ # `config.status --recheck' to rerun these tests and create the -+ # libtool script then. -+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` -+ if test -f "$ltmain_in"; then -+ test -f Makefile && make "$ltmain" -+ 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 -+ -+CC="$lt_save_CC" -+ -+ else -+ tagname="" -+ fi -+ ;; -+ -+ GCJ) -+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then -+ -+ -+ -+# Source file extension for Java test sources. -+ac_ext=java -+ -+# Object file extension for compiled Java test sources. -+objext=o -+objext_GCJ=$objext -+ -+# Code to be used in simple compile tests -+lt_simple_compile_test_code="class foo {}\n" -+ -+# Code to be used in simple link tests -+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' -+ -+# ltmain only uses $CC for tagged configurations so make sure $CC is set. -+ -+# 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 warnings/boilerplate of simple test code -+ac_outfile=conftest.$ac_objext -+printf "$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 -+printf "$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 conftest* -+ -+ -+# Allow CC to be a program name with arguments. -+lt_save_CC="$CC" -+CC=${GCJ-"gcj"} -+compiler=$CC -+compiler_GCJ=$CC -+for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ -+# GCJ did not exist at the time GCC didn't implicitly link libc in. -+archive_cmds_need_lc_GCJ=no -+ -+old_archive_cmds_GCJ=$old_archive_cmds -+ -+ -+lt_prog_compiler_no_builtin_flag_GCJ= -+ -+if test "$GCC" = yes; then -+ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' -+ -+ -+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_prog_compiler_rtti_exceptions=no -+ ac_outfile=conftest.$ac_objext -+ printf "$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:18224: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&5 -+ echo "$as_me:18228: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 -+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 -+ -+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then -+ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" -+else -+ : -+fi -+ -+fi -+ -+lt_prog_compiler_wl_GCJ= -+lt_prog_compiler_pic_GCJ= -+lt_prog_compiler_static_GCJ= -+ -+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+ -+ if test "$GCC" = yes; then -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ lt_prog_compiler_static_GCJ='-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_GCJ='-Bstatic' -+ fi -+ ;; -+ -+ amigaos*) -+ # 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_GCJ='-m68020 -resident32 -malways-restore-a4' -+ ;; -+ -+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) -+ # PIC is the default for these OSes. -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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_GCJ='-DDLL_EXPORT' -+ ;; -+ -+ darwin* | rhapsody*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ lt_prog_compiler_pic_GCJ='-fno-common' -+ ;; -+ -+ interix3*) -+ # 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_GCJ=no -+ enable_shared=no -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ lt_prog_compiler_pic_GCJ=-Kconform_pic -+ fi -+ ;; -+ -+ hpux*) -+ # 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_GCJ='-fPIC' -+ ;; -+ esac -+ ;; -+ -+ *) -+ lt_prog_compiler_pic_GCJ='-fPIC' -+ ;; -+ esac -+ else -+ # PORTME Check for flag to pass linker flags through the system compiler. -+ case $host_os in -+ aix*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ if test "$host_cpu" = ia64; then -+ # AIX 5 now supports IA64 processor -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ else -+ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' -+ fi -+ ;; -+ darwin*) -+ # PIC is the default on this platform -+ # Common symbols not allowed in MH_DYLIB files -+ case $cc_basename in -+ xlc*) -+ lt_prog_compiler_pic_GCJ='-qnocommon' -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ ;; -+ esac -+ ;; -+ -+ mingw* | pw32* | os2*) -+ # 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_GCJ='-DDLL_EXPORT' -+ ;; -+ -+ hpux9* | hpux10* | hpux11*) -+ lt_prog_compiler_wl_GCJ='-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_GCJ='+Z' -+ ;; -+ esac -+ # Is there a better lt_prog_compiler_static that works with the bundled CC? -+ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' -+ ;; -+ -+ irix5* | irix6* | nonstopux*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ # PIC (with -KPIC) is the default. -+ lt_prog_compiler_static_GCJ='-non_shared' -+ ;; -+ -+ newsos6) -+ lt_prog_compiler_pic_GCJ='-KPIC' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ ;; -+ -+ linux*) -+ case $cc_basename in -+ icc* | ecc*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ lt_prog_compiler_pic_GCJ='-KPIC' -+ lt_prog_compiler_static_GCJ='-static' -+ ;; -+ pgcc* | pgf77* | pgf90* | pgf95*) -+ # Portland Group compilers (*not* the Pentium gcc compiler, -+ # which looks to be a dead project) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ lt_prog_compiler_pic_GCJ='-fpic' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ ;; -+ ccc*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ # All Alpha code is PIC. -+ lt_prog_compiler_static_GCJ='-non_shared' -+ ;; -+ esac -+ ;; -+ -+ osf3* | osf4* | osf5*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ # All OSF/1 code is PIC. -+ lt_prog_compiler_static_GCJ='-non_shared' -+ ;; -+ -+ solaris*) -+ lt_prog_compiler_pic_GCJ='-KPIC' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ case $cc_basename in -+ f77* | f90* | f95*) -+ lt_prog_compiler_wl_GCJ='-Qoption ld ';; -+ *) -+ lt_prog_compiler_wl_GCJ='-Wl,';; -+ esac -+ ;; -+ -+ sunos4*) -+ lt_prog_compiler_wl_GCJ='-Qoption ld ' -+ lt_prog_compiler_pic_GCJ='-PIC' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ ;; -+ -+ sysv4 | sysv4.2uw2* | sysv4.3*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ lt_prog_compiler_pic_GCJ='-KPIC' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec ;then -+ lt_prog_compiler_pic_GCJ='-Kconform_pic' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ fi -+ ;; -+ -+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ lt_prog_compiler_pic_GCJ='-KPIC' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ ;; -+ -+ unicos*) -+ lt_prog_compiler_wl_GCJ='-Wl,' -+ lt_prog_compiler_can_build_shared_GCJ=no -+ ;; -+ -+ uts4*) -+ lt_prog_compiler_pic_GCJ='-pic' -+ lt_prog_compiler_static_GCJ='-Bstatic' -+ ;; -+ -+ *) -+ lt_prog_compiler_can_build_shared_GCJ=no -+ ;; -+ esac -+ fi -+ -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 -+ -+# -+# Check to make sure the PIC flag actually works. -+# -+if test -n "$lt_prog_compiler_pic_GCJ"; then -+ -+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_pic_works_GCJ=no -+ ac_outfile=conftest.$ac_objext -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ lt_compiler_flag="$lt_prog_compiler_pic_GCJ" -+ # 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:18492: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>conftest.err) -+ ac_status=$? -+ cat conftest.err >&5 -+ echo "$as_me:18496: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_pic_works_GCJ=yes -+ fi -+ fi -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 -+ -+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then -+ case $lt_prog_compiler_pic_GCJ in -+ "" | " "*) ;; -+ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; -+ esac -+else -+ lt_prog_compiler_pic_GCJ= -+ lt_prog_compiler_can_build_shared_GCJ=no -+fi -+ -+fi -+case $host_os in -+ # For platforms which do not support PIC, -DPIC is meaningless: -+ *djgpp*) -+ lt_prog_compiler_pic_GCJ= -+ ;; -+ *) -+ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" -+ ;; -+esac -+ -+# -+# Check to make sure the static flag actually works. -+# -+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" -+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_prog_compiler_static_works_GCJ=no -+ save_LDFLAGS="$LDFLAGS" -+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" -+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp -+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 -+ if diff conftest.exp conftest.er2 >/dev/null; then -+ lt_prog_compiler_static_works_GCJ=yes -+ fi -+ else -+ lt_prog_compiler_static_works_GCJ=yes -+ fi -+ fi -+ $rm conftest* -+ LDFLAGS="$save_LDFLAGS" -+ -+fi -+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 -+echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6 -+ -+if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then -+ : -+else -+ lt_prog_compiler_static_GCJ= -+fi -+ -+ -+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then -+ echo $ECHO_N "(cached) $ECHO_C" >&6 -+else -+ lt_cv_prog_compiler_c_o_GCJ=no -+ $rm -r conftest 2>/dev/null -+ mkdir conftest -+ cd conftest -+ mkdir out -+ printf "$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:18596: $lt_compile\"" >&5) -+ (eval "$lt_compile" 2>out/conftest.err) -+ ac_status=$? -+ cat out/conftest.err >&5 -+ echo "$as_me:18600: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_GCJ=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 .. -+ rmdir conftest -+ $rm conftest* -+ -+fi -+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 -+ -+ -+hard_links="nottested" -+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then -+ # do not overwrite the value of need_locks provided by the user -+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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 -+ echo "$as_me:$LINENO: result: $hard_links" >&5 -+echo "${ECHO_T}$hard_links" >&6 -+ if test "$hard_links" = no; then -+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -+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 -+ -+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+ -+ runpath_var= -+ allow_undefined_flag_GCJ= -+ enable_shared_with_static_runtimes_GCJ=no -+ archive_cmds_GCJ= -+ archive_expsym_cmds_GCJ= -+ old_archive_From_new_cmds_GCJ= -+ old_archive_from_expsyms_cmds_GCJ= -+ export_dynamic_flag_spec_GCJ= -+ whole_archive_flag_spec_GCJ= -+ thread_safe_flag_spec_GCJ= -+ hardcode_libdir_flag_spec_GCJ= -+ hardcode_libdir_flag_spec_ld_GCJ= -+ hardcode_libdir_separator_GCJ= -+ hardcode_direct_GCJ=no -+ hardcode_minus_L_GCJ=no -+ hardcode_shlibpath_var_GCJ=unsupported -+ link_all_deplibs_GCJ=unknown -+ hardcode_automatic_GCJ=no -+ module_cmds_GCJ= -+ module_expsym_cmds_GCJ= -+ always_export_symbols_GCJ=no -+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -+ # include_expsyms should be a list of space-separated symbols to be *always* -+ # included in the symbol list -+ include_expsyms_GCJ= -+ # 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_GCJ="_GLOBAL_OFFSET_TABLE_" -+ # 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. -+ extract_expsyms_cmds= -+ # Just being paranoid about ensuring that cc_basename is set. -+ for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+ case $host_os in -+ cygwin* | mingw* | pw32*) -+ # 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_GCJ=yes -+ if test "$with_gnu_ld" = 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_GCJ='${wl}--rpath ${wl}$libdir' -+ export_dynamic_flag_spec_GCJ='${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_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' -+ else -+ whole_archive_flag_spec_GCJ= -+ fi -+ supports_anon_versioning=no -+ case `$LD -v 2>/dev/null` in -+ *\ [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 -+ aix3* | aix4* | aix5*) -+ # On AIX/PPC, the GNU linker is very broken -+ if test "$host_cpu" != ia64; then -+ ld_shlibs_GCJ=no -+ cat <&2 -+ -+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH -+*** so that a non-GNU linker is found, and then restart. -+ -+EOF -+ fi -+ ;; -+ -+ amigaos*) -+ archive_cmds_GCJ='$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_GCJ='-L$libdir' -+ hardcode_minus_L_GCJ=yes -+ -+ # Samuel A. Falvo II reports -+ # that the semantics of dynamic libraries on AmigaOS, at least up -+ # to version 4, is to share data among multiple programs linked -+ # with the same dynamic library. Since this doesn't match the -+ # behavior of shared libraries on other platforms, we can't use -+ # them. -+ ld_shlibs_GCJ=no -+ ;; -+ -+ beos*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ allow_undefined_flag_GCJ=unsupported -+ # Joseph Beckenbach says some releases of gcc -+ # support --undefined. This deserves some investigation. FIXME -+ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ else -+ ld_shlibs_GCJ=no -+ fi -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, -+ # as there is no search path for DLLs. -+ hardcode_libdir_flag_spec_GCJ='-L$libdir' -+ allow_undefined_flag_GCJ=unsupported -+ always_export_symbols_GCJ=no -+ enable_shared_with_static_runtimes_GCJ=yes -+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' -+ -+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then -+ archive_cmds_GCJ='$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_GCJ='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_GCJ=no -+ fi -+ ;; -+ -+ interix3*) -+ hardcode_direct_GCJ=no -+ hardcode_shlibpath_var_GCJ=no -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' -+ export_dynamic_flag_spec_GCJ='${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_GCJ='$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_GCJ='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' -+ ;; -+ -+ linux*) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ tmp_addflag= -+ case $cc_basename,$host_cpu in -+ pgcc*) # Portland Group C compiler -+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' -+ tmp_addflag=' $pic_flag' -+ ;; -+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers -+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;; -+ esac -+ archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ -+ if test $supports_anon_versioning = yes; then -+ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ -+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ -+ $echo "local: *; };" >> $output_objdir/$libname.ver~ -+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' -+ fi -+ else -+ ld_shlibs_GCJ=no -+ fi -+ ;; -+ -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' -+ wlarc= -+ else -+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_GCJ='$CC -shared $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_GCJ=no -+ cat <&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. -+ -+EOF -+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ else -+ ld_shlibs_GCJ=no -+ fi -+ ;; -+ -+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) -+ case `$LD -v 2>&1` in -+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) -+ ld_shlibs_GCJ=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 -+ ;; -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' -+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' -+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' -+ else -+ ld_shlibs_GCJ=no -+ fi -+ ;; -+ esac -+ ;; -+ -+ sunos4*) -+ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ wlarc= -+ hardcode_direct_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ *) -+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then -+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' -+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' -+ else -+ ld_shlibs_GCJ=no -+ fi -+ ;; -+ esac -+ -+ if test "$ld_shlibs_GCJ" = no; then -+ runpath_var= -+ hardcode_libdir_flag_spec_GCJ= -+ export_dynamic_flag_spec_GCJ= -+ whole_archive_flag_spec_GCJ= -+ fi -+ else -+ # PORTME fill in a description of your system's linker (not GNU ld) -+ case $host_os in -+ aix3*) -+ allow_undefined_flag_GCJ=unsupported -+ always_export_symbols_GCJ=yes -+ archive_expsym_cmds_GCJ='$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_GCJ=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_GCJ=unsupported -+ fi -+ ;; -+ -+ aix4* | aix5*) -+ 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 -+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then -+ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' -+ else -+ export_symbols_cmds_GCJ='$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].*|aix5*) -+ 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_GCJ='' -+ hardcode_direct_GCJ=yes -+ hardcode_libdir_separator_GCJ=':' -+ link_all_deplibs_GCJ=yes -+ -+ 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 -+ hardcode_direct_GCJ=yes -+ else -+ # We have old collect2 -+ hardcode_direct_GCJ=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_GCJ=yes -+ hardcode_libdir_flag_spec_GCJ='-L$libdir' -+ hardcode_libdir_separator_GCJ= -+ 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 -+ -+ # 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_GCJ=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_GCJ='-berok' -+ # Determine the default libpath from the value encoded in an empty executable. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ -+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" -+ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_GCJ='${wl}-R $libdir:/usr/lib:/lib' -+ allow_undefined_flag_GCJ="-z nodefs" -+ archive_expsym_cmds_GCJ="\$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. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -+ (eval $ac_link) 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && -+ { ac_try='test -z "$ac_c_werror_flag" -+ || test ! -s conftest.err' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; } && -+ { ac_try='test -s conftest$ac_exeext' -+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -+ (eval $ac_try) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ -+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'` -+# Check for a 64-bit object if we didn't find anything. -+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -+}'`; fi -+else -+ echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+fi -+rm -f conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -+ -+ hardcode_libdir_flag_spec_GCJ='${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_GCJ=' ${wl}-bernotok' -+ allow_undefined_flag_GCJ=' ${wl}-berok' -+ # Exported symbols can be pulled into shared objects from archives -+ whole_archive_flag_spec_GCJ='$convenience' -+ archive_cmds_need_lc_GCJ=yes -+ # This is similar to how AIX traditionally builds its shared libraries. -+ archive_expsym_cmds_GCJ="\$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*) -+ archive_cmds_GCJ='$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_GCJ='-L$libdir' -+ hardcode_minus_L_GCJ=yes -+ # see comment about different semantics on the GNU ld section -+ ld_shlibs_GCJ=no -+ ;; -+ -+ bsdi[45]*) -+ export_dynamic_flag_spec_GCJ=-rdynamic -+ ;; -+ -+ cygwin* | mingw* | pw32*) -+ # 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. -+ hardcode_libdir_flag_spec_GCJ=' ' -+ allow_undefined_flag_GCJ=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_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' -+ # The linker will automatically build a .lib file if we build a DLL. -+ old_archive_From_new_cmds_GCJ='true' -+ # FIXME: Should let the user specify the lib program. -+ old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' -+ fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' -+ enable_shared_with_static_runtimes_GCJ=yes -+ ;; -+ -+ darwin* | rhapsody*) -+ case $host_os in -+ rhapsody* | darwin1.[012]) -+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' -+ ;; -+ *) # Darwin 1.3 on -+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then -+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ else -+ case ${MACOSX_DEPLOYMENT_TARGET} in -+ 10.[012]) -+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' -+ ;; -+ 10.*) -+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' -+ ;; -+ esac -+ fi -+ ;; -+ esac -+ archive_cmds_need_lc_GCJ=no -+ hardcode_direct_GCJ=no -+ hardcode_automatic_GCJ=yes -+ hardcode_shlibpath_var_GCJ=unsupported -+ whole_archive_flag_spec_GCJ='' -+ link_all_deplibs_GCJ=yes -+ if test "$GCC" = yes ; then -+ output_verbose_link_cmd='echo' -+ archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' -+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ else -+ case $cc_basename in -+ xlc*) -+ output_verbose_link_cmd='echo' -+ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' -+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' -+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds -+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' -+ ;; -+ *) -+ ld_shlibs_GCJ=no -+ ;; -+ esac -+ fi -+ ;; -+ -+ dgux*) -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec_GCJ='-L$libdir' -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ freebsd1*) -+ ld_shlibs_GCJ=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_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' -+ hardcode_libdir_flag_spec_GCJ='-R$libdir' -+ hardcode_direct_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ # Unfortunately, older versions of FreeBSD 2 do not have this feature. -+ freebsd2*) -+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_GCJ=yes -+ hardcode_minus_L_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries. -+ freebsd* | kfreebsd*-gnu | dragonfly*) -+ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' -+ hardcode_libdir_flag_spec_GCJ='-R$libdir' -+ hardcode_direct_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ hpux9*) -+ if test "$GCC" = yes; then -+ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_GCJ='$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_GCJ='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_GCJ=: -+ hardcode_direct_GCJ=yes -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ hardcode_minus_L_GCJ=yes -+ export_dynamic_flag_spec_GCJ='${wl}-E' -+ ;; -+ -+ hpux10*) -+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then -+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_GCJ='$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_GCJ='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_GCJ=: -+ -+ hardcode_direct_GCJ=yes -+ export_dynamic_flag_spec_GCJ='${wl}-E' -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ hardcode_minus_L_GCJ=yes -+ fi -+ ;; -+ -+ hpux11*) -+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then -+ case $host_cpu in -+ hppa*64*) -+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ ia64*) -+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds_GCJ='$CC -shared -fPIC ${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_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ ia64*) -+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' -+ ;; -+ *) -+ archive_cmds_GCJ='$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 -+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' -+ hardcode_libdir_separator_GCJ=: -+ -+ case $host_cpu in -+ hppa*64*|ia64*) -+ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' -+ hardcode_direct_GCJ=no -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ *) -+ hardcode_direct_GCJ=yes -+ export_dynamic_flag_spec_GCJ='${wl}-E' -+ -+ # hardcode_minus_L: Not really in the search PATH, -+ # but as the default location of the library. -+ hardcode_minus_L_GCJ=yes -+ ;; -+ esac -+ fi -+ ;; -+ -+ irix5* | irix6* | nonstopux*) -+ if test "$GCC" = yes; then -+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' -+ fi -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_GCJ=: -+ link_all_deplibs_GCJ=yes -+ ;; -+ -+ netbsd*) -+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then -+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out -+ else -+ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF -+ fi -+ hardcode_libdir_flag_spec_GCJ='-R$libdir' -+ hardcode_direct_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ newsos6) -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_GCJ=yes -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_GCJ=: -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ openbsd*) -+ hardcode_direct_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then -+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' -+ export_dynamic_flag_spec_GCJ='${wl}-E' -+ else -+ case $host_os in -+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) -+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec_GCJ='-R$libdir' -+ ;; -+ *) -+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' -+ ;; -+ esac -+ fi -+ ;; -+ -+ os2*) -+ hardcode_libdir_flag_spec_GCJ='-L$libdir' -+ hardcode_minus_L_GCJ=yes -+ allow_undefined_flag_GCJ=unsupported -+ archive_cmds_GCJ='$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_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' -+ ;; -+ -+ osf3*) -+ if test "$GCC" = yes; then -+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ else -+ allow_undefined_flag_GCJ=' -expect_unresolved \*' -+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ fi -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' -+ hardcode_libdir_separator_GCJ=: -+ ;; -+ -+ osf4* | osf5*) # as osf3* with the addition of -msym flag -+ if test "$GCC" = yes; then -+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' -+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' -+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' -+ else -+ allow_undefined_flag_GCJ=' -expect_unresolved \*' -+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' -+ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ -+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_GCJ='-rpath $libdir' -+ fi -+ hardcode_libdir_separator_GCJ=: -+ ;; -+ -+ solaris*) -+ no_undefined_flag_GCJ=' -z text' -+ if test "$GCC" = yes; then -+ wlarc='${wl}' -+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ -+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' -+ else -+ wlarc='' -+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ archive_expsym_cmds_GCJ='$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' -+ fi -+ hardcode_libdir_flag_spec_GCJ='-R$libdir' -+ hardcode_shlibpath_var_GCJ=no -+ case $host_os in -+ solaris2.[0-5] | solaris2.[0-5].*) ;; -+ *) -+ # The compiler driver will combine linker options so we -+ # cannot just pass the convience library names through -+ # without $wl, iff we do not link with $LD. -+ # Luckily, gcc supports the same syntax we need for Sun Studio. -+ # Supported since Solaris 2.6 (maybe 2.5.1?) -+ case $wlarc in -+ '') -+ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; -+ *) -+ whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; -+ esac ;; -+ esac -+ link_all_deplibs_GCJ=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_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' -+ fi -+ hardcode_libdir_flag_spec_GCJ='-L$libdir' -+ hardcode_direct_GCJ=yes -+ hardcode_minus_L_GCJ=yes -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ sysv4) -+ case $host_vendor in -+ sni) -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_GCJ=yes # is this really true??? -+ ;; -+ siemens) -+ ## LD is ld it makes a PLAMLIB -+ ## CC just makes a GrossModule. -+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' -+ reload_cmds_GCJ='$CC -r -o $output$reload_objs' -+ hardcode_direct_GCJ=no -+ ;; -+ motorola) -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie -+ ;; -+ esac -+ runpath_var='LD_RUN_PATH' -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ sysv4.3*) -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_shlibpath_var_GCJ=no -+ export_dynamic_flag_spec_GCJ='-Bexport' -+ ;; -+ -+ sysv4*MP*) -+ if test -d /usr/nec; then -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_shlibpath_var_GCJ=no -+ runpath_var=LD_RUN_PATH -+ hardcode_runpath_var=yes -+ ld_shlibs_GCJ=yes -+ fi -+ ;; -+ -+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) -+ no_undefined_flag_GCJ='${wl}-z,text' -+ archive_cmds_need_lc_GCJ=no -+ hardcode_shlibpath_var_GCJ=no -+ runpath_var='LD_RUN_PATH' -+ -+ if test "$GCC" = yes; then -+ archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_GCJ='$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_GCJ='${wl}-z,text' -+ allow_undefined_flag_GCJ='${wl}-z,nodefs' -+ archive_cmds_need_lc_GCJ=no -+ hardcode_shlibpath_var_GCJ=no -+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' -+ hardcode_libdir_separator_GCJ=':' -+ link_all_deplibs_GCJ=yes -+ export_dynamic_flag_spec_GCJ='${wl}-Bexport' -+ runpath_var='LD_RUN_PATH' -+ -+ if test "$GCC" = yes; then -+ archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ else -+ archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' -+ fi -+ ;; -+ -+ uts4*) -+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' -+ hardcode_libdir_flag_spec_GCJ='-L$libdir' -+ hardcode_shlibpath_var_GCJ=no -+ ;; -+ -+ *) -+ ld_shlibs_GCJ=no -+ ;; -+ esac -+ fi -+ -+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -+echo "${ECHO_T}$ld_shlibs_GCJ" >&6 -+test "$ld_shlibs_GCJ" = no && can_build_shared=no -+ -+# -+# Do we need to explicitly link libc? -+# -+case "x$archive_cmds_need_lc_GCJ" in -+x|xyes) -+ # Assume -lc should be added -+ archive_cmds_need_lc_GCJ=yes -+ -+ if test "$enable_shared" = yes && test "$GCC" = yes; then -+ case $archive_cmds_GCJ 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. -+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ $rm conftest* -+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext -+ -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } 2>conftest.err; then -+ soname=conftest -+ lib=conftest -+ libobjs=conftest.$ac_objext -+ deplibs= -+ wl=$lt_prog_compiler_wl_GCJ -+ pic_flag=$lt_prog_compiler_pic_GCJ -+ compiler_flags=-v -+ linker_flags=-v -+ verstring= -+ output_objdir=. -+ libname=conftest -+ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ -+ allow_undefined_flag_GCJ= -+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 -+ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } -+ then -+ archive_cmds_need_lc_GCJ=no -+ else -+ archive_cmds_need_lc_GCJ=yes -+ fi -+ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag -+ else -+ cat conftest.err 1>&5 -+ fi -+ $rm conftest* -+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 -+ ;; -+ esac -+ fi -+ ;; -+esac -+ -+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+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" -+if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then -+ # 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. -+ 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 -+else -+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -+fi -+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 -+ 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' -+ ;; -+ -+aix4* | aix5*) -+ version_type=linux -+ 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*) -+ 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=`$echo "X$lib" | $Xsed -e '\''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' -+ ;; -+ -+beos*) -+ library_names_spec='${libname}${shared_ext}' -+ dynamic_linker="$host_os ld.so" -+ shlibpath_var=LIBRARY_PATH -+ ;; -+ -+bsdi[45]*) -+ version_type=linux -+ 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*) -+ version_type=windows -+ shrext_cmds=".dll" -+ need_version=no -+ need_lib_prefix=no -+ -+ case $GCC,$host_os in -+ yes,cygwin* | yes,mingw* | yes,pw32*) -+ 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' -+ 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="/usr/lib /lib/w32api /lib /usr/local/lib" -+ ;; -+ mingw*) -+ # MinGW DLLs use traditional 'lib' prefix -+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' -+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` -+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then -+ # It is most probably a Windows format PATH printed by -+ # mingw gcc, but we are running on Cygwin. Gcc prints its search -+ # path with ; separators, and with drive letters. We can handle the -+ # drive letters (cygwin fileutils understands them), so leave them, -+ # especially as we might pass files found there to a mingw objdump, -+ # which wouldn't understand a cygwinified path. Ahh. -+ 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 -+ ;; -+ 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 -+ ;; -+ -+ *) -+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' -+ ;; -+ esac -+ dynamic_linker='Win32 ld.exe' -+ # 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}${versuffix}$shared_ext ${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`' -+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. -+ if test "$GCC" = yes; then -+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` -+ else -+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' -+ fi -+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' -+ ;; -+ -+dgux*) -+ version_type=linux -+ 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 -+ ;; -+ -+freebsd1*) -+ dynamic_linker=no -+ ;; -+ -+kfreebsd*-gnu) -+ version_type=linux -+ 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='GNU ld.so' -+ ;; -+ -+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[123]*) 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 -+ ;; -+ freebsd*) # from 4.6 on -+ shlibpath_overrides_runpath=yes -+ hardcode_into_libs=yes -+ ;; -+ esac -+ ;; -+ -+gnu*) -+ version_type=linux -+ 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 -+ 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' -+ ;; -+ -+interix3*) -+ version_type=linux -+ 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 -+ 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 Linux ELF. -+linux*) -+ version_type=linux -+ 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 -+ # 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 -+ -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390x*|powerpc64*) -+ echo '#line 20065 "configure"' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ -+ # 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/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $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' -+ ;; -+ -+knetbsd*-gnu) -+ version_type=linux -+ 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='GNU 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 -+ 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=linux -+ 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 -+ ;; -+ -+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" -+ ;; -+ -+solaris*) -+ version_type=linux -+ 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 -+ 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 -+ export_dynamic_flag_spec='${wl}-Blargedynsym' -+ 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 -+ 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 -+ 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' -+ shlibpath_overrides_runpath=no -+ else -+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' -+ shlibpath_overrides_runpath=yes -+ 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' -+ ;; -+ -+uts4*) -+ version_type=linux -+ 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 -+echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -+echo "${ECHO_T}$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 -+ -+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+hardcode_action_GCJ= -+if test -n "$hardcode_libdir_flag_spec_GCJ" || \ -+ test -n "$runpath_var_GCJ" || \ -+ test "X$hardcode_automatic_GCJ" = "Xyes" ; then -+ -+ # We can hardcode non-existant directories. -+ if test "$hardcode_direct_GCJ" != 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_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && -+ test "$hardcode_minus_L_GCJ" != no; then -+ # Linking always hardcodes the temporary library directory. -+ hardcode_action_GCJ=relink -+ else -+ # We can link without hardcoding, and we can hardcode nonexisting dirs. -+ hardcode_action_GCJ=immediate -+ fi -+else -+ # We cannot hardcode anything, or else we can only hardcode existing -+ # directories. -+ hardcode_action_GCJ=unsupported -+fi -+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -+echo "${ECHO_T}$hardcode_action_GCJ" >&6 -+ -+if test "$hardcode_action_GCJ" = relink; 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 -+ -+ -+# The else clause should only fire when bootstrapping the -+# libtool distribution, otherwise you forgot to ship ltmain.sh -+# with your package, and you will get complaints that there are -+# no rules to generate ltmain.sh. -+if test -f "$ltmain"; then -+ # 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 -+ # Now quote all the things that may contain metacharacters while being -+ # careful not to overquote the AC_SUBSTed values. We take copies of the -+ # variables and quote the copies for generation of the libtool script. -+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ -+ SED SHELL STRIP \ -+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ -+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ -+ deplibs_check_method reload_flag reload_cmds need_locks \ -+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ -+ lt_cv_sys_global_symbol_to_c_name_address \ -+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ -+ old_postinstall_cmds old_postuninstall_cmds \ -+ compiler_GCJ \ -+ CC_GCJ \ -+ LD_GCJ \ -+ lt_prog_compiler_wl_GCJ \ -+ lt_prog_compiler_pic_GCJ \ -+ lt_prog_compiler_static_GCJ \ -+ lt_prog_compiler_no_builtin_flag_GCJ \ -+ export_dynamic_flag_spec_GCJ \ -+ thread_safe_flag_spec_GCJ \ -+ whole_archive_flag_spec_GCJ \ -+ enable_shared_with_static_runtimes_GCJ \ -+ old_archive_cmds_GCJ \ -+ old_archive_from_new_cmds_GCJ \ -+ predep_objects_GCJ \ -+ postdep_objects_GCJ \ -+ predeps_GCJ \ -+ postdeps_GCJ \ -+ compiler_lib_search_path_GCJ \ -+ archive_cmds_GCJ \ -+ archive_expsym_cmds_GCJ \ -+ postinstall_cmds_GCJ \ -+ postuninstall_cmds_GCJ \ -+ old_archive_from_expsyms_cmds_GCJ \ -+ allow_undefined_flag_GCJ \ -+ no_undefined_flag_GCJ \ -+ export_symbols_cmds_GCJ \ -+ hardcode_libdir_flag_spec_GCJ \ -+ hardcode_libdir_flag_spec_ld_GCJ \ -+ hardcode_libdir_separator_GCJ \ -+ hardcode_automatic_GCJ \ -+ module_cmds_GCJ \ -+ module_expsym_cmds_GCJ \ -+ lt_cv_prog_compiler_c_o_GCJ \ -+ exclude_expsyms_GCJ \ -+ include_expsyms_GCJ; do -+ -+ case $var in -+ old_archive_cmds_GCJ | \ -+ old_archive_from_new_cmds_GCJ | \ -+ archive_cmds_GCJ | \ -+ archive_expsym_cmds_GCJ | \ -+ module_cmds_GCJ | \ -+ module_expsym_cmds_GCJ | \ -+ old_archive_from_expsyms_cmds_GCJ | \ -+ export_symbols_cmds_GCJ | \ -+ extract_expsyms_cmds | reload_cmds | finish_cmds | \ -+ postinstall_cmds | postuninstall_cmds | \ -+ old_postinstall_cmds | old_postuninstall_cmds | \ -+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) -+ # Double-quote double-evaled strings. -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" -+ ;; -+ *) -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" -+ ;; -+ esac -+ done -+ -+ case $lt_echo in -+ *'\$0 --fallback-echo"') -+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` -+ ;; -+ esac -+ -+cfgfile="$ofile" -+ -+ cat <<__EOF__ >> "$cfgfile" -+# ### BEGIN LIBTOOL TAG CONFIG: $tagname -+ -+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -+ -+# Shell to use when invoking shell scripts. -+SHELL=$lt_SHELL -+ -+# Whether or not to build shared libraries. -+build_libtool_libs=$enable_shared -+ -+# Whether or not to build static libraries. -+build_old_libs=$enable_static -+ -+# Whether or not to add -lc for building shared libraries. -+build_libtool_need_lc=$archive_cmds_need_lc_GCJ -+ -+# Whether or not to disallow shared libs when runtime libs are static -+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ -+ -+# Whether or not to optimize for fast installation. -+fast_install=$enable_fast_install -+ -+# 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 -+ -+# An echo program that does not interpret backslashes. -+echo=$lt_echo -+ -+# The archiver. -+AR=$lt_AR -+AR_FLAGS=$lt_AR_FLAGS -+ -+# A C compiler. -+LTCC=$lt_LTCC -+ -+# LTCC compiler flags. -+LTCFLAGS=$lt_LTCFLAGS -+ -+# A language-specific compiler. -+CC=$lt_compiler_GCJ -+ -+# Is the compiler the GNU C compiler? -+with_gcc=$GCC_GCJ -+ -+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` -+gcc_ver=\`gcc -dumpversion\` -+ -+# An ERE matcher. -+EGREP=$lt_EGREP -+ -+# The linker used to build libraries. -+LD=$lt_LD_GCJ -+ -+# Whether we need hard or soft links. -+LN_S=$lt_LN_S -+ -+# A BSD-compatible nm program. -+NM=$lt_NM -+ -+# A symbol stripping program -+STRIP=$lt_STRIP -+ -+# Used to examine libraries when file_magic_cmd begins "file" -+MAGIC_CMD=$MAGIC_CMD -+ -+# Used on cygwin: DLL creation program. -+DLLTOOL="$DLLTOOL" -+ -+# Used on cygwin: object dumper. -+OBJDUMP="$OBJDUMP" -+ -+# Used on cygwin: assembler. -+AS="$AS" -+ -+# The name of the directory that contains temporary libtool files. -+objdir=$objdir -+ -+# How to create reloadable object files. -+reload_flag=$lt_reload_flag -+reload_cmds=$lt_reload_cmds -+ -+# How to pass a linker flag through the compiler. -+wl=$lt_lt_prog_compiler_wl_GCJ -+ -+# Object file suffix (normally "o"). -+objext="$ac_objext" -+ -+# Old archive suffix (normally "a"). -+libext="$libext" -+ -+# Shared library suffix (normally ".so"). -+shrext_cmds='$shrext_cmds' -+ -+# Executable file suffix (normally ""). -+exeext="$exeext" -+ -+# Additional compiler flags for building library objects. -+pic_flag=$lt_lt_prog_compiler_pic_GCJ -+pic_mode=$pic_mode -+ -+# What is the maximum length of a command? -+max_cmd_len=$lt_cv_sys_max_cmd_len -+ -+# Does compiler simultaneously support -c and -o options? -+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ -+ -+# Must we lock files when doing compilation? -+need_locks=$lt_need_locks -+ -+# 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 -+ -+# 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 -+ -+# Compiler flag to prevent dynamic linking. -+link_static_flag=$lt_lt_prog_compiler_static_GCJ -+ -+# Compiler flag to turn off builtin functions. -+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ -+ -+# Compiler flag to allow reflexive dlopens. -+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ -+ -+# Compiler flag to generate shared objects directly from archives. -+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ -+ -+# Compiler flag to generate thread-safe objects. -+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ -+ -+# Library versioning type. -+version_type=$version_type -+ -+# 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 -+ -+# Commands used to build and install an old-style archive. -+RANLIB=$lt_RANLIB -+old_archive_cmds=$lt_old_archive_cmds_GCJ -+old_postinstall_cmds=$lt_old_postinstall_cmds -+old_postuninstall_cmds=$lt_old_postuninstall_cmds -+ -+# Create an old-style archive from a shared archive. -+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ -+ -+# Create a temporary old-style archive to link instead of a shared archive. -+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ -+ -+# Commands used to build and install a shared archive. -+archive_cmds=$lt_archive_cmds_GCJ -+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ -+postinstall_cmds=$lt_postinstall_cmds -+postuninstall_cmds=$lt_postuninstall_cmds -+ -+# Commands used to build a loadable module (assumed same as above if empty) -+module_cmds=$lt_module_cmds_GCJ -+module_expsym_cmds=$lt_module_expsym_cmds_GCJ -+ -+# Commands to strip libraries. -+old_striplib=$lt_old_striplib -+striplib=$lt_striplib -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predep_objects=\`echo $lt_predep_objects_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdep_objects=\`echo $lt_postdep_objects_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predeps=$lt_predeps_GCJ -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdeps=$lt_postdeps_GCJ -+ -+# The library search path used internally by the compiler when linking -+# a shared library. -+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# 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 -+ -+# Flag that allows shared libraries with undefined symbols to be built. -+allow_undefined_flag=$lt_allow_undefined_flag_GCJ -+ -+# Flag that forces no undefined symbols. -+no_undefined_flag=$lt_no_undefined_flag_GCJ -+ -+# Commands used to finish a libtool library installation in a directory. -+finish_cmds=$lt_finish_cmds -+ -+# Same as above, but a single script fragment to be evaled but not shown. -+finish_eval=$lt_finish_eval -+ -+# 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 -+ -+# This is the shared library runtime path variable. -+runpath_var=$runpath_var -+ -+# This is the shared library path variable. -+shlibpath_var=$shlibpath_var -+ -+# Is shlibpath searched before the hard-coded library search path? -+shlibpath_overrides_runpath=$shlibpath_overrides_runpath -+ -+# How to hardcode a shared library path into an executable. -+hardcode_action=$hardcode_action_GCJ -+ -+# Whether we should hardcode library paths into libraries. -+hardcode_into_libs=$hardcode_into_libs -+ -+# 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_GCJ -+ -+# If ld is used when linking, flag to hardcode \$libdir into -+# a binary during linking. This must work even if \$libdir does -+# not exist. -+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ -+ -+# Whether we need a single -rpath flag with a separated argument. -+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ -+ -+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -+# resulting binary. -+hardcode_direct=$hardcode_direct_GCJ -+ -+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -+# resulting binary. -+hardcode_minus_L=$hardcode_minus_L_GCJ -+ -+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -+# the resulting binary. -+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ -+ -+# 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_GCJ -+ -+# Variables whose values should be saved in libtool wrapper scripts and -+# restored at relink time. -+variables_saved_for_relink="$variables_saved_for_relink" -+ -+# Whether libtool must link a program against all its dependency libraries. -+link_all_deplibs=$link_all_deplibs_GCJ -+ -+# Compile-time system search path for libraries -+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Run-time system search path for libraries -+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec -+ -+# Fix the shell variable \$srcfile for the compiler. -+fix_srcfile_path="$fix_srcfile_path_GCJ" -+ -+# Set to yes if exported symbols are required. -+always_export_symbols=$always_export_symbols_GCJ -+ -+# The commands to list exported symbols. -+export_symbols_cmds=$lt_export_symbols_cmds_GCJ -+ -+# The commands to extract the exported symbol list from a shared archive. -+extract_expsyms_cmds=$lt_extract_expsyms_cmds -+ -+# Symbols that should not be listed in the preloaded symbols. -+exclude_expsyms=$lt_exclude_expsyms_GCJ -+ -+# Symbols that must always be exported. -+include_expsyms=$lt_include_expsyms_GCJ -+ -+# ### END LIBTOOL TAG CONFIG: $tagname -+ -+__EOF__ -+ -+ -+else -+ # If there is no Makefile yet, we rely on a make rule to execute -+ # `config.status --recheck' to rerun these tests and create the -+ # libtool script then. -+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` -+ if test -f "$ltmain_in"; then -+ test -f Makefile && make "$ltmain" -+ 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 -+ -+CC="$lt_save_CC" -+ -+ else -+ tagname="" -+ fi -+ ;; -+ -+ RC) -+ -+ -+ -+# Source file extension for RC test sources. -+ac_ext=rc -+ -+# Object file extension for compiled RC test sources. -+objext=o -+objext_RC=$objext -+ -+# Code to be used in simple compile tests -+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' -+ -+# 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. -+ -+# 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 warnings/boilerplate of simple test code -+ac_outfile=conftest.$ac_objext -+printf "$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 -+printf "$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 conftest* -+ -+ -+# Allow CC to be a program name with arguments. -+lt_save_CC="$CC" -+CC=${RC-"windres"} -+compiler=$CC -+compiler_RC=$CC -+for cc_temp in $compiler""; do -+ case $cc_temp in -+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; -+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; -+ \-*) ;; -+ *) break;; -+ esac -+done -+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` -+ -+lt_cv_prog_compiler_c_o_RC=yes -+ -+# The else clause should only fire when bootstrapping the -+# libtool distribution, otherwise you forgot to ship ltmain.sh -+# with your package, and you will get complaints that there are -+# no rules to generate ltmain.sh. -+if test -f "$ltmain"; then -+ # 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 -+ # Now quote all the things that may contain metacharacters while being -+ # careful not to overquote the AC_SUBSTed values. We take copies of the -+ # variables and quote the copies for generation of the libtool script. -+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ -+ SED SHELL STRIP \ -+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ -+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ -+ deplibs_check_method reload_flag reload_cmds need_locks \ -+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ -+ lt_cv_sys_global_symbol_to_c_name_address \ -+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ -+ old_postinstall_cmds old_postuninstall_cmds \ -+ compiler_RC \ -+ CC_RC \ -+ LD_RC \ -+ lt_prog_compiler_wl_RC \ -+ lt_prog_compiler_pic_RC \ -+ lt_prog_compiler_static_RC \ -+ lt_prog_compiler_no_builtin_flag_RC \ -+ export_dynamic_flag_spec_RC \ -+ thread_safe_flag_spec_RC \ -+ whole_archive_flag_spec_RC \ -+ enable_shared_with_static_runtimes_RC \ -+ old_archive_cmds_RC \ -+ old_archive_from_new_cmds_RC \ -+ predep_objects_RC \ -+ postdep_objects_RC \ -+ predeps_RC \ -+ postdeps_RC \ -+ compiler_lib_search_path_RC \ -+ archive_cmds_RC \ -+ archive_expsym_cmds_RC \ -+ postinstall_cmds_RC \ -+ postuninstall_cmds_RC \ -+ old_archive_from_expsyms_cmds_RC \ -+ allow_undefined_flag_RC \ -+ no_undefined_flag_RC \ -+ export_symbols_cmds_RC \ -+ hardcode_libdir_flag_spec_RC \ -+ hardcode_libdir_flag_spec_ld_RC \ -+ hardcode_libdir_separator_RC \ -+ hardcode_automatic_RC \ -+ module_cmds_RC \ -+ module_expsym_cmds_RC \ -+ lt_cv_prog_compiler_c_o_RC \ -+ exclude_expsyms_RC \ -+ include_expsyms_RC; do -+ -+ case $var in -+ old_archive_cmds_RC | \ -+ old_archive_from_new_cmds_RC | \ -+ archive_cmds_RC | \ -+ archive_expsym_cmds_RC | \ -+ module_cmds_RC | \ -+ module_expsym_cmds_RC | \ -+ old_archive_from_expsyms_cmds_RC | \ -+ export_symbols_cmds_RC | \ -+ extract_expsyms_cmds | reload_cmds | finish_cmds | \ -+ postinstall_cmds | postuninstall_cmds | \ -+ old_postinstall_cmds | old_postuninstall_cmds | \ -+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) -+ # Double-quote double-evaled strings. -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" -+ ;; -+ *) -+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" -+ ;; -+ esac -+ done -+ -+ case $lt_echo in -+ *'\$0 --fallback-echo"') -+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` -+ ;; -+ esac -+ -+cfgfile="$ofile" -+ -+ cat <<__EOF__ >> "$cfgfile" -+# ### BEGIN LIBTOOL TAG CONFIG: $tagname -+ -+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -+ -+# Shell to use when invoking shell scripts. -+SHELL=$lt_SHELL -+ -+# Whether or not to build shared libraries. -+build_libtool_libs=$enable_shared -+ -+# Whether or not to build static libraries. -+build_old_libs=$enable_static -+ -+# Whether or not to add -lc for building shared libraries. -+build_libtool_need_lc=$archive_cmds_need_lc_RC -+ -+# Whether or not to disallow shared libs when runtime libs are static -+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC -+ -+# Whether or not to optimize for fast installation. -+fast_install=$enable_fast_install -+ -+# 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 -+ -+# An echo program that does not interpret backslashes. -+echo=$lt_echo -+ -+# The archiver. -+AR=$lt_AR -+AR_FLAGS=$lt_AR_FLAGS -+ -+# A C compiler. -+LTCC=$lt_LTCC -+ -+# LTCC compiler flags. -+LTCFLAGS=$lt_LTCFLAGS -+ -+# A language-specific compiler. -+CC=$lt_compiler_RC -+ -+# Is the compiler the GNU C compiler? -+with_gcc=$GCC_RC -+ -+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` -+gcc_ver=\`gcc -dumpversion\` -+ -+# An ERE matcher. -+EGREP=$lt_EGREP -+ -+# The linker used to build libraries. -+LD=$lt_LD_RC -+ -+# Whether we need hard or soft links. -+LN_S=$lt_LN_S -+ -+# A BSD-compatible nm program. -+NM=$lt_NM -+ -+# A symbol stripping program -+STRIP=$lt_STRIP -+ -+# Used to examine libraries when file_magic_cmd begins "file" -+MAGIC_CMD=$MAGIC_CMD -+ -+# Used on cygwin: DLL creation program. -+DLLTOOL="$DLLTOOL" -+ -+# Used on cygwin: object dumper. -+OBJDUMP="$OBJDUMP" -+ -+# Used on cygwin: assembler. -+AS="$AS" -+ -+# The name of the directory that contains temporary libtool files. -+objdir=$objdir -+ -+# How to create reloadable object files. -+reload_flag=$lt_reload_flag -+reload_cmds=$lt_reload_cmds -+ -+# How to pass a linker flag through the compiler. -+wl=$lt_lt_prog_compiler_wl_RC -+ -+# Object file suffix (normally "o"). -+objext="$ac_objext" -+ -+# Old archive suffix (normally "a"). -+libext="$libext" -+ -+# Shared library suffix (normally ".so"). -+shrext_cmds='$shrext_cmds' -+ -+# Executable file suffix (normally ""). -+exeext="$exeext" -+ -+# Additional compiler flags for building library objects. -+pic_flag=$lt_lt_prog_compiler_pic_RC -+pic_mode=$pic_mode -+ -+# What is the maximum length of a command? -+max_cmd_len=$lt_cv_sys_max_cmd_len -+ -+# Does compiler simultaneously support -c and -o options? -+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC -+ -+# Must we lock files when doing compilation? -+need_locks=$lt_need_locks -+ -+# 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 -+ -+# 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 -+ -+# Compiler flag to prevent dynamic linking. -+link_static_flag=$lt_lt_prog_compiler_static_RC -+ -+# Compiler flag to turn off builtin functions. -+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC -+ -+# Compiler flag to allow reflexive dlopens. -+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC -+ -+# Compiler flag to generate shared objects directly from archives. -+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC -+ -+# Compiler flag to generate thread-safe objects. -+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC -+ -+# Library versioning type. -+version_type=$version_type -+ -+# 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 -+ -+# Commands used to build and install an old-style archive. -+RANLIB=$lt_RANLIB -+old_archive_cmds=$lt_old_archive_cmds_RC -+old_postinstall_cmds=$lt_old_postinstall_cmds -+old_postuninstall_cmds=$lt_old_postuninstall_cmds -+ -+# Create an old-style archive from a shared archive. -+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC -+ -+# Create a temporary old-style archive to link instead of a shared archive. -+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC -+ -+# Commands used to build and install a shared archive. -+archive_cmds=$lt_archive_cmds_RC -+archive_expsym_cmds=$lt_archive_expsym_cmds_RC -+postinstall_cmds=$lt_postinstall_cmds -+postuninstall_cmds=$lt_postuninstall_cmds -+ -+# Commands used to build a loadable module (assumed same as above if empty) -+module_cmds=$lt_module_cmds_RC -+module_expsym_cmds=$lt_module_expsym_cmds_RC -+ -+# Commands to strip libraries. -+old_striplib=$lt_old_striplib -+striplib=$lt_striplib -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predep_objects=\`echo $lt_predep_objects_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdep_objects=\`echo $lt_postdep_objects_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Dependencies to place before the objects being linked to create a -+# shared library. -+predeps=$lt_predeps_RC -+ -+# Dependencies to place after the objects being linked to create a -+# shared library. -+postdeps=$lt_postdeps_RC -+ -+# The library search path used internally by the compiler when linking -+# a shared library. -+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# 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 -+ -+# Flag that allows shared libraries with undefined symbols to be built. -+allow_undefined_flag=$lt_allow_undefined_flag_RC -+ -+# Flag that forces no undefined symbols. -+no_undefined_flag=$lt_no_undefined_flag_RC -+ -+# Commands used to finish a libtool library installation in a directory. -+finish_cmds=$lt_finish_cmds -+ -+# Same as above, but a single script fragment to be evaled but not shown. -+finish_eval=$lt_finish_eval -+ -+# 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 -+ -+# This is the shared library runtime path variable. -+runpath_var=$runpath_var -+ -+# This is the shared library path variable. -+shlibpath_var=$shlibpath_var -+ -+# Is shlibpath searched before the hard-coded library search path? -+shlibpath_overrides_runpath=$shlibpath_overrides_runpath -+ -+# How to hardcode a shared library path into an executable. -+hardcode_action=$hardcode_action_RC -+ -+# Whether we should hardcode library paths into libraries. -+hardcode_into_libs=$hardcode_into_libs -+ -+# 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_RC -+ -+# If ld is used when linking, flag to hardcode \$libdir into -+# a binary during linking. This must work even if \$libdir does -+# not exist. -+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC -+ -+# Whether we need a single -rpath flag with a separated argument. -+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC -+ -+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -+# resulting binary. -+hardcode_direct=$hardcode_direct_RC -+ -+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -+# resulting binary. -+hardcode_minus_L=$hardcode_minus_L_RC -+ -+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -+# the resulting binary. -+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC -+ -+# 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_RC -+ -+# Variables whose values should be saved in libtool wrapper scripts and -+# restored at relink time. -+variables_saved_for_relink="$variables_saved_for_relink" -+ -+# Whether libtool must link a program against all its dependency libraries. -+link_all_deplibs=$link_all_deplibs_RC -+ -+# Compile-time system search path for libraries -+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` -+ -+# Run-time system search path for libraries -+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec -+ -+# Fix the shell variable \$srcfile for the compiler. -+fix_srcfile_path="$fix_srcfile_path_RC" -+ -+# Set to yes if exported symbols are required. -+always_export_symbols=$always_export_symbols_RC -+ -+# The commands to list exported symbols. -+export_symbols_cmds=$lt_export_symbols_cmds_RC -+ -+# The commands to extract the exported symbol list from a shared archive. -+extract_expsyms_cmds=$lt_extract_expsyms_cmds -+ -+# Symbols that should not be listed in the preloaded symbols. -+exclude_expsyms=$lt_exclude_expsyms_RC -+ -+# Symbols that must always be exported. -+include_expsyms=$lt_include_expsyms_RC -+ -+# ### END LIBTOOL TAG CONFIG: $tagname -+ -+__EOF__ -+ -+ -+else -+ # If there is no Makefile yet, we rely on a make rule to execute -+ # `config.status --recheck' to rerun these tests and create the -+ # libtool script then. -+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` -+ if test -f "$ltmain_in"; then -+ test -f Makefile && make "$ltmain" -+ 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 -+ -+CC="$lt_save_CC" -+ -+ ;; -+ -+ *) -+ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 -+echo "$as_me: error: Unsupported tag name: $tagname" >&2;} -+ { (exit 1); exit 1; }; } -+ ;; -+ esac -+ -+ # Append the new tag name to the list of available tags. -+ if test -n "$tagname" ; then -+ available_tags="$available_tags $tagname" -+ fi -+ fi -+ done -+ IFS="$lt_save_ifs" -+ -+ # Now substitute the updated list of available tags. -+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then -+ mv "${ofile}T" "$ofile" -+ chmod +x "$ofile" -+ else -+ rm -f "${ofile}T" -+ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 -+echo "$as_me: error: unable to update list of available tagged configurations." >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+fi -+ -+ -+ -+# This can be used to rebuild libtool when needed -+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" -+ -+# Always use our own libtool. -+LIBTOOL='$(SHELL) $(top_builddir)/libtool' -+ -+# Prevent multiple expansion -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+CFLAGS="-O2 -Wall" -+## check for --enable-debug first before checking CFLAGS before -+## so that we don't mix -O and -g -+# Check whether --enable-debug or --disable-debug was given. -+if test "${enable_debug+set}" = set; then -+ enableval="$enable_debug" -+ if eval "test x$enable_debug = xyes"; then -+ CFLAGS="${CFLAGS} -g -O0" -+ fi -+fi; -+ -+ -+if test x$debug = xtrue; then -+ DEBUG_TRUE= -+ DEBUG_FALSE='#' -+else -+ DEBUG_TRUE='#' -+ DEBUG_FALSE= -+fi -+ -+ -+ ac_config_commands="$ac_config_commands default" -+ -+ -+ -+ -+ ac_config_files="$ac_config_files Makefile src/Makefile src/apps/Makefile src/apps/dhcpc/Makefile src/apps/brcm-iscsi/Makefile src/uip/Makefile src/unix/Makefile src/unix/libs/Makefile" -+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, don't put newlines in cache variables' values. -+# 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. -+{ -+ (set) 2>&1 | -+ case `(ac_space=' '; set | grep ac_space) 2>&1` in -+ *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 \ -+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" -+ ;; -+ esac; -+} | -+ sed ' -+ t clear -+ : clear -+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ -+ t end -+ /^ac_cv_env/!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" && echo "updating cache $cache_file" -+ cat confcache >$cache_file -+ else -+ echo "not updating unwritable cache $cache_file" -+ 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}' -+ -+# VPATH may cause trouble with some makes, so we remove $(srcdir), -+# ${srcdir} and @srcdir@ 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[ ]*=/{ -+s/:*\$(srcdir):*/:/; -+s/:*\${srcdir}:*/:/; -+s/:*@srcdir@:*/:/; -+s/^\([^=]*=[ ]*\):*/\1/; -+s/:*$//; -+s/^[^=]*=[ ]*$//; -+}' -+fi -+ -+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_i=`echo "$ac_i" | -+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'` -+ # 2. Add them. -+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" -+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' -+done -+LIBOBJS=$ac_libobjs -+ -+LTLIBOBJS=$ac_ltlibobjs -+ -+ -+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then -+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -+Usually this means the macro was only invoked conditionally." >&5 -+echo "$as_me: error: conditional \"AMDEP\" was never defined. -+Usually this means the macro was only invoked conditionally." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then -+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -+Usually this means the macro was only invoked conditionally." >&5 -+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -+Usually this means the macro was only invoked conditionally." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then -+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -+Usually this means the macro was only invoked conditionally." >&5 -+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -+Usually this means the macro was only invoked conditionally." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then -+ { { echo "$as_me:$LINENO: error: conditional \"DEBUG\" was never defined. -+Usually this means the macro was only invoked conditionally." >&5 -+echo "$as_me: error: conditional \"DEBUG\" was never defined. -+Usually this means the macro was only invoked conditionally." >&2;} -+ { (exit 1); exit 1; }; } -+fi -+ -+: ${CONFIG_STATUS=./config.status} -+ac_clean_files_save=$ac_clean_files -+ac_clean_files="$ac_clean_files $CONFIG_STATUS" -+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -+echo "$as_me: creating $CONFIG_STATUS" >&6;} -+cat >$CONFIG_STATUS <<_ACEOF -+#! $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} -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+## --------------------- ## -+## M4sh Initialization. ## -+## --------------------- ## -+ -+# 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+"$@"}'='"$@"' -+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then -+ set -o posix -+fi -+DUALCASE=1; export DUALCASE # for MKS sh -+ -+# Support unset when possible. -+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -+ as_unset=unset -+else -+ as_unset=false -+fi -+ -+ -+# Work around bugs in pre-3.0 UWIN ksh. -+$as_unset ENV MAIL MAILPATH -+PS1='$ ' -+PS2='> ' -+PS4='+ ' -+ -+# NLS nuisances. -+for as_var in \ -+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -+ LC_TELEPHONE LC_TIME -+do -+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -+ eval $as_var=C; export $as_var -+ else -+ $as_unset $as_var -+ fi -+done -+ -+# Required to use basename. -+if expr a : '\(a\)' >/dev/null 2>&1; 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 -+ -+ -+# Name of the executable. -+as_me=`$as_basename "$0" || -+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ -+ X"$0" : 'X\(//\)$' \| \ -+ X"$0" : 'X\(/\)$' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -+ /^X\/\(\/\/\)$/{ s//\1/; q; } -+ /^X\/\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ -+ -+# PATH needs CR, and LINENO needs CR and PATH. -+# 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 -+ -+# The user is always right. -+if test "${PATH_SEPARATOR+set}" != set; then -+ echo "#! /bin/sh" >conf$$.sh -+ echo "exit 0" >>conf$$.sh -+ chmod +x conf$$.sh -+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -+ PATH_SEPARATOR=';' -+ else -+ PATH_SEPARATOR=: -+ fi -+ rm -f conf$$.sh -+fi -+ -+ -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x$as_lineno_3" = "x$as_lineno_2" || { -+ # Find who we are. Look in the path if we contain no path at all -+ # relative or not. -+ 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 -+ -+ ;; -+ 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 -+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+ case $CONFIG_SHELL in -+ '') -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for as_base in sh bash ksh sh5; do -+ case $as_dir in -+ /*) -+ if ("$as_dir/$as_base" -c ' -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then -+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } -+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } -+ CONFIG_SHELL=$as_dir/$as_base -+ export CONFIG_SHELL -+ exec "$CONFIG_SHELL" "$0" ${1+"$@"} -+ fi;; -+ esac -+ done -+done -+;; -+ esac -+ -+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO -+ # uniformly replaced by the line number. The first 'sed' inserts a -+ # line-number line before each line; the second 'sed' does the real -+ # work. The second script uses 'N' to pair each line-number line -+ # with the numbered line, and appends trailing '-' during -+ # substitution so that $LINENO is not a special case at line end. -+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) -+ sed '=' <$as_myself | -+ sed ' -+ N -+ s,$,-, -+ : loop -+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, -+ t loop -+ s,-$,, -+ s,^['$as_cr_digits']*\n,, -+ ' >$as_me.lineno && -+ chmod +x $as_me.lineno || -+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} -+ { (exit 1); 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 sensible to this). -+ . ./$as_me.lineno -+ # Exit status is that of the last command. -+ exit -+} -+ -+ -+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in -+ *c*,-n*) ECHO_N= ECHO_C=' -+' ECHO_T=' ' ;; -+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; -+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -+esac -+ -+if expr a : '\(a\)' >/dev/null 2>&1; then -+ as_expr=expr -+else -+ as_expr=false -+fi -+ -+rm -f conf$$ conf$$.exe conf$$.file -+echo >conf$$.file -+if ln -s conf$$.file conf$$ 2>/dev/null; then -+ # We could just check for DJGPP; but this test a) works b) is more generic -+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). -+ if test -f conf$$.exe; then -+ # Don't use ln at all; we don't have any links -+ as_ln_s='cp -p' -+ else -+ as_ln_s='ln -s' -+ fi -+elif ln conf$$.file conf$$ 2>/dev/null; then -+ as_ln_s=ln -+else -+ as_ln_s='cp -p' -+fi -+rm -f conf$$ conf$$.exe conf$$.file -+ -+if mkdir -p . 2>/dev/null; then -+ as_mkdir_p=: -+else -+ test -d ./-p && rmdir ./-p -+ as_mkdir_p=false -+fi -+ -+as_executable_p="test -f" -+ -+# 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'" -+ -+ -+# IFS -+# We need space, tab and new line, in precisely that order. -+as_nl=' -+' -+IFS=" $as_nl" -+ -+# CDPATH. -+$as_unset CDPATH -+ -+exec 6>&1 -+ -+# Open the log real soon, to keep \$[0] and so on meaningful, and to -+# report actual input values of CONFIG_FILES etc. instead of their -+# values after options handling. Logging --version etc. is OK. -+exec 5>>config.log -+{ -+ echo -+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -+## Running $as_me. ## -+_ASBOX -+} >&5 -+cat >&5 <<_CSEOF -+ -+This file was extended by iscsiuio $as_me 0.7.6.1g, which was -+generated by GNU Autoconf 2.59. Invocation command line was -+ -+ CONFIG_FILES = $CONFIG_FILES -+ CONFIG_HEADERS = $CONFIG_HEADERS -+ CONFIG_LINKS = $CONFIG_LINKS -+ CONFIG_COMMANDS = $CONFIG_COMMANDS -+ $ $0 $@ -+ -+_CSEOF -+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -+echo >&5 -+_ACEOF -+ -+# Files that config.status was made for. -+if test -n "$ac_config_files"; then -+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -+fi -+ -+if test -n "$ac_config_headers"; then -+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -+fi -+ -+if test -n "$ac_config_links"; then -+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -+fi -+ -+if test -n "$ac_config_commands"; then -+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -+fi -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+ -+ac_cs_usage="\ -+\`$as_me' instantiates files from templates according to the -+current configuration. -+ -+Usage: $0 [OPTIONS] [FILE]... -+ -+ -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 -+ --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_cs_version="\\ -+iscsiuio config.status 0.7.6.1g -+configured by $0, generated by GNU Autoconf 2.59, -+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -+ -+Copyright (C) 2003 Free Software Foundation, Inc. -+This config.status script is free software; the Free Software Foundation -+gives unlimited permission to copy, distribute and modify it." -+srcdir=$srcdir -+INSTALL="$INSTALL" -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+# If no file are specified by the user, then we need to provide default -+# value. By we need to know if files were specified by the user. -+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=$1 -+ ac_optarg=$2 -+ ac_shift=shift -+ ;; -+ *) # This is not an option, so the user has probably given explicit -+ # arguments. -+ ac_option=$1 -+ ac_need_defaults=false;; -+ esac -+ -+ case $ac_option in -+ # Handling of the options. -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) -+ ac_cs_recheck=: ;; -+ --version | --vers* | -V ) -+ echo "$ac_cs_version"; exit 0 ;; -+ --he | --h) -+ # Conflict between --help and --header -+ { { echo "$as_me:$LINENO: error: ambiguous option: $1 -+Try \`$0 --help' for more information." >&5 -+echo "$as_me: error: ambiguous option: $1 -+Try \`$0 --help' for more information." >&2;} -+ { (exit 1); exit 1; }; };; -+ --help | --hel | -h ) -+ echo "$ac_cs_usage"; exit 0 ;; -+ --debug | --d* | -d ) -+ debug=: ;; -+ --file | --fil | --fi | --f ) -+ $ac_shift -+ CONFIG_FILES="$CONFIG_FILES $ac_optarg" -+ ac_need_defaults=false;; -+ --header | --heade | --head | --hea ) -+ $ac_shift -+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" -+ ac_need_defaults=false;; -+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ -+ | -silent | --silent | --silen | --sile | --sil | --si | --s) -+ ac_cs_silent=: ;; -+ -+ # This is an error. -+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -+Try \`$0 --help' for more information." >&5 -+echo "$as_me: error: unrecognized option: $1 -+Try \`$0 --help' for more information." >&2;} -+ { (exit 1); exit 1; }; } ;; -+ -+ *) ac_config_targets="$ac_config_targets $1" ;; -+ -+ 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 -+if \$ac_cs_recheck; then -+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 -+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -+fi -+ -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<_ACEOF -+# -+# INIT-COMMANDS section. -+# -+ -+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" -+ -+ -+_ACEOF -+ -+ -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+for ac_config_target in $ac_config_targets -+do -+ case "$ac_config_target" in -+ # Handling of arguments. -+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; -+ "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; -+ "src/apps/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/Makefile" ;; -+ "src/apps/dhcpc/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/dhcpc/Makefile" ;; -+ "src/apps/brcm-iscsi/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/brcm-iscsi/Makefile" ;; -+ "src/uip/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/uip/Makefile" ;; -+ "src/unix/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/unix/Makefile" ;; -+ "src/unix/libs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/unix/libs/Makefile" ;; -+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; -+ "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; -+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; -+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -+echo "$as_me: error: invalid argument: $ac_config_target" >&2;} -+ { (exit 1); exit 1; }; };; -+ 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 to put it here, and in addition, -+# creating and moving files from /tmp can sometimes cause problems. -+# Create a temporary directory, and hook for its removal unless debugging. -+$debug || -+{ -+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 -+ trap '{ (exit 1); exit 1; }' 1 2 13 15 -+} -+ -+# Create a (secure) tmp directory for tmp files. -+ -+{ -+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && -+ test -n "$tmp" && test -d "$tmp" -+} || -+{ -+ tmp=./confstat$$-$RANDOM -+ (umask 077 && mkdir $tmp) -+} || -+{ -+ echo "$me: cannot create a temporary directory in ." >&2 -+ { (exit 1); exit 1; } -+} -+ -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<_ACEOF -+ -+# -+# CONFIG_FILES section. -+# -+ -+# No need to generate the scripts if there are no CONFIG_FILES. -+# This happens for instance when ./config.status config.h -+if test -n "\$CONFIG_FILES"; then -+ # Protect against being on the right side of a sed subst in config.status. -+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; -+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -+s,@SHELL@,$SHELL,;t t -+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -+s,@exec_prefix@,$exec_prefix,;t t -+s,@prefix@,$prefix,;t t -+s,@program_transform_name@,$program_transform_name,;t t -+s,@bindir@,$bindir,;t t -+s,@sbindir@,$sbindir,;t t -+s,@libexecdir@,$libexecdir,;t t -+s,@datadir@,$datadir,;t t -+s,@sysconfdir@,$sysconfdir,;t t -+s,@sharedstatedir@,$sharedstatedir,;t t -+s,@localstatedir@,$localstatedir,;t t -+s,@libdir@,$libdir,;t t -+s,@includedir@,$includedir,;t t -+s,@oldincludedir@,$oldincludedir,;t t -+s,@infodir@,$infodir,;t t -+s,@mandir@,$mandir,;t t -+s,@build_alias@,$build_alias,;t t -+s,@host_alias@,$host_alias,;t t -+s,@target_alias@,$target_alias,;t t -+s,@DEFS@,$DEFS,;t t -+s,@ECHO_C@,$ECHO_C,;t t -+s,@ECHO_N@,$ECHO_N,;t t -+s,@ECHO_T@,$ECHO_T,;t t -+s,@LIBS@,$LIBS,;t t -+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -+s,@INSTALL_DATA@,$INSTALL_DATA,;t t -+s,@CYGPATH_W@,$CYGPATH_W,;t t -+s,@PACKAGE@,$PACKAGE,;t t -+s,@VERSION@,$VERSION,;t t -+s,@ACLOCAL@,$ACLOCAL,;t t -+s,@AUTOCONF@,$AUTOCONF,;t t -+s,@AUTOMAKE@,$AUTOMAKE,;t t -+s,@AUTOHEADER@,$AUTOHEADER,;t t -+s,@MAKEINFO@,$MAKEINFO,;t t -+s,@install_sh@,$install_sh,;t t -+s,@STRIP@,$STRIP,;t t -+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -+s,@mkdir_p@,$mkdir_p,;t t -+s,@AWK@,$AWK,;t t -+s,@SET_MAKE@,$SET_MAKE,;t t -+s,@am__leading_dot@,$am__leading_dot,;t t -+s,@AMTAR@,$AMTAR,;t t -+s,@am__tar@,$am__tar,;t t -+s,@am__untar@,$am__untar,;t t -+s,@BASH@,$BASH,;t t -+s,@CC@,$CC,;t t -+s,@CFLAGS@,$CFLAGS,;t t -+s,@LDFLAGS@,$LDFLAGS,;t t -+s,@CPPFLAGS@,$CPPFLAGS,;t t -+s,@ac_ct_CC@,$ac_ct_CC,;t t -+s,@EXEEXT@,$EXEEXT,;t t -+s,@OBJEXT@,$OBJEXT,;t t -+s,@DEPDIR@,$DEPDIR,;t t -+s,@am__include@,$am__include,;t t -+s,@am__quote@,$am__quote,;t t -+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -+s,@CCDEPMODE@,$CCDEPMODE,;t t -+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -+s,@RANLIB@,$RANLIB,;t t -+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -+s,@CPP@,$CPP,;t t -+s,@EGREP@,$EGREP,;t t -+s,@ENDIAN@,$ENDIAN,;t t -+s,@build@,$build,;t t -+s,@build_cpu@,$build_cpu,;t t -+s,@build_vendor@,$build_vendor,;t t -+s,@build_os@,$build_os,;t t -+s,@host@,$host,;t t -+s,@host_cpu@,$host_cpu,;t t -+s,@host_vendor@,$host_vendor,;t t -+s,@host_os@,$host_os,;t t -+s,@SED@,$SED,;t t -+s,@LN_S@,$LN_S,;t t -+s,@ECHO@,$ECHO,;t t -+s,@AR@,$AR,;t t -+s,@ac_ct_AR@,$ac_ct_AR,;t t -+s,@CXX@,$CXX,;t t -+s,@CXXFLAGS@,$CXXFLAGS,;t t -+s,@ac_ct_CXX@,$ac_ct_CXX,;t t -+s,@CXXDEPMODE@,$CXXDEPMODE,;t t -+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t -+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t -+s,@CXXCPP@,$CXXCPP,;t t -+s,@F77@,$F77,;t t -+s,@FFLAGS@,$FFLAGS,;t t -+s,@ac_ct_F77@,$ac_ct_F77,;t t -+s,@LIBTOOL@,$LIBTOOL,;t t -+s,@DEBUG_TRUE@,$DEBUG_TRUE,;t t -+s,@DEBUG_FALSE@,$DEBUG_FALSE,;t t -+s,@LIBOBJS@,$LIBOBJS,;t t -+s,@LTLIBOBJS@,$LTLIBOBJS,;t t -+CEOF -+ -+_ACEOF -+ -+ cat >>$CONFIG_STATUS <<\_ACEOF -+ # Split the substitutions into bite-sized pieces for seds with -+ # small command number limits, like on Digital OSF/1 and HP-UX. -+ ac_max_sed_lines=48 -+ ac_sed_frag=1 # Number of current file. -+ ac_beg=1 # First line for current file. -+ ac_end=$ac_max_sed_lines # Line after last line for current file. -+ ac_more_lines=: -+ ac_sed_cmds= -+ while $ac_more_lines; do -+ if test $ac_beg -gt 1; then -+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag -+ else -+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag -+ fi -+ if test ! -s $tmp/subs.frag; then -+ ac_more_lines=false -+ else -+ # The purpose of the label and of the branching condition is to -+ # speed up the sed processing (if there are no `@' at all, there -+ # is no need to browse any of the substitutions). -+ # These are the two extra sed commands mentioned above. -+ (echo ':t -+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed -+ if test -z "$ac_sed_cmds"; then -+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" -+ else -+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" -+ fi -+ ac_sed_frag=`expr $ac_sed_frag + 1` -+ ac_beg=$ac_end -+ ac_end=`expr $ac_end + $ac_max_sed_lines` -+ fi -+ done -+ if test -z "$ac_sed_cmds"; then -+ ac_sed_cmds=cat -+ fi -+fi # test -n "$CONFIG_FILES" -+ -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue -+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". -+ case $ac_file in -+ - | *:- | *:-:* ) # input from stdin -+ cat >$tmp/stdin -+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ * ) ac_file_in=$ac_file.in ;; -+ esac -+ -+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. -+ ac_dir=`(dirname "$ac_file") 2>/dev/null || -+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_file" : 'X\(//\)[^/]' \| \ -+ X"$ac_file" : 'X\(//\)$' \| \ -+ X"$ac_file" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$ac_file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p "$ac_dir" -+ else -+ as_dir="$ac_dir" -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ ac_builddir=. -+ -+if test "$ac_dir" != .; then -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A "../" for each directory in $ac_dir_suffix. -+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -+else -+ ac_dir_suffix= ac_top_builddir= -+fi -+ -+case $srcdir in -+ .) # No --srcdir option. We are building in place. -+ ac_srcdir=. -+ if test -z "$ac_top_builddir"; then -+ ac_top_srcdir=. -+ else -+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -+ fi ;; -+ [\\/]* | ?:[\\/]* ) # Absolute path. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir ;; -+ *) # Relative path. -+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_builddir$srcdir ;; -+esac -+ -+# Do not use `cd foo && pwd` to compute absolute paths, because -+# the directories may not exist. -+case `pwd` in -+.) ac_abs_builddir="$ac_dir";; -+*) -+ case "$ac_dir" in -+ .) ac_abs_builddir=`pwd`;; -+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -+ *) ac_abs_builddir=`pwd`/"$ac_dir";; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_builddir=${ac_top_builddir}.;; -+*) -+ case ${ac_top_builddir}. in -+ .) ac_abs_top_builddir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_srcdir=$ac_srcdir;; -+*) -+ case $ac_srcdir in -+ .) ac_abs_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_srcdir=$ac_top_srcdir;; -+*) -+ case $ac_top_srcdir in -+ .) ac_abs_top_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -+ esac;; -+esac -+ -+ -+ case $INSTALL in -+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; -+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;; -+ esac -+ -+ if test x"$ac_file" != x-; then -+ { echo "$as_me:$LINENO: creating $ac_file" >&5 -+echo "$as_me: creating $ac_file" >&6;} -+ rm -f "$ac_file" -+ fi -+ # 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. */ -+ if test x"$ac_file" = x-; then -+ configure_input= -+ else -+ configure_input="$ac_file. " -+ fi -+ configure_input=$configure_input"Generated from `echo $ac_file_in | -+ sed 's,.*/,,'` by configure." -+ -+ # First look for the input files in the build tree, otherwise in the -+ # src tree. -+ ac_file_inputs=`IFS=: -+ for f in $ac_file_in; do -+ case $f in -+ -) echo $tmp/stdin ;; -+ [\\/$]*) -+ # Absolute (can't be DOS-style, as IFS=:) -+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ echo "$f";; -+ *) # Relative -+ if test -f "$f"; then -+ # Build tree -+ echo "$f" -+ elif test -f "$srcdir/$f"; then -+ # Source tree -+ echo "$srcdir/$f" -+ else -+ # /dev/null tree -+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ fi;; -+ esac -+ done` || { (exit 1); exit 1; } -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF -+ sed "$ac_vpsub -+$extrasub -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+:t -+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -+s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t -+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -+s,@INSTALL@,$ac_INSTALL,;t t -+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out -+ rm -f $tmp/stdin -+ if test x"$ac_file" != x-; then -+ mv $tmp/out $ac_file -+ else -+ cat $tmp/out -+ rm -f $tmp/out -+ fi -+ -+done -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+ -+# -+# CONFIG_HEADER section. -+# -+ -+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -+# NAME is the cpp macro being defined and VALUE is the value it is being given. -+# -+# ac_d sets the value in "#define NAME VALUE" lines. -+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -+ac_dB='[ ].*$,\1#\2' -+ac_dC=' ' -+ac_dD=',;t' -+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -+ac_uB='$,\1#\2define\3' -+ac_uC=' ' -+ac_uD=',;t' -+ -+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue -+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". -+ case $ac_file in -+ - | *:- | *:-:* ) # input from stdin -+ cat >$tmp/stdin -+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -+ * ) ac_file_in=$ac_file.in ;; -+ esac -+ -+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -+echo "$as_me: creating $ac_file" >&6;} -+ -+ # First look for the input files in the build tree, otherwise in the -+ # src tree. -+ ac_file_inputs=`IFS=: -+ for f in $ac_file_in; do -+ case $f in -+ -) echo $tmp/stdin ;; -+ [\\/$]*) -+ # Absolute (can't be DOS-style, as IFS=:) -+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ # Do quote $f, to prevent DOS paths from being IFS'd. -+ echo "$f";; -+ *) # Relative -+ if test -f "$f"; then -+ # Build tree -+ echo "$f" -+ elif test -f "$srcdir/$f"; then -+ # Source tree -+ echo "$srcdir/$f" -+ else -+ # /dev/null tree -+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -+echo "$as_me: error: cannot find input file: $f" >&2;} -+ { (exit 1); exit 1; }; } -+ fi;; -+ esac -+ done` || { (exit 1); exit 1; } -+ # Remove the trailing spaces. -+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in -+ -+_ACEOF -+ -+# Transform confdefs.h into two sed scripts, `conftest.defines' and -+# `conftest.undefs', that substitutes the proper values into -+# config.h.in to produce config.h. The first handles `#define' -+# templates, and the second `#undef' templates. -+# And first: Protect against being on the right side of a sed subst in -+# config.status. Protect against being in an unquoted here document -+# in config.status. -+rm -f conftest.defines conftest.undefs -+# Using a here document instead of a string reduces the quoting nightmare. -+# Putting comments in sed scripts is not portable. -+# -+# `end' is used to avoid that the second main sed command (meant for -+# 0-ary CPP macros) applies to n-ary macro definitions. -+# See the Autoconf documentation for `clear'. -+cat >confdef2sed.sed <<\_ACEOF -+s/[\\&,]/\\&/g -+s,[\\$`],\\&,g -+t clear -+: clear -+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -+t end -+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -+: end -+_ACEOF -+# If some macros were called several times there might be several times -+# the same #defines, which is useless. Nevertheless, we may not want to -+# sort them, since we want the *last* AC-DEFINE to be honored. -+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -+rm -f confdef2sed.sed -+ -+# This sed command replaces #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. -+cat >>conftest.undefs <<\_ACEOF -+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -+_ACEOF -+ -+# Break up conftest.defines because some shells have a limit on the size -+# of here documents, and old seds have small limits too (100 cmds). -+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -+echo ' :' >>$CONFIG_STATUS -+rm -f conftest.tail -+while grep . conftest.defines >/dev/null -+do -+ # Write a limited-size here document to $tmp/defines.sed. -+ echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS -+ # Speed up: don't consider the non `#define' lines. -+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS -+ # Work around the forget-to-reset-the-flag bug. -+ echo 't clr' >>$CONFIG_STATUS -+ echo ': clr' >>$CONFIG_STATUS -+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS -+ echo 'CEOF -+ sed -f $tmp/defines.sed $tmp/in >$tmp/out -+ rm -f $tmp/in -+ mv $tmp/out $tmp/in -+' >>$CONFIG_STATUS -+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail -+ rm -f conftest.defines -+ mv conftest.tail conftest.defines -+done -+rm -f conftest.defines -+echo ' fi # grep' >>$CONFIG_STATUS -+echo >>$CONFIG_STATUS -+ -+# Break up conftest.undefs because some shells have a limit on the size -+# of here documents, and old seds have small limits too (100 cmds). -+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -+rm -f conftest.tail -+while grep . conftest.undefs >/dev/null -+do -+ # Write a limited-size here document to $tmp/undefs.sed. -+ echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS -+ # Speed up: don't consider the non `#undef' -+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS -+ # Work around the forget-to-reset-the-flag bug. -+ echo 't clr' >>$CONFIG_STATUS -+ echo ': clr' >>$CONFIG_STATUS -+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS -+ echo 'CEOF -+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out -+ rm -f $tmp/in -+ mv $tmp/out $tmp/in -+' >>$CONFIG_STATUS -+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail -+ rm -f conftest.undefs -+ mv conftest.tail conftest.undefs -+done -+rm -f conftest.undefs -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+ # 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. */ -+ if test x"$ac_file" = x-; then -+ echo "/* Generated by configure. */" >$tmp/config.h -+ else -+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h -+ fi -+ cat $tmp/in >>$tmp/config.h -+ rm -f $tmp/in -+ if test x"$ac_file" != x-; then -+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then -+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -+echo "$as_me: $ac_file is unchanged" >&6;} -+ else -+ ac_dir=`(dirname "$ac_file") 2>/dev/null || -+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_file" : 'X\(//\)[^/]' \| \ -+ X"$ac_file" : 'X\(//\)$' \| \ -+ X"$ac_file" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$ac_file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p "$ac_dir" -+ else -+ as_dir="$ac_dir" -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ rm -f $ac_file -+ mv $tmp/config.h $ac_file -+ fi -+ else -+ cat $tmp/config.h -+ rm -f $tmp/config.h -+ fi -+# Compute $ac_file's index in $config_headers. -+_am_stamp_count=1 -+for _am_header in $config_headers :; do -+ case $_am_header in -+ $ac_file | $ac_file:* ) -+ break ;; -+ * ) -+ _am_stamp_count=`expr $_am_stamp_count + 1` ;; -+ esac -+done -+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || -+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X$ac_file : 'X\(//\)[^/]' \| \ -+ X$ac_file : 'X\(//\)$' \| \ -+ X$ac_file : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X$ac_file | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'`/stamp-h$_am_stamp_count -+done -+_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF -+ -+# -+# CONFIG_COMMANDS section. -+# -+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue -+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'` -+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` -+ ac_dir=`(dirname "$ac_dest") 2>/dev/null || -+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$ac_dest" : 'X\(//\)[^/]' \| \ -+ X"$ac_dest" : 'X\(//\)$' \| \ -+ X"$ac_dest" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$ac_dest" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p "$ac_dir" -+ else -+ as_dir="$ac_dir" -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ ac_builddir=. -+ -+if test "$ac_dir" != .; then -+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -+ # A "../" for each directory in $ac_dir_suffix. -+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -+else -+ ac_dir_suffix= ac_top_builddir= -+fi -+ -+case $srcdir in -+ .) # No --srcdir option. We are building in place. -+ ac_srcdir=. -+ if test -z "$ac_top_builddir"; then -+ ac_top_srcdir=. -+ else -+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -+ fi ;; -+ [\\/]* | ?:[\\/]* ) # Absolute path. -+ ac_srcdir=$srcdir$ac_dir_suffix; -+ ac_top_srcdir=$srcdir ;; -+ *) # Relative path. -+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -+ ac_top_srcdir=$ac_top_builddir$srcdir ;; -+esac -+ -+# Do not use `cd foo && pwd` to compute absolute paths, because -+# the directories may not exist. -+case `pwd` in -+.) ac_abs_builddir="$ac_dir";; -+*) -+ case "$ac_dir" in -+ .) ac_abs_builddir=`pwd`;; -+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -+ *) ac_abs_builddir=`pwd`/"$ac_dir";; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_builddir=${ac_top_builddir}.;; -+*) -+ case ${ac_top_builddir}. in -+ .) ac_abs_top_builddir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_srcdir=$ac_srcdir;; -+*) -+ case $ac_srcdir in -+ .) ac_abs_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -+ esac;; -+esac -+case $ac_abs_builddir in -+.) ac_abs_top_srcdir=$ac_top_srcdir;; -+*) -+ case $ac_top_srcdir in -+ .) ac_abs_top_srcdir=$ac_abs_builddir;; -+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -+ esac;; -+esac -+ -+ -+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -+echo "$as_me: executing $ac_dest commands" >&6;} -+ case $ac_dest in -+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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. -+ # So let's grep whole file. -+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then -+ dirpart=`(dirname "$mf") 2>/dev/null || -+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$mf" : 'X\(//\)[^/]' \| \ -+ X"$mf" : 'X\(//\)$' \| \ -+ X"$mf" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+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"` -+ # When using ansi2knr, U may be empty or an underscore; expand it -+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/g'`; do -+ # Make sure the directory exists. -+ test -f "$dirpart/$file" && continue -+ fdir=`(dirname "$file") 2>/dev/null || -+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$file" : 'X\(//\)[^/]' \| \ -+ X"$file" : 'X\(//\)$' \| \ -+ X"$file" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$file" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ { if $as_mkdir_p; then -+ mkdir -p $dirpart/$fdir -+ else -+ as_dir=$dirpart/$fdir -+ as_dirs= -+ while test ! -d "$as_dir"; do -+ as_dirs="$as_dir $as_dirs" -+ as_dir=`(dirname "$as_dir") 2>/dev/null || -+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -+ X"$as_dir" : 'X\(//\)[^/]' \| \ -+ X"$as_dir" : 'X\(//\)$' \| \ -+ X"$as_dir" : 'X\(/\)' \| \ -+ . : '\(.\)' 2>/dev/null || -+echo X"$as_dir" | -+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` -+ done -+ test ! -n "$as_dirs" || mkdir $as_dirs -+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} -+ { (exit 1); exit 1; }; }; } -+ -+ # echo "creating $dirpart/$file" -+ echo '# dummy' > "$dirpart/$file" -+ done -+done -+ ;; -+ default ) echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h ;; -+ esac -+done -+_ACEOF -+ -+cat >>$CONFIG_STATUS <<\_ACEOF -+ -+{ (exit 0); exit 0; } -+_ACEOF -+chmod +x $CONFIG_STATUS -+ac_clean_files=$ac_clean_files_save -+ -+ -+# 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 || { (exit 1); exit 1; } -+fi -+# -diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac -new file mode 100644 -index 0000000..34f0481 ---- /dev/null -+++ b/iscsiuio/configure.ac -@@ -0,0 +1,76 @@ -+dnl iscsiuio uIP user space stack configure.ac file -+dnl -+dnl Copyright (c) 2004-2013 Broadcom Corporation -+dnl -+dnl This program is free software; you can redistribute it and/or modify -+dnl it under the terms of the GNU General Public License as published by -+dnl the Free Software Foundation. -+dnl -+dnl Written by: Eddie Wai (eddie.wai@broadcom.com) -+dnl Benjamin Li (benli@broadcom.com) -+dnl -+ -+PACKAGE=iscsiuio -+VERSION=0.7.6.1g -+ -+AC_INIT(iscsiuio, 0.7.6.1g, eddie.wai@broadcom.com) -+ -+AM_INIT_AUTOMAKE($PACKAGE, $VERSION) -+AC_CONFIG_HEADER(config.h) -+AC_PATH_PROGS(BASH, bash) -+ -+AC_PROG_CC -+AM_PROG_CC_C_O -+ -+AC_PROG_RANLIB -+ -+AC_GNU_SOURCE -+AC_PROG_INSTALL -+AC_PROG_GCC_TRADITIONAL -+ -+# Checks for typedefs, structures, and compiler characteristics. -+AC_C_CONST -+AC_C_INLINE -+AC_TYPE_OFF_T -+AC_TYPE_SIZE_T -+AC_CHECK_TYPES(int8_t) -+AC_CHECK_TYPES(uint8_t) -+AC_CHECK_TYPES(int16_t) -+AC_CHECK_TYPES(uint16_t) -+AC_CHECK_TYPES(int32_t) -+AC_CHECK_TYPES(uint32_t) -+AC_CHECK_TYPES(int64_t) -+AC_CHECK_TYPES(uint64_t) -+AC_CHECK_SIZEOF(short, 2) -+AC_CHECK_SIZEOF(int, 4) -+AC_CHECK_SIZEOF(long, 4) -+ -+AC_C_BIGENDIAN(AC_SUBST([ENDIAN],[BIG]),AC_SUBST([ENDIAN],[LITTLE])) -+ -+AC_LIBTOOL_DLOPEN -+ -+# libtool stuff -+AC_PROG_LIBTOOL -+ -+CFLAGS="-O2 -Wall" -+## check for --enable-debug first before checking CFLAGS before -+## so that we don't mix -O and -g -+AC_ARG_ENABLE(debug, -+[ --enable-debug Turn on compiler debugging information (default=no)], -+ [if eval "test x$enable_debug = xyes"; then -+ CFLAGS="${CFLAGS} -g -O0" -+ fi]) -+AM_CONDITIONAL([DEBUG], [test x$debug = xtrue]) -+ -+AC_CONFIG_COMMANDS([default],[[ echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h]],[[]]) -+ -+AC_PREFIX_DEFAULT() -+ -+AC_OUTPUT([Makefile -+src/Makefile -+src/apps/Makefile -+src/apps/dhcpc/Makefile -+src/apps/brcm-iscsi/Makefile -+src/uip/Makefile -+src/unix/Makefile -+src/unix/libs/Makefile]) -diff --git a/iscsiuio/depcomp b/iscsiuio/depcomp -new file mode 100755 -index 0000000..e5f9736 ---- /dev/null -+++ b/iscsiuio/depcomp -@@ -0,0 +1,589 @@ -+#! /bin/sh -+# depcomp - compile a program generating dependencies as side-effects -+ -+scriptversion=2007-03-29.01 -+ -+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 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, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -+# 02110-1301, USA. -+ -+# 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 outputing dependencies. -+ libtool Whether libtool is used (yes/no). -+ -+Report bugs to . -+EOF -+ exit $? -+ ;; -+ -v | --v*) -+ echo "depcomp $scriptversion" -+ exit $? -+ ;; -+esac -+ -+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" -+ -+# 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 -+ -+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 -eq 0; then : -+ else -+ rm -f "$tmpdepfile" -+ exit $stat -+ fi -+ mv "$tmpdepfile" "$depfile" -+ ;; -+ -+gcc) -+## 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). -+## - 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 -eq 0; then : -+ else -+ rm -f "$tmpdepfile" -+ exit $stat -+ fi -+ rm -f "$depfile" -+ echo "$object : \\" > "$depfile" -+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -+## 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. -+ tr ' ' ' -+' < "$tmpdepfile" | -+## 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. -+## Some versions of the HPUX 10.20 sed can't process this invocation -+## correctly. Breaking it into two sed invocations is a workaround. -+ sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then : -+ else -+ 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 ' ' ' -+' < "$tmpdepfile" \ -+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ -+ tr ' -+' ' ' >> $depfile -+ echo >> $depfile -+ -+ # The second pass generates a dummy entry for each header file. -+ tr ' ' ' -+' < "$tmpdepfile" \ -+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ -+ >> $depfile -+ else -+ # The sourcefile does not contain any dependencies, so just -+ # store a dummy comment line, to avoid errors with the Makefile -+ # "include basename.Plo" scheme. -+ echo "#dummy" > "$depfile" -+ fi -+ rm -f "$tmpdepfile" -+ ;; -+ -+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. -+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` -+ test "x$dir" = "x$object" && dir= -+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` -+ 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 -eq 0; then : -+ else -+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" -+ exit $stat -+ fi -+ -+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" -+ do -+ test -f "$tmpdepfile" && break -+ done -+ if test -f "$tmpdepfile"; then -+ # Each line is of the form `foo.o: dependent.h'. -+ # Do two passes, one to just change these to -+ # `$object: dependent.h' and one to simply `dependent.h:'. -+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" -+ # That's a tab and a space in the []. -+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" -+ else -+ # The sourcefile does not contain any dependencies, so just -+ # store a dummy comment line, to avoid errors with the Makefile -+ # "include basename.Plo" scheme. -+ echo "#dummy" > "$depfile" -+ fi -+ rm -f "$tmpdepfile" -+ ;; -+ -+icc) -+ # Intel's C compiler understands `-MD -MF file'. However on -+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c -+ # ICC 7.0 will fill foo.d with something like -+ # foo.o: sub/foo.c -+ # foo.o: sub/foo.h -+ # which is wrong. We want: -+ # sub/foo.o: sub/foo.c -+ # sub/foo.o: sub/foo.h -+ # sub/foo.c: -+ # sub/foo.h: -+ # ICC 7.1 will output -+ # foo.o: sub/foo.c sub/foo.h -+ # and will wrap long lines using \ : -+ # foo.o: sub/foo.c ... \ -+ # sub/foo.h ... \ -+ # ... -+ -+ "$@" -MD -MF "$tmpdepfile" -+ stat=$? -+ if test $stat -eq 0; then : -+ else -+ 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. -+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` -+ test "x$dir" = "x$object" && dir= -+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` -+ 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 -eq 0; then : -+ else -+ 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" -+ # Add `dependent.h:' lines. -+ sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" -+ else -+ echo "#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. -+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` -+ test "x$dir" = "x$object" && dir= -+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` -+ -+ if test "$libtool" = yes; then -+ # With Tru64 cc, shared objects can also be used to make a -+ # static library. This mechanism is used in libtool 1.4 series to -+ # handle both shared and static libraries in a single compilation. -+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. -+ # -+ # With libtool 1.5 this exception was removed, and libtool now -+ # 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.libs/$base.lo.d # libtool 1.4 -+ tmpdepfile2=$dir$base.o.d # libtool 1.5 -+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 -+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 -+ "$@" -Wc,-MD -+ else -+ tmpdepfile1=$dir$base.o.d -+ tmpdepfile2=$dir$base.d -+ tmpdepfile3=$dir$base.d -+ tmpdepfile4=$dir$base.d -+ "$@" -MD -+ fi -+ -+ stat=$? -+ if test $stat -eq 0; then : -+ else -+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" -+ exit $stat -+ fi -+ -+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" -+ do -+ test -f "$tmpdepfile" && break -+ done -+ if test -f "$tmpdepfile"; then -+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" -+ # That's a tab and a space in the []. -+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" -+ else -+ echo "#dummy" > "$depfile" -+ fi -+ rm -f "$tmpdepfile" -+ ;; -+ -+#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 $1 != '--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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" -+ rm -f "$depfile" -+ cat < "$tmpdepfile" > "$depfile" -+ tr ' ' ' -+' < "$tmpdepfile" | \ -+## Some versions of the HPUX 10.20 sed can't process this invocation -+## correctly. Breaking it into two sed invocations is a workaround. -+ 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 $1 != '--mode=compile'; do -+ shift -+ done -+ shift -+ fi -+ # X makedepend -+ shift -+ cleared=no -+ for arg in "$@"; do -+ case $cleared in -+ no) -+ set ""; shift -+ cleared=yes ;; -+ esac -+ 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. -+ -*|$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" -+ cat < "$tmpdepfile" > "$depfile" -+ sed '1,2d' "$tmpdepfile" | tr ' ' ' -+' | \ -+## Some versions of the HPUX 10.20 sed can't process this invocation -+## correctly. Breaking it into two sed invocations is a workaround. -+ 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 $1 != '--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, regardless of -o, -+ # because we must use -o when running libtool. -+ "$@" || exit $? -+ IFS=" " -+ for arg -+ do -+ case "$arg" in -+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") -+ set fnord "$@" -+ shift -+ shift -+ ;; -+ *) -+ set fnord "$@" "$arg" -+ shift -+ shift -+ ;; -+ esac -+ done -+ "$@" -E | -+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" -+ rm -f "$depfile" -+ echo "$object : \\" > "$depfile" -+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" -+ echo " " >> "$depfile" -+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" -+ rm -f "$tmpdepfile" -+ ;; -+ -+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-end: "$" -+# End: -diff --git a/iscsiuio/docs/iscsiuio.8 b/iscsiuio/docs/iscsiuio.8 -new file mode 100644 -index 0000000..2f577bc ---- /dev/null -+++ b/iscsiuio/docs/iscsiuio.8 -@@ -0,0 +1,86 @@ -+.\" Copyright (c) 2010-2013 Broadcom Corporation -+.\" This is free documentation; you can redistribute it and/or -+.\" modify it under the terms of the GNU General Public License as -+.\" published by the Free Software Foundation. -+.\" -+.\" bnx2.4,v 0.7.6.1g -+.\" -+.TH iscsiuio 8 "01/14/2013" "Broadcom Corporation" -+.\" -+.\" NAME part -+.\" -+.SH NAME -+iscsiuio \- iSCSI UserSpace I/O driver -+.\" -+.\" SYNOPSIS part -+.\" -+.SH SYNOPSIS -+.B iscsiuio -+.RB [ -d -f -v ] -+.PP -+.\" -+.\" DESCRIPTION part -+.\" -+.SH DESCRIPTION -+iscsiuio is the UserSpace I/O driver for the Broadcom NetXtreme II -+BCM5706/5708/5709 series PCI/PCI-X Gigabit Ethernet Network Interface Card -+(NIC) and for the Broadcom NetXtreme II BCM57710/57711/57712/57800/57810/57840 -+series PCI-E 10 Gigabit Ethernet Network Interface Card. -+The driver has been tested on 2.6.28 kernels and above. -+.PP -+Refer to the README.TXT from the driver package on how to -+compile and install the driver. -+.PP -+Refer to various Linux documentations -+on how to configure network protocol and address. -+.\" -+.\" DRIVER DEPENDENCIES part -+.\" -+.SH DRIVER DEPENDENCIES -+ -+.\" -+.\" PARAMETER part -+.\" -+.SH PARAMETERS -+There are very few parameters when running this application. -+.TP -+.BI -d -+This is to enable debug mode where debug messages will be sent to stdout -+The following debug modes are supported -+.P -+.RS -+DEBUG 4 - Print all messages -+.P -+INFO 3 - Print messages needed to follow the uIP code (default) -+.P -+WARN 2 - Print warning messages -+.P -+ERROR 1 - Only print critical errors -+.RE -+.PP -+.TP -+.TP -+.BI -f -+This is to enable forground mode so that this application doesn't get sent -+into the background. -+.PP -+.TP -+.BI -v -+This is to print the version. -+.PP -+.TP -+.BI -p -+Use pidfile (default /var/run/iscsiuio.pid ) -+.PP -+.TP -+.BI -h -+Display this help and exit. -+ -+ -+.\" -+.\" AUTHOR part -+.\" -+.SH AUTHOR -+Eddie Wai \- eddie.wai@broadcom.com -+.P -+Benjamin Li \- benli@broadcom.com -diff --git a/iscsiuio/install-sh b/iscsiuio/install-sh -new file mode 100755 -index 0000000..a5897de ---- /dev/null -+++ b/iscsiuio/install-sh -@@ -0,0 +1,519 @@ -+#!/bin/sh -+# install - install a program, script, or datafile -+ -+scriptversion=2006-12-25.00 -+ -+# 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 -+ 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 -+ 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 -+ trap '(exit $?); exit' 1 2 13 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 starting with `-'. -+ 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 -+ # Protect names starting with `-'. -+ case $dst in -+ -*) dst=./$dst;; -+ esac -+ -+ # 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-writeable 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 -z "$d" && 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-end: "$" -+# End: -diff --git a/iscsiuio/iscsiuiolog b/iscsiuio/iscsiuiolog -new file mode 100644 -index 0000000..360947c ---- /dev/null -+++ b/iscsiuio/iscsiuiolog -@@ -0,0 +1,10 @@ -+/var/log/iscsiuio.log { -+ weekly -+ missingok -+ notifempty -+ rotate 4 -+ sharedscripts -+ postrotate -+ pkill -USR1 iscsiuio 2> /dev/null || true -+ endscript -+} -diff --git a/iscsiuio/ltmain.sh b/iscsiuio/ltmain.sh -new file mode 100755 -index 0000000..10c9130 ---- /dev/null -+++ b/iscsiuio/ltmain.sh -@@ -0,0 +1,6912 @@ -+# ltmain.sh - Provide generalized library-building support services. -+# NOTE: Changing this file will not affect anything until you rerun configure. -+# -+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 -+# Free Software Foundation, Inc. -+# Originally by Gordon Matzigkeit , 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+# -+# 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. -+ -+basename="s,^.*/,,g" -+ -+# 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" -+ -+# The name of this program: -+progname=`echo "$progpath" | $SED $basename` -+modename="$progname" -+ -+# Global variables: -+EXIT_SUCCESS=0 -+EXIT_FAILURE=1 -+ -+PROGRAM=ltmain.sh -+PACKAGE=libtool -+VERSION=1.5.22 -+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" -+ -+# Be Bourne compatible (taken from Autoconf:_AS_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 -+ -+# Check that we have a working $echo. -+if test "X$1" = X--no-reexec; then -+ # Discard the --no-reexec flag, and continue. -+ shift -+elif test "X$1" = X--fallback-echo; then -+ # Avoid inline document here, it may be left over -+ : -+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then -+ # Yippee, $echo works! -+ : -+else -+ # Restart under the correct shell, and then maybe $echo will work. -+ exec $SHELL "$progpath" --no-reexec ${1+"$@"} -+fi -+ -+if test "X$1" = X--fallback-echo; then -+ # used as fallback echo -+ shift -+ cat <&2 -+ $echo "Fatal configuration error. " -+ $echo "See the $PACKAGE docs for more information." 1>&2 -+ exit $EXIT_FAILURE -+fi -+ -+# Global variables. -+mode=$default_mode -+nonopt= -+prev= -+prevopt= -+run= -+show="$echo" -+show_help= -+execute_dlfiles= -+duplicate_deps=no -+preserve_args= -+lo2o="s/\\.lo\$/.${objext}/" -+o2lo="s/\\.${objext}\$/.lo/" -+extracted_archives= -+extracted_serial=0 -+ -+##################################### -+# Shell function definitions: -+# This seems to be the best place for them -+ -+# 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 "$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" || { -+ $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 -+ exit $EXIT_FAILURE -+ } -+ fi -+ -+ $echo "X$my_tmpdir" | $Xsed -+} -+ -+ -+# 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. -+func_win32_libid () -+{ -+ 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 -+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ -+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then -+ win32_nmres=`eval $NM -f posix -A $1 | \ -+ $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_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 () -+{ -+ if test -n "$available_tags" && test -z "$tagname"; then -+ CC_quoted= -+ for arg in $CC; do -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ CC_quoted="$CC_quoted $arg" -+ done -+ 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; -+ # 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. -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ CC_quoted="$CC_quoted $arg" -+ done -+ case "$@ " in -+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) -+ # 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 -+ $echo "$modename: unable to infer tagged configuration" -+ $echo "$modename: specify a tag with \`--tag'" 1>&2 -+ exit $EXIT_FAILURE -+# else -+# $echo "$modename: using $tagname tagged configuration" -+ fi -+ ;; -+ esac -+ fi -+} -+ -+ -+# func_extract_an_archive dir oldlib -+func_extract_an_archive () -+{ -+ f_ex_an_ar_dir="$1"; shift -+ f_ex_an_ar_oldlib="$1" -+ -+ $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" -+ $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? -+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then -+ : -+ else -+ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+} -+ -+# func_extract_archives gentop oldlib ... -+func_extract_archives () -+{ -+ my_gentop="$1"; shift -+ my_oldlibs=${1+"$@"} -+ my_oldobjs="" -+ my_xlib="" -+ my_xabs="" -+ my_xdir="" -+ my_status="" -+ -+ $show "${rm}r $my_gentop" -+ $run ${rm}r "$my_gentop" -+ $show "$mkdir $my_gentop" -+ $run $mkdir "$my_gentop" -+ my_status=$? -+ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then -+ exit $my_status -+ fi -+ -+ 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 -+ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` -+ my_xlib_u=$my_xlib -+ while :; do -+ case " $extracted_archives " in -+ *" $my_xlib_u "*) -+ extracted_serial=`expr $extracted_serial + 1` -+ 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" -+ -+ $show "${rm}r $my_xdir" -+ $run ${rm}r "$my_xdir" -+ $show "$mkdir $my_xdir" -+ $run $mkdir "$my_xdir" -+ exit_status=$? -+ if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then -+ exit $exit_status -+ fi -+ case $host in -+ *-darwin*) -+ $show "Extracting $my_xabs" -+ # Do not bother doing anything if just a dry run -+ if test -z "$run"; then -+ darwin_orig_dir=`pwd` -+ cd $my_xdir || exit $? -+ darwin_archive=$my_xabs -+ darwin_curdir=`pwd` -+ darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` -+ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` -+ if test -n "$darwin_arches"; then -+ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` -+ darwin_arch= -+ $show "$darwin_base_archive has multiple architectures $darwin_arches" -+ for darwin_arch in $darwin_arches ; do -+ 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 have a bunch of thin objects, gotta fatten them up :) -+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` -+ darwin_file= -+ darwin_files= -+ for darwin_file in $darwin_filelist; do -+ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` -+ lipo -create -output "$darwin_file" $darwin_files -+ done # $darwin_filelist -+ ${rm}r unfat-$$ -+ cd "$darwin_orig_dir" -+ else -+ cd "$darwin_orig_dir" -+ func_extract_an_archive "$my_xdir" "$my_xabs" -+ fi # $darwin_arches -+ fi # $run -+ ;; -+ *) -+ func_extract_an_archive "$my_xdir" "$my_xabs" -+ ;; -+ esac -+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` -+ done -+ func_extract_archives_result="$my_oldobjs" -+} -+# End of Shell function definitions -+##################################### -+ -+# Darwin sucks -+eval std_shrext=\"$shrext_cmds\" -+ -+disable_libs=no -+ -+# Parse our command line options once, thoroughly. -+while test "$#" -gt 0 -+do -+ arg="$1" -+ shift -+ -+ case $arg in -+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; -+ *) optarg= ;; -+ esac -+ -+ # If the previous option needs an argument, assign it. -+ if test -n "$prev"; then -+ case $prev in -+ execute_dlfiles) -+ execute_dlfiles="$execute_dlfiles $arg" -+ ;; -+ tag) -+ tagname="$arg" -+ preserve_args="${preserve_args}=$arg" -+ -+ # Check whether tagname contains only valid characters -+ case $tagname in -+ *[!-_A-Za-z0-9,/]*) -+ $echo "$progname: invalid tag name: $tagname" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ -+ case $tagname in -+ CC) -+ # Don't test for the "default" C tag, as we know, it's there, but -+ # not specially marked. -+ ;; -+ *) -+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then -+ taglist="$taglist $tagname" -+ # Evaluate the configuration. -+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" -+ else -+ $echo "$progname: ignoring unknown tag $tagname" 1>&2 -+ fi -+ ;; -+ esac -+ ;; -+ *) -+ eval "$prev=\$arg" -+ ;; -+ esac -+ -+ prev= -+ prevopt= -+ continue -+ fi -+ -+ # Have we seen a non-optional argument yet? -+ case $arg in -+ --help) -+ show_help=yes -+ ;; -+ -+ --version) -+ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" -+ $echo -+ $echo "Copyright (C) 2005 Free Software Foundation, Inc." -+ $echo "This is free software; see the source for copying conditions. There is NO" -+ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." -+ exit $? -+ ;; -+ -+ --config) -+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath -+ # Now print the configurations for the tags. -+ for tagname in $taglist; do -+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" -+ done -+ exit $? -+ ;; -+ -+ --debug) -+ $echo "$progname: enabling shell trace mode" -+ set -x -+ preserve_args="$preserve_args $arg" -+ ;; -+ -+ --dry-run | -n) -+ run=: -+ ;; -+ -+ --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 $? -+ ;; -+ -+ --finish) mode="finish" ;; -+ -+ --mode) prevopt="--mode" prev=mode ;; -+ --mode=*) mode="$optarg" ;; -+ -+ --preserve-dup-deps) duplicate_deps="yes" ;; -+ -+ --quiet | --silent) -+ show=: -+ preserve_args="$preserve_args $arg" -+ ;; -+ -+ --tag) -+ prevopt="--tag" -+ prev=tag -+ preserve_args="$preserve_args --tag" -+ ;; -+ --tag=*) -+ set tag "$optarg" ${1+"$@"} -+ shift -+ prev=tag -+ preserve_args="$preserve_args --tag" -+ ;; -+ -+ -dlopen) -+ prevopt="-dlopen" -+ prev=execute_dlfiles -+ ;; -+ -+ -*) -+ $echo "$modename: unrecognized option \`$arg'" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ -+ *) -+ nonopt="$arg" -+ break -+ ;; -+ esac -+done -+ -+if test -n "$prevopt"; then -+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+fi -+ -+case $disable_libs in -+no) -+ ;; -+shared) -+ build_libtool_libs=no -+ build_old_libs=yes -+ ;; -+static) -+ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -+ ;; -+esac -+ -+# 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= -+ -+if test -z "$show_help"; then -+ -+ # Infer the operation mode. -+ if test -z "$mode"; then -+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 -+ $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 -+ case $nonopt in -+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) -+ mode=link -+ for arg -+ do -+ case $arg in -+ -c) -+ mode=compile -+ break -+ ;; -+ esac -+ done -+ ;; -+ *db | *dbx | *strace | *truss) -+ mode=execute -+ ;; -+ *install*|cp|mv) -+ mode=install -+ ;; -+ *rm) -+ mode=uninstall -+ ;; -+ *) -+ # If we have no mode, but dlfiles were specified, then do execute mode. -+ test -n "$execute_dlfiles" && mode=execute -+ -+ # Just use the default operation mode. -+ if test -z "$mode"; then -+ if test -n "$nonopt"; then -+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 -+ else -+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 -+ fi -+ fi -+ ;; -+ esac -+ fi -+ -+ # Only execute mode is allowed to have -dlopen flags. -+ if test -n "$execute_dlfiles" && test "$mode" != execute; then -+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # Change the help message to a mode-specific one. -+ generic_help="$help" -+ help="Try \`$modename --help --mode=$mode' for more information." -+ -+ # These modes are in order of execution frequency so that they run quickly. -+ case $mode in -+ # libtool compile mode -+ compile) -+ modename="$modename: compile" -+ # 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= -+ -+ 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) -+ if test -n "$libobj" ; then -+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ arg_mode=target -+ continue -+ ;; -+ -+ -static | -prefer-pic | -prefer-non-pic) -+ later="$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,*) -+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` -+ lastarg= -+ save_ifs="$IFS"; IFS=',' -+ for arg in $args; do -+ IFS="$save_ifs" -+ -+ # Double-quote args containing other shell metacharacters. -+ # Many Bourne shells cannot handle close brackets correctly -+ # in scan sets, so we specify it separately. -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ lastarg="$lastarg $arg" -+ done -+ IFS="$save_ifs" -+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` -+ -+ # Add the arguments to base_compile. -+ base_compile="$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. -+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` -+ -+ case $lastarg in -+ # Double-quote args containing other shell metacharacters. -+ # Many Bourne shells cannot handle close brackets correctly -+ # in scan sets, and some SunOS ksh mistreat backslash-escaping -+ # in scan sets (worked around with variable expansion), -+ # and furthermore cannot handle '|' '&' '(' ')' in scan sets -+ # at all, so we specify them separately. -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ lastarg="\"$lastarg\"" -+ ;; -+ esac -+ -+ base_compile="$base_compile $lastarg" -+ done # for arg -+ -+ case $arg_mode in -+ arg) -+ $echo "$modename: you must specify an argument for -Xcompile" -+ exit $EXIT_FAILURE -+ ;; -+ target) -+ $echo "$modename: you must specify a target with \`-o'" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ *) -+ # Get the name of the library object. -+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` -+ ;; -+ esac -+ -+ # Recognize several different file suffixes. -+ # If the user specifies -o file.o, it is replaced with file.lo -+ xform='[cCFSifmso]' -+ case $libobj in -+ *.ada) xform=ada ;; -+ *.adb) xform=adb ;; -+ *.ads) xform=ads ;; -+ *.asm) xform=asm ;; -+ *.c++) xform=c++ ;; -+ *.cc) xform=cc ;; -+ *.ii) xform=ii ;; -+ *.class) xform=class ;; -+ *.cpp) xform=cpp ;; -+ *.cxx) xform=cxx ;; -+ *.f90) xform=f90 ;; -+ *.for) xform=for ;; -+ *.java) xform=java ;; -+ *.obj) xform=obj ;; -+ esac -+ -+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` -+ -+ case $libobj in -+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; -+ *) -+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ -+ func_infer_tag $base_compile -+ -+ for arg in $later; do -+ case $arg in -+ -static) -+ build_old_libs=yes -+ continue -+ ;; -+ -+ -prefer-pic) -+ pic_mode=yes -+ continue -+ ;; -+ -+ -prefer-non-pic) -+ pic_mode=no -+ continue -+ ;; -+ esac -+ done -+ -+ qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` -+ case $qlibobj in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ qlibobj="\"$qlibobj\"" ;; -+ esac -+ test "X$libobj" != "X$qlibobj" \ -+ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ -+ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." -+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` -+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$xdir" = "X$obj"; then -+ xdir= -+ else -+ xdir=$xdir/ -+ fi -+ lobj=${xdir}$objdir/$objname -+ -+ if test -z "$base_compile"; then -+ $echo "$modename: you must specify a compilation command" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # 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 -+ -+ $run $rm $removelist -+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 -+ -+ # On Cygwin there's no "real" PIC flag so we must build both object types -+ case $host_os in -+ cygwin* | mingw* | pw32* | os2*) -+ 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} -+ lockfile="$output_obj.lock" -+ removelist="$removelist $output_obj $lockfile" -+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 -+ 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 $run ln "$progpath" "$lockfile" 2>/dev/null; do -+ $show "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." -+ -+ $run $rm $removelist -+ exit $EXIT_FAILURE -+ fi -+ $echo "$srcfile" > "$lockfile" -+ fi -+ -+ if test -n "$fix_srcfile_path"; then -+ eval srcfile=\"$fix_srcfile_path\" -+ fi -+ qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` -+ case $qsrcfile in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ qsrcfile="\"$qsrcfile\"" ;; -+ esac -+ -+ $run $rm "$libobj" "${libobj}T" -+ -+ # Create a libtool object file (analogous to a ".la" file), -+ # but don't create it if we're doing a dry run. -+ test -z "$run" && cat > ${libobj}T </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." -+ -+ $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 -+ $show "$mv $output_obj $lobj" -+ if $run $mv $output_obj $lobj; then : -+ else -+ error=$? -+ $run $rm $removelist -+ exit $error -+ fi -+ fi -+ -+ # Append the name of the PIC object to the libtool object file. -+ test -z "$run" && cat >> ${libobj}T <> ${libobj}T </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." -+ -+ $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 -+ $show "$mv $output_obj $obj" -+ if $run $mv $output_obj $obj; then : -+ else -+ error=$? -+ $run $rm $removelist -+ exit $error -+ fi -+ fi -+ -+ # Append the name of the non-PIC object the libtool object file. -+ # Only append if the libtool object file exists. -+ test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 -+ 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 -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test -+ ;; -+ *) qarg=$arg ;; -+ esac -+ libtool_args="$libtool_args $qarg" -+ -+ # If the previous option needs an argument, assign it. -+ if test -n "$prev"; then -+ case $prev in -+ output) -+ compile_command="$compile_command @OUTPUT@" -+ finalize_command="$finalize_command @OUTPUT@" -+ ;; -+ esac -+ -+ case $prev in -+ dlfiles|dlprefiles) -+ if test "$preload" = no; then -+ # Add the symbol object into the linking commands. -+ compile_command="$compile_command @SYMFILE@" -+ finalize_command="$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 -+ dlfiles="$dlfiles $arg" -+ else -+ dlprefiles="$dlprefiles $arg" -+ fi -+ prev= -+ continue -+ ;; -+ esac -+ ;; -+ expsyms) -+ export_symbols="$arg" -+ if test ! -f "$arg"; then -+ $echo "$modename: symbol file \`$arg' does not exist" -+ exit $EXIT_FAILURE -+ fi -+ prev= -+ continue -+ ;; -+ expsyms_regex) -+ export_symbols_regex="$arg" -+ prev= -+ continue -+ ;; -+ inst_prefix) -+ inst_prefix_dir="$arg" -+ prev= -+ continue -+ ;; -+ precious_regex) -+ precious_files_regex="$arg" -+ prev= -+ continue -+ ;; -+ release) -+ release="-$arg" -+ prev= -+ continue -+ ;; -+ objectlist) -+ if test -f "$arg"; then -+ save_arg=$arg -+ moreargs= -+ for fil in `cat $save_arg` -+ do -+# moreargs="$moreargs $fil" -+ arg=$fil -+ # A libtool-controlled object. -+ -+ # Check to see that this really is a libtool object. -+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ pic_object= -+ non_pic_object= -+ -+ # Read the .lo file -+ # If there is no directory component, then add one. -+ case $arg in -+ */* | *\\*) . $arg ;; -+ *) . ./$arg ;; -+ esac -+ -+ if test -z "$pic_object" || \ -+ test -z "$non_pic_object" || -+ test "$pic_object" = none && \ -+ test "$non_pic_object" = none; then -+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # Extract subdirectory from the argument. -+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$xdir" = "X$arg"; then -+ xdir= -+ else -+ xdir="$xdir/" -+ fi -+ -+ 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 -+ dlfiles="$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. -+ dlprefiles="$dlprefiles $pic_object" -+ prev= -+ fi -+ -+ # A PIC object. -+ libobjs="$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 -+ non_pic_objects="$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" -+ non_pic_objects="$non_pic_objects $non_pic_object" -+ fi -+ else -+ # Only an error if not doing a dry-run. -+ if test -z "$run"; then -+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 -+ exit $EXIT_FAILURE -+ else -+ # Dry-run case. -+ -+ # Extract subdirectory from the argument. -+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$xdir" = "X$arg"; then -+ xdir= -+ else -+ xdir="$xdir/" -+ fi -+ -+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` -+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` -+ libobjs="$libobjs $pic_object" -+ non_pic_objects="$non_pic_objects $non_pic_object" -+ fi -+ fi -+ done -+ else -+ $echo "$modename: link input file \`$save_arg' does not exist" -+ exit $EXIT_FAILURE -+ fi -+ arg=$save_arg -+ prev= -+ continue -+ ;; -+ rpath | xrpath) -+ # We need an absolute path. -+ case $arg in -+ [\\/]* | [A-Za-z]:[\\/]*) ;; -+ *) -+ $echo "$modename: only absolute run-paths are allowed" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ if test "$prev" = rpath; then -+ case "$rpath " in -+ *" $arg "*) ;; -+ *) rpath="$rpath $arg" ;; -+ esac -+ else -+ case "$xrpath " in -+ *" $arg "*) ;; -+ *) xrpath="$xrpath $arg" ;; -+ esac -+ fi -+ prev= -+ continue -+ ;; -+ xcompiler) -+ compiler_flags="$compiler_flags $qarg" -+ prev= -+ compile_command="$compile_command $qarg" -+ finalize_command="$finalize_command $qarg" -+ continue -+ ;; -+ xlinker) -+ linker_flags="$linker_flags $qarg" -+ compiler_flags="$compiler_flags $wl$qarg" -+ prev= -+ compile_command="$compile_command $wl$qarg" -+ finalize_command="$finalize_command $wl$qarg" -+ continue -+ ;; -+ xcclinker) -+ linker_flags="$linker_flags $qarg" -+ compiler_flags="$compiler_flags $qarg" -+ prev= -+ compile_command="$compile_command $qarg" -+ finalize_command="$finalize_command $qarg" -+ continue -+ ;; -+ shrext) -+ shrext_cmds="$arg" -+ prev= -+ continue -+ ;; -+ darwin_framework|darwin_framework_skip) -+ test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ prev= -+ 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 -+ compile_command="$compile_command $link_static_flag" -+ finalize_command="$finalize_command $link_static_flag" -+ fi -+ continue -+ ;; -+ -+ -allow-undefined) -+ # FIXME: remove this flag sometime in the future. -+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 -+ continue -+ ;; -+ -+ -avoid-version) -+ avoid_version=yes -+ 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 -+ $echo "$modename: more than one -exported-symbols argument is not allowed" -+ exit $EXIT_FAILURE -+ fi -+ if test "X$arg" = "X-export-symbols"; then -+ prev=expsyms -+ else -+ prev=expsyms_regex -+ fi -+ continue -+ ;; -+ -+ -framework|-arch|-isysroot) -+ case " $CC " in -+ *" ${arg} ${1} "* | *" ${arg} ${1} "*) -+ prev=darwin_framework_skip ;; -+ *) compiler_flags="$compiler_flags $arg" -+ prev=darwin_framework ;; -+ esac -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ 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*) -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ ;; -+ esac -+ continue -+ ;; -+ -+ -L*) -+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` -+ # We need an absolute path. -+ case $dir in -+ [\\/]* | [A-Za-z]:[\\/]*) ;; -+ *) -+ absdir=`cd "$dir" && pwd` -+ if test -z "$absdir"; then -+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 -+ absdir="$dir" -+ notinst_path="$notinst_path $dir" -+ fi -+ dir="$absdir" -+ ;; -+ esac -+ case "$deplibs " in -+ *" -L$dir "*) ;; -+ *) -+ deplibs="$deplibs -L$dir" -+ lib_search_path="$lib_search_path $dir" -+ ;; -+ esac -+ case $host in -+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) -+ testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` -+ case :$dllsearchpath: in -+ *":$dir:"*) ;; -+ *) dllsearchpath="$dllsearchpath:$dir";; -+ esac -+ case :$dllsearchpath: in -+ *":$testbindir:"*) ;; -+ *) dllsearchpath="$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*) -+ # 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 -+ deplibs="$deplibs -framework System" -+ 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 -+ deplibs="$deplibs $arg" -+ continue -+ ;; -+ -+ # Tru64 UNIX uses -model [arg] to determine the layout of C++ -+ # classes, name mangling, and exception handling. -+ -model) -+ compile_command="$compile_command $arg" -+ compiler_flags="$compiler_flags $arg" -+ finalize_command="$finalize_command $arg" -+ prev=xcompiler -+ continue -+ ;; -+ -+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) -+ compiler_flags="$compiler_flags $arg" -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ continue -+ ;; -+ -+ -module) -+ module=yes -+ continue -+ ;; -+ -+ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler -+ # -r[0-9][0-9]* specifies the processor on the SGI compiler -+ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler -+ # +DA*, +DD* enable 64-bit mode on the HP compiler -+ # -q* pass through compiler args for the IBM compiler -+ # -m* pass through architecture-specific compiler args for GCC -+ # -m*, -t[45]*, -txscale* pass through architecture-specific -+ # compiler args for GCC -+ # -pg pass through profiling flag for GCC -+ # @file GCC response files -+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ -+ -t[45]*|-txscale*|@*) -+ -+ # Unknown arguments in both finalize_command and compile_command need -+ # to be aesthetically quoted because they are evaled later. -+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ compiler_flags="$compiler_flags $arg" -+ continue -+ ;; -+ -+ -shrext) -+ prev=shrext -+ continue -+ ;; -+ -+ -no-fast-install) -+ fast_install=no -+ continue -+ ;; -+ -+ -no-install) -+ case $host in -+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) -+ # The PATH hackery in wrapper scripts is required on Windows -+ # in order for the loader to find any dlls it needs. -+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 -+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 -+ 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*) -+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` -+ # We need an absolute path. -+ case $dir in -+ [\\/]* | [A-Za-z]:[\\/]*) ;; -+ *) -+ $echo "$modename: only absolute run-paths are allowed" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ case "$xrpath " in -+ *" $dir "*) ;; -+ *) xrpath="$xrpath $dir" ;; -+ esac -+ 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 -+ ;; -+ -+ -Wc,*) -+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` -+ arg= -+ save_ifs="$IFS"; IFS=',' -+ for flag in $args; do -+ IFS="$save_ifs" -+ case $flag in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ flag="\"$flag\"" -+ ;; -+ esac -+ arg="$arg $wl$flag" -+ compiler_flags="$compiler_flags $flag" -+ done -+ IFS="$save_ifs" -+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"` -+ ;; -+ -+ -Wl,*) -+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` -+ arg= -+ save_ifs="$IFS"; IFS=',' -+ for flag in $args; do -+ IFS="$save_ifs" -+ case $flag in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ flag="\"$flag\"" -+ ;; -+ esac -+ arg="$arg $wl$flag" -+ compiler_flags="$compiler_flags $wl$flag" -+ linker_flags="$linker_flags $flag" -+ done -+ IFS="$save_ifs" -+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"` -+ ;; -+ -+ -Xcompiler) -+ prev=xcompiler -+ continue -+ ;; -+ -+ -Xlinker) -+ prev=xlinker -+ continue -+ ;; -+ -+ -XCClinker) -+ prev=xcclinker -+ continue -+ ;; -+ -+ # Some other compiler flag. -+ -* | +*) -+ # Unknown arguments in both finalize_command and compile_command need -+ # to be aesthetically quoted because they are evaled later. -+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ ;; -+ -+ *.$objext) -+ # A standard object. -+ objs="$objs $arg" -+ ;; -+ -+ *.lo) -+ # A libtool-controlled object. -+ -+ # Check to see that this really is a libtool object. -+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ pic_object= -+ non_pic_object= -+ -+ # Read the .lo file -+ # If there is no directory component, then add one. -+ case $arg in -+ */* | *\\*) . $arg ;; -+ *) . ./$arg ;; -+ esac -+ -+ if test -z "$pic_object" || \ -+ test -z "$non_pic_object" || -+ test "$pic_object" = none && \ -+ test "$non_pic_object" = none; then -+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # Extract subdirectory from the argument. -+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$xdir" = "X$arg"; then -+ xdir= -+ else -+ xdir="$xdir/" -+ fi -+ -+ 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 -+ dlfiles="$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. -+ dlprefiles="$dlprefiles $pic_object" -+ prev= -+ fi -+ -+ # A PIC object. -+ libobjs="$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 -+ non_pic_objects="$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" -+ non_pic_objects="$non_pic_objects $non_pic_object" -+ fi -+ else -+ # Only an error if not doing a dry-run. -+ if test -z "$run"; then -+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 -+ exit $EXIT_FAILURE -+ else -+ # Dry-run case. -+ -+ # Extract subdirectory from the argument. -+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$xdir" = "X$arg"; then -+ xdir= -+ else -+ xdir="$xdir/" -+ fi -+ -+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` -+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` -+ libobjs="$libobjs $pic_object" -+ non_pic_objects="$non_pic_objects $non_pic_object" -+ fi -+ fi -+ ;; -+ -+ *.$libext) -+ # An archive. -+ deplibs="$deplibs $arg" -+ old_deplibs="$old_deplibs $arg" -+ continue -+ ;; -+ -+ *.la) -+ # A libtool-controlled library. -+ -+ if test "$prev" = dlfiles; then -+ # This library was specified with -dlopen. -+ dlfiles="$dlfiles $arg" -+ prev= -+ elif test "$prev" = dlprefiles; then -+ # The library was specified with -dlpreopen. -+ dlprefiles="$dlprefiles $arg" -+ prev= -+ else -+ deplibs="$deplibs $arg" -+ 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. -+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ ;; -+ esac # arg -+ -+ # Now actually substitute the argument into the commands. -+ if test -n "$arg"; then -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ fi -+ done # argument parsing loop -+ -+ if test -n "$prev"; then -+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then -+ eval arg=\"$export_dynamic_flag_spec\" -+ compile_command="$compile_command $arg" -+ finalize_command="$finalize_command $arg" -+ fi -+ -+ oldlibs= -+ # calculate the name of the file, without its directory -+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` -+ libobjs_save="$libobjs" -+ -+ if test -n "$shlibpath_var"; then -+ # get the directories listed in $shlibpath_var -+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" -+ -+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$output_objdir" = "X$output"; then -+ output_objdir="$objdir" -+ else -+ output_objdir="$output_objdir/$objdir" -+ fi -+ # Create the object directory. -+ if test ! -d "$output_objdir"; then -+ $show "$mkdir $output_objdir" -+ $run $mkdir $output_objdir -+ exit_status=$? -+ if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then -+ exit $exit_status -+ fi -+ fi -+ -+ # Determine the type of output -+ case $output in -+ "") -+ $echo "$modename: you must specify an output file" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ *.$libext) linkmode=oldlib ;; -+ *.lo | *.$objext) linkmode=obj ;; -+ *.la) linkmode=lib ;; -+ *) linkmode=prog ;; # Anything else should be a program. -+ esac -+ -+ case $host in -+ *cygwin* | *mingw* | *pw32*) -+ # don't eliminate duplications in $postdeps and $predeps -+ duplicate_compiler_generated_deps=yes -+ ;; -+ *) -+ duplicate_compiler_generated_deps=$duplicate_deps -+ ;; -+ 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 test "X$duplicate_deps" = "Xyes" ; then -+ case "$libs " in -+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; -+ esac -+ fi -+ libs="$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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then -+ for pre_post_dep in $predeps $postdeps; do -+ case "$pre_post_deps " in -+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; -+ esac -+ pre_post_deps="$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 -+ case $linkmode in -+ lib) -+ passes="conv link" -+ for file in $dlfiles $dlprefiles; do -+ case $file in -+ *.la) ;; -+ *) -+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ 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 -+ 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 "$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) -+ if test "$linkmode,$pass" = "prog,link"; then -+ compile_deplibs="$deplib $compile_deplibs" -+ finalize_deplibs="$deplib $finalize_deplibs" -+ else -+ compiler_flags="$compiler_flags $deplib" -+ fi -+ continue -+ ;; -+ -l*) -+ if test "$linkmode" != lib && test "$linkmode" != prog; then -+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 -+ continue -+ fi -+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` -+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; 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 (${SED} -e '2q' $lib | -+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ library_names= -+ old_library= -+ case $lib in -+ */* | *\\*) . $lib ;; -+ *) . ./$lib ;; -+ esac -+ 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 -+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` -+ test "X$ladir" = "X$lib" && ladir="." -+ 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 -+ -L*) -+ case $linkmode in -+ lib) -+ deplibs="$deplib $deplibs" -+ test "$pass" = conv && continue -+ newdependency_libs="$deplib $newdependency_libs" -+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` -+ ;; -+ 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 -+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` -+ ;; -+ *) -+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 -+ ;; -+ esac # linkmode -+ continue -+ ;; # -L -+ -R*) -+ if test "$pass" = link; then -+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` -+ # Make sure the xrpath contains only unique directories. -+ case "$xrpath " in -+ *" $dir "*) ;; -+ *) xrpath="$xrpath $dir" ;; -+ esac -+ fi -+ deplibs="$deplib $deplibs" -+ continue -+ ;; -+ *.la) lib="$deplib" ;; -+ *.$libext) -+ if test "$pass" = conv; then -+ deplibs="$deplib $deplibs" -+ continue -+ fi -+ case $linkmode in -+ lib) -+ valid_a_lib=no -+ case $deplibs_check_method in -+ match_pattern*) -+ set dummy $deplibs_check_method -+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` -+ 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 used here." -+ else -+ $echo -+ $echo "*** Warning: Linking the shared library $output against the" -+ $echo "*** static library $deplib is not portable!" -+ deplibs="$deplib $deplibs" -+ fi -+ 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. -+ newdlprefiles="$newdlprefiles $deplib" -+ compile_deplibs="$deplib $compile_deplibs" -+ finalize_deplibs="$deplib $finalize_deplibs" -+ else -+ newdlfiles="$newdlfiles $deplib" -+ fi -+ fi -+ continue -+ ;; -+ %DEPLIBS%) -+ alldeplibs=yes -+ continue -+ ;; -+ esac # case $deplib -+ if test "$found" = yes || test -f "$lib"; then : -+ else -+ $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # Check to see that this really is a libtool archive. -+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : -+ else -+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` -+ test "X$ladir" = "X$lib" && ladir="." -+ -+ dlname= -+ dlopen= -+ dlpreopen= -+ libdir= -+ library_names= -+ old_library= -+ # 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 -+ case $lib in -+ */* | *\\*) . $lib ;; -+ *) . ./$lib ;; -+ esac -+ -+ if test "$linkmode,$pass" = "lib,link" || -+ test "$linkmode,$pass" = "prog,scan" || -+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then -+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen" -+ test -n "$dlpreopen" && dlprefiles="$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 -+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ # It is a libtool convenience library, so add in its objects. -+ convenience="$convenience $ladir/$objdir/$old_library" -+ old_convenience="$old_convenience $ladir/$objdir/$old_library" -+ tmp_libs= -+ for deplib in $dependency_libs; do -+ deplibs="$deplib $deplibs" -+ if test "X$duplicate_deps" = "Xyes" ; then -+ case "$tmp_libs " in -+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; -+ esac -+ fi -+ tmp_libs="$tmp_libs $deplib" -+ done -+ elif test "$linkmode" != prog && test "$linkmode" != lib; then -+ $echo "$modename: \`$lib' is not a convenience library" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ continue -+ fi # $pass = conv -+ -+ -+ # Get the name of the library we link against. -+ linklib= -+ for l in $old_library $library_names; do -+ linklib="$l" -+ done -+ if test -z "$linklib"; then -+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # This library was specified with -dlopen. -+ if test "$pass" = dlopen; then -+ if test -z "$libdir"; then -+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 -+ exit $EXIT_FAILURE -+ 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. -+ dlprefiles="$dlprefiles $lib $dependency_libs" -+ else -+ newdlfiles="$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 -+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 -+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 -+ abs_ladir="$ladir" -+ fi -+ ;; -+ esac -+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` -+ -+ # Find the relevant object directory and library name. -+ if test "X$installed" = Xyes; then -+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then -+ $echo "$modename: warning: library \`$lib' was moved." 1>&2 -+ dir="$ladir" -+ absdir="$abs_ladir" -+ libdir="$abs_ladir" -+ else -+ dir="$libdir" -+ absdir="$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 -+ notinst_path="$notinst_path $abs_ladir" -+ else -+ dir="$ladir/$objdir" -+ absdir="$abs_ladir/$objdir" -+ # Remove this search path later -+ notinst_path="$notinst_path $abs_ladir" -+ fi -+ fi # $installed = yes -+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` -+ -+ # This library was specified with -dlpreopen. -+ if test "$pass" = dlpreopen; then -+ if test -z "$libdir"; then -+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ # Prefer using a static library (so that no silly _DYNAMIC symbols -+ # are required to link). -+ if test -n "$old_library"; then -+ newdlprefiles="$newdlprefiles $dir/$old_library" -+ # Otherwise, use the dlname, so that lt_dlopen finds it. -+ elif test -n "$dlname"; then -+ newdlprefiles="$newdlprefiles $dir/$dlname" -+ else -+ newdlprefiles="$newdlprefiles $dir/$linklib" -+ fi -+ 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 -+ newlib_search_path="$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*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test -+ 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 test "X$duplicate_deps" = "Xyes" ; then -+ case "$tmp_libs " in -+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; -+ esac -+ fi -+ tmp_libs="$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 -+ *" $dir "*) ;; -+ *" $absdir "*) ;; -+ *) temp_rpath="$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 "*) ;; -+ *) compile_rpath="$compile_rpath $absdir" -+ esac -+ ;; -+ esac -+ case " $sys_lib_dlsearch_path " in -+ *" $libdir "*) ;; -+ *) -+ case "$finalize_rpath " in -+ *" $libdir "*) ;; -+ *) finalize_rpath="$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 -+ if test "$installed" = no; then -+ notinst_deplibs="$notinst_deplibs $lib" -+ need_relink=yes -+ fi -+ # This is a shared library -+ -+ # Warn about portability, can't link against -module's on -+ # some systems (darwin) -+ if 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 "*) ;; -+ *) compile_rpath="$compile_rpath $absdir" -+ esac -+ ;; -+ esac -+ case " $sys_lib_dlsearch_path " in -+ *" $libdir "*) ;; -+ *) -+ case "$finalize_rpath " in -+ *" $libdir "*) ;; -+ *) finalize_rpath="$finalize_rpath $libdir" -+ esac -+ ;; -+ esac -+ fi -+ -+ if test -n "$old_archive_from_expsyms_cmds"; then -+ # figure out the soname -+ set dummy $library_names -+ realname="$2" -+ shift; 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*) -+ major=`expr $current - $age` -+ versuffix="-$major" -+ ;; -+ esac -+ eval soname=\"$soname_spec\" -+ else -+ soname="$realname" -+ fi -+ -+ # Make a new name for the extract_expsyms_cmds to use -+ soroot="$soname" -+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'` -+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" -+ -+ # If the library has no export list, then create one now -+ if test -f "$output_objdir/$soname-def"; then : -+ else -+ $show "extracting exported symbol list from \`$soname'" -+ save_ifs="$IFS"; IFS='~' -+ cmds=$extract_expsyms_cmds -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ fi -+ -+ # Create $newlib -+ if test -f "$output_objdir/$newlib"; then :; else -+ $show "generating import library for \`$soname'" -+ save_ifs="$IFS"; IFS='~' -+ cmds=$old_archive_from_expsyms_cmds -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ 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 "$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 module then we can not link against -+ # it, someone is ignoring the new warnings I added -+ if /usr/bin/file -L $add 2> /dev/null | -+ $EGREP ": [^:]* bundle" >/dev/null ; 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 -+ 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; then -+ add="$dir/$linklib" -+ elif test "$hardcode_minus_L" = yes; then -+ add_dir="-L$dir" -+ # Try looking first in the location we're being installed to. -+ if test -n "$inst_prefix_dir"; then -+ case $libdir in -+ [\\/]*) -+ add_dir="$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 -+ $echo "$modename: configuration error: unsupported hardcode properties" -+ exit $EXIT_FAILURE -+ fi -+ -+ if test -n "$add_shlibpath"; then -+ case :$compile_shlibpath: in -+ *":$add_shlibpath:"*) ;; -+ *) compile_shlibpath="$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:"*) ;; -+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; -+ esac -+ fi -+ fi -+ fi -+ -+ if test "$linkmode" = prog || test "$mode" = relink; then -+ add_shlibpath= -+ add_dir= -+ add= -+ # Finalize command for both is simple: just hardcode it. -+ if test "$hardcode_direct" = yes; 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:"*) ;; -+ *) finalize_shlibpath="$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 -+ [\\/]*) -+ add_dir="$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*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` -+ case " $xrpath " in -+ *" $temp_xrpath "*) ;; -+ *) xrpath="$xrpath $temp_xrpath";; -+ esac;; -+ *) temp_deplibs="$temp_deplibs $libdir";; -+ esac -+ done -+ dependency_libs="$temp_deplibs" -+ fi -+ -+ newlib_search_path="$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" -+ if test "X$duplicate_deps" = "Xyes" ; then -+ case "$tmp_libs " in -+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; -+ esac -+ fi -+ tmp_libs="$tmp_libs $deplib" -+ done -+ -+ if test "$link_all_deplibs" != no; then -+ # Add the search paths of all dependency libraries -+ for deplib in $dependency_libs; do -+ case $deplib in -+ -L*) path="$deplib" ;; -+ *.la) -+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` -+ test "X$dir" = "X$deplib" && dir="." -+ # We need an absolute path. -+ case $dir in -+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; -+ *) -+ absdir=`cd "$dir" && pwd` -+ if test -z "$absdir"; then -+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 -+ absdir="$dir" -+ fi -+ ;; -+ esac -+ if grep "^installed=no" $deplib > /dev/null; then -+ path="$absdir/$objdir" -+ else -+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` -+ if test -z "$libdir"; then -+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ if test "$absdir" != "$libdir"; then -+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 -+ fi -+ path="$absdir" -+ fi -+ depdepl= -+ case $host in -+ *-*-darwin*) -+ # we do not want to link against static libs, -+ # but need to link against shared -+ 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 "$path/$depdepl" ; then -+ depdepl="$path/$depdepl" -+ fi -+ # do not add paths which are already there -+ case " $newlib_search_path " in -+ *" $path "*) ;; -+ *) newlib_search_path="$newlib_search_path $path";; -+ esac -+ fi -+ path="" -+ ;; -+ *) -+ path="-L$path" -+ ;; -+ esac -+ ;; -+ -l*) -+ case $host in -+ *-*-darwin*) -+ # Again, we only want to link against shared libraries -+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` -+ for tmp in $newlib_search_path ; do -+ if test -f "$tmp/lib$tmp_libs.dylib" ; then -+ eval depdepl="$tmp/lib$tmp_libs.dylib" -+ break -+ fi -+ done -+ path="" -+ ;; -+ *) continue ;; -+ esac -+ ;; -+ *) continue ;; -+ esac -+ case " $deplibs " in -+ *" $path "*) ;; -+ *) deplibs="$path $deplibs" ;; -+ esac -+ case " $deplibs " in -+ *" $depdepl "*) ;; -+ *) deplibs="$depdepl $deplibs" ;; -+ esac -+ done -+ fi # link_all_deplibs != no -+ fi # linkmode = lib -+ done # for deplib in $libs -+ 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 "*) ;; -+ *) lib_search_path="$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 "*) ;; -+ *) tmp_libs="$tmp_libs $deplib" ;; -+ esac -+ ;; -+ *) tmp_libs="$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 -+ tmp_libs="$tmp_libs $i" -+ fi -+ done -+ dependency_libs=$tmp_libs -+ done # for pass -+ if test "$linkmode" = prog; then -+ dlfiles="$newdlfiles" -+ dlprefiles="$newdlprefiles" -+ fi -+ -+ case $linkmode in -+ oldlib) -+ if test -n "$deplibs"; then -+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 -+ fi -+ -+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then -+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 -+ fi -+ -+ if test -n "$rpath"; then -+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 -+ fi -+ -+ if test -n "$xrpath"; then -+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 -+ fi -+ -+ if test -n "$vinfo"; then -+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 -+ fi -+ -+ if test -n "$release"; then -+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 -+ fi -+ -+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then -+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 -+ fi -+ -+ # Now set the variables for building old libraries. -+ build_libtool_libs=no -+ oldlibs="$output" -+ objs="$objs$old_deplibs" -+ ;; -+ -+ lib) -+ # Make sure we only generate libraries of the form `libNAME.la'. -+ case $outputname in -+ lib*) -+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` -+ eval shared_ext=\"$shrext_cmds\" -+ eval libname=\"$libname_spec\" -+ ;; -+ *) -+ if test "$module" = no; then -+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ if test "$need_lib_prefix" != no; then -+ # Add the "lib" prefix for modules if required -+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` -+ eval shared_ext=\"$shrext_cmds\" -+ eval libname=\"$libname_spec\" -+ else -+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` -+ fi -+ ;; -+ esac -+ -+ if test -n "$objs"; then -+ if test "$deplibs_check_method" != pass_all; then -+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 -+ exit $EXIT_FAILURE -+ else -+ $echo -+ $echo "*** Warning: Linking the shared library $output against the non-libtool" -+ $echo "*** objects $objs is not portable!" -+ libobjs="$libobjs $objs" -+ fi -+ fi -+ -+ if test "$dlself" != no; then -+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 -+ fi -+ -+ set dummy $rpath -+ if test "$#" -gt 2; then -+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 -+ fi -+ install_libdir="$2" -+ -+ 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 -+ -+ if test -n "$vinfo"; then -+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 -+ fi -+ -+ if test -n "$release"; then -+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 -+ fi -+ else -+ -+ # Parse the version information argument. -+ save_ifs="$IFS"; IFS=':' -+ set dummy $vinfo 0 0 0 -+ IFS="$save_ifs" -+ -+ if test -n "$8"; then -+ $echo "$modename: too many parameters to \`-version-info'" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # 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="$2" -+ number_minor="$3" -+ number_revision="$4" -+ # -+ # 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 -+ darwin|linux|osf|windows|none) -+ current=`expr $number_major + $number_minor` -+ age="$number_minor" -+ revision="$number_revision" -+ ;; -+ freebsd-aout|freebsd-elf|sunos) -+ current="$number_major" -+ revision="$number_minor" -+ age="0" -+ ;; -+ irix|nonstopux) -+ current=`expr $number_major + $number_minor - 1` -+ age="$number_minor" -+ revision="$number_minor" -+ ;; -+ esac -+ ;; -+ no) -+ current="$2" -+ revision="$3" -+ age="$4" -+ ;; -+ 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]) ;; -+ *) -+ $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 -+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ 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]) ;; -+ *) -+ $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 -+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ 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]) ;; -+ *) -+ $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 -+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ -+ if test "$age" -gt "$current"; then -+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 -+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2 -+ exit $EXIT_FAILURE -+ 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 -+ major=.`expr $current - $age` -+ versuffix="$major.$age.$revision" -+ # Darwin ld doesn't like 0 for these options... -+ minor_current=`expr $current + 1` -+ verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" -+ ;; -+ -+ freebsd-aout) -+ major=".$current" -+ versuffix=".$current.$revision"; -+ ;; -+ -+ freebsd-elf) -+ major=".$current" -+ versuffix=".$current"; -+ ;; -+ -+ irix | nonstopux) -+ major=`expr $current - $age + 1` -+ -+ 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 -+ iface=`expr $revision - $loop` -+ loop=`expr $loop - 1` -+ verstring="$verstring_prefix$major.$iface:$verstring" -+ done -+ -+ # Before this point, $major must not contain `.'. -+ major=.$major -+ versuffix="$major.$revision" -+ ;; -+ -+ linux) -+ major=.`expr $current - $age` -+ versuffix="$major.$age.$revision" -+ ;; -+ -+ osf) -+ major=.`expr $current - $age` -+ 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 -+ iface=`expr $current - $loop` -+ loop=`expr $loop - 1` -+ verstring="$verstring:${iface}.0" -+ done -+ -+ # Make executables depend on our current version. -+ verstring="$verstring:${current}.0" -+ ;; -+ -+ sunos) -+ major=".$current" -+ versuffix=".$current.$revision" -+ ;; -+ -+ windows) -+ # Use '-' rather than '.', since we only want one -+ # extension on DOS 8.3 filesystems. -+ major=`expr $current - $age` -+ versuffix="-$major" -+ ;; -+ -+ *) -+ $echo "$modename: unknown library version type \`$version_type'" 1>&2 -+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ 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 -+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 -+ build_libtool_libs=no -+ build_old_libs=yes -+ fi -+ else -+ # Don't allow undefined symbols. -+ allow_undefined_flag="$no_undefined_flag" -+ fi -+ fi -+ -+ if test "$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) -+ ;; -+ $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 -+ removelist="$removelist $p" -+ ;; -+ *) ;; -+ esac -+ done -+ if test -n "$removelist"; then -+ $show "${rm}r $removelist" -+ $run ${rm}r $removelist -+ fi -+ fi -+ -+ # Now set the variables for building old libraries. -+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then -+ oldlibs="$oldlibs $output_objdir/$libname.$libext" -+ -+ # Transform .lo files to .o files. -+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` -+ fi -+ -+ # Eliminate all temporary directories. -+# for path in $notinst_path; do -+# lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` -+# deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` -+# dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 -+ temp_xrpath="$temp_xrpath -R$libdir" -+ case "$finalize_rpath " in -+ *" $libdir "*) ;; -+ *) finalize_rpath="$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 "*) ;; -+ *) dlfiles="$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 "*) ;; -+ *) dlprefiles="$dlprefiles $lib" ;; -+ esac -+ done -+ -+ if test "$build_libtool_libs" = yes; then -+ if test -n "$rpath"; then -+ case $host in -+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) -+ # these systems don't actually have a c library (as such)! -+ ;; -+ *-*-rhapsody* | *-*-darwin1.[012]) -+ # Rhapsody C library is in the System framework -+ deplibs="$deplibs -framework System" -+ ;; -+ *-*-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 -+ deplibs="$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. -+ $rm conftest.c -+ cat > conftest.c </dev/null` -+ 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 "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; -+ esac -+ done -+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ -+ | ${SED} 10q \ -+ | $EGREP "$file_magic_regex" > /dev/null; then -+ newdeplibs="$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 -+ else -+ # Add a -L argument. -+ newdeplibs="$newdeplibs $a_deplib" -+ fi -+ done # Gone through all deplibs. -+ ;; -+ match_pattern*) -+ set dummy $deplibs_check_method -+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` -+ for a_deplib in $deplibs; do -+ name=`expr $a_deplib : '-l\(.*\)'` -+ # If $name is empty we are operating on a -L argument. -+ if test -n "$name" && test "$name" != "0"; then -+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then -+ case " $predeps $postdeps " in -+ *" $a_deplib "*) -+ newdeplibs="$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 -+ newdeplibs="$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 -+ else -+ # Add a -L argument. -+ newdeplibs="$newdeplibs $a_deplib" -+ fi -+ done # Gone through all deplibs. -+ ;; -+ none | unknown | *) -+ newdeplibs="" -+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -+ -e '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 "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` -+ done -+ fi -+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ -+ | grep . >/dev/null; then -+ $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 -+ fi -+ ;; -+ 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 is the System framework -+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` -+ ;; -+ 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 -+ -+ -+ # 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 "*) -+ new_libs="$new_libs -L$path/$objdir" ;; -+ esac -+ ;; -+ esac -+ done -+ for deplib in $deplibs; do -+ case $deplib in -+ -L*) -+ case " $new_libs " in -+ *" $deplib "*) ;; -+ *) new_libs="$new_libs $deplib" ;; -+ esac -+ ;; -+ *) new_libs="$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 -+ if test "$hardcode_into_libs" = yes; then -+ # Hardcode the library paths -+ hardcode_libdirs= -+ dep_rpath= -+ rpath="$finalize_rpath" -+ test "$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 -+ 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"*) -+ ;; -+ *) -+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" -+ ;; -+ esac -+ fi -+ else -+ eval flag=\"$hardcode_libdir_flag_spec\" -+ dep_rpath="$dep_rpath $flag" -+ fi -+ elif test -n "$runpath_var"; then -+ case "$perm_rpath " in -+ *" $libdir "*) ;; -+ *) perm_rpath="$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" -+ if test -n "$hardcode_libdir_flag_spec_ld"; then -+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" -+ else -+ eval dep_rpath=\"$hardcode_libdir_flag_spec\" -+ fi -+ fi -+ if test -n "$runpath_var" && test -n "$perm_rpath"; then -+ # We should set the runpath_var. -+ rpath= -+ for dir in $perm_rpath; do -+ rpath="$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 "$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 -+ realname="$2" -+ shift; 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 -+ linknames="$linknames $link" -+ done -+ -+ # Use standard objects if they are pic -+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` -+ -+ # Prepare the list of exported symbols -+ if test -z "$export_symbols"; then -+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then -+ $show "generating symbol list for \`$libname.la'" -+ export_symbols="$output_objdir/$libname.exp" -+ $run $rm $export_symbols -+ cmds=$export_symbols_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ if len=`expr "X$cmd" : ".*"` && -+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ skipped_export=false -+ else -+ # The command line is too long to execute in one step. -+ $show "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"; then -+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" -+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' -+ $show "$mv \"${export_symbols}T\" \"$export_symbols\"" -+ $run eval '$mv "${export_symbols}T" "$export_symbols"' -+ fi -+ fi -+ fi -+ -+ if test -n "$export_symbols" && test -n "$include_expsyms"; then -+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' -+ fi -+ -+ tmp_deplibs= -+ for test_deplib in $deplibs; do -+ case " $convenience " in -+ *" $test_deplib "*) ;; -+ *) -+ tmp_deplibs="$tmp_deplibs $test_deplib" -+ ;; -+ esac -+ done -+ deplibs="$tmp_deplibs" -+ -+ if test -n "$convenience"; then -+ if test -n "$whole_archive_flag_spec"; then -+ save_libobjs=$libobjs -+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\" -+ else -+ gentop="$output_objdir/${outputname}x" -+ generated="$generated $gentop" -+ -+ func_extract_archives $gentop $convenience -+ libobjs="$libobjs $func_extract_archives_result" -+ fi -+ fi -+ -+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then -+ eval flag=\"$thread_safe_flag_spec\" -+ linker_flags="$linker_flags $flag" -+ fi -+ -+ # Make a backup of the uninstalled library when relinking -+ if test "$mode" = relink; then -+ $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:" && -+ len=`expr "X$test_cmds" : ".*" 2>/dev/null` && -+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then -+ : -+ else -+ # The command line is too long to link in one step, link piecewise. -+ $echo "creating reloadable object files..." -+ -+ # 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 -+ output_la=`$echo "X$output" | $Xsed -e "$basename"` -+ -+ # Clear the reloadable object creation command queue and -+ # initialize k to one. -+ test_cmds= -+ concat_cmds= -+ objlist= -+ delfiles= -+ last_robj= -+ k=1 -+ output=$output_objdir/$output_la-${k}.$objext -+ # Loop over the list of objects to be linked. -+ for obj in $save_libobjs -+ do -+ eval test_cmds=\"$reload_cmds $objlist $last_robj\" -+ if test "X$objlist" = X || -+ { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && -+ test "$len" -le "$max_cmd_len"; }; then -+ objlist="$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. -+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\" -+ else -+ # All subsequent reloadable object files will link in -+ # the last one created. -+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" -+ fi -+ last_robj=$output_objdir/$output_la-${k}.$objext -+ k=`expr $k + 1` -+ output=$output_objdir/$output_la-${k}.$objext -+ objlist=$obj -+ len=1 -+ 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~ -+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" -+ -+ if ${skipped_export-false}; then -+ $show "generating symbol list for \`$libname.la'" -+ export_symbols="$output_objdir/$libname.exp" -+ $run $rm $export_symbols -+ libobjs=$output -+ # Append the command to create the export file. -+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" -+ fi -+ -+ # Set up a command to remove the reloadable object files -+ # after they are used. -+ i=0 -+ while test "$i" -lt "$k" -+ do -+ i=`expr $i + 1` -+ delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" -+ done -+ -+ $echo "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" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ -+ 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\" -+ 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 -+ -+ # Append the command to remove the reloadable object files -+ # to the just-reset $cmds. -+ eval cmds=\"\$cmds~\$rm $delfiles\" -+ fi -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || { -+ lt_exit=$? -+ -+ # Restore the uninstalled library and exit -+ if test "$mode" = relink; then -+ $run eval '(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 "$mode" = relink; then -+ $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 -+ $show "${rm}r $gentop" -+ $run ${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 -+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" -+ $run 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 "$deplibs"; then -+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 -+ fi -+ -+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then -+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 -+ fi -+ -+ if test -n "$rpath"; then -+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 -+ fi -+ -+ if test -n "$xrpath"; then -+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 -+ fi -+ -+ if test -n "$vinfo"; then -+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 -+ fi -+ -+ if test -n "$release"; then -+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 -+ fi -+ -+ case $output in -+ *.lo) -+ if test -n "$objs$old_deplibs"; then -+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ libobj="$output" -+ obj=`$echo "X$output" | $Xsed -e "$lo2o"` -+ ;; -+ *) -+ libobj= -+ obj="$output" -+ ;; -+ esac -+ -+ # Delete the old objects. -+ $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 "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` -+ else -+ gentop="$output_objdir/${obj}x" -+ generated="$generated $gentop" -+ -+ func_extract_archives $gentop $convenience -+ reload_conv_objs="$reload_objs $func_extract_archives_result" -+ fi -+ fi -+ -+ # Create the old-style object. -+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test -+ -+ output="$obj" -+ cmds=$reload_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ -+ # Exit if we aren't doing a library object file. -+ if test -z "$libobj"; then -+ if test -n "$gentop"; then -+ $show "${rm}r $gentop" -+ $run ${rm}r $gentop -+ fi -+ -+ exit $EXIT_SUCCESS -+ fi -+ -+ if test "$build_libtool_libs" != yes; then -+ if test -n "$gentop"; then -+ $show "${rm}r $gentop" -+ $run ${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" -+ # $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" -+ cmds=$reload_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ fi -+ -+ if test -n "$gentop"; then -+ $show "${rm}r $gentop" -+ $run ${rm}r $gentop -+ fi -+ -+ exit $EXIT_SUCCESS -+ ;; -+ -+ prog) -+ case $host in -+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; -+ esac -+ if test -n "$vinfo"; then -+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 -+ fi -+ -+ if test -n "$release"; then -+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 -+ fi -+ -+ if test "$preload" = yes; then -+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && -+ test "$dlopen_self_static" = unknown; then -+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." -+ fi -+ fi -+ -+ case $host in -+ *-*-rhapsody* | *-*-darwin1.[012]) -+ # On Rhapsody replace the C library is the System framework -+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` -+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` -+ ;; -+ esac -+ -+ case $host in -+ *darwin*) -+ # Don't allow lazy linking, it breaks C++ global constructors -+ if test "$tagname" = CXX ; then -+ compile_command="$compile_command ${wl}-bind_at_load" -+ finalize_command="$finalize_command ${wl}-bind_at_load" -+ fi -+ ;; -+ 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 "*) -+ new_libs="$new_libs -L$path/$objdir" ;; -+ esac -+ ;; -+ esac -+ done -+ for deplib in $compile_deplibs; do -+ case $deplib in -+ -L*) -+ case " $new_libs " in -+ *" $deplib "*) ;; -+ *) new_libs="$new_libs $deplib" ;; -+ esac -+ ;; -+ *) new_libs="$new_libs $deplib" ;; -+ esac -+ done -+ compile_deplibs="$new_libs" -+ -+ -+ compile_command="$compile_command $compile_deplibs" -+ finalize_command="$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 "*) ;; -+ *) finalize_rpath="$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"*) -+ ;; -+ *) -+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" -+ ;; -+ esac -+ fi -+ else -+ eval flag=\"$hardcode_libdir_flag_spec\" -+ rpath="$rpath $flag" -+ fi -+ elif test -n "$runpath_var"; then -+ case "$perm_rpath " in -+ *" $libdir "*) ;; -+ *) perm_rpath="$perm_rpath $libdir" ;; -+ esac -+ fi -+ case $host in -+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) -+ testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` -+ case :$dllsearchpath: in -+ *":$libdir:"*) ;; -+ *) dllsearchpath="$dllsearchpath:$libdir";; -+ esac -+ case :$dllsearchpath: in -+ *":$testbindir:"*) ;; -+ *) dllsearchpath="$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"*) -+ ;; -+ *) -+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" -+ ;; -+ esac -+ fi -+ else -+ eval flag=\"$hardcode_libdir_flag_spec\" -+ rpath="$rpath $flag" -+ fi -+ elif test -n "$runpath_var"; then -+ case "$finalize_perm_rpath " in -+ *" $libdir "*) ;; -+ *) finalize_perm_rpath="$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 "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` -+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` -+ fi -+ -+ dlsyms= -+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then -+ if test -n "$NM" && test -n "$global_symbol_pipe"; then -+ dlsyms="${outputname}S.c" -+ else -+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 -+ fi -+ fi -+ -+ if test -n "$dlsyms"; then -+ case $dlsyms in -+ "") ;; -+ *.c) -+ # Discover the nlist of each of the dlfiles. -+ nlist="$output_objdir/${outputname}.nm" -+ -+ $show "$rm $nlist ${nlist}S ${nlist}T" -+ $run $rm "$nlist" "${nlist}S" "${nlist}T" -+ -+ # Parse the name list into a source file. -+ $show "creating $output_objdir/$dlsyms" -+ -+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ -+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ -+ -+#ifdef __cplusplus -+extern \"C\" { -+#endif -+ -+/* Prevent the only kind of declaration conflicts we can make. */ -+#define lt_preloaded_symbols some_other_symbol -+ -+/* External symbol declarations for the compiler. */\ -+" -+ -+ if test "$dlself" = yes; then -+ $show "generating symbol list for \`$output'" -+ -+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" -+ -+ # Add our own program objects to the symbol list. -+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` -+ for arg in $progfiles; do -+ $show "extracting global C symbols from \`$arg'" -+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" -+ done -+ -+ if test -n "$exclude_expsyms"; then -+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' -+ $run eval '$mv "$nlist"T "$nlist"' -+ fi -+ -+ if test -n "$export_symbols_regex"; then -+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' -+ $run eval '$mv "$nlist"T "$nlist"' -+ fi -+ -+ # Prepare the list of exported symbols -+ if test -z "$export_symbols"; then -+ export_symbols="$output_objdir/$outputname.exp" -+ $run $rm $export_symbols -+ $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' -+ case $host in -+ *cygwin* | *mingw* ) -+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' -+ $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' -+ ;; -+ esac -+ else -+ $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' -+ $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' -+ $run eval 'mv "$nlist"T "$nlist"' -+ case $host in -+ *cygwin* | *mingw* ) -+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' -+ $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' -+ ;; -+ esac -+ fi -+ fi -+ -+ for arg in $dlprefiles; do -+ $show "extracting global C symbols from \`$arg'" -+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` -+ $run eval '$echo ": $name " >> "$nlist"' -+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" -+ done -+ -+ if test -z "$run"; then -+ # 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/$dlsyms"' -+ else -+ $echo '/* NONE */' >> "$output_objdir/$dlsyms" -+ fi -+ -+ $echo >> "$output_objdir/$dlsyms" "\ -+ -+#undef lt_preloaded_symbols -+ -+#if defined (__STDC__) && __STDC__ -+# define lt_ptr void * -+#else -+# define lt_ptr char * -+# define const -+#endif -+ -+/* The mapping between symbol names and symbols. */ -+" -+ -+ case $host in -+ *cygwin* | *mingw* ) -+ $echo >> "$output_objdir/$dlsyms" "\ -+/* DATA imports from DLLs on WIN32 can't be const, because -+ runtime relocations are performed -- see ld's documentation -+ on pseudo-relocs */ -+struct { -+" -+ ;; -+ * ) -+ $echo >> "$output_objdir/$dlsyms" "\ -+const struct { -+" -+ ;; -+ esac -+ -+ -+ $echo >> "$output_objdir/$dlsyms" "\ -+ const char *name; -+ lt_ptr address; -+} -+lt_preloaded_symbols[] = -+{\ -+" -+ -+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" -+ -+ $echo >> "$output_objdir/$dlsyms" "\ -+ {0, (lt_ptr) 0} -+}; -+ -+/* This works around a problem in FreeBSD linker */ -+#ifdef FREEBSD_WORKAROUND -+static const void *lt_preloaded_setup() { -+ return lt_preloaded_symbols; -+} -+#endif -+ -+#ifdef __cplusplus -+} -+#endif\ -+" -+ fi -+ -+ pic_flag_for_symtable= -+ 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*) -+ case "$compile_command " in -+ *" -static "*) ;; -+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; -+ esac;; -+ *-*-hpux*) -+ case "$compile_command " in -+ *" -static "*) ;; -+ *) pic_flag_for_symtable=" $pic_flag";; -+ esac -+ esac -+ -+ # Now compile the dynamic symbol file. -+ $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" -+ $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? -+ -+ # Clean up the generated files. -+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" -+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" -+ -+ # Transform the symbol file into the correct name. -+ case $host in -+ *cygwin* | *mingw* ) -+ if test -f "$output_objdir/${outputname}.def" ; then -+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` -+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` -+ else -+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` -+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` -+ fi -+ ;; -+ * ) -+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` -+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` -+ ;; -+ esac -+ ;; -+ *) -+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ 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 "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` -+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` -+ fi -+ -+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then -+ # Replace the output file specification. -+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` -+ link_command="$compile_command$compile_rpath" -+ -+ # We have no uninstalled library dependencies, so finalize right now. -+ $show "$link_command" -+ $run eval "$link_command" -+ exit_status=$? -+ -+ # Delete the generated files. -+ if test -n "$dlsyms"; then -+ $show "$rm $output_objdir/${outputname}S.${objext}" -+ $run $rm "$output_objdir/${outputname}S.${objext}" -+ fi -+ -+ exit $exit_status -+ fi -+ -+ if test -n "$shlibpath_var"; then -+ # We should set the shlibpath_var -+ rpath= -+ for dir in $temp_rpath; do -+ case $dir in -+ [\\/]* | [A-Za-z]:[\\/]*) -+ # Absolute path. -+ rpath="$rpath$dir:" -+ ;; -+ *) -+ # Relative path: add a thisdir entry. -+ rpath="$rpath\$thisdir/$dir:" -+ ;; -+ esac -+ done -+ temp_rpath="$rpath" -+ 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 -+ rpath="$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 -+ rpath="$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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` -+ # Delete the old output file. -+ $run $rm $output -+ # Link the executable and exit -+ $show "$link_command" -+ $run eval "$link_command" || exit $? -+ 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" -+ -+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 -+ $echo "$modename: \`$output' will be relinked during installation" 1>&2 -+ else -+ if test "$fast_install" != no; then -+ link_command="$finalize_var$compile_command$finalize_rpath" -+ if test "$fast_install" = yes; then -+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` -+ 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` -+ -+ # Delete the old output files. -+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname -+ -+ $show "$link_command" -+ $run eval "$link_command" || exit $? -+ -+ # Now create the wrapper script. -+ $show "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}\" || 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 -+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` -+ relink_command="$var=\"$var_value\"; export $var; $relink_command" -+ fi -+ done -+ relink_command="(cd `pwd`; $relink_command)" -+ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` -+ fi -+ -+ # Quote $echo for shipping. -+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then -+ case $progpath in -+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; -+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; -+ esac -+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` -+ else -+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` -+ fi -+ -+ # Only actually do things if our run command is non-null. -+ if test -z "$run"; then -+ # win32 will think the script is a binary if it has -+ # a .exe suffix, so we strip it off here. -+ case $output in -+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; -+ esac -+ # test for cygwin because mv fails w/o .exe extensions -+ case $host in -+ *cygwin*) -+ exeext=.exe -+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; -+ *) exeext= ;; -+ esac -+ case $host in -+ *cygwin* | *mingw* ) -+ output_name=`basename $output` -+ output_path=`dirname $output` -+ 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 -+ -+ cat > $cwrappersource <> $cwrappersource<<"EOF" -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if defined(PATH_MAX) -+# define LT_PATHMAX PATH_MAX -+#elif defined(MAXPATHLEN) -+# define LT_PATHMAX MAXPATHLEN -+#else -+# define LT_PATHMAX 1024 -+#endif -+ -+#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 -+# 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 */ -+ -+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -+#define XFREE(stale) do { \ -+ if (stale) { free ((void *) stale); stale = 0; } \ -+} while (0) -+ -+/* -DDEBUG is fairly common in CFLAGS. */ -+#undef DEBUG -+#if defined DEBUGWRAPPER -+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) -+#else -+# define DEBUG(format, ...) -+#endif -+ -+const char *program_name = NULL; -+ -+void * xmalloc (size_t num); -+char * xstrdup (const char *string); -+const char * base_name (const char *name); -+char * find_executable(const char *wrapper); -+int check_executable(const char *path); -+char * strendzap(char *str, const char *pat); -+void lt_fatal (const char *message, ...); -+ -+int -+main (int argc, char *argv[]) -+{ -+ char **newargz; -+ int i; -+ -+ program_name = (char *) xstrdup (base_name (argv[0])); -+ DEBUG("(main) argv[0] : %s\n",argv[0]); -+ DEBUG("(main) program_name : %s\n",program_name); -+ newargz = XMALLOC(char *, argc+2); -+EOF -+ -+ cat >> $cwrappersource <> $cwrappersource <<"EOF" -+ newargz[1] = find_executable(argv[0]); -+ if (newargz[1] == NULL) -+ lt_fatal("Couldn't find %s", argv[0]); -+ DEBUG("(main) found exe at : %s\n",newargz[1]); -+ /* we know the script has the same name, without the .exe */ -+ /* so make sure newargz[1] doesn't end in .exe */ -+ strendzap(newargz[1],".exe"); -+ for (i = 1; i < argc; i++) -+ newargz[i+1] = xstrdup(argv[i]); -+ newargz[argc+1] = NULL; -+ -+ for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" -+ return 127; -+} -+ -+void * -+xmalloc (size_t num) -+{ -+ void * p = (void *) malloc (num); -+ if (!p) -+ lt_fatal ("Memory exhausted"); -+ -+ return p; -+} -+ -+char * -+xstrdup (const char *string) -+{ -+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL -+; -+} -+ -+const char * -+base_name (const char *name) -+{ -+ const char *base; -+ -+#if defined (HAVE_DOS_BASED_FILE_SYSTEM) -+ /* Skip over the disk name in MSDOS pathnames. */ -+ if (isalpha ((unsigned char)name[0]) && name[1] == ':') -+ name += 2; -+#endif -+ -+ for (base = name; *name; name++) -+ if (IS_DIR_SEPARATOR (*name)) -+ base = name + 1; -+ return base; -+} -+ -+int -+check_executable(const char * path) -+{ -+ struct stat st; -+ -+ DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); -+ if ((!path) || (!*path)) -+ return 0; -+ -+ if ((stat (path, &st) >= 0) && -+ ( -+ /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ -+#if defined (S_IXOTH) -+ ((st.st_mode & S_IXOTH) == S_IXOTH) || -+#endif -+#if defined (S_IXGRP) -+ ((st.st_mode & S_IXGRP) == S_IXGRP) || -+#endif -+ ((st.st_mode & S_IXUSR) == S_IXUSR)) -+ ) -+ return 1; -+ else -+ return 0; -+} -+ -+/* Searches for the full path of the wrapper. Returns -+ newly allocated full path name if found, NULL otherwise */ -+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; -+ -+ DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); -+ -+ 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 ("getcwd failed"); -+ 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 ("getcwd failed"); -+ 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 * -+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; -+} -+ -+static void -+lt_error_core (int exit_status, const char * mode, -+ const char * message, va_list ap) -+{ -+ fprintf (stderr, "%s: %s: ", program_name, mode); -+ vfprintf (stderr, message, ap); -+ fprintf (stderr, ".\n"); -+ -+ if (exit_status >= 0) -+ exit (exit_status); -+} -+ -+void -+lt_fatal (const char *message, ...) -+{ -+ va_list ap; -+ va_start (ap, message); -+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap); -+ va_end (ap); -+} -+EOF -+ # we should really use a build-platform specific compiler -+ # here, but OTOH, the wrappers (shell script and this C one) -+ # are only useful if you want to execute the "real" binary. -+ # Since the "real" binary is built for $host, then this -+ # wrapper might as well be built for $host, too. -+ $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource -+ ;; -+ esac -+ $rm $output -+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 -+ -+ $echo > $output "\ -+#! $SHELL -+ -+# $output - temporary wrapper script for $objdir/$outputname -+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -+# -+# 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. -+Xsed='${SED} -e 1s/^X//' -+sed_quote_subst='$sed_quote_subst' -+ -+# Be Bourne compatible (taken from Autoconf:_AS_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 -+ -+# 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 variable: -+ 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 -+ echo=\"$qecho\" -+ file=\"\$0\" -+ # Make sure echo works. -+ if test \"X\$1\" = X--no-reexec; then -+ # Discard the --no-reexec flag, and continue. -+ shift -+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then -+ # Yippee, \$echo works! -+ : -+ else -+ # Restart under the correct shell, and then maybe \$echo will work. -+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} -+ fi -+ fi\ -+" -+ $echo >> $output "\ -+ -+ # Find the directory that this script lives in. -+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e 's%^.*/%%'\` -+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` -+ done -+ -+ # Try to get the absolute directory name. -+ absdir=\`cd \"\$thisdir\" && pwd\` -+ test -n \"\$absdir\" && thisdir=\"\$absdir\" -+" -+ -+ if test "$fast_install" = yes; then -+ $echo >> $output "\ -+ 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 >> $output "\ -+ -+ # 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 $EXIT_FAILURE -+ fi -+ fi -+ -+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || -+ { $rm \"\$progdir/\$program\"; -+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } -+ $rm \"\$progdir/\$file\" -+ fi" -+ else -+ $echo >> $output "\ -+ program='$outputname' -+ progdir=\"\$thisdir/$objdir\" -+" -+ fi -+ -+ $echo >> $output "\ -+ -+ if test -f \"\$progdir/\$program\"; then" -+ -+ # Export our shlibpath_var if we have one. -+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then -+ $echo >> $output "\ -+ # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` -+ -+ export $shlibpath_var -+" -+ fi -+ -+ # fixup the dll searchpath if we need to. -+ if test -n "$dllsearchpath"; then -+ $echo >> $output "\ -+ # Add the dll search path components to the executable PATH -+ PATH=$dllsearchpath:\$PATH -+" -+ fi -+ -+ $echo >> $output "\ -+ if test \"\$libtool_execute_magic\" != \"$magic\"; then -+ # Run the actual program with our arguments. -+" -+ case $host in -+ # Backslashes separate directories on plain windows -+ *-*-mingw | *-*-os2*) -+ $echo >> $output "\ -+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -+" -+ ;; -+ -+ *) -+ $echo >> $output "\ -+ exec \"\$progdir/\$program\" \${1+\"\$@\"} -+" -+ ;; -+ esac -+ $echo >> $output "\ -+ \$echo \"\$0: cannot exec \$program \$*\" -+ exit $EXIT_FAILURE -+ 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 $EXIT_FAILURE -+ fi -+fi\ -+" -+ chmod +x $output -+ fi -+ 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" -+ 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" -+ fi -+ addlibs="$old_convenience" -+ fi -+ -+ if test -n "$addlibs"; then -+ gentop="$output_objdir/${outputname}x" -+ generated="$generated $gentop" -+ -+ func_extract_archives $gentop $addlibs -+ oldobjs="$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 -+ # 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 -+ $echo "X$obj" | $Xsed -e 's%^.*/%%' -+ done | sort | sort -uc >/dev/null 2>&1); then -+ : -+ else -+ $echo "copying selected object files to avoid basename conflicts..." -+ -+ if test -z "$gentop"; then -+ gentop="$output_objdir/${outputname}x" -+ generated="$generated $gentop" -+ -+ $show "${rm}r $gentop" -+ $run ${rm}r "$gentop" -+ $show "$mkdir $gentop" -+ $run $mkdir "$gentop" -+ exit_status=$? -+ if test "$exit_status" -ne 0 && test ! -d "$gentop"; then -+ exit $exit_status -+ fi -+ fi -+ -+ save_oldobjs=$oldobjs -+ oldobjs= -+ counter=1 -+ for obj in $save_oldobjs -+ do -+ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` -+ case " $oldobjs " in -+ " ") oldobjs=$obj ;; -+ *[\ /]"$objbase "*) -+ while :; do -+ # Make sure we don't pick an alternate name that also -+ # overlaps. -+ newobj=lt$counter-$objbase -+ counter=`expr $counter + 1` -+ case " $oldobjs " in -+ *[\ /]"$newobj "*) ;; -+ *) if test ! -f "$gentop/$newobj"; then break; fi ;; -+ esac -+ done -+ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" -+ $run ln "$obj" "$gentop/$newobj" || -+ $run cp "$obj" "$gentop/$newobj" -+ oldobjs="$oldobjs $gentop/$newobj" -+ ;; -+ *) oldobjs="$oldobjs $obj" ;; -+ esac -+ done -+ fi -+ -+ eval cmds=\"$old_archive_cmds\" -+ -+ if len=`expr "X$cmds" : ".*"` && -+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then -+ cmds=$old_archive_cmds -+ else -+ # the command line is too long to link in one step, link in parts -+ $echo "using piecewise archive linking..." -+ save_RANLIB=$RANLIB -+ RANLIB=: -+ objlist= -+ concat_cmds= -+ save_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 -+ for obj in $save_oldobjs -+ do -+ oldobjs="$objlist $obj" -+ objlist="$objlist $obj" -+ eval test_cmds=\"$old_archive_cmds\" -+ if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && -+ test "$len" -le "$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= -+ 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 -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ eval cmd=\"$cmd\" -+ IFS="$save_ifs" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ done -+ -+ if test -n "$generated"; then -+ $show "${rm}r$generated" -+ $run ${rm}r$generated -+ fi -+ -+ # Now create the libtool archive. -+ case $output in -+ *.la) -+ old_library= -+ test "$build_old_libs" = yes && old_library="$libname.$libext" -+ $show "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}\" || 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 -+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` -+ relink_command="$var=\"$var_value\"; 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 "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` -+ if test "$hardcode_automatic" = yes ; then -+ relink_command= -+ fi -+ -+ -+ # Only create the output if not a dry run. -+ if test -z "$run"; then -+ 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) -+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` -+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` -+ if test -z "$libdir"; then -+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ newdependency_libs="$newdependency_libs $libdir/$name" -+ ;; -+ *) newdependency_libs="$newdependency_libs $deplib" ;; -+ esac -+ done -+ dependency_libs="$newdependency_libs" -+ newdlfiles= -+ for lib in $dlfiles; do -+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` -+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` -+ if test -z "$libdir"; then -+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ newdlfiles="$newdlfiles $libdir/$name" -+ done -+ dlfiles="$newdlfiles" -+ newdlprefiles= -+ for lib in $dlprefiles; do -+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` -+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` -+ if test -z "$libdir"; then -+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ newdlprefiles="$newdlprefiles $libdir/$name" -+ done -+ dlprefiles="$newdlprefiles" -+ else -+ newdlfiles= -+ for lib in $dlfiles; do -+ case $lib in -+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; -+ *) abs=`pwd`"/$lib" ;; -+ esac -+ newdlfiles="$newdlfiles $abs" -+ done -+ dlfiles="$newdlfiles" -+ newdlprefiles= -+ for lib in $dlprefiles; do -+ case $lib in -+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; -+ *) abs=`pwd`"/$lib" ;; -+ esac -+ newdlprefiles="$newdlprefiles $abs" -+ done -+ dlprefiles="$newdlprefiles" -+ fi -+ $rm $output -+ # place dlname in correct position for cygwin -+ tdlname=$dlname -+ case $host,$output,$installed,$module,$dlname in -+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; -+ esac -+ $echo > $output "\ -+# $outputname - a libtool library file -+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -+# -+# 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' -+ -+# Libraries that this one depends upon. -+dependency_libs='$dependency_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 -+ fi -+ -+ # Do a symbolic link so that the libtool archive can be found in -+ # LD_LIBRARY_PATH before the program is installed. -+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" -+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? -+ ;; -+ esac -+ exit $EXIT_SUCCESS -+ ;; -+ -+ # libtool install mode -+ install) -+ modename="$modename: install" -+ -+ # 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. -+ $echo "X$nonopt" | grep shtool > /dev/null; then -+ # Aesthetically quote it. -+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ install_prog="$arg " -+ arg="$1" -+ shift -+ else -+ install_prog= -+ arg=$nonopt -+ fi -+ -+ # The real first argument should be the name of the installation program. -+ # Aesthetically quote it. -+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ install_prog="$install_prog$arg" -+ -+ # We need to accept at least all the BSD install flags. -+ dest= -+ files= -+ opts= -+ prev= -+ install_type= -+ isdir=no -+ stripme= -+ for arg -+ do -+ if test -n "$dest"; then -+ files="$files $dest" -+ dest=$arg -+ continue -+ fi -+ -+ case $arg in -+ -d) isdir=yes ;; -+ -f) -+ case " $install_prog " in -+ *[\\\ /]cp\ *) ;; -+ *) prev=$arg ;; -+ esac -+ ;; -+ -g | -m | -o) prev=$arg ;; -+ -s) -+ stripme=" -s" -+ continue -+ ;; -+ -*) -+ ;; -+ *) -+ # If the previous option needed an argument, then skip it. -+ if test -n "$prev"; then -+ prev= -+ else -+ dest=$arg -+ continue -+ fi -+ ;; -+ esac -+ -+ # Aesthetically quote the argument. -+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` -+ case $arg in -+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") -+ arg="\"$arg\"" -+ ;; -+ esac -+ install_prog="$install_prog $arg" -+ done -+ -+ if test -z "$install_prog"; then -+ $echo "$modename: you must specify an install program" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ if test -n "$prev"; then -+ $echo "$modename: the \`$prev' option requires an argument" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ if test -z "$files"; then -+ if test -z "$dest"; then -+ $echo "$modename: no file or destination specified" 1>&2 -+ else -+ $echo "$modename: you must specify a destination" 1>&2 -+ fi -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # Strip any trailing slash from the destination. -+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` -+ -+ # Check to see that the destination is a directory. -+ test -d "$dest" && isdir=yes -+ if test "$isdir" = yes; then -+ destdir="$dest" -+ destname= -+ else -+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` -+ test "X$destdir" = "X$dest" && destdir=. -+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` -+ -+ # Not a directory, so check to see that there is only one file specified. -+ set dummy $files -+ if test "$#" -gt 2; then -+ $echo "$modename: \`$dest' is not a directory" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ fi -+ case $destdir in -+ [\\/]* | [A-Za-z]:[\\/]*) ;; -+ *) -+ for file in $files; do -+ case $file in -+ *.lo) ;; -+ *) -+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ 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. -+ staticlibs="$staticlibs $file" -+ ;; -+ -+ *.la) -+ # Check to see that this really is a libtool archive. -+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : -+ else -+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ library_names= -+ old_library= -+ relink_command= -+ # If there is no directory component, then add one. -+ case $file in -+ */* | *\\*) . $file ;; -+ *) . ./$file ;; -+ esac -+ -+ # Add the libdir to current_libdirs if it is the destination. -+ if test "X$destdir" = "X$libdir"; then -+ case "$current_libdirs " in -+ *" $libdir "*) ;; -+ *) current_libdirs="$current_libdirs $libdir" ;; -+ esac -+ else -+ # Note the libdir as a future libdir. -+ case "$future_libdirs " in -+ *" $libdir "*) ;; -+ *) future_libdirs="$future_libdirs $libdir" ;; -+ esac -+ fi -+ -+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ -+ test "X$dir" = "X$file/" && dir= -+ dir="$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 "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. -+ if test "$inst_prefix_dir" = "$destdir"; then -+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ if test -n "$inst_prefix_dir"; then -+ # Stick the inst_prefix_dir data into the link command. -+ relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` -+ else -+ relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` -+ fi -+ -+ $echo "$modename: warning: relinking \`$file'" 1>&2 -+ $show "$relink_command" -+ if $run eval "$relink_command"; then : -+ else -+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ fi -+ -+ # See the names of the shared library. -+ set dummy $library_names -+ if test -n "$2"; then -+ realname="$2" -+ shift -+ shift -+ -+ srcname="$realname" -+ test -n "$relink_command" && srcname="$realname"T -+ -+ # Install the shared library and build the symlinks. -+ $show "$install_prog $dir/$srcname $destdir/$realname" -+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? -+ if test -n "$stripme" && test -n "$striplib"; then -+ $show "$striplib $destdir/$realname" -+ $run 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 -+ if test "$linkname" != "$realname"; then -+ $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" -+ $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" -+ fi -+ done -+ fi -+ -+ # Do each command in the postinstall commands. -+ lib="$destdir/$realname" -+ cmds=$postinstall_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || { -+ lt_exit=$? -+ -+ # Restore the uninstalled library and exit -+ if test "$mode" = relink; then -+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' -+ fi -+ -+ exit $lt_exit -+ } -+ done -+ IFS="$save_ifs" -+ fi -+ -+ # Install the pseudo-library for information purposes. -+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` -+ instname="$dir/$name"i -+ $show "$install_prog $instname $destdir/$name" -+ $run eval "$install_prog $instname $destdir/$name" || exit $? -+ -+ # Maybe install the static library, too. -+ test -n "$old_library" && staticlibs="$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 -+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` -+ destfile="$destdir/$destfile" -+ fi -+ -+ # Deduce the name of the destination old-style object file. -+ case $destfile in -+ *.lo) -+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` -+ ;; -+ *.$objext) -+ staticdest="$destfile" -+ destfile= -+ ;; -+ *) -+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ -+ # Install the libtool object if requested. -+ if test -n "$destfile"; then -+ $show "$install_prog $file $destfile" -+ $run eval "$install_prog $file $destfile" || exit $? -+ fi -+ -+ # Install the old object if enabled. -+ if test "$build_old_libs" = yes; then -+ # Deduce the name of the old-style object file. -+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` -+ -+ $show "$install_prog $staticobj $staticdest" -+ $run 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 -+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` -+ 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 -+ file=`$echo $file|${SED} 's,.exe$,,'` -+ stripped_ext=".exe" -+ fi -+ ;; -+ esac -+ -+ # Do a test to see if this is really a libtool program. -+ case $host in -+ *cygwin*|*mingw*) -+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` -+ ;; -+ *) -+ wrapper=$file -+ ;; -+ esac -+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then -+ notinst_deplibs= -+ relink_command= -+ -+ # Note that it is not necessary on cygwin/mingw to append a dot to -+ # foo even if both foo 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. -+ # -+ # If there is no directory component, then add one. -+ case $wrapper in -+ */* | *\\*) . ${wrapper} ;; -+ *) . ./${wrapper} ;; -+ esac -+ -+ # Check the variables that should have been set. -+ if test -z "$notinst_deplibs"; then -+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ finalize=yes -+ for lib in $notinst_deplibs; do -+ # Check to see that each library is installed. -+ libdir= -+ if test -f "$lib"; then -+ # If there is no directory component, then add one. -+ case $lib in -+ */* | *\\*) . $lib ;; -+ *) . ./$lib ;; -+ esac -+ fi -+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test -+ if test -n "$libdir" && test ! -f "$libfile"; then -+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 -+ finalize=no -+ fi -+ done -+ -+ relink_command= -+ # Note that it is not necessary on cygwin/mingw to append a dot to -+ # foo even if both foo 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. -+ # -+ # If there is no directory component, then add one. -+ case $wrapper in -+ */* | *\\*) . ${wrapper} ;; -+ *) . ./${wrapper} ;; -+ esac -+ -+ outputname= -+ if test "$fast_install" = no && test -n "$relink_command"; then -+ if test "$finalize" = yes && test -z "$run"; then -+ tmpdir=`func_mktempdir` -+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` -+ outputname="$tmpdir/$file" -+ # Replace the output file specification. -+ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` -+ -+ $show "$relink_command" -+ if $run eval "$relink_command"; then : -+ else -+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 -+ ${rm}r "$tmpdir" -+ continue -+ fi -+ file="$outputname" -+ else -+ $echo "$modename: warning: cannot relink \`$file'" 1>&2 -+ fi -+ else -+ # Install the binary that we compiled earlier. -+ file=`$echo "X$file$stripped_ext" | $Xsed -e "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) -+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` -+ ;; -+ esac -+ ;; -+ esac -+ $show "$install_prog$stripme $file $destfile" -+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $? -+ test -n "$outputname" && ${rm}r "$tmpdir" -+ ;; -+ esac -+ done -+ -+ for file in $staticlibs; do -+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` -+ -+ # Set up the ranlib parameters. -+ oldlib="$destdir/$name" -+ -+ $show "$install_prog $file $oldlib" -+ $run eval "$install_prog \$file \$oldlib" || exit $? -+ -+ if test -n "$stripme" && test -n "$old_striplib"; then -+ $show "$old_striplib $oldlib" -+ $run eval "$old_striplib $oldlib" || exit $? -+ fi -+ -+ # Do each command in the postinstall commands. -+ cmds=$old_postinstall_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || exit $? -+ done -+ IFS="$save_ifs" -+ done -+ -+ if test -n "$future_libdirs"; then -+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 -+ fi -+ -+ if test -n "$current_libdirs"; then -+ # Maybe just do a dry run. -+ test -n "$run" && current_libdirs=" -n$current_libdirs" -+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' -+ else -+ exit $EXIT_SUCCESS -+ fi -+ ;; -+ -+ # libtool finish mode -+ finish) -+ modename="$modename: finish" -+ libdirs="$nonopt" -+ admincmds= -+ -+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then -+ for dir -+ do -+ libdirs="$libdirs $dir" -+ done -+ -+ for libdir in $libdirs; do -+ if test -n "$finish_cmds"; then -+ # Do each command in the finish commands. -+ cmds=$finish_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" || admincmds="$admincmds -+ $cmd" -+ done -+ IFS="$save_ifs" -+ fi -+ if test -n "$finish_eval"; then -+ # Do the single finish_eval. -+ eval cmds=\"$finish_eval\" -+ $run eval "$cmds" || admincmds="$admincmds -+ $cmds" -+ fi -+ done -+ fi -+ -+ # Exit here if they wanted silent mode. -+ test "$show" = : && exit $EXIT_SUCCESS -+ -+ $echo "X----------------------------------------------------------------------" | $Xsed -+ $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" -+ $echo "more information, such as the ld(1) and ld.so(8) manual pages." -+ $echo "X----------------------------------------------------------------------" | $Xsed -+ exit $EXIT_SUCCESS -+ ;; -+ -+ # libtool execute mode -+ execute) -+ modename="$modename: execute" -+ -+ # The first argument is the command name. -+ cmd="$nonopt" -+ if test -z "$cmd"; then -+ $echo "$modename: you must specify a COMMAND" 1>&2 -+ $echo "$help" -+ exit $EXIT_FAILURE -+ fi -+ -+ # Handle -dlopen flags immediately. -+ for file in $execute_dlfiles; do -+ if test ! -f "$file"; then -+ $echo "$modename: \`$file' is not a file" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ dir= -+ case $file in -+ *.la) -+ # Check to see that this really is a libtool archive. -+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : -+ else -+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ # Read the libtool library. -+ dlname= -+ library_names= -+ -+ # If there is no directory component, then add one. -+ case $file in -+ */* | *\\*) . $file ;; -+ *) . ./$file ;; -+ esac -+ -+ # Skip this library if it cannot be dlopened. -+ if test -z "$dlname"; then -+ # Warn if it was a shared library. -+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" -+ continue -+ fi -+ -+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` -+ test "X$dir" = "X$file" && dir=. -+ -+ if test -f "$dir/$objdir/$dlname"; then -+ dir="$dir/$objdir" -+ else -+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ ;; -+ -+ *.lo) -+ # Just add the directory containing the .lo file. -+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` -+ test "X$dir" = "X$file" && dir=. -+ ;; -+ -+ *) -+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 -+ 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 -+ -*) ;; -+ *) -+ # Do a test to see if this is really a libtool program. -+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ # If there is no directory component, then add one. -+ case $file in -+ */* | *\\*) . $file ;; -+ *) . ./$file ;; -+ esac -+ -+ # Transform arg to wrapped name. -+ file="$progdir/$program" -+ fi -+ ;; -+ esac -+ # Quote arguments (to preserve shell metacharacters). -+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` -+ args="$args \"$file\"" -+ done -+ -+ if test -z "$run"; 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 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 -+ ;; -+ -+ # libtool clean and uninstall mode -+ clean | uninstall) -+ modename="$modename: $mode" -+ 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) rm="$rm $arg"; rmforce=yes ;; -+ -*) rm="$rm $arg" ;; -+ *) files="$files $arg" ;; -+ esac -+ done -+ -+ if test -z "$rm"; then -+ $echo "$modename: you must specify an RM program" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+ -+ rmdirs= -+ -+ origobjdir="$objdir" -+ for file in $files; do -+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` -+ if test "X$dir" = "X$file"; then -+ dir=. -+ objdir="$origobjdir" -+ else -+ objdir="$dir/$origobjdir" -+ fi -+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` -+ test "$mode" = uninstall && objdir="$dir" -+ -+ # Remember objdir for removal later, being careful to avoid duplicates -+ if test "$mode" = clean; then -+ case " $rmdirs " in -+ *" $objdir "*) ;; -+ *) rmdirs="$rmdirs $objdir" ;; -+ 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 (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ . $dir/$name -+ -+ # Delete the libtool libraries and symlinks. -+ for n in $library_names; do -+ rmfiles="$rmfiles $objdir/$n" -+ done -+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" -+ -+ case "$mode" in -+ clean) -+ case " $library_names " in -+ # " " in the beginning catches empty $dlname -+ *" $dlname "*) ;; -+ *) rmfiles="$rmfiles $objdir/$dlname" ;; -+ esac -+ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" -+ ;; -+ uninstall) -+ if test -n "$library_names"; then -+ # Do each command in the postuninstall commands. -+ cmds=$postuninstall_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" -+ if test "$?" -ne 0 && test "$rmforce" != yes; then -+ exit_status=1 -+ fi -+ done -+ IFS="$save_ifs" -+ fi -+ -+ if test -n "$old_library"; then -+ # Do each command in the old_postuninstall commands. -+ cmds=$old_postuninstall_cmds -+ save_ifs="$IFS"; IFS='~' -+ for cmd in $cmds; do -+ IFS="$save_ifs" -+ eval cmd=\"$cmd\" -+ $show "$cmd" -+ $run eval "$cmd" -+ if test "$?" -ne 0 && test "$rmforce" != yes; then -+ exit_status=1 -+ fi -+ done -+ IFS="$save_ifs" -+ fi -+ # FIXME: should reinstall the best remaining shared library. -+ ;; -+ esac -+ fi -+ ;; -+ -+ *.lo) -+ # Possibly a libtool object, so verify it. -+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ -+ # Read the .lo file -+ . $dir/$name -+ -+ # Add PIC object to the list of files to remove. -+ if test -n "$pic_object" \ -+ && test "$pic_object" != none; then -+ rmfiles="$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 -+ rmfiles="$rmfiles $dir/$non_pic_object" -+ fi -+ fi -+ ;; -+ -+ *) -+ if test "$mode" = clean ; then -+ noexename=$name -+ case $file in -+ *.exe) -+ file=`$echo $file|${SED} 's,.exe$,,'` -+ noexename=`$echo $name|${SED} 's,.exe$,,'` -+ # $file with .exe has already been added to rmfiles, -+ # add $file without .exe -+ rmfiles="$rmfiles $file" -+ ;; -+ esac -+ # Do a test to see if this is a libtool program. -+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then -+ relink_command= -+ . $dir/$noexename -+ -+ # note $name still contains .exe if it was in $file originally -+ # as does the version of $file that was added into $rmfiles -+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" -+ if test "$fast_install" = yes && test -n "$relink_command"; then -+ rmfiles="$rmfiles $objdir/lt-$name" -+ fi -+ if test "X$noexename" != "X$name" ; then -+ rmfiles="$rmfiles $objdir/lt-${noexename}.c" -+ fi -+ fi -+ fi -+ ;; -+ esac -+ $show "$rm $rmfiles" -+ $run $rm $rmfiles || exit_status=1 -+ done -+ objdir="$origobjdir" -+ -+ # Try to remove the ${objdir}s in the directories where we deleted files -+ for dir in $rmdirs; do -+ if test -d "$dir"; then -+ $show "rmdir $dir" -+ $run rmdir $dir >/dev/null 2>&1 -+ fi -+ done -+ -+ exit $exit_status -+ ;; -+ -+ "") -+ $echo "$modename: you must specify a MODE" 1>&2 -+ $echo "$generic_help" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+ esac -+ -+ if test -z "$exec_cmd"; then -+ $echo "$modename: invalid operation mode \`$mode'" 1>&2 -+ $echo "$generic_help" 1>&2 -+ exit $EXIT_FAILURE -+ fi -+fi # test -z "$show_help" -+ -+if test -n "$exec_cmd"; then -+ eval exec $exec_cmd -+ exit $EXIT_FAILURE -+fi -+ -+# We need to display help for each of the modes. -+case $mode in -+"") $echo \ -+"Usage: $modename [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 -+ --finish same as \`--mode=finish' -+ --help display this help message and exit -+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] -+ --quiet same as \`--silent' -+ --silent don't print informational messages -+ --tag=TAG use configuration variables from tag TAG -+ --version print version information -+ -+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. Try \`$modename --help --mode=MODE' for -+a more detailed description of MODE. -+ -+Report bugs to ." -+ exit $EXIT_SUCCESS -+ ;; -+ -+clean) -+ $echo \ -+"Usage: $modename [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: $modename [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 -+ -prefer-pic try to building PIC objects only -+ -prefer-non-pic try to building non-PIC objects only -+ -static always build a \`.o' file suitable for static linking -+ -+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: $modename [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: $modename [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: $modename [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 rest of the components are interpreted as arguments to that command (only -+BSD-compatible install options are recognized)." -+ ;; -+ -+link) -+ $echo \ -+"Usage: $modename [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 -+ -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 -+ -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] -+ -+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: $modename [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." -+ ;; -+ -+*) -+ $echo "$modename: invalid operation mode \`$mode'" 1>&2 -+ $echo "$help" 1>&2 -+ exit $EXIT_FAILURE -+ ;; -+esac -+ -+$echo -+$echo "Try \`$modename --help' for more information about other modes." -+ -+exit $? -+ -+# 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 -+disable_libs=shared -+# ### END LIBTOOL TAG CONFIG: disable-shared -+ -+# ### BEGIN LIBTOOL TAG CONFIG: disable-static -+disable_libs=static -+# ### END LIBTOOL TAG CONFIG: disable-static -+ -+# Local Variables: -+# mode:shell-script -+# sh-indentation:2 -+# End: -diff --git a/iscsiuio/missing b/iscsiuio/missing -new file mode 100755 -index 0000000..1c8ff70 ---- /dev/null -+++ b/iscsiuio/missing -@@ -0,0 +1,367 @@ -+#! /bin/sh -+# Common stub for a few missing GNU programs while installing. -+ -+scriptversion=2006-05-10.23 -+ -+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 -+# Free Software Foundation, Inc. -+# Originally 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, write to the Free Software -+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -+# 02110-1301, USA. -+ -+# 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 -+ -+run=: -+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -+sed_minuso='s/.* -o \([^ ]*\).*/\1/p' -+ -+# In the cases where this matters, `missing' is being run in the -+# srcdir already. -+if test -f configure.ac; then -+ configure_ac=configure.ac -+else -+ configure_ac=configure.in -+fi -+ -+msg="missing on your system" -+ -+case $1 in -+--run) -+ # Try to run requested program, and just exit if it succeeds. -+ run= -+ shift -+ "$@" && exit 0 -+ # Exit code 63 means version mismatch. This often happens -+ # when the user try to use an ancient version of a tool on -+ # a file that requires a minimum version. In this case we -+ # we should proceed has if the program had been absent, or -+ # if --run hadn't been passed. -+ if test $? = 63; then -+ run=: -+ msg="probably too old" -+ fi -+ ;; -+ -+ -h|--h|--he|--hel|--help) -+ echo "\ -+$0 [OPTION]... PROGRAM [ARGUMENT]... -+ -+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -+error status if there is no known handling for PROGRAM. -+ -+Options: -+ -h, --help display this help and exit -+ -v, --version output version information and exit -+ --run try to run the given command, and emulate it if it fails -+ -+Supported PROGRAM values: -+ aclocal touch file \`aclocal.m4' -+ autoconf touch file \`configure' -+ autoheader touch file \`config.h.in' -+ autom4te touch the output file, or create a stub one -+ automake touch all \`Makefile.in' files -+ bison create \`y.tab.[ch]', if possible, from existing .[ch] -+ flex create \`lex.yy.c', if possible, from existing .c -+ help2man touch the output file -+ lex create \`lex.yy.c', if possible, from existing .c -+ makeinfo touch the output file -+ tar try tar, gnutar, gtar, then tar without non-portable flags -+ yacc create \`y.tab.[ch]', if possible, from existing .[ch] -+ -+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 -+ -+# Now exit if we have it, but it failed. Also exit now if we -+# don't have it and --version was passed (most likely to detect -+# the program). -+case $1 in -+ lex|yacc) -+ # Not GNU programs, they don't have --version. -+ ;; -+ -+ tar) -+ if test -n "$run"; then -+ echo 1>&2 "ERROR: \`tar' requires --run" -+ exit 1 -+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then -+ exit 1 -+ fi -+ ;; -+ -+ *) -+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then -+ # We have it, but it failed. -+ exit 1 -+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then -+ # Could not run --version or --help. This is probably someone -+ # running `$TOOL --version' or `$TOOL --help' to check whether -+ # $TOOL exists and not knowing $TOOL uses missing. -+ exit 1 -+ fi -+ ;; -+esac -+ -+# If it does not exist, or fails to run (possibly an outdated version), -+# try to emulate it. -+case $1 in -+ aclocal*) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want -+ to install the \`Automake' and \`Perl' packages. Grab them from -+ any GNU archive site." -+ touch aclocal.m4 -+ ;; -+ -+ autoconf) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified \`${configure_ac}'. You might want to install the -+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU -+ archive site." -+ touch configure -+ ;; -+ -+ autoheader) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified \`acconfig.h' or \`${configure_ac}'. You might want -+ to install the \`Autoconf' and \`GNU m4' packages. Grab them -+ from any GNU archive site." -+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` -+ test -z "$files" && files="config.h" -+ touch_files= -+ for f in $files; do -+ case $f in -+ *:*) touch_files="$touch_files "`echo "$f" | -+ sed -e 's/^[^:]*://' -e 's/:.*//'`;; -+ *) touch_files="$touch_files $f.in";; -+ esac -+ done -+ touch $touch_files -+ ;; -+ -+ automake*) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. -+ You might want to install the \`Automake' and \`Perl' packages. -+ Grab them from any GNU archive site." -+ find . -type f -name Makefile.am -print | -+ sed 's/\.am$/.in/' | -+ while read f; do touch "$f"; done -+ ;; -+ -+ autom4te) -+ echo 1>&2 "\ -+WARNING: \`$1' is needed, but is $msg. -+ You might have modified some files without having the -+ proper tools for further handling them. -+ You can get \`$1' as part of \`Autoconf' from any GNU -+ archive site." -+ -+ file=`echo "$*" | sed -n "$sed_output"` -+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` -+ if test -f "$file"; then -+ touch $file -+ else -+ test -z "$file" || exec >$file -+ echo "#! /bin/sh" -+ echo "# Created by GNU Automake missing as a replacement of" -+ echo "# $ $@" -+ echo "exit 0" -+ chmod +x $file -+ exit 1 -+ fi -+ ;; -+ -+ bison|yacc) -+ echo 1>&2 "\ -+WARNING: \`$1' $msg. You should only need it if -+ you modified a \`.y' file. You may need the \`Bison' package -+ in order for those modifications to take effect. You can get -+ \`Bison' from any GNU archive site." -+ rm -f y.tab.c y.tab.h -+ if test $# -ne 1; then -+ eval LASTARG="\${$#}" -+ case $LASTARG in -+ *.y) -+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` -+ if test -f "$SRCFILE"; then -+ cp "$SRCFILE" y.tab.c -+ fi -+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` -+ if test -f "$SRCFILE"; then -+ cp "$SRCFILE" y.tab.h -+ fi -+ ;; -+ esac -+ fi -+ if test ! -f y.tab.h; then -+ echo >y.tab.h -+ fi -+ if test ! -f y.tab.c; then -+ echo 'main() { return 0; }' >y.tab.c -+ fi -+ ;; -+ -+ lex|flex) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified a \`.l' file. You may need the \`Flex' package -+ in order for those modifications to take effect. You can get -+ \`Flex' from any GNU archive site." -+ rm -f lex.yy.c -+ if test $# -ne 1; then -+ eval LASTARG="\${$#}" -+ case $LASTARG in -+ *.l) -+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` -+ if test -f "$SRCFILE"; then -+ cp "$SRCFILE" lex.yy.c -+ fi -+ ;; -+ esac -+ fi -+ if test ! -f lex.yy.c; then -+ echo 'main() { return 0; }' >lex.yy.c -+ fi -+ ;; -+ -+ help2man) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified a dependency of a manual page. You may need the -+ \`Help2man' package in order for those modifications to take -+ effect. You can get \`Help2man' from any GNU archive site." -+ -+ file=`echo "$*" | sed -n "$sed_output"` -+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` -+ if test -f "$file"; then -+ touch $file -+ else -+ test -z "$file" || exec >$file -+ echo ".ab help2man is required to generate this page" -+ exit 1 -+ fi -+ ;; -+ -+ makeinfo) -+ echo 1>&2 "\ -+WARNING: \`$1' is $msg. You should only need it if -+ you modified a \`.texi' or \`.texinfo' file, or any other file -+ indirectly affecting the aspect of the manual. The spurious -+ call might also be the consequence of using a buggy \`make' (AIX, -+ DU, IRIX). You might want to install the \`Texinfo' package or -+ the \`GNU make' package. Grab either from any GNU archive site." -+ # The file to touch is that specified with -o ... -+ file=`echo "$*" | sed -n "$sed_output"` -+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` -+ if test -z "$file"; then -+ # ... or it is the one specified with @setfilename ... -+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` -+ file=`sed -n ' -+ /^@setfilename/{ -+ s/.* \([^ ]*\) *$/\1/ -+ p -+ q -+ }' $infile` -+ # ... or it is derived from the source name (dir/f.texi becomes f.info) -+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info -+ fi -+ # If the file does not exist, the user really needs makeinfo; -+ # let's fail without touching anything. -+ test -f $file || exit 1 -+ touch $file -+ ;; -+ -+ tar) -+ shift -+ -+ # We have already tried tar in the generic part. -+ # Look for gnutar/gtar before invocation to avoid ugly error -+ # messages. -+ if (gnutar --version > /dev/null 2>&1); then -+ gnutar "$@" && exit 0 -+ fi -+ if (gtar --version > /dev/null 2>&1); then -+ gtar "$@" && exit 0 -+ fi -+ firstarg="$1" -+ if shift; then -+ case $firstarg in -+ *o*) -+ firstarg=`echo "$firstarg" | sed s/o//` -+ tar "$firstarg" "$@" && exit 0 -+ ;; -+ esac -+ case $firstarg in -+ *h*) -+ firstarg=`echo "$firstarg" | sed s/h//` -+ tar "$firstarg" "$@" && exit 0 -+ ;; -+ esac -+ fi -+ -+ echo 1>&2 "\ -+WARNING: I can't seem to be able to run \`tar' with the given arguments. -+ You may want to install GNU tar or Free paxutils, or check the -+ command line arguments." -+ exit 1 -+ ;; -+ -+ *) -+ echo 1>&2 "\ -+WARNING: \`$1' is needed, and is $msg. -+ You might have modified some files without having the -+ proper tools for further handling them. Check the \`README' file, -+ it often tells you about the needed prerequisites for installing -+ this package. You may also peek at any GNU archive site, in case -+ some other package would contain this missing \`$1' program." -+ exit 1 -+ ;; -+esac -+ -+exit 0 -+ -+# Local variables: -+# eval: (add-hook 'write-file-hooks 'time-stamp) -+# time-stamp-start: "scriptversion=" -+# time-stamp-format: "%:y-%02m-%02d.%02H" -+# time-stamp-end: "$" -+# End: -diff --git a/iscsiuio/src/Makefile.am b/iscsiuio/src/Makefile.am -new file mode 100644 -index 0000000..44b0085 ---- /dev/null -+++ b/iscsiuio/src/Makefile.am -@@ -0,0 +1 @@ -+SUBDIRS = apps uip unix -diff --git a/iscsiuio/src/Makefile.in b/iscsiuio/src/Makefile.in -new file mode 100644 -index 0000000..b6d1346 ---- /dev/null -+++ b/iscsiuio/src/Makefile.in -@@ -0,0 +1,471 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = .. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+subdir = src -+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+SOURCES = -+DIST_SOURCES = -+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -+ html-recursive info-recursive install-data-recursive \ -+ install-exec-recursive install-info-recursive \ -+ install-recursive installcheck-recursive installdirs-recursive \ -+ pdf-recursive ps-recursive uninstall-info-recursive \ -+ uninstall-recursive -+ETAGS = etags -+CTAGS = ctags -+DIST_SUBDIRS = $(SUBDIRS) -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+SUBDIRS = apps uip unix -+all: all-recursive -+ -+.SUFFIXES: -+$(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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/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 -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+# 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. -+$(RECURSIVE_TARGETS): -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ list='$(SUBDIRS)'; 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; \ -+ (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" -+ -+mostlyclean-recursive clean-recursive distclean-recursive \ -+maintainer-clean-recursive: -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ case "$@" in \ -+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ -+ *) list='$(SUBDIRS)' ;; \ -+ esac; \ -+ rev=''; for subdir in $$list; do \ -+ if test "$$subdir" = "."; then :; else \ -+ rev="$$subdir $$rev"; \ -+ fi; \ -+ done; \ -+ rev="$$rev ."; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ for subdir in $$rev; do \ -+ echo "Making $$target in $$subdir"; \ -+ if test "$$subdir" = "."; then \ -+ local_target="$$target-am"; \ -+ else \ -+ local_target="$$target"; \ -+ fi; \ -+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ -+ || eval $$failcom; \ -+ done && test -z "$$fail" -+tags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ -+ done -+ctags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ -+ done -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ 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 || \ -+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ -+ fi; \ -+ done; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 \ -+ test -d "$(distdir)/$$subdir" \ -+ || $(mkdir_p) "$(distdir)/$$subdir" \ -+ || exit 1; \ -+ distdir=`$(am__cd) $(distdir) && pwd`; \ -+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ -+ (cd $$subdir && \ -+ $(MAKE) $(AM_MAKEFLAGS) \ -+ top_distdir="$$top_distdir" \ -+ distdir="$$distdir/$$subdir" \ -+ distdir) \ -+ || exit 1; \ -+ fi; \ -+ done -+check-am: all-am -+check: check-recursive -+all-am: Makefile -+installdirs: installdirs-recursive -+installdirs-am: -+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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-recursive -+ -+clean-am: clean-generic clean-libtool mostlyclean-am -+ -+distclean: distclean-recursive -+ -rm -f Makefile -+distclean-am: clean-am distclean-generic distclean-libtool \ -+ distclean-tags -+ -+dvi: dvi-recursive -+ -+dvi-am: -+ -+html: html-recursive -+ -+info: info-recursive -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-recursive -+ -+install-man: -+ -+installcheck-am: -+ -+maintainer-clean: maintainer-clean-recursive -+ -rm -f Makefile -+maintainer-clean-am: distclean-am maintainer-clean-generic -+ -+mostlyclean: mostlyclean-recursive -+ -+mostlyclean-am: mostlyclean-generic mostlyclean-libtool -+ -+pdf: pdf-recursive -+ -+pdf-am: -+ -+ps: ps-recursive -+ -+ps-am: -+ -+uninstall-am: uninstall-info-am -+ -+uninstall-info: uninstall-info-recursive -+ -+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ -+ clean clean-generic clean-libtool clean-recursive ctags \ -+ ctags-recursive distclean distclean-generic distclean-libtool \ -+ distclean-recursive distclean-tags distdir dvi dvi-am html \ -+ html-am info info-am install install-am install-data \ -+ install-data-am install-exec install-exec-am install-info \ -+ install-info-am install-man install-strip installcheck \ -+ installcheck-am installdirs installdirs-am maintainer-clean \ -+ maintainer-clean-generic maintainer-clean-recursive \ -+ mostlyclean mostlyclean-generic mostlyclean-libtool \ -+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ -+ uninstall uninstall-am uninstall-info-am -+ -+# 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: -diff --git a/iscsiuio/src/README b/iscsiuio/src/README -new file mode 100644 -index 0000000..9fca6fb ---- /dev/null -+++ b/iscsiuio/src/README -@@ -0,0 +1,13 @@ -+uIP is a very small implementation of the TCP/IP stack that is written -+by Adam Dunkels . More information can be obtained -+at the uIP homepage at http://www.sics.se/~adam/uip/. -+ -+This is version $Name: uip-1-0 $. -+ -+The directory structure look as follows: -+ -+apps/ - Example applications -+doc/ - Documentation -+lib/ - Library code used by some applications -+uip/ - uIP TCP/IP stack code -+unix/ - uIP as a user space process under FreeBSD or Linux -diff --git a/iscsiuio/src/apps/Makefile.am b/iscsiuio/src/apps/Makefile.am -new file mode 100644 -index 0000000..08ed18d ---- /dev/null -+++ b/iscsiuio/src/apps/Makefile.am -@@ -0,0 +1 @@ -+SUBDIRS = dhcpc brcm-iscsi -diff --git a/iscsiuio/src/apps/Makefile.in b/iscsiuio/src/apps/Makefile.in -new file mode 100644 -index 0000000..8d045d8 ---- /dev/null -+++ b/iscsiuio/src/apps/Makefile.in -@@ -0,0 +1,471 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = ../.. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+subdir = src/apps -+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+SOURCES = -+DIST_SOURCES = -+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -+ html-recursive info-recursive install-data-recursive \ -+ install-exec-recursive install-info-recursive \ -+ install-recursive installcheck-recursive installdirs-recursive \ -+ pdf-recursive ps-recursive uninstall-info-recursive \ -+ uninstall-recursive -+ETAGS = etags -+CTAGS = ctags -+DIST_SUBDIRS = $(SUBDIRS) -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+SUBDIRS = dhcpc brcm-iscsi -+all: all-recursive -+ -+.SUFFIXES: -+$(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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/apps/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/apps/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 -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+# 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. -+$(RECURSIVE_TARGETS): -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ list='$(SUBDIRS)'; 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; \ -+ (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" -+ -+mostlyclean-recursive clean-recursive distclean-recursive \ -+maintainer-clean-recursive: -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ case "$@" in \ -+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ -+ *) list='$(SUBDIRS)' ;; \ -+ esac; \ -+ rev=''; for subdir in $$list; do \ -+ if test "$$subdir" = "."; then :; else \ -+ rev="$$subdir $$rev"; \ -+ fi; \ -+ done; \ -+ rev="$$rev ."; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ for subdir in $$rev; do \ -+ echo "Making $$target in $$subdir"; \ -+ if test "$$subdir" = "."; then \ -+ local_target="$$target-am"; \ -+ else \ -+ local_target="$$target"; \ -+ fi; \ -+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ -+ || eval $$failcom; \ -+ done && test -z "$$fail" -+tags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ -+ done -+ctags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ -+ done -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ 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 || \ -+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ -+ fi; \ -+ done; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 \ -+ test -d "$(distdir)/$$subdir" \ -+ || $(mkdir_p) "$(distdir)/$$subdir" \ -+ || exit 1; \ -+ distdir=`$(am__cd) $(distdir) && pwd`; \ -+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ -+ (cd $$subdir && \ -+ $(MAKE) $(AM_MAKEFLAGS) \ -+ top_distdir="$$top_distdir" \ -+ distdir="$$distdir/$$subdir" \ -+ distdir) \ -+ || exit 1; \ -+ fi; \ -+ done -+check-am: all-am -+check: check-recursive -+all-am: Makefile -+installdirs: installdirs-recursive -+installdirs-am: -+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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-recursive -+ -+clean-am: clean-generic clean-libtool mostlyclean-am -+ -+distclean: distclean-recursive -+ -rm -f Makefile -+distclean-am: clean-am distclean-generic distclean-libtool \ -+ distclean-tags -+ -+dvi: dvi-recursive -+ -+dvi-am: -+ -+html: html-recursive -+ -+info: info-recursive -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-recursive -+ -+install-man: -+ -+installcheck-am: -+ -+maintainer-clean: maintainer-clean-recursive -+ -rm -f Makefile -+maintainer-clean-am: distclean-am maintainer-clean-generic -+ -+mostlyclean: mostlyclean-recursive -+ -+mostlyclean-am: mostlyclean-generic mostlyclean-libtool -+ -+pdf: pdf-recursive -+ -+pdf-am: -+ -+ps: ps-recursive -+ -+ps-am: -+ -+uninstall-am: uninstall-info-am -+ -+uninstall-info: uninstall-info-recursive -+ -+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ -+ clean clean-generic clean-libtool clean-recursive ctags \ -+ ctags-recursive distclean distclean-generic distclean-libtool \ -+ distclean-recursive distclean-tags distdir dvi dvi-am html \ -+ html-am info info-am install install-am install-data \ -+ install-data-am install-exec install-exec-am install-info \ -+ install-info-am install-man install-strip installcheck \ -+ installcheck-am installdirs installdirs-am maintainer-clean \ -+ maintainer-clean-generic maintainer-clean-recursive \ -+ mostlyclean mostlyclean-generic mostlyclean-libtool \ -+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ -+ uninstall uninstall-am uninstall-info-am -+ -+# 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: -diff --git a/iscsiuio/src/apps/README b/iscsiuio/src/apps/README -new file mode 100644 -index 0000000..0096c4e ---- /dev/null -+++ b/iscsiuio/src/apps/README -@@ -0,0 +1,2 @@ -+This directory contains a few example applications. They are not all -+heavily tested, however. -diff --git a/iscsiuio/src/apps/brcm-iscsi/Makefile.am b/iscsiuio/src/apps/brcm-iscsi/Makefile.am -new file mode 100644 -index 0000000..fb4d661 ---- /dev/null -+++ b/iscsiuio/src/apps/brcm-iscsi/Makefile.am -@@ -0,0 +1,13 @@ -+INCLUDES = -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_apps_brcm_iscsi.a -+ -+lib_apps_brcm_iscsi_a_SOURCES = brcm_iscsi.c -+ -+lib_apps_brcm_iscsi_a_CFLAGS = $(AM_CFLAGS) \ -+ -DBYTE_ORDER=@ENDIAN@ -diff --git a/iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi b/iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi -new file mode 100644 -index 0000000..732275f ---- /dev/null -+++ b/iscsiuio/src/apps/brcm-iscsi/Makefile.brcm-iscsi -@@ -0,0 +1 @@ -+APP_SOURCES += brcm-iscsi.c -diff --git a/iscsiuio/src/apps/brcm-iscsi/Makefile.in b/iscsiuio/src/apps/brcm-iscsi/Makefile.in -new file mode 100644 -index 0000000..dc6d748 ---- /dev/null -+++ b/iscsiuio/src/apps/brcm-iscsi/Makefile.in -@@ -0,0 +1,446 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = ../../.. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+subdir = src/apps/brcm-iscsi -+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+LIBRARIES = $(noinst_LIBRARIES) -+ARFLAGS = cru -+lib_apps_brcm_iscsi_a_AR = $(AR) $(ARFLAGS) -+lib_apps_brcm_iscsi_a_LIBADD = -+am_lib_apps_brcm_iscsi_a_OBJECTS = \ -+ lib_apps_brcm_iscsi_a-brcm_iscsi.$(OBJEXT) -+lib_apps_brcm_iscsi_a_OBJECTS = $(am_lib_apps_brcm_iscsi_a_OBJECTS) -+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -+depcomp = $(SHELL) $(top_srcdir)/depcomp -+am__depfiles_maybe = depfiles -+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ -+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ -+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -+ $(AM_CFLAGS) $(CFLAGS) -+CCLD = $(CC) -+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -+ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -+SOURCES = $(lib_apps_brcm_iscsi_a_SOURCES) -+DIST_SOURCES = $(lib_apps_brcm_iscsi_a_SOURCES) -+ETAGS = etags -+CTAGS = ctags -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+INCLUDES = -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_apps_brcm_iscsi.a -+lib_apps_brcm_iscsi_a_SOURCES = brcm_iscsi.c -+lib_apps_brcm_iscsi_a_CFLAGS = $(AM_CFLAGS) \ -+ -DBYTE_ORDER=@ENDIAN@ -+ -+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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/apps/brcm-iscsi/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/apps/brcm-iscsi/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 -+ -+clean-noinstLIBRARIES: -+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -+lib_apps_brcm_iscsi.a: $(lib_apps_brcm_iscsi_a_OBJECTS) $(lib_apps_brcm_iscsi_a_DEPENDENCIES) -+ -rm -f lib_apps_brcm_iscsi.a -+ $(lib_apps_brcm_iscsi_a_AR) lib_apps_brcm_iscsi.a $(lib_apps_brcm_iscsi_a_OBJECTS) $(lib_apps_brcm_iscsi_a_LIBADD) -+ $(RANLIB) lib_apps_brcm_iscsi.a -+ -+mostlyclean-compile: -+ -rm -f *.$(OBJEXT) -+ -+distclean-compile: -+ -rm -f *.tab.c -+ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Po@am__quote@ -+ -+.c.o: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c $< -+ -+.c.obj: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -+ -+.c.lo: -+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -+ -+lib_apps_brcm_iscsi_a-brcm_iscsi.o: brcm_iscsi.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_brcm_iscsi_a_CFLAGS) $(CFLAGS) -MT lib_apps_brcm_iscsi_a-brcm_iscsi.o -MD -MP -MF "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Tpo" -c -o lib_apps_brcm_iscsi_a-brcm_iscsi.o `test -f 'brcm_iscsi.c' || echo '$(srcdir)/'`brcm_iscsi.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Tpo" "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Po"; else rm -f "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='brcm_iscsi.c' object='lib_apps_brcm_iscsi_a-brcm_iscsi.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_brcm_iscsi_a_CFLAGS) $(CFLAGS) -c -o lib_apps_brcm_iscsi_a-brcm_iscsi.o `test -f 'brcm_iscsi.c' || echo '$(srcdir)/'`brcm_iscsi.c -+ -+lib_apps_brcm_iscsi_a-brcm_iscsi.obj: brcm_iscsi.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_brcm_iscsi_a_CFLAGS) $(CFLAGS) -MT lib_apps_brcm_iscsi_a-brcm_iscsi.obj -MD -MP -MF "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Tpo" -c -o lib_apps_brcm_iscsi_a-brcm_iscsi.obj `if test -f 'brcm_iscsi.c'; then $(CYGPATH_W) 'brcm_iscsi.c'; else $(CYGPATH_W) '$(srcdir)/brcm_iscsi.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Tpo" "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Po"; else rm -f "$(DEPDIR)/lib_apps_brcm_iscsi_a-brcm_iscsi.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='brcm_iscsi.c' object='lib_apps_brcm_iscsi_a-brcm_iscsi.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_brcm_iscsi_a_CFLAGS) $(CFLAGS) -c -o lib_apps_brcm_iscsi_a-brcm_iscsi.obj `if test -f 'brcm_iscsi.c'; then $(CYGPATH_W) 'brcm_iscsi.c'; else $(CYGPATH_W) '$(srcdir)/brcm_iscsi.c'; fi` -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 $(LIBRARIES) -+installdirs: -+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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-generic clean-libtool clean-noinstLIBRARIES \ -+ mostlyclean-am -+ -+distclean: distclean-am -+ -rm -rf ./$(DEPDIR) -+ -rm -f Makefile -+distclean-am: clean-am distclean-compile distclean-generic \ -+ distclean-libtool distclean-tags -+ -+dvi: dvi-am -+ -+dvi-am: -+ -+html: html-am -+ -+info: info-am -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-am -+ -+install-man: -+ -+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-info-am -+ -+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ -+ clean-libtool clean-noinstLIBRARIES ctags distclean \ -+ distclean-compile distclean-generic distclean-libtool \ -+ distclean-tags distdir dvi dvi-am html html-am info info-am \ -+ install install-am install-data install-data-am install-exec \ -+ install-exec-am install-info install-info-am install-man \ -+ 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 uninstall uninstall-am \ -+ uninstall-info-am -+ -+# 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: -diff --git a/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c -new file mode 100644 -index 0000000..7979774 ---- /dev/null -+++ b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.c -@@ -0,0 +1,88 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li -+ * Based on code example from Adam Dunkels -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ */ -+/** -+ * \addtogroup brcm-iscsi -+ * @{ -+ */ -+ -+/** -+ * \file -+ * An example of how to write uIP applications -+ * with protosockets -+ * \author -+ * Benjamin Li -+ */ -+ -+/* -+ * This is a short example of how to write uIP applications using -+ * protosockets. -+ */ -+ -+/* -+ * We define the application state (struct hello_world_state) in the -+ * hello-world.h file, so we need to include it here. We also include -+ * uip.h (since this cannot be included in hello-world.h) and -+ * , since we use the memcpy() function in the code. -+ */ -+#include "brcm_iscsi.h" -+#include "uip.h" -+#include -+#include -+ -+#include "uip_arp.h" -+ -+/*---------------------------------------------------------------------------*/ -+/* -+ * The initialization function. We must explicitly call this function -+ * from the system initialization code, some time after uip_init() is -+ * called. -+ */ -+void brcm_iscsi_init(void) -+{ -+} -+ -+/*---------------------------------------------------------------------------*/ -+/* -+ * In hello-world.h we have defined the UIP_APPCALL macro to -+ * hello_world_appcall so that this funcion is uIP's application -+ * function. This function is called whenever an uIP event occurs -+ * (e.g. when a new connection is established, new data arrives, sent -+ * data is acknowledged, data needs to be retransmitted, etc.). -+ */ -+void brcm_iscsi_appcall(struct uip_stack *ustack) -+{ -+} -diff --git a/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h -new file mode 100644 -index 0000000..f008471 ---- /dev/null -+++ b/iscsiuio/src/apps/brcm-iscsi/brcm_iscsi.h -@@ -0,0 +1,90 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li -+ * Based on code example from Adam Dunkels -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ */ -+/** -+ * \addtogroup apps -+ * @{ -+ */ -+ -+/** -+ * \defgroup helloworld Hello, world -+ * @{ -+ * -+ * A small example showing how to write applications with -+ * \ref psock "protosockets". -+ */ -+ -+/** -+ * \file -+ * Header file for an example of how to write uIP applications -+ * with protosockets. -+ * \author -+ * Benjamin Li -+ */ -+ -+#ifndef __BRCM_ISCSI_H__ -+#define __BRCM_ISCSI_H__ -+ -+/* Since this file will be included by uip.h, we cannot include uip.h -+ here. But we might need to include uipopt.h if we need the u8_t and -+ u16_t datatypes. */ -+#include "uipopt.h" -+#include "uip.h" -+#include "psock.h" -+ -+/* Next, we define the hello_world_state structure. This is the state -+ of our application, and the memory required for this state is -+ allocated together with each TCP connection. One application state -+ for each TCP connection. */ -+struct hello_world_state { -+ struct psock p; -+ u8_t inputbuffer[32]; -+ u8_t name[40]; -+ -+ struct uip_udp_conn *conn; -+}; -+ -+/* Finally we define the application function to be called by uIP. */ -+void brcm_iscsi_appcall(struct uip_stack *ustack); -+#ifndef UIP_APPCALL -+#define UIP_APPCALL brcm_iscsi_appcall -+#endif /* UIP_APPCALL */ -+ -+void brcm_iscsi_init(void); -+ -+#endif /* __BRCM_ISCSI_H__ */ -+/** @} */ -+/** @} */ -diff --git a/iscsiuio/src/apps/dhcpc/Makefile.am b/iscsiuio/src/apps/dhcpc/Makefile.am -new file mode 100644 -index 0000000..b8a7bbf ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/Makefile.am -@@ -0,0 +1,13 @@ -+INCLUDES = -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_apps_dhcpc.a -+ -+lib_apps_dhcpc_a_SOURCES = dhcpc.c dhcpv6.c -+ -+lib_apps_dhcpc_a_CFLAGS = $(AM_CFLAGS) \ -+ -DBYTE_ORDER=@ENDIAN@ -diff --git a/iscsiuio/src/apps/dhcpc/Makefile.dhcpc b/iscsiuio/src/apps/dhcpc/Makefile.dhcpc -new file mode 100644 -index 0000000..f84c84f ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/Makefile.dhcpc -@@ -0,0 +1 @@ -+APP_SOURCES += dhcpc.c timer.c -diff --git a/iscsiuio/src/apps/dhcpc/Makefile.in b/iscsiuio/src/apps/dhcpc/Makefile.in -new file mode 100644 -index 0000000..68260e9 ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/Makefile.in -@@ -0,0 +1,461 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = ../../.. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+subdir = src/apps/dhcpc -+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+LIBRARIES = $(noinst_LIBRARIES) -+ARFLAGS = cru -+lib_apps_dhcpc_a_AR = $(AR) $(ARFLAGS) -+lib_apps_dhcpc_a_LIBADD = -+am_lib_apps_dhcpc_a_OBJECTS = lib_apps_dhcpc_a-dhcpc.$(OBJEXT) \ -+ lib_apps_dhcpc_a-dhcpv6.$(OBJEXT) -+lib_apps_dhcpc_a_OBJECTS = $(am_lib_apps_dhcpc_a_OBJECTS) -+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -+depcomp = $(SHELL) $(top_srcdir)/depcomp -+am__depfiles_maybe = depfiles -+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ -+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ -+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -+ $(AM_CFLAGS) $(CFLAGS) -+CCLD = $(CC) -+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -+ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -+SOURCES = $(lib_apps_dhcpc_a_SOURCES) -+DIST_SOURCES = $(lib_apps_dhcpc_a_SOURCES) -+ETAGS = etags -+CTAGS = ctags -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+INCLUDES = -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_apps_dhcpc.a -+lib_apps_dhcpc_a_SOURCES = dhcpc.c dhcpv6.c -+lib_apps_dhcpc_a_CFLAGS = $(AM_CFLAGS) \ -+ -DBYTE_ORDER=@ENDIAN@ -+ -+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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/apps/dhcpc/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/apps/dhcpc/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 -+ -+clean-noinstLIBRARIES: -+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -+lib_apps_dhcpc.a: $(lib_apps_dhcpc_a_OBJECTS) $(lib_apps_dhcpc_a_DEPENDENCIES) -+ -rm -f lib_apps_dhcpc.a -+ $(lib_apps_dhcpc_a_AR) lib_apps_dhcpc.a $(lib_apps_dhcpc_a_OBJECTS) $(lib_apps_dhcpc_a_LIBADD) -+ $(RANLIB) lib_apps_dhcpc.a -+ -+mostlyclean-compile: -+ -rm -f *.$(OBJEXT) -+ -+distclean-compile: -+ -rm -f *.tab.c -+ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Po@am__quote@ -+ -+.c.o: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c $< -+ -+.c.obj: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -+ -+.c.lo: -+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -+ -+lib_apps_dhcpc_a-dhcpc.o: dhcpc.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -MT lib_apps_dhcpc_a-dhcpc.o -MD -MP -MF "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Tpo" -c -o lib_apps_dhcpc_a-dhcpc.o `test -f 'dhcpc.c' || echo '$(srcdir)/'`dhcpc.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Tpo" "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Po"; else rm -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dhcpc.c' object='lib_apps_dhcpc_a-dhcpc.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -c -o lib_apps_dhcpc_a-dhcpc.o `test -f 'dhcpc.c' || echo '$(srcdir)/'`dhcpc.c -+ -+lib_apps_dhcpc_a-dhcpc.obj: dhcpc.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -MT lib_apps_dhcpc_a-dhcpc.obj -MD -MP -MF "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Tpo" -c -o lib_apps_dhcpc_a-dhcpc.obj `if test -f 'dhcpc.c'; then $(CYGPATH_W) 'dhcpc.c'; else $(CYGPATH_W) '$(srcdir)/dhcpc.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Tpo" "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Po"; else rm -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpc.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dhcpc.c' object='lib_apps_dhcpc_a-dhcpc.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -c -o lib_apps_dhcpc_a-dhcpc.obj `if test -f 'dhcpc.c'; then $(CYGPATH_W) 'dhcpc.c'; else $(CYGPATH_W) '$(srcdir)/dhcpc.c'; fi` -+ -+lib_apps_dhcpc_a-dhcpv6.o: dhcpv6.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -MT lib_apps_dhcpc_a-dhcpv6.o -MD -MP -MF "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Tpo" -c -o lib_apps_dhcpc_a-dhcpv6.o `test -f 'dhcpv6.c' || echo '$(srcdir)/'`dhcpv6.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Tpo" "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Po"; else rm -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dhcpv6.c' object='lib_apps_dhcpc_a-dhcpv6.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -c -o lib_apps_dhcpc_a-dhcpv6.o `test -f 'dhcpv6.c' || echo '$(srcdir)/'`dhcpv6.c -+ -+lib_apps_dhcpc_a-dhcpv6.obj: dhcpv6.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -MT lib_apps_dhcpc_a-dhcpv6.obj -MD -MP -MF "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Tpo" -c -o lib_apps_dhcpc_a-dhcpv6.obj `if test -f 'dhcpv6.c'; then $(CYGPATH_W) 'dhcpv6.c'; else $(CYGPATH_W) '$(srcdir)/dhcpv6.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Tpo" "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Po"; else rm -f "$(DEPDIR)/lib_apps_dhcpc_a-dhcpv6.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dhcpv6.c' object='lib_apps_dhcpc_a-dhcpv6.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_apps_dhcpc_a_CFLAGS) $(CFLAGS) -c -o lib_apps_dhcpc_a-dhcpv6.obj `if test -f 'dhcpv6.c'; then $(CYGPATH_W) 'dhcpv6.c'; else $(CYGPATH_W) '$(srcdir)/dhcpv6.c'; fi` -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 $(LIBRARIES) -+installdirs: -+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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-generic clean-libtool clean-noinstLIBRARIES \ -+ mostlyclean-am -+ -+distclean: distclean-am -+ -rm -rf ./$(DEPDIR) -+ -rm -f Makefile -+distclean-am: clean-am distclean-compile distclean-generic \ -+ distclean-libtool distclean-tags -+ -+dvi: dvi-am -+ -+dvi-am: -+ -+html: html-am -+ -+info: info-am -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-am -+ -+install-man: -+ -+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-info-am -+ -+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ -+ clean-libtool clean-noinstLIBRARIES ctags distclean \ -+ distclean-compile distclean-generic distclean-libtool \ -+ distclean-tags distdir dvi dvi-am html html-am info info-am \ -+ install install-am install-data install-data-am install-exec \ -+ install-exec-am install-info install-info-am install-man \ -+ 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 uninstall uninstall-am \ -+ uninstall-info-am -+ -+# 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: -diff --git a/iscsiuio/src/apps/dhcpc/dhcpc.c b/iscsiuio/src/apps/dhcpc/dhcpc.c -new file mode 100644 -index 0000000..f4a9994 ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/dhcpc.c -@@ -0,0 +1,417 @@ -+/* -+ * Copyright (c) 2005, Swedish Institute of Computer Science -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "uip.h" -+#include "dhcpc.h" -+#include "timer.h" -+#include "pt.h" -+ -+#include "debug.h" -+#include "logger.h" -+#include "nic.h" -+#include "nic_utils.h" -+ -+struct __attribute__ ((__packed__)) dhcp_msg { -+ u8_t op, htype, hlen, hops; -+ u8_t xid[4]; -+ u16_t secs, flags; -+ u8_t ciaddr[4]; -+ u8_t yiaddr[4]; -+ u8_t siaddr[4]; -+ u8_t giaddr[4]; -+ u8_t chaddr[16]; -+#ifndef UIP_CONF_DHCP_LIGHT -+ u8_t sname[64]; -+ u8_t file[128]; -+#endif -+ u8_t options[312]; -+}; -+ -+#define BOOTP_BROADCAST 0x8000 -+ -+#define DHCP_REQUEST 1 -+#define DHCP_REPLY 2 -+#define DHCP_HTYPE_ETHERNET 1 -+#define DHCP_HLEN_ETHERNET 6 -+#define DHCP_MSG_LEN 236 -+ -+#define DHCPC_SERVER_PORT 67 -+#define DHCPC_CLIENT_PORT 68 -+ -+#define DHCPDISCOVER 1 -+#define DHCPOFFER 2 -+#define DHCPREQUEST 3 -+#define DHCPDECLINE 4 -+#define DHCPACK 5 -+#define DHCPNAK 6 -+#define DHCPRELEASE 7 -+ -+#define DHCP_OPTION_SUBNET_MASK 1 -+#define DHCP_OPTION_ROUTER 3 -+#define DHCP_OPTION_DNS_SERVER 6 -+#define DHCP_OPTION_REQ_IPADDR 50 -+#define DHCP_OPTION_LEASE_TIME 51 -+#define DHCP_OPTION_MSG_TYPE 53 -+#define DHCP_OPTION_SERVER_ID 54 -+#define DHCP_OPTION_REQ_LIST 55 -+#define DHCP_OPTION_END 255 -+ -+static u8_t xid[4] = { 0xad, 0xde, 0x12, 0x23 }; -+static const u8_t magic_cookie[4] = { 99, 130, 83, 99 }; -+ -+struct dhcpc_options dhcpc_opt = { -+ .enable_random_xid = 1, -+}; -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t *add_msg_type(u8_t *optptr, u8_t type) -+{ -+ *optptr++ = DHCP_OPTION_MSG_TYPE; -+ *optptr++ = 1; -+ *optptr++ = type; -+ return optptr; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t *add_server_id(struct dhcpc_state *s, u8_t *optptr) -+{ -+ *optptr++ = DHCP_OPTION_SERVER_ID; -+ *optptr++ = 4; -+ memcpy(optptr, s->serverid, 4); -+ return optptr + 4; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t *add_req_ipaddr(struct dhcpc_state *s, u8_t *optptr) -+{ -+ *optptr++ = DHCP_OPTION_REQ_IPADDR; -+ *optptr++ = 4; -+ memcpy(optptr, s->ipaddr, 4); -+ return optptr + 4; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t *add_req_options(u8_t *optptr) -+{ -+ *optptr++ = DHCP_OPTION_REQ_LIST; -+ *optptr++ = 3; -+ *optptr++ = DHCP_OPTION_SUBNET_MASK; -+ *optptr++ = DHCP_OPTION_ROUTER; -+ *optptr++ = DHCP_OPTION_DNS_SERVER; -+ return optptr; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t *add_end(u8_t *optptr) -+{ -+ *optptr++ = DHCP_OPTION_END; -+ return optptr; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static void create_msg(struct dhcpc_state *s, struct dhcp_msg *m) -+{ -+ m->op = DHCP_REQUEST; -+ m->htype = DHCP_HTYPE_ETHERNET; -+ m->hlen = s->mac_len; -+ m->hops = 0; -+ memcpy(m->xid, xid, sizeof(m->xid)); -+ m->secs = 0; -+ m->flags = const_htons(BOOTP_BROADCAST); /* Broadcast bit. */ -+ /* uip_ipaddr_copy(m->ciaddr, uip_hostaddr); */ -+ memcpy(m->ciaddr, s->ustack->hostaddr, sizeof(m->ciaddr)); -+ memset(m->yiaddr, 0, sizeof(m->yiaddr)); -+ memset(m->siaddr, 0, sizeof(m->siaddr)); -+ memset(m->giaddr, 0, sizeof(m->giaddr)); -+ memcpy(m->chaddr, s->mac_addr, s->mac_len); -+ memset(&m->chaddr[s->mac_len], 0, sizeof(m->chaddr) - s->mac_len); -+#ifndef UIP_CONF_DHCP_LIGHT -+ memset(m->sname, 0, sizeof(m->sname)); -+ memset(m->file, 0, sizeof(m->file)); -+#endif -+ -+ memcpy(m->options, magic_cookie, sizeof(magic_cookie)); -+} -+ -+/*---------------------------------------------------------------------------*/ -+static void send_discover(struct dhcpc_state *s) -+{ -+ u8_t *end; -+ struct dhcp_msg *m = (struct dhcp_msg *)s->ustack->uip_appdata; -+ -+ create_msg(s, m); -+ -+ end = add_msg_type(&m->options[4], DHCPDISCOVER); -+ end = add_req_options(end); -+ end = add_end(end); -+ -+ uip_appsend(s->ustack, s->ustack->uip_appdata, -+ end - (u8_t *) s->ustack->uip_appdata); -+} -+ -+/*---------------------------------------------------------------------------*/ -+static void send_request(struct dhcpc_state *s) -+{ -+ u8_t *end; -+ struct dhcp_msg *m = (struct dhcp_msg *)s->ustack->uip_appdata; -+ -+ create_msg(s, m); -+ -+ end = add_msg_type(&m->options[4], DHCPREQUEST); -+ end = add_server_id(s, end); -+ end = add_req_ipaddr(s, end); -+ end = add_end(end); -+ -+ uip_appsend(s->ustack, s->ustack->uip_appdata, -+ end - (u8_t *) s->ustack->uip_appdata); -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t parse_options(struct dhcpc_state *s, u8_t *optptr, int len) -+{ -+ u8_t *end = optptr + len; -+ u8_t type = 0; -+ -+ while (optptr < end) { -+ switch (*optptr) { -+ case DHCP_OPTION_SUBNET_MASK: -+ memcpy(s->netmask, optptr + 2, 4); -+ break; -+ case DHCP_OPTION_ROUTER: -+ memcpy(s->default_router, optptr + 2, 4); -+ break; -+ case DHCP_OPTION_DNS_SERVER: -+ memcpy(s->dnsaddr, optptr + 2, 4); -+ break; -+ case DHCP_OPTION_MSG_TYPE: -+ type = *(optptr + 2); -+ break; -+ case DHCP_OPTION_SERVER_ID: -+ memcpy(s->serverid, optptr + 2, 4); -+ break; -+ case DHCP_OPTION_LEASE_TIME: -+ memcpy(s->lease_time, optptr + 2, 4); -+ break; -+ case DHCP_OPTION_END: -+ return type; -+ } -+ -+ optptr += optptr[1] + 2; -+ } -+ return type; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t parse_msg(struct dhcpc_state *s) -+{ -+ struct dhcp_msg *m = (struct dhcp_msg *)s->ustack->uip_appdata; -+ -+ if (m->op == DHCP_REPLY && -+ memcmp(m->xid, xid, sizeof(xid)) == 0 && -+ memcmp(m->chaddr, s->mac_addr, s->mac_len) == 0) { -+ memcpy(s->ipaddr, m->yiaddr, 4); -+ return parse_options(s, &m->options[4], uip_datalen(s->ustack)); -+ } -+ return 0; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static PT_THREAD(handle_dhcp(struct uip_stack *ustack)) -+{ -+ struct dhcpc_state *s; -+ s = ustack->dhcpc; -+ -+ if (s == NULL) { -+ LOG_WARN("Could not find dhcpc state"); -+ return PT_ENDED; -+ } -+ -+ PT_BEGIN(&s->pt); -+ -+ /* try_again: */ -+ s->state = STATE_SENDING; -+ s->ticks = CLOCK_SECOND; -+ -+ do { -+ send_discover(s); -+ timer_set(&s->timer, s->ticks); -+ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) -+ || timer_expired(&s->timer)); -+ -+ if (uip_newdata(s->ustack) && parse_msg(s) == DHCPOFFER) { -+ s->state = STATE_OFFER_RECEIVED; -+ break; -+ } -+ -+ if (s->ticks < CLOCK_SECOND * 60) -+ s->ticks += CLOCK_SECOND; -+ else -+ PT_RESTART(&s->pt); -+ } while (s->state != STATE_OFFER_RECEIVED); -+ -+ s->ticks = CLOCK_SECOND; -+ -+ do { -+ send_request(s); -+ timer_set(&s->timer, s->ticks); -+ s->ustack->uip_flags &= ~UIP_NEWDATA; -+ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) -+ || timer_expired(&s->timer)); -+ -+ if (uip_newdata(s->ustack) && parse_msg(s) == DHCPACK) { -+ s->state = STATE_CONFIG_RECEIVED; -+ break; -+ } -+ -+ if (s->ticks <= CLOCK_SECOND * 10) -+ s->ticks += CLOCK_SECOND; -+ else -+ PT_RESTART(&s->pt); -+ } while (s->state != STATE_CONFIG_RECEIVED); -+ -+ LOG_INFO("Got IP address %d.%d.%d.%d", -+ uip_ipaddr1(s->ipaddr), uip_ipaddr2(s->ipaddr), -+ uip_ipaddr3(s->ipaddr), uip_ipaddr4(s->ipaddr)); -+ LOG_INFO("Got netmask %d.%d.%d.%d", -+ uip_ipaddr1(s->netmask), uip_ipaddr2(s->netmask), -+ uip_ipaddr3(s->netmask), uip_ipaddr4(s->netmask)); -+ LOG_INFO("Got DNS server %d.%d.%d.%d", -+ uip_ipaddr1(s->dnsaddr), uip_ipaddr2(s->dnsaddr), -+ uip_ipaddr3(s->dnsaddr), uip_ipaddr4(s->dnsaddr)); -+ LOG_INFO("Got default router %d.%d.%d.%d", -+ uip_ipaddr1(s->default_router), uip_ipaddr2(s->default_router), -+ uip_ipaddr3(s->default_router), -+ uip_ipaddr4(s->default_router)); -+ s->lease_time_nl32 = -+ ntohs(s->lease_time[0]) * 65536ul + ntohs(s->lease_time[1]); -+ LOG_INFO("Lease expires in %ld seconds", s->lease_time_nl32); -+ -+ s->last_update = time(NULL); -+ -+ set_uip_stack(s->ustack, -+ (uip_ip4addr_t *) s->ipaddr, -+ (uip_ip4addr_t *) s->netmask, -+ (uip_ip4addr_t *) s->default_router, -+ (uint8_t *) s->mac_addr); -+ -+ /* Put the stack thread back into a long sleep */ -+ s->nic->flags |= NIC_LONG_SLEEP; -+ -+ /* timer_stop(&s.timer); */ -+ -+ /* Handle DHCP lease expiration */ -+ s->ticks = CLOCK_SECOND * s->lease_time_nl32; -+ timer_set(&s->timer, s->ticks); -+ PT_WAIT_UNTIL(&s->pt, timer_expired(&s->timer)); -+ LOG_INFO("Lease expired, re-acquire IP address"); -+ s->nic->flags &= ~NIC_LONG_SLEEP; -+ PT_RESTART(&s->pt); -+ -+ /* -+ * PT_END restarts the thread so we do this instead. Eventually we -+ * should reacquire expired leases here. -+ */ -+ -+ while (1) -+ PT_YIELD(&s->pt); -+ -+ PT_END(&(s->pt)); -+} -+ -+/*---------------------------------------------------------------------------*/ -+int dhcpc_init(nic_t *nic, struct uip_stack *ustack, -+ const void *mac_addr, int mac_len) -+{ -+ uip_ip4addr_t addr; -+ struct dhcpc_state *s = ustack->dhcpc; -+ -+ if (s) { -+ LOG_DEBUG("DHCP: DHCP context already allocated"); -+ return -EALREADY; -+ } -+ s = malloc(sizeof(*s)); -+ if (s == NULL) { -+ LOG_ERR("Couldn't allocate size for dhcpc info"); -+ return -ENOMEM; -+ } -+ -+ memset(s, 0, sizeof(*s)); -+ s->nic = nic; -+ s->ustack = ustack; -+ s->mac_addr = mac_addr; -+ s->mac_len = mac_len; -+ s->state = STATE_INITIAL; -+ -+ /* Initialize XID to randomly */ -+ if (dhcpc_opt.enable_random_xid == 1) { -+ u32_t gen_xid; -+ gen_xid = random(); -+ memcpy(xid, &gen_xid, sizeof(gen_xid)); -+ } -+ uip_ipaddr(addr, 255, 255, 255, 255); -+ s->conn = uip_udp_new(ustack, &addr, const_htons(DHCPC_SERVER_PORT)); -+ if (s->conn != NULL) -+ uip_udp_bind(s->conn, const_htons(DHCPC_CLIENT_PORT)); -+ -+ ustack->dhcpc = s; -+ -+ /* Let the RX poll value take over */ -+ nic->flags &= ~NIC_LONG_SLEEP; -+ -+ PT_INIT(&s->pt); -+ -+ return 0; -+} -+ -+/*---------------------------------------------------------------------------*/ -+void dhcpc_appcall(struct uip_stack *ustack) -+{ -+ handle_dhcp(ustack); -+} -+ -+/*---------------------------------------------------------------------------*/ -+void dhcpc_request(struct uip_stack *ustack) -+{ -+ struct dhcpc_state *s = ustack->dhcpc; -+ -+ if (s != NULL && s->state == STATE_INITIAL) -+ handle_dhcp(ustack); -+} -+ -+/*---------------------------------------------------------------------------*/ -diff --git a/iscsiuio/src/apps/dhcpc/dhcpc.h b/iscsiuio/src/apps/dhcpc/dhcpc.h -new file mode 100644 -index 0000000..89cf086 ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/dhcpc.h -@@ -0,0 +1,86 @@ -+/* -+ * Copyright (c) 2005, Swedish Institute of Computer Science -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+#ifndef __DHCPC_H__ -+#define __DHCPC_H__ -+ -+#include -+ -+#include "nic.h" -+#include "timer.h" -+#include "pt.h" -+#include "uip.h" -+ -+#define STATE_INITIAL 0 -+#define STATE_SENDING 1 -+#define STATE_OFFER_RECEIVED 2 -+#define STATE_CONFIG_RECEIVED 3 -+ -+struct dhcpc_state { -+ struct pt pt; -+ -+ nic_t *nic; -+ struct uip_stack *ustack; -+ char state; -+ struct uip_udp_conn *conn; -+ struct timer timer; -+ u32_t ticks; -+ const void *mac_addr; -+ int mac_len; -+ -+ u8_t serverid[4]; -+ -+ u16_t lease_time[2]; -+ u32_t lease_time_nl32; -+ u16_t ipaddr[2]; -+ u16_t netmask[2]; -+ u16_t dnsaddr[2]; -+ u16_t default_router[2]; -+ -+ time_t last_update; -+}; -+ -+struct dhcpc_options { -+ u8_t enable_random_xid; -+ u8_t xid[4]; -+}; -+ -+int dhcpc_init(nic_t *nic, struct uip_stack *ustack, -+ const void *mac_addr, int mac_len); -+void dhcpc_request(struct uip_stack *ustack); -+ -+void dhcpc_appcall(struct uip_stack *ustack); -+ -+void dhcpc_configured(const struct dhcpc_state *s); -+ -+#define UIP_UDP_APPCALL dhcpc_appcall -+ -+#endif /* __DHCPC_H__ */ -diff --git a/iscsiuio/src/apps/dhcpc/dhcpv6.c b/iscsiuio/src/apps/dhcpc/dhcpv6.c -new file mode 100644 -index 0000000..a92209a ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/dhcpv6.c -@@ -0,0 +1,513 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai -+ * Based on code from Kevin Tran's iSCSI boot code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * dhcpv6.c - DHCPv6 engine -+ * -+ */ -+#include -+#include -+ -+#include "ipv6.h" -+#include "ipv6_pkt.h" -+#include "dhcpv6.h" -+#include "logger.h" -+ -+/* Local function prototypes */ -+static int dhcpv6_send_solicit_packet(struct dhcpv6_context *context); -+static int dhcpv6_send_request_packet(struct dhcpv6_context *context); -+static u16_t dhcpv6_init_packet(struct dhcpv6_context *context, u8_t type); -+static void dhcpv6_init_dhcpv6_server_addr(struct ipv6_addr *addr); -+static void dhcpv6_handle_advertise(struct dhcpv6_context *context, -+ u16_t dhcpv6_len); -+static void dhcpv6_handle_reply(struct dhcpv6_context *context, -+ u16_t dhcpv6_len); -+static int dhcpv6_process_opt_ia_na(struct dhcpv6_context *context, -+ struct dhcpv6_opt_hdr *opt_hdr); -+static void dhcpv6_process_opt_dns_servers(struct dhcpv6_context *context, -+ struct dhcpv6_opt_hdr *opt_hdr); -+static void dhcpv6_parse_vendor_option(struct dhcpv6_context *context, -+ u8_t *option, int len); -+ -+void dhcpv6_init(struct dhcpv6_context *context) -+{ -+ context->seconds = 0; -+ context->our_mac_addr = -+ ipv6_get_link_addr(context->ipv6_context); -+ -+ /* Use the last four bytes of MAC address as base of the transaction -+ ID */ -+ context->dhcpv6_transaction_id = -+ *((u32_t *) &context->our_mac_addr->addr[2]) & 0xffffffL; -+ -+ context->dhcpv6_done = FALSE; -+ strcpy(context->dhcp_vendor_id, "BRCM ISAN"); -+} -+ -+int dhcpv6_do_discovery(struct dhcpv6_context *context) -+{ -+ int retc = ISCSI_FAILURE; -+ -+ context->eth = -+ (struct eth_hdr *)context->ipv6_context->ustack->data_link_layer; -+ context->ipv6 = -+ (struct ipv6_hdr *)context->ipv6_context->ustack->network_layer; -+ context->udp = -+ (struct udp_hdr *)((u8_t *)context->ipv6 + sizeof(struct ipv6_hdr)); -+ -+ /* Send out DHCPv6 Solicit packet. */ -+ dhcpv6_send_solicit_packet(context); -+ -+ return retc; -+} -+ -+static int dhcpv6_send_solicit_packet(struct dhcpv6_context *context) -+{ -+ u16_t packet_len; -+ -+ LOG_DEBUG("DHCPV6: Send solicit"); -+ packet_len = dhcpv6_init_packet(context, DHCPV6_SOLICIT); -+ context->dhcpv6_state = DHCPV6_STATE_SOLICIT_SENT; -+ ipv6_send_udp_packet(context->ipv6_context, packet_len); -+ -+ return 0; -+} -+ -+static int dhcpv6_send_request_packet(struct dhcpv6_context *context) -+{ -+ u16_t packet_len; -+ -+ LOG_DEBUG("DHCPV6: Send request"); -+ packet_len = dhcpv6_init_packet(context, DHCPV6_REQUEST); -+ -+ context->dhcpv6_state = DHCPV6_STATE_REQ_SENT; -+ ipv6_send_udp_packet(context->ipv6_context, packet_len); -+ -+ return 0; -+} -+ -+static u16_t dhcpv6_init_packet(struct dhcpv6_context *context, u8_t type) -+{ -+ u16_t pkt_len; -+ struct udp_hdr *udp = context->udp; -+ union dhcpv6_hdr *dhcpv6; -+ struct dhcpv6_option *opt; -+ u16_t len; -+ -+ /* Initialize dest IP with well-known DHCP server address */ -+ dhcpv6_init_dhcpv6_server_addr(&context->ipv6->ipv6_dst); -+ /* Initialize dest MAC based on MC dest IP */ -+ ipv6_mc_init_dest_mac(context->eth, context->ipv6); -+ -+ /* Initialize UDP header */ -+ udp->src_port = HOST_TO_NET16(DHCPV6_CLIENT_PORT); -+ udp->dest_port = HOST_TO_NET16(DHCPV6_SERVER_PORT); -+ -+ /* -+ * DHCPv6 section has the following format per RFC 3315 -+ * -+ * 0 1 2 3 -+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * | msg-type | transaction-id | -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * | | -+ * . options . -+ * . (variable) . -+ * | | -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ */ -+ dhcpv6 = (union dhcpv6_hdr *)((u8_t *)udp + sizeof(struct udp_hdr)); -+ -+ if (dhcpv6->dhcpv6_type != type) -+ context->dhcpv6_transaction_id++; -+ -+ dhcpv6->dhcpv6_trans_id = context->dhcpv6_transaction_id; -+ dhcpv6->dhcpv6_type = type; -+ -+ /* Keep track of length of all DHCP options. */ -+ pkt_len = sizeof(union dhcpv6_hdr); -+ -+ if (dhcpv6->dhcpv6_type == DHCPV6_REQUEST) { -+ /* We will send back whatever DHCPv6 sent us */ -+ return ((u8_t *)udp - (u8_t *)context->eth + -+ NET_TO_HOST16(udp->length)); -+ } -+ -+ opt = (struct dhcpv6_option *)((u8_t *)dhcpv6 + -+ sizeof(union dhcpv6_hdr)); -+ /* Add client ID option */ -+ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_CLIENTID); -+ opt->hdr.length = HOST_TO_NET16(sizeof(struct dhcpv6_opt_client_id)); -+ opt->type.client_id.duid_type = -+ HOST_TO_NET16(DHCPV6_DUID_TYPE_LINK_LAYER_AND_TIME); -+ opt->type.client_id.hw_type = HOST_TO_NET16(DHCPV6_HW_TYPE_ETHERNET); -+ opt->type.client_id.time = HOST_TO_NET32(clock_time()/1000 - -+ 0x3A4FC880); -+ memcpy((char *)&opt->type.client_id.link_layer_addr, -+ (char *)context->our_mac_addr, sizeof(struct mac_address)); -+ pkt_len += sizeof(struct dhcpv6_opt_client_id) + -+ sizeof(struct dhcpv6_opt_hdr); -+ opt = (struct dhcpv6_option *)((u8_t *)opt + -+ sizeof(struct dhcpv6_opt_client_id) + -+ sizeof(struct dhcpv6_opt_hdr)); -+ -+ /* Add Vendor Class option if it's configured */ -+ len = strlen(context->dhcp_vendor_id); -+ if (len > 0) { -+ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_VENDOR_CLASS); -+ opt->hdr.length = -+ HOST_TO_NET16(sizeof(struct dhcpv6_vendor_class) -+ + len - 1); -+ opt->type.vendor_class.enterprise_number = -+ HOST_TO_NET32(IANA_ENTERPRISE_NUM_BROADCOM); -+ opt->type.vendor_class.vendor_class_length = HOST_TO_NET16(len); -+ memcpy((char *)&opt->type.vendor_class. -+ vendor_class_data[0], -+ (char *)context->dhcp_vendor_id, len); -+ pkt_len += -+ sizeof(struct dhcpv6_vendor_class) - 1 + len + -+ sizeof(struct dhcpv6_opt_hdr); -+ opt = -+ (struct dhcpv6_option *)((u8_t *)opt + -+ sizeof(struct dhcpv6_vendor_class) - 1 + len + -+ sizeof(struct dhcpv6_opt_hdr)); -+ } -+ -+ /* Add IA_NA option */ -+ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_IA_NA); -+ opt->hdr.length = HOST_TO_NET16(sizeof(struct dhcpv6_opt_id_assoc_na)); -+ opt->type.ida_na.iaid = -+ htonl(*((u32_t *) &context->our_mac_addr->addr[2])); -+ opt->type.ida_na.t1 = 0; -+ opt->type.ida_na.t2 = 0; -+ pkt_len += sizeof(struct dhcpv6_opt_id_assoc_na) + -+ sizeof(struct dhcpv6_opt_hdr); -+ opt = (struct dhcpv6_option *)((u8_t *)opt + -+ sizeof(struct dhcpv6_opt_id_assoc_na) + -+ sizeof(struct dhcpv6_opt_hdr)); -+ /* Add Elapsed Time option */ -+ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_ELAPSED_TIME); -+ opt->hdr.length = HOST_TO_NET16(sizeof(struct dhcpv6_opt_elapse_time)); -+ opt->type.elapsed_time.time = HOST_TO_NET16(context->seconds); -+ pkt_len += sizeof(struct dhcpv6_opt_elapse_time) + -+ sizeof(struct dhcpv6_opt_hdr); -+ -+ /* Add Option Request List */ -+ opt = (struct dhcpv6_option *)((u8_t *)opt + -+ sizeof(struct dhcpv6_opt_elapse_time) + -+ sizeof(struct dhcpv6_opt_hdr)); -+ opt->hdr.type = HOST_TO_NET16(DHCPV6_OPT_ORO); -+ opt->hdr.length = HOST_TO_NET16(3 * -+ sizeof(struct dhcpv6_opt_request_list)); -+ opt->type.list.request_code[0] = HOST_TO_NET16(DHCPV6_OPT_VENDOR_CLASS); -+ opt->type.list.request_code[1] = HOST_TO_NET16(DHCPV6_OPT_VENDOR_OPTS); -+ opt->type.list.request_code[2] = HOST_TO_NET16(DHCPV6_OPT_DNS_SERVERS); -+ pkt_len += 3 * sizeof(struct dhcpv6_opt_request_list) + -+ sizeof(struct dhcpv6_opt_hdr); -+ -+ udp->length = HOST_TO_NET16(sizeof(struct udp_hdr) + pkt_len); -+ -+ pkt_len += -+ ((u8_t *)udp - (u8_t *)context->eth) + sizeof(struct udp_hdr); -+ -+ return pkt_len; -+} -+ -+static void dhcpv6_init_dhcpv6_server_addr(struct ipv6_addr *addr) -+{ -+ /* Well-known DHCPv6 server address is ff02::1:2 */ -+ memset((char *)addr, 0, sizeof(struct ipv6_addr)); -+ addr->addr8[0] = 0xff; -+ addr->addr8[1] = 0x02; -+ addr->addr8[13] = 0x01; -+ addr->addr8[15] = 0x02; -+} -+ -+void ipv6_udp_handle_dhcp(struct dhcpv6_context *context) -+{ -+ union dhcpv6_hdr *dhcpv6; -+ u16_t dhcpv6_len; -+ -+ if (context->dhcpv6_done == TRUE) -+ return; -+ -+ dhcpv6 = (union dhcpv6_hdr *)((u8_t *)context->udp + -+ sizeof(struct udp_hdr)); -+ -+ if (dhcpv6->dhcpv6_trans_id != context->dhcpv6_transaction_id) -+ return; -+ -+ dhcpv6_len = -+ NET_TO_HOST16(context->udp->length) - sizeof(struct udp_hdr); -+ -+ switch (dhcpv6->dhcpv6_type) { -+ case DHCPV6_ADVERTISE: -+ dhcpv6_handle_advertise(context, dhcpv6_len); -+ break; -+ -+ case DHCPV6_REPLY: -+ dhcpv6_handle_reply(context, dhcpv6_len); -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+static void dhcpv6_handle_advertise(struct dhcpv6_context *context, -+ u16_t dhcpv6_len) -+{ -+ union dhcpv6_hdr *dhcpv6 = -+ (union dhcpv6_hdr *)((u8_t *)context->udp + -+ sizeof(struct udp_hdr)); -+ struct dhcpv6_opt_hdr *opt; -+ u16_t type; -+ int i; -+ int opt_len; -+ u8_t *vendor_id = NULL; -+ u16_t vendor_id_len = 0; -+ u8_t *vendor_opt_data = NULL; -+ int vendor_opt_len = 0; -+ int addr_cnt = 0; -+ -+ /* We only handle DHCPv6 advertise if we recently sent DHCPv6 solicit */ -+ if (context->dhcpv6_state != DHCPV6_STATE_SOLICIT_SENT) -+ return; -+ -+ LOG_DEBUG("DHCPV6: handle advertise"); -+ context->dhcpv6_state = DHCPV6_STATE_ADV_RCVD; -+ -+ i = 0; -+ while (i < (dhcpv6_len - sizeof(union dhcpv6_hdr))) { -+ opt = (struct dhcpv6_opt_hdr *)((u8_t *)dhcpv6 + -+ sizeof(union dhcpv6_hdr) + i); -+ opt_len = NET_TO_HOST16(opt->length); -+ -+ type = NET_TO_HOST16(opt->type); -+ -+ /* We only care about some of the options */ -+ switch (type) { -+ case DHCPV6_OPT_IA_NA: -+ if (context-> -+ dhcpv6_task & DHCPV6_TASK_GET_IP_ADDRESS) { -+ addr_cnt += -+ dhcpv6_process_opt_ia_na(context, opt); -+ } -+ break; -+ -+ case DHCPV6_OPT_VENDOR_CLASS: -+ vendor_id_len = -+ NET_TO_HOST16(((struct dhcpv6_option *)opt)->type. -+ vendor_class.vendor_class_length); -+ vendor_id = -+ &((struct dhcpv6_option *)opt)->type.vendor_class. -+ vendor_class_data[0]; -+ break; -+ -+ case DHCPV6_OPT_VENDOR_OPTS: -+ vendor_opt_len = opt_len - 4; -+ vendor_opt_data = -+ &((struct dhcpv6_option *)opt)->type.vendor_opts. -+ vendor_opt_data[0]; -+ break; -+ -+ case DHCPV6_OPT_DNS_SERVERS: -+ if (context->dhcpv6_task & DHCPV6_TASK_GET_OTHER_PARAMS) -+ dhcpv6_process_opt_dns_servers(context, opt); -+ break; -+ -+ default: -+ break; -+ } -+ -+ i += NET_TO_HOST16(opt->length) + sizeof(struct dhcpv6_opt_hdr); -+ } -+ -+ if (context->dhcpv6_task & DHCPV6_TASK_GET_OTHER_PARAMS) { -+ if ((vendor_id_len > 0) && -+ (strncmp((char *)vendor_id, -+ (char *)context->dhcp_vendor_id, -+ vendor_id_len) == 0)) { -+ dhcpv6_parse_vendor_option(context, -+ vendor_opt_data, -+ vendor_opt_len); -+ context->dhcpv6_done = TRUE; -+ } -+ } -+ -+ if (context->dhcpv6_task & DHCPV6_TASK_GET_IP_ADDRESS) { -+ if (addr_cnt > 0) { -+ /* -+ * If we need to acquire IP address from the server, -+ * we need to send Request to server to confirm. -+ */ -+ dhcpv6_send_request_packet(context); -+ context->dhcpv6_done = TRUE; -+ } -+ } -+ -+ if (context->dhcpv6_done) { -+ /* Keep track of IPv6 address of DHCHv6 server */ -+ memcpy((char *)&context->dhcp_server, -+ (char *)&context->ipv6->ipv6_src, -+ sizeof(struct ipv6_addr)); -+ } -+} -+ -+static int dhcpv6_process_opt_ia_na(struct dhcpv6_context *context, -+ struct dhcpv6_opt_hdr *opt_hdr) -+{ -+ int i; -+ int opt_len; -+ struct dhcpv6_option *opt; -+ int len; -+ int addr_cnt; -+ opt_len = NET_TO_HOST16(opt_hdr->length) - -+ sizeof(struct dhcpv6_opt_id_assoc_na); -+ -+ i = 0; -+ addr_cnt = 0; -+ while (i < opt_len) { -+ opt = -+ (struct dhcpv6_option *)((u8_t *)opt_hdr + -+ sizeof(struct dhcpv6_opt_hdr) + -+ sizeof(struct dhcpv6_opt_id_assoc_na) + i); -+ -+ len = NET_TO_HOST16(opt->hdr.length); -+ switch (NET_TO_HOST16(opt->hdr.type)) { -+ case DHCPV6_OPT_IAADDR: -+ if (len > -+ (sizeof(struct dhcpv6_opt_hdr) + -+ sizeof(struct dhcpv6_opt_iaa_addr))) { -+ struct dhcpv6_option *in_opt; -+ -+ in_opt = (struct dhcpv6_option *)((u8_t *)opt + -+ sizeof(struct dhcpv6_opt_hdr) + -+ sizeof(struct dhcpv6_opt_iaa_addr)); -+ if (in_opt->hdr.type == -+ HOST_TO_NET16(DHCPV6_OPT_STATUS_CODE)) { -+ /* This entry has error! */ -+ if (in_opt->type.sts.status != 0) -+ break; -+ } -+ } -+ LOG_INFO("DHCPv6: Got IP Addr"); -+ /* Status is OK, let's add this addr to our address -+ list */ -+ ipv6_add_prefix_entry(context->ipv6_context, -+ &opt->type.iaa_addr.addr, 64); -+ -+ /* Add multicast address for this address */ -+ ipv6_add_solit_node_address(context-> -+ ipv6_context, -+ &opt->type.iaa_addr.addr); -+ addr_cnt++; -+ break; -+ -+ default: -+ break; -+ } -+ -+ i += len + sizeof(struct dhcpv6_opt_hdr); -+ } -+ -+ return addr_cnt; -+} -+ -+static void dhcpv6_process_opt_dns_servers(struct dhcpv6_context *context, -+ struct dhcpv6_opt_hdr *opt_hdr) -+{ -+ int opt_len; -+ -+ opt_len = NET_TO_HOST16(opt_hdr->length); -+ -+ if (opt_len >= sizeof(struct ipv6_addr)) -+ memcpy((char *)&context->primary_dns_server, -+ (char *)&((struct dhcpv6_option *)opt_hdr)->type.dns. -+ primary_addr, sizeof(struct ipv6_addr)); -+ -+ if (opt_len >= 2 * sizeof(struct ipv6_addr)) -+ memcpy((char *)&context->secondary_dns_server, -+ (char *)&((struct dhcpv6_option *)opt_hdr)->type.dns. -+ secondary_addr, sizeof(struct ipv6_addr)); -+} -+ -+static void dhcpv6_handle_reply(struct dhcpv6_context *context, -+ u16_t dhcpv6_len) -+{ -+ if (context->dhcpv6_state != DHCPV6_STATE_REQ_SENT) -+ return; -+ -+ context->dhcpv6_done = TRUE; -+} -+ -+static void dhcpv6_parse_vendor_option(struct dhcpv6_context *context, -+ u8_t *option, int len) -+{ -+ struct dhcpv6_option *opt; -+ u16_t type; -+ int opt_len; -+ int data_len; -+ int i; -+ u8_t *data; -+ -+ for (i = 0; i < len; i += opt_len + sizeof(struct dhcpv6_opt_hdr)) { -+ opt = (struct dhcpv6_option *)((u8_t *)option + i); -+ type = HOST_TO_NET16(opt->hdr.type); -+ opt_len = HOST_TO_NET16(opt->hdr.length); -+ data = &opt->type.data[0]; -+ data_len = strlen((char *)data); -+ -+ switch (type) { -+ case 201: -+ /* iSCSI target 1 */ -+ break; -+ -+ case 202: -+ /* iSCSI target 2 */ -+ break; -+ -+ case 203: -+ if (data_len > ISCSI_MAX_ISCSI_NAME_LENGTH) -+ data_len = ISCSI_MAX_ISCSI_NAME_LENGTH; -+ data[data_len] = '\0'; -+ strcpy(context->initiatorName, (char *)data); -+ break; -+ -+ default: -+ break; -+ } -+ } -+} -diff --git a/iscsiuio/src/apps/dhcpc/dhcpv6.h b/iscsiuio/src/apps/dhcpc/dhcpv6.h -new file mode 100644 -index 0000000..f82cfdb ---- /dev/null -+++ b/iscsiuio/src/apps/dhcpc/dhcpv6.h -@@ -0,0 +1,252 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai -+ * Based on code from Kevin Tran's iSCSI boot code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * dhcpv6.h - DHCPv6 engine header -+ * -+ */ -+#ifndef __IDHCPV6_H__ -+#define __IDHCPV6_H__ -+ -+#include "ipv6_ndpc.h" -+#include "ipv6.h" -+ -+#define ISCSI_MAX_ISCSI_NAME_LENGTH 128 -+/* DHCPv6 Message types. */ -+#define DHCPV6_SOLICIT 1 -+#define DHCPV6_ADVERTISE 2 -+#define DHCPV6_REQUEST 3 -+#define DHCPV6_CONFIRM 4 -+#define DHCPV6_RENEW 5 -+#define DHCPV6_REBIND 6 -+#define DHCPV6_REPLY 7 -+#define DHCPV6_RELEASE 8 -+#define DHCPV6_DECLINE 9 -+#define DHCPV6_RECONFIGURE 10 -+#define DHCPV6_INFO_REQUEST 11 -+#define DHCPV6_RELAY_FORW 12 -+#define DHCPV6_RELAY_REPL 13 -+ -+/* Option codes. */ -+#define DHCPV6_OPT_CLIENTID 1 /* Client ID option - built by stack */ -+#define DHCPV6_OPT_SERVERID 2 /* Server ID option - built by stack */ -+#define DHCPV6_OPT_IA_NA 3 /* IA_NA option - built by user */ -+#define DHCPV6_OPT_IA_TA 4 /* IA_TA option - not supported */ -+#define DHCPV6_OPT_IAADDR 5 /* IA_ADDR option - built by user */ -+#define DHCPV6_OPT_ORO 6 /* Option Request Option - built by -+ stack */ -+#define DHCPV6_OPT_PREFERENCE 7 /* Preference option - built by server -+ */ -+#define DHCPV6_OPT_ELAPSED_TIME 8 /* Elapsed Time option - built by stack -+ */ -+#define DHCPV6_OPT_RELAY_MSG 9 /* Relay Message option - not supported -+ */ -+#define DHCPV6_OPT_AUTH 11 /* Authentication option - built by -+ stack */ -+#define DHCPV6_OPT_UNICAST 12 /* Server Unicast option - built by -+ server */ -+#define DHCPV6_OPT_STATUS_CODE 13 /* Status Code option - built by stack -+ */ -+#define DHCPV6_OPT_RAPID_COMMIT 14 /* Rapid Commit option - built by user -+ */ -+#define DHCPV6_OPT_USER_CLASS 15 /* User Class option - built by user */ -+#define DHCPV6_OPT_VENDOR_CLASS 16 /* Vendor Class option - built by user -+ */ -+#define DHCPV6_OPT_VENDOR_OPTS 17 /* Vendor-Specific Information option - -+ build by user */ -+#define DHCPV6_OPT_INTERFACE_ID 18 /* Interface ID option - not supported -+ */ -+#define DHCPV6_OPT_RECONF_MSG 19 /* Reconfigure Message option - built -+ by server */ -+#define DHCPV6_OPT_RECONF_ACCEPT 20 /* Reconfigure Accept option - built by -+ user */ -+#define DHCPV6_OPT_SIP_SERVER_D 21 /* NOT SUPPORTED - included for -+ completeness only */ -+#define DHCPV6_OPT_SIP_SERVER_A 22 /* NOT SUPPORTED - included for -+ completeness only */ -+#define DHCPV6_OPT_DNS_SERVERS 23 /* DNS Recursive Name Server option - -+ built by server */ -+#define DHCPV6_OPT_DOMAIN_LIST 24 /* Domain Search List option - not -+ supported */ -+#define DHCPV6_MAX_OPT_CODES 25 /* This will be the count + 1 since -+ the parsing array starts -+ at [1] instead of [0] */ -+ -+/* Authentication protocol types. */ -+#define DHCPV6_DELAYED_AUTH_PROT 2 /* Delayed Authentication protocol. */ -+#define DHCPV6_RECON_KEY_AUTH_PROT 3 /* Reconfigure Key Authentication -+ protocol. */ -+ -+struct dhcpv6_context { -+#define DHCP_VENDOR_ID_LEN 128 -+ char dhcp_vendor_id[DHCP_VENDOR_ID_LEN]; -+ struct mac_address *our_mac_addr; -+ u32_t dhcpv6_transaction_id; -+ u16_t seconds; -+ int timeout; -+ int dhcpv6_done; -+ -+#define DHCPV6_STATE_UNKNOWN 0 -+#define DHCPV6_STATE_SOLICIT_SENT 1 -+#define DHCPV6_STATE_ADV_RCVD 2 -+#define DHCPV6_STATE_REQ_SENT 3 -+#define DHCPV6_STATE_CONFIRM_SENT 4 -+ int dhcpv6_state; -+ u16_t dhcpv6_task; -+ struct ipv6_context *ipv6_context; -+ struct eth_hdr *eth; -+ struct ipv6_hdr *ipv6; -+ struct udp_hdr *udp; -+ -+ char initiatorName[ISCSI_MAX_ISCSI_NAME_LENGTH]; -+ struct ipv6_addr dhcp_server; -+ struct ipv6_addr primary_dns_server; -+ struct ipv6_addr secondary_dns_server; -+ -+}; -+ -+union dhcpv6_hdr { -+ struct { -+ u32_t type:8; -+ u32_t trans_id:24; -+ } field; -+ -+ u32_t type_transaction; -+}; -+ -+#define dhcpv6_type field.type -+#define dhcpv6_trans_id field.trans_id -+ -+struct dhcpv6_opt_hdr { -+ u16_t type; -+ u16_t length; -+}; -+ -+struct dhcpv6_opt_client_id { -+ u16_t duid_type; -+#define DHCPV6_DUID_TYPE_LINK_LAYER_AND_TIME 1 -+#define DHCPV6_DUID_TYPE_VENDOR_BASED 2 -+#define DHCPV6_DUID_TYPE_LINK_LAYER 3 -+ u16_t hw_type; -+#define DHCPV6_HW_TYPE_ETHERNET 1 -+ u32_t time; -+ struct mac_address link_layer_addr; -+}; -+ -+struct dhcpv6_opt_id_assoc_na { -+ u32_t iaid; -+#define DHCPV6_OPT_IA_NA_IAID 0x306373L -+ u32_t t1; -+ u32_t t2; -+}; -+ -+struct dhcpv6_opt_elapse_time { -+ u16_t time; -+}; -+ -+struct dhcpv6_opt_iaa_addr { -+ struct ipv6_addr addr; -+ u32_t preferred_lifetime; -+ u32_t valid_lifetime; -+}; -+ -+struct dhcpv6_opt_status { -+ u16_t status; -+}; -+ -+struct dhcpv6_opt_request_list { -+ u16_t request_code[1]; -+}; -+ -+struct dhcpv6_opt_dns { -+ struct ipv6_addr primary_addr; -+ struct ipv6_addr secondary_addr; -+}; -+ -+struct dhcpv6_vendor_class { -+ u32_t enterprise_number; -+ u16_t vendor_class_length; -+ u8_t vendor_class_data[1]; -+}; -+ -+struct dhcpv6_vendor_opts { -+ u32_t enterprise_number; -+ u8_t vendor_opt_data[1]; -+}; -+ -+struct dhcpv6_option { -+ struct dhcpv6_opt_hdr hdr; -+ union { -+ struct dhcpv6_vendor_opts vendor_opts; -+ struct dhcpv6_vendor_class vendor_class; -+ struct dhcpv6_opt_client_id client_id; -+ struct dhcpv6_opt_id_assoc_na ida_na; -+ struct dhcpv6_opt_elapse_time elapsed_time; -+ struct dhcpv6_opt_iaa_addr iaa_addr; -+ struct dhcpv6_opt_status sts; -+ struct dhcpv6_opt_request_list list; -+ struct dhcpv6_opt_dns dns; -+ u8_t data[1]; -+ } type; -+}; -+ -+#define DHCPV6_NUM_OF_RETRY 4 -+ -+#define DHCPV6_ACK_TIMEOUT 2 -+ -+#define IANA_ENTERPRISE_NUM_BROADCOM 0x113d -+ -+/* Broadcom Extended DHCP options used in iSCSI boot */ -+#define DHCPV6_TAG_FIRST_ISCSI_TARGET_NAME 201 -+#define DHCPV6_TAG_SECOND_ISCSI_TARGET_NAME 202 -+#define DHCPV6_TAG_ISCSI_INITIATOR_NAME 203 -+ -+#define MAX_DHCP_RX_OFFERS 4 -+#define MAX_DHCP_OPTION43_LENGTH 1024 -+ -+#define DHCPV6_TASK_GET_IP_ADDRESS 0x1 -+#define DHCPV6_TASK_GET_OTHER_PARAMS 0x2 -+ -+enum { -+ ISCSI_FAILURE, -+ ISCSI_USER_ABORT, -+ ISCSI_SUCCESS -+}; -+ -+/* Function prototypes */ -+int dhcpv6_do_discovery(struct dhcpv6_context *context); -+void ipv6_udp_handle_dhcp(struct dhcpv6_context *context); -+void dhcpv6_init(struct dhcpv6_context *context); -+ -+#endif /* __IDHCPV6_H__ */ -diff --git a/iscsiuio/src/uip-1.0-changelog.txt b/iscsiuio/src/uip-1.0-changelog.txt -new file mode 100644 -index 0000000..800e444 ---- /dev/null -+++ b/iscsiuio/src/uip-1.0-changelog.txt -@@ -0,0 +1,98 @@ -+* A new API: protosockets that are similar to BSD sockets but does not -+ require any underlying multithreading system. -+ -+* Very rudimentary IPv6 support -+ -+* New application: DHCP client. Web server rewritten with protosockets. -+ -+* Removed uIP zero-copy functionality in order to simplify uIP device -+ driver coding: outbound packets are now *always* stored in full in -+ the uip_buf buffer. -+ -+* Checksum computation is now part of uip.c, but it still is possible -+ to implement them in assembly code by specifying a configuration -+ option. Checksum code now runs on architectures with 2-byte alignment. -+ -+* Added TCP persistent timer. -+ -+* Made all IP address representations use the new uip_ipaddr_ip -+ datatype for clarity. -+ -+* Updated window behavior so that sending to a host with a small open -+ window works better now. -+ -+* UDP API change: uip_udp_new() now takes port numbers in network byte -+ order like TCP functions. -+ -+* Allow reception of packets when no IP address is configured to make -+ DHCP work. -+ -+* Moved Ethernet address into main uIP module from ARP module. -+ -+* Made constants explicit #defines and moved them out of the code -+ (header sizes, TCP options, TCP header length field). -+ -+* If uip_len is less than that reported by the IP header, the packet -+ is discarded. If uip_len is greater than the length reported by the -+ IP header, uip_len is adjusted. -+ -+* Moved header size definitions into header file. -+ -+* Added uIP call for polling an application without triggering any -+ timer events. Removed redundant assignments of uip_len and uip_slen. -+ -+* Removed compiler warning about icmp_input label being defined when -+ UIP_PINGADDRCONF was not used. -+ -+* Added UIP_APPDATA_SIZE macro that holds the available buffer size -+ for user data. -+ -+* Added uip_udp_bind() call. -+ -+* Moved checksum code into main uIP module. -+ -+* Switched the TCP, UDP and IP header structures to be structs rather -+ than typedefs. -+ -+* Prefixed TCP state names with UIP_ to avoid name space -+ contamination. -+ -+* Changed declarations of uip_appdatap and friends to void * to avoid -+ explicit typecasts. -+ -+* Bugfixes -+ -+ o TCP: Fixed bug with high byte of peer window size. -+ -+ o TCP: Fixed bug that in some cases prevented concurrent reception and -+ transmission of TCP data. -+ -+ o TCP: uip_connect() didn't correctly calculate age of TIME_WAIT -+ connections. -+ -+ o TCP: Array index for uip_conns[] array was out of bounds in -+ comparison. Comparison changed to make index within bounds. -+ -+ o TCP: if the remote host crashes and tries to reestablish an old -+ connection, uIP should respond with an ACK with the correct -+ sequence and acknowledgment numbers, to which the remote host -+ should respond with an ACK. uIP did not respond with the correct -+ ACK. -+ -+ o TCP: Fixed check for SYNACK segment: now checks only relevant TCP -+ control flags and discards flags reserved for future expansion. -+ -+ o TCP: Fixed bug where uIP did not inform application that a connection -+ had been aborted during an active open. -+ -+ o TCP: FIN segment was accepted even though application had stopped -+ incoming data with uip_stop(). -+ -+ o TCP: A FINACK segment would not always correctly acknowledge data. -+ -+ o UDP: checksums are now calculated after all fields have been -+ filled in. -+ -+ o UDP: network byte order on lastport in uip_udp_new(). -+ -+ o IP: memset() bugs in IP fragment reassembly code fixed. -diff --git a/iscsiuio/src/uip/Makefile.am b/iscsiuio/src/uip/Makefile.am -new file mode 100644 -index 0000000..2d20573 ---- /dev/null -+++ b/iscsiuio/src/uip/Makefile.am -@@ -0,0 +1,18 @@ -+INCLUDES = -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_iscsi_uip.a -+ -+lib_iscsi_uip_a_SOURCES = uip.c \ -+ uip_arp.c \ -+ psock.c \ -+ timer.c \ -+ uip-neighbor.c \ -+ uip_eth.c \ -+ ipv6_ndpc.c \ -+ ipv6.c -+ -+lib_iscsi_uip_a_CFLAGS = -DBYTE_ORDER=@ENDIAN@ -diff --git a/iscsiuio/src/uip/Makefile.in b/iscsiuio/src/uip/Makefile.in -new file mode 100644 -index 0000000..5375ca0 ---- /dev/null -+++ b/iscsiuio/src/uip/Makefile.in -@@ -0,0 +1,562 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = ../.. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+subdir = src/uip -+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+LIBRARIES = $(noinst_LIBRARIES) -+ARFLAGS = cru -+lib_iscsi_uip_a_AR = $(AR) $(ARFLAGS) -+lib_iscsi_uip_a_LIBADD = -+am_lib_iscsi_uip_a_OBJECTS = lib_iscsi_uip_a-uip.$(OBJEXT) \ -+ lib_iscsi_uip_a-uip_arp.$(OBJEXT) \ -+ lib_iscsi_uip_a-psock.$(OBJEXT) \ -+ lib_iscsi_uip_a-timer.$(OBJEXT) \ -+ lib_iscsi_uip_a-uip-neighbor.$(OBJEXT) \ -+ lib_iscsi_uip_a-uip_eth.$(OBJEXT) \ -+ lib_iscsi_uip_a-ipv6_ndpc.$(OBJEXT) \ -+ lib_iscsi_uip_a-ipv6.$(OBJEXT) -+lib_iscsi_uip_a_OBJECTS = $(am_lib_iscsi_uip_a_OBJECTS) -+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -+depcomp = $(SHELL) $(top_srcdir)/depcomp -+am__depfiles_maybe = depfiles -+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ -+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ -+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -+ $(AM_CFLAGS) $(CFLAGS) -+CCLD = $(CC) -+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -+ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -+SOURCES = $(lib_iscsi_uip_a_SOURCES) -+DIST_SOURCES = $(lib_iscsi_uip_a_SOURCES) -+ETAGS = etags -+CTAGS = ctags -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+INCLUDES = -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_iscsi_uip.a -+lib_iscsi_uip_a_SOURCES = uip.c \ -+ uip_arp.c \ -+ psock.c \ -+ timer.c \ -+ uip-neighbor.c \ -+ uip_eth.c \ -+ ipv6_ndpc.c \ -+ ipv6.c -+ -+lib_iscsi_uip_a_CFLAGS = -DBYTE_ORDER=@ENDIAN@ -+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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/uip/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/uip/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 -+ -+clean-noinstLIBRARIES: -+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -+lib_iscsi_uip.a: $(lib_iscsi_uip_a_OBJECTS) $(lib_iscsi_uip_a_DEPENDENCIES) -+ -rm -f lib_iscsi_uip.a -+ $(lib_iscsi_uip_a_AR) lib_iscsi_uip.a $(lib_iscsi_uip_a_OBJECTS) $(lib_iscsi_uip_a_LIBADD) -+ $(RANLIB) lib_iscsi_uip.a -+ -+mostlyclean-compile: -+ -rm -f *.$(OBJEXT) -+ -+distclean-compile: -+ -rm -f *.tab.c -+ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-ipv6.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-psock.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-timer.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-uip.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Po@am__quote@ -+ -+.c.o: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c $< -+ -+.c.obj: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -+ -+.c.lo: -+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -+ -+lib_iscsi_uip_a-uip.o: uip.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip.Tpo" -c -o lib_iscsi_uip_a-uip.o `test -f 'uip.c' || echo '$(srcdir)/'`uip.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip.c' object='lib_iscsi_uip_a-uip.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip.o `test -f 'uip.c' || echo '$(srcdir)/'`uip.c -+ -+lib_iscsi_uip_a-uip.obj: uip.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip.Tpo" -c -o lib_iscsi_uip_a-uip.obj `if test -f 'uip.c'; then $(CYGPATH_W) 'uip.c'; else $(CYGPATH_W) '$(srcdir)/uip.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip.c' object='lib_iscsi_uip_a-uip.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip.obj `if test -f 'uip.c'; then $(CYGPATH_W) 'uip.c'; else $(CYGPATH_W) '$(srcdir)/uip.c'; fi` -+ -+lib_iscsi_uip_a-uip_arp.o: uip_arp.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip_arp.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Tpo" -c -o lib_iscsi_uip_a-uip_arp.o `test -f 'uip_arp.c' || echo '$(srcdir)/'`uip_arp.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip_arp.c' object='lib_iscsi_uip_a-uip_arp.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip_arp.o `test -f 'uip_arp.c' || echo '$(srcdir)/'`uip_arp.c -+ -+lib_iscsi_uip_a-uip_arp.obj: uip_arp.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip_arp.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Tpo" -c -o lib_iscsi_uip_a-uip_arp.obj `if test -f 'uip_arp.c'; then $(CYGPATH_W) 'uip_arp.c'; else $(CYGPATH_W) '$(srcdir)/uip_arp.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip_arp.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip_arp.c' object='lib_iscsi_uip_a-uip_arp.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip_arp.obj `if test -f 'uip_arp.c'; then $(CYGPATH_W) 'uip_arp.c'; else $(CYGPATH_W) '$(srcdir)/uip_arp.c'; fi` -+ -+lib_iscsi_uip_a-psock.o: psock.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-psock.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-psock.Tpo" -c -o lib_iscsi_uip_a-psock.o `test -f 'psock.c' || echo '$(srcdir)/'`psock.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-psock.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-psock.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-psock.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='psock.c' object='lib_iscsi_uip_a-psock.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-psock.o `test -f 'psock.c' || echo '$(srcdir)/'`psock.c -+ -+lib_iscsi_uip_a-psock.obj: psock.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-psock.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-psock.Tpo" -c -o lib_iscsi_uip_a-psock.obj `if test -f 'psock.c'; then $(CYGPATH_W) 'psock.c'; else $(CYGPATH_W) '$(srcdir)/psock.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-psock.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-psock.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-psock.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='psock.c' object='lib_iscsi_uip_a-psock.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-psock.obj `if test -f 'psock.c'; then $(CYGPATH_W) 'psock.c'; else $(CYGPATH_W) '$(srcdir)/psock.c'; fi` -+ -+lib_iscsi_uip_a-timer.o: timer.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-timer.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-timer.Tpo" -c -o lib_iscsi_uip_a-timer.o `test -f 'timer.c' || echo '$(srcdir)/'`timer.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-timer.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-timer.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-timer.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='timer.c' object='lib_iscsi_uip_a-timer.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-timer.o `test -f 'timer.c' || echo '$(srcdir)/'`timer.c -+ -+lib_iscsi_uip_a-timer.obj: timer.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-timer.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-timer.Tpo" -c -o lib_iscsi_uip_a-timer.obj `if test -f 'timer.c'; then $(CYGPATH_W) 'timer.c'; else $(CYGPATH_W) '$(srcdir)/timer.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-timer.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-timer.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-timer.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='timer.c' object='lib_iscsi_uip_a-timer.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-timer.obj `if test -f 'timer.c'; then $(CYGPATH_W) 'timer.c'; else $(CYGPATH_W) '$(srcdir)/timer.c'; fi` -+ -+lib_iscsi_uip_a-uip-neighbor.o: uip-neighbor.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip-neighbor.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Tpo" -c -o lib_iscsi_uip_a-uip-neighbor.o `test -f 'uip-neighbor.c' || echo '$(srcdir)/'`uip-neighbor.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip-neighbor.c' object='lib_iscsi_uip_a-uip-neighbor.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip-neighbor.o `test -f 'uip-neighbor.c' || echo '$(srcdir)/'`uip-neighbor.c -+ -+lib_iscsi_uip_a-uip-neighbor.obj: uip-neighbor.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip-neighbor.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Tpo" -c -o lib_iscsi_uip_a-uip-neighbor.obj `if test -f 'uip-neighbor.c'; then $(CYGPATH_W) 'uip-neighbor.c'; else $(CYGPATH_W) '$(srcdir)/uip-neighbor.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip-neighbor.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip-neighbor.c' object='lib_iscsi_uip_a-uip-neighbor.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip-neighbor.obj `if test -f 'uip-neighbor.c'; then $(CYGPATH_W) 'uip-neighbor.c'; else $(CYGPATH_W) '$(srcdir)/uip-neighbor.c'; fi` -+ -+lib_iscsi_uip_a-uip_eth.o: uip_eth.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip_eth.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Tpo" -c -o lib_iscsi_uip_a-uip_eth.o `test -f 'uip_eth.c' || echo '$(srcdir)/'`uip_eth.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip_eth.c' object='lib_iscsi_uip_a-uip_eth.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip_eth.o `test -f 'uip_eth.c' || echo '$(srcdir)/'`uip_eth.c -+ -+lib_iscsi_uip_a-uip_eth.obj: uip_eth.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-uip_eth.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Tpo" -c -o lib_iscsi_uip_a-uip_eth.obj `if test -f 'uip_eth.c'; then $(CYGPATH_W) 'uip_eth.c'; else $(CYGPATH_W) '$(srcdir)/uip_eth.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-uip_eth.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='uip_eth.c' object='lib_iscsi_uip_a-uip_eth.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-uip_eth.obj `if test -f 'uip_eth.c'; then $(CYGPATH_W) 'uip_eth.c'; else $(CYGPATH_W) '$(srcdir)/uip_eth.c'; fi` -+ -+lib_iscsi_uip_a-ipv6_ndpc.o: ipv6_ndpc.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-ipv6_ndpc.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Tpo" -c -o lib_iscsi_uip_a-ipv6_ndpc.o `test -f 'ipv6_ndpc.c' || echo '$(srcdir)/'`ipv6_ndpc.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ipv6_ndpc.c' object='lib_iscsi_uip_a-ipv6_ndpc.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-ipv6_ndpc.o `test -f 'ipv6_ndpc.c' || echo '$(srcdir)/'`ipv6_ndpc.c -+ -+lib_iscsi_uip_a-ipv6_ndpc.obj: ipv6_ndpc.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-ipv6_ndpc.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Tpo" -c -o lib_iscsi_uip_a-ipv6_ndpc.obj `if test -f 'ipv6_ndpc.c'; then $(CYGPATH_W) 'ipv6_ndpc.c'; else $(CYGPATH_W) '$(srcdir)/ipv6_ndpc.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6_ndpc.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ipv6_ndpc.c' object='lib_iscsi_uip_a-ipv6_ndpc.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-ipv6_ndpc.obj `if test -f 'ipv6_ndpc.c'; then $(CYGPATH_W) 'ipv6_ndpc.c'; else $(CYGPATH_W) '$(srcdir)/ipv6_ndpc.c'; fi` -+ -+lib_iscsi_uip_a-ipv6.o: ipv6.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-ipv6.o -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Tpo" -c -o lib_iscsi_uip_a-ipv6.o `test -f 'ipv6.c' || echo '$(srcdir)/'`ipv6.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ipv6.c' object='lib_iscsi_uip_a-ipv6.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-ipv6.o `test -f 'ipv6.c' || echo '$(srcdir)/'`ipv6.c -+ -+lib_iscsi_uip_a-ipv6.obj: ipv6.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -MT lib_iscsi_uip_a-ipv6.obj -MD -MP -MF "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Tpo" -c -o lib_iscsi_uip_a-ipv6.obj `if test -f 'ipv6.c'; then $(CYGPATH_W) 'ipv6.c'; else $(CYGPATH_W) '$(srcdir)/ipv6.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Tpo" "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Po"; else rm -f "$(DEPDIR)/lib_iscsi_uip_a-ipv6.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ipv6.c' object='lib_iscsi_uip_a-ipv6.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_iscsi_uip_a_CFLAGS) $(CFLAGS) -c -o lib_iscsi_uip_a-ipv6.obj `if test -f 'ipv6.c'; then $(CYGPATH_W) 'ipv6.c'; else $(CYGPATH_W) '$(srcdir)/ipv6.c'; fi` -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 $(LIBRARIES) -+installdirs: -+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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-generic clean-libtool clean-noinstLIBRARIES \ -+ mostlyclean-am -+ -+distclean: distclean-am -+ -rm -rf ./$(DEPDIR) -+ -rm -f Makefile -+distclean-am: clean-am distclean-compile distclean-generic \ -+ distclean-libtool distclean-tags -+ -+dvi: dvi-am -+ -+dvi-am: -+ -+html: html-am -+ -+info: info-am -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-am -+ -+install-man: -+ -+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-info-am -+ -+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ -+ clean-libtool clean-noinstLIBRARIES ctags distclean \ -+ distclean-compile distclean-generic distclean-libtool \ -+ distclean-tags distdir dvi dvi-am html html-am info info-am \ -+ install install-am install-data install-data-am install-exec \ -+ install-exec-am install-info install-info-am install-man \ -+ 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 uninstall uninstall-am \ -+ uninstall-info-am -+ -+# 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: -diff --git a/iscsiuio/src/uip/Makefile.include b/iscsiuio/src/uip/Makefile.include -new file mode 100644 -index 0000000..aa3ac63 ---- /dev/null -+++ b/iscsiuio/src/uip/Makefile.include -@@ -0,0 +1,47 @@ -+ -+ -+ifdef APPS -+ APPDIRS = $(foreach APP, $(APPS), ../apps/$(APP)) -+ -include $(foreach APP, $(APPS), ../apps/$(APP)/Makefile.$(APP)) -+ CFLAGS += $(addprefix -I../apps/,$(APPS)) -+endif -+ -+ifndef CCDEP -+ CCDEP = $(CC) -+endif -+ifndef CCDEPCFLAGS -+ CCDEPCFLAGS = $(CFLAGS) -+endif -+ifndef OBJECTDIR -+ OBJECTDIR = obj -+endif -+ -+ifeq (${wildcard $(OBJECTDIR)},) -+ DUMMY := ${shell mkdir $(OBJECTDIR)} -+endif -+ -+ -+vpath %.c . ../uip ../lib $(APPDIRS) -+ -+$(OBJECTDIR)/%.o: %.c -+ $(CC) $(CFLAGS) -c $< -o $@ -+ -+$(OBJECTDIR)/%.d: %.c -+ @set -e; rm -f $@; \ -+ $(CCDEP) -MM $(CCDEPCFLAGS) $< > $@.$$$$; \ -+ sed 's,\($*\)\.o[ :]*,$(OBJECTDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ -+ rm -f $@.$$$$ -+ -+UIP_SOURCES=uip.c uip_arp.c uiplib.c psock.c timer.c uip-neighbor.c uip_eth.c ipv6_ndp.c ipv6.c -+ -+ -+ifneq ($(MAKECMDGOALS),clean) -+-include $(addprefix $(OBJECTDIR)/,$(UIP_SOURCES:.c=.d) \ -+ $(APP_SOURCES:.c=.d)) -+endif -+ -+libuip.a: ${addprefix $(OBJECTDIR)/, $(UIP_SOURCES:.c=.o)} -+ $(AR) rc $@ $^ -+ -+libapps.a: ${addprefix $(OBJECTDIR)/, $(APP_SOURCES:.c=.o)} -+ $(AR) rc $@ $^ -diff --git a/iscsiuio/src/uip/clock.h b/iscsiuio/src/uip/clock.h -new file mode 100644 -index 0000000..d79326b ---- /dev/null -+++ b/iscsiuio/src/uip/clock.h -@@ -0,0 +1,87 @@ -+/** -+ * \defgroup clock Clock interface -+ * -+ * The clock interface is the interface between the \ref timer "timer library" -+ * and the platform specific clock functionality. The clock -+ * interface must be implemented for each platform that uses the \ref -+ * timer "timer library". -+ * -+ * The clock interface does only one this: it measures time. The clock -+ * interface provides a macro, CLOCK_SECOND, which corresponds to one -+ * second of system time. -+ * -+ * \sa \ref timer "Timer library" -+ * -+ * @{ -+ */ -+ -+/* -+ * Copyright (c) 2004, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+#ifndef __CLOCK_H__ -+#define __CLOCK_H__ -+ -+#include "clock-arch.h" -+ -+/** -+ * Initialize the clock library. -+ * -+ * This function initializes the clock library and should be called -+ * from the main() function of the system. -+ * -+ */ -+void clock_init(void); -+ -+/** -+ * Get the current clock time. -+ * -+ * This function returns the current system clock time. -+ * -+ * \return The current clock time, measured in system ticks. -+ */ -+clock_time_t clock_time(void); -+ -+/** -+ * A second, measured in system clock time. -+ * -+ * \hideinitializer -+ */ -+#ifdef CLOCK_CONF_SECOND -+#define CLOCK_SECOND CLOCK_CONF_SECOND -+#else -+#define CLOCK_SECOND (clock_time_t)32 -+#endif -+ -+#endif /* __CLOCK_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/debug.h b/iscsiuio/src/uip/debug.h -new file mode 100644 -index 0000000..a58fa7a ---- /dev/null -+++ b/iscsiuio/src/uip/debug.h -@@ -0,0 +1,13 @@ -+#ifndef __DEBUG_H__ -+#define __DEBUG_H__ -+ -+#ifdef DEBUG -+#define UIP_DEBUG(args...) \ -+ do { \ -+ fprintf(stdout, args); \ -+ fflush(stdout); \ -+ } while (0); -+#else -+#endif -+ -+#endif -diff --git a/iscsiuio/src/uip/icmpv6.h b/iscsiuio/src/uip/icmpv6.h -new file mode 100644 -index 0000000..9b00d82 ---- /dev/null -+++ b/iscsiuio/src/uip/icmpv6.h -@@ -0,0 +1,301 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai (eddie.wai@broadcom.com) -+ * Based on Kevin Tran's iSCSI boot code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * icmpv6.h - This file contains macro definitions pertaining to ICMPv6 -+ * -+ * RFC 2463 : ICMPv6 Specification -+ * RFC 2461 : Neighbor Discovery for IPv6 -+ * -+ */ -+#ifndef __ICMPV6_H__ -+#define __ICMPV6_H__ -+ -+/* Base ICMP Header sizes */ -+#define IPV6_RTR_SOL_HDR_SIZE 8 -+#define IPV6_RTR_ADV_HDR_SIZE 16 -+#define IPV6_NEIGH_SOL_HDR_SIZE 24 -+#define IPV6_NEIGH_ADV_HDR_SIZE 24 -+#define IPV6_LINK_LAYER_OPT_SIZE 2 -+#define IPV6_LINK_LAYER_OPT_LENGTH 8 -+#define IPV6_MTU_OPT_SIZE 8 -+#define IPV6_PREFIX_OPT_SIZE 32 -+#define IPV6_ECHO_REQUEST_HDR_SIZE 8 -+#define IPV6_ECHO_REPLY_HDR_SIZE 8 -+#define IPV6_REDIRECT_SIZE 40 -+#define IPV6_DHAAD_REQ_HDR_SIZE 8 -+#define IPV6_DHAAD_REPLY_HDR_SIZE 8 -+#define IPV6_PRFXSOL_HDR_SIZE 8 -+#define IPV6_PRFXADV_HDR_SIZE 8 -+#define IPV6_RTR_ADV_INT_OPT_SIZE 8 -+ -+/* ICMP Message Types */ -+/* Error messages are always less than 128 */ -+#define ICMPV6_DST_UNREACH 1 /* Destination Unreachable */ -+#define ICMPV6_PACKET_TOO_BIG 2 /* Packet Too Big */ -+#define ICMPV6_TIME_EXCEEDED 3 /* Time Exceeded */ -+#define ICMPV6_PARAM_PROB 4 /* Parameter Problem */ -+ -+#define ICMPV6_RTR_SOL 133 /* Router Solicitation */ -+#define ICMPV6_RTR_ADV 134 /* Router Advertisement */ -+#define ICMPV6_NEIGH_SOL 135 /* Neighbor Solicitation */ -+#define ICMPV6_NEIGH_ADV 136 /* Neighbor Advertisement */ -+#define ICMPV6_REDIRECT 137 /* Redirect */ -+#define ICMPV6_ECHO_REQUEST 128 /* Echo Request */ -+#define ICMPV6_ECHO_REPLY 129 /* Echo Reply */ -+#define ICMPV6_WRUREQUEST 139 /* Who Are You Request */ -+#define ICMPV6_WRUREPLY 140 /* Who Are You Reply */ -+#define ICMPV6_ROUTER_RENUMBERING 138 /* Router Renumbering */ -+#define ICMPV6_HA_ADDR_DISC_REQ 144 /* Dynamic Home Agent Address -+ Discovery Request */ -+#define ICMPV6_HA_ADDR_DISC_REPLY 145 /* Dynamic Home Agent Address -+ Discovery Reply */ -+#define ICMPV6_MP_SOLICIT 146 /* Mobile Prefix Solicitation */ -+#define ICMPV6_MP_ADV 147 /* Mobile Prefix Reply */ -+ -+/* Destination Unreachable Codes */ -+#define ICMPV6_DST_UNREACH_NOROUTE 0 -+#define ICMPV6_DST_UNREACH_ADMIN 1 -+#define ICMPV6_DST_UNREACH_ADDRESS 3 -+#define ICMPV6_DST_UNREACH_PORT 4 -+ -+/* Time Exceeded Codes */ -+#define ICMPV6_TIME_EXCD_HPLMT 0 /* Hop Limit exceeded in transit */ -+#define ICMPV6_TIME_EXCD_REASM 1 /* Fragment reassembly time exceeded */ -+ -+/* Parameter Problem Codes */ -+#define ICMPV6_PARM_PROB_HEADER 0 -+#define ICMPV6_PARM_PROB_NEXT_HDR 1 -+#define ICMPV6_PARM_PROB_OPTION 2 -+ -+/* ICMP Option Types */ -+#define IPV6_ICMP_OPTION_SRC_ADDR 1 /* Source Link-Layer Address */ -+#define IPV6_ICMP_OPTION_TAR_ADDR 2 /* Target Link-Layer Address */ -+#define IPV6_ICMP_OPTION_PREFIX 3 /* Prefix */ -+#define IPV6_ICMP_OPTION_RED_HDR 4 /* Redirect Header */ -+#define IPV6_ICMP_OPTION_MTU 5 /* Link MTU */ -+#define IPV6_ICMP_OPTION_RTR_ADV_INT 7 /* Rtr Advertisement Interval */ -+ -+/* ICMP Offsets */ -+#define IPV6_ICMP_TYPE_OFFSET 0 -+#define IPV6_ICMP_CODE_OFFSET 1 -+#define IPV6_ICMP_CKSUM_OFFSET 2 -+#define IPV6_ICMP_RESERVED_OFFSET 4 -+#define IPV6_ICMP_DATA_OFFSET 8 -+ -+/* ICMP Router Solicitation Offsets */ -+#define IPV6_ICMP_RTR_SOL_RES_OFFSET 4 -+#define IPV6_ICMP_RTR_SOL_OPTIONS_OFFSET 8 -+ -+/* ICMP Router Advertisement Offsets */ -+#define IPV6_ICMP_RTR_ADV_CURHOPLMT_OFFSET 4 -+#define IPV6_ICMP_RTR_ADV_MGDANDCFG_BIT_OFFSET 5 -+#define IPV6_ICMP_RTR_ADV_RTR_LIFETIME_OFFSET 6 -+#define IPV6_ICMP_RTR_ADV_RCHBL_TIME_OFFSET 8 -+#define IPV6_ICMP_RTR_ADV_RTRNS_TMR_OFFSET 12 -+#define IPV6_ICMP_RTR_ADV_OPTIONS_OFFSET 16 -+ -+/* ICMP Neighbor Solicitation Offsets */ -+#define IPV6_ICMP_NEIGH_SOL_RES_OFFSET 4 -+#define IPV6_ICMP_NEIGH_SOL_TRGT_ADDRS_OFFSET 8 -+#define IPV6_ICMP_NEIGH_SOL_OPTIONS_OFFSET 24 -+ -+/* ICMP Neighbor Advertisement Offsets */ -+#define IPV6_ICMP_NEIGH_ADV_FLAG_OFFSET 4 -+#define IPV6_ICMP_NEIGH_ADV_TRGT_ADDRS_OFFSET 8 -+#define IPV6_ICMP_NEIGH_ADV_OPTIONS_OFFSET 24 -+ -+/* ICMP Redirect Offsets */ -+#define IPV6_ICMP_REDIRECT_TRGT_ADDRS_OFFSET 8 -+#define IPV6_ICMP_REDIRECT_DEST_ADDRS_OFFSET 24 -+#define IPV6_ICMP_REDIRECT_OPTIONS_OFFSET 40 -+ -+/* ICMP Option Offsets */ -+#define IPV6_ICMP_OPTION_TYPE_OFFSET 0 -+#define IPV6_ICMP_OPTION_LENGTH_OFFSET 1 -+ -+/* ICMP Link-Layer Address Option Offsets */ -+#define IPV6_ICMP_LL_OPTION_ADDRESS_OFFSET 2 -+ -+/* ICMP Prefix Option Offsets */ -+#define IPV6_ICMP_PREFIX_PRE_LENGTH_OFFSET 2 -+#define IPV6_ICMP_PREFIX_FLAG_OFFSET 3 -+#define IPV6_ICMP_PREFIX_VALID_LIFETIME_OFFSET 4 -+#define IPV6_ICMP_PREFIX_PREF_LIFETIME_OFFSET 8 -+#define IPV6_ICMP_PREFIX_RES2_OFFSET 12 -+#define IPV6_ICMP_PREFIX_PREFIX_OFFSET 16 -+ -+/* ICMP Redirected Header Option Offsets */ -+#define IPV6_ICMP_RED_OPTION_TYPE_OFFSET 0 -+#define IPV6_ICMP_RED_OPTION_LEN_OFFSET 1 -+#define IPV6_ICMP_RED_OPTION_RES1_OFFSET 2 -+#define IPV6_ICMP_RED_OPTION_RES2_OFFSET 4 -+#define IPV6_ICMP_RED_OPTION_DATA_OFFSET 8 -+ -+/* ICMP MTU Option Offsets */ -+#define IPV6_ICMP_MTU_RESERVED_OFFSET 2 -+#define IPV6_ICMP_MTU_OFFSET 4 -+ -+/* ICMP Echo Request Offsets */ -+#define IPV6_ICMP_ECHO_ID 4 -+#define IPV6_ICMP_ECHO_SEQ 6 -+#define IPV6_ICMP_ECHO_DATA 8 -+ -+/* ICMP Destination Unreachable Offsets */ -+#define IPV6_DST_UNREACH_UNUSED 4 -+#define IPV6_DST_UNREACH_DATA 8 -+ -+/* ICMP Parameter Problem Offsets */ -+#define IPV6_PARAM_PROB_PTR 4 -+#define IPV6_PARAM_PROT_DATA 8 -+ -+/* ICMP Time Exceeded Offsets */ -+#define IPV6_TIME_EXCEEDED_DATA 8 -+ -+/* ICMP Packet Too Big Offsets */ -+#define IPV6_PKT_TOO_BIG_MTU 4 -+#define IPV6_PKT_TOO_BIG_DATA 8 -+ -+/* Home Agent Address Discovery Request Header Offsets */ -+#define ICMPV6_HA_ADDR_DISC_REQ_ID_OFFSET 4 -+#define ICMPV6_HA_ADDR_DISC_REQ_RSVD_OFFSET 6 -+ -+/* Home Agent Address Discovery Reply Header Offsets */ -+#define ICMPV6_HA_ADDR_DISC_REPLY_ID_OFFSET 4 -+#define ICMPV6_HA_ADDR_DISC_REPLY_RSVD_OFFSET 6 -+#define ICMPV6_HA_ADDR_DISC_REPLY_HA_ADDR_OFFSET 8 -+ -+/* Mobile Prefix Solicitation Header Offsets */ -+#define ICMPV6_MP_SOLICIT_ID_OFFSET 4 -+#define ICMPV6_MP_SOLICIT_RSVD_OFFSET 6 -+ -+/* Mobile Prefix Advertisement Header Offsets */ -+#define ICMPV6_MP_ADV_ID_OFFSET 4 -+#define ICMPV6_MP_ADV_MGDANDCFG_BIT_OFFSET 6 -+#define ICMPV6_MP_ADV_OPT_OFFSET 8 -+ -+/* Advertisement Interval Option Header Offsets */ -+#define ICMPV6_ADV_INT_TYPE_OFFSET 0 -+#define ICMPV6_ADV_INT_LEN_OFFSET 1 -+#define ICMPV6_ADV_INT_RSVD_OFFSET 2 -+#define ICMPV6_ADV_INT_ADV_INT_OFFSET 4 -+ -+#define ICMPV6_HEADER_LEN 4 -+ -+#define IPV6_PREFIX_FLAG_ONLINK 0x80 -+#define IPV6_PREFIX_FLAG_AUTO 0x40 -+#define IPV6_PREFIX_FLAG_ROUTER 0x20 -+ -+#define IPV6_NA_FLAG_ROUTER 0x80 -+#define IPV6_NA_FLAG_SOLICITED 0x40 -+#define IPV6_NA_FLAG_OVERRIDE 0x20 -+ -+/* Router Advertisement Flags */ -+#define IPV6_RA_MANAGED_FLAG 0x80 -+#define IPV6_RA_CONFIG_FLAG 0x40 -+ -+/* Mobile Prefix Advertisement Flags */ -+#define IPV6_PA_MANAGED_FLAG 0x80 -+#define IPV6_PA_CONFIG_FLAG 0x40 -+ -+/* Validation Values */ -+#define ICMPV6_VALID_HOP_LIMIT 255 /* Valid Hop Limit */ -+#define ICMPV6_VALID_CODE 0 /* Valid Code */ -+#define ICMPV6_RTRSOL_MIN_LENGTH 8 /* Minimum valid length for -+ Router Solicitation */ -+#define ICMPV6_RTRADV_MIN_LENGTH 16 /* Minimum valid length for -+ Router Advertisement */ -+#define ICMPV6_NEIGHSOL_MIN_LENGTH 24 /* Minimum valid length for -+ Neighbor Solicitation */ -+#define ICMPV6_NEIGHADV_MIN_LENGTH 24 /* Minimum valid length for -+ Neighbor Advertisement */ -+#define ICMPV6_REDIRECT_MIN_LENGTH 40 /* Minimum valid length for -+ Neighbor Advertisement */ -+ -+/* ICMPV6 Header */ -+struct icmpv6_hdr { -+ u8_t icmpv6_type; /* type field */ -+ u8_t icmpv6_code; /* code field */ -+ u16_t icmpv6_cksum; /* checksum field */ -+ union { -+ u32_t icmpv6_un_data32[1]; /* type-specific field */ -+ u16_t icmpv6_un_data16[2]; /* type-specific field */ -+ u8_t icmpv6_un_data8[4]; /* type-specific field */ -+ } data; -+}; -+ -+#define icmpv6_data data.icmpv6_un_data32[0] -+ -+struct icmpv6_opt_hdr { -+ u8_t type; -+ u8_t len; -+}; -+ -+struct icmpv6_opt_link_addr { -+ struct icmpv6_opt_hdr hdr; -+ u8_t link_addr[6]; -+}; -+ -+struct icmpv6_opt_prefix { -+ struct icmpv6_opt_hdr hdr; -+ u8_t prefix_len; -+ u8_t flags; -+#define ICMPV6_OPT_PREFIX_FLAG_ON_LINK (1 << 7) -+#define ICMPV6_OPT_PREFIX_FLAG_BIT_A (1 << 6) -+ u32_t valid_lifetime; -+ u32_t preferred_lifetime; -+ u32_t reserved; -+ struct ipv6_addr prefix; -+}; -+ -+/* Neighbor Solicitation */ -+struct icmpv6_nd_solicit { -+ struct icmpv6_hdr nd_ns_hdr; -+}; -+ -+/* Router Advertisement */ -+struct icmpv6_router_advert { -+ struct icmpv6_hdr header; -+ u32_t reachable_time; -+ u32_t retransmit_timer; -+}; -+ -+#define nd_ra_type header.icmpv6_type -+#define nd_ra_code header.icmpv6_code -+#define nd_ra_cksum header.icmpv6_cksum -+#define nd_ra_curhoplimit header.data.icmpv6_un_data8[0] -+#define nd_ra_flags_reserved header.data.icmpv6_un_data8[1] -+#define nd_ra_router_lifetime header.data.icmpv6_un_data16[1] -+ -+#endif /* __ICMPV6_H__ */ -diff --git a/iscsiuio/src/uip/ipv6.c b/iscsiuio/src/uip/ipv6.c -new file mode 100644 -index 0000000..edaa2e9 ---- /dev/null -+++ b/iscsiuio/src/uip/ipv6.c -@@ -0,0 +1,1296 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai (eddie.wai@broadcom.com) -+ * Based on Kevin Tran's iSCSI boot code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * ipv6.c - This file contains simplifed IPv6 processing code. -+ * -+ */ -+#include -+#include -+#include -+#include "logger.h" -+#include "uip.h" -+#include "ipv6.h" -+#include "ipv6_pkt.h" -+#include "icmpv6.h" -+#include "uipopt.h" -+#include "dhcpv6.h" -+ -+inline int best_match_bufcmp(u8_t *a, u8_t *b, int len) -+{ -+ int i; -+ -+ for (i = 0; i < len; i++) { -+ if (a[i] != b[i]) -+ break; -+ } -+ return i; -+} -+ -+/* Local function prototypes */ -+static int ipv6_is_it_our_address(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr); -+static void ipv6_insert_protocol_chksum(struct ipv6_hdr *ipv6); -+static void ipv6_update_arp_table(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr, -+ struct mac_address *mac_addr); -+static void ipv6_icmp_init_link_option(struct ipv6_context *context, -+ struct icmpv6_opt_link_addr *link_opt, -+ u8_t type); -+static void ipv6_icmp_rx(struct ipv6_context *context); -+static void ipv6_icmp_handle_nd_adv(struct ipv6_context *context); -+static void ipv6_icmp_handle_nd_sol(struct ipv6_context *context); -+static void ipv6_icmp_handle_echo_request(struct ipv6_context *context); -+static void ipv6_icmp_handle_router_adv(struct ipv6_context *context); -+static void ipv6_icmp_process_prefix(struct ipv6_context *context, -+ struct icmpv6_opt_prefix *icmp_prefix); -+static void ipv6_udp_rx(struct ipv6_context *context); -+ -+int iscsiL2Send(struct ipv6_context *context, int pkt_len) -+{ -+ LOG_DEBUG("IPv6: iscsiL2Send"); -+ uip_send(context->ustack, -+ (void *)context->ustack->data_link_layer, pkt_len); -+ -+ return pkt_len; -+} -+ -+int iscsiL2AddMcAddr(struct ipv6_context *context, -+ struct mac_address *new_mc_addr) -+{ -+ int i; -+ struct mac_address *mc_addr; -+ const struct mac_address all_zeroes_mc = { { 0, 0, 0, 0, 0, 0 } }; -+ -+ mc_addr = context->mc_addr; -+ for (i = 0; i < MAX_MCADDR_TABLE; i++, mc_addr++) -+ if (!memcmp((char *)mc_addr, -+ (char *)new_mc_addr, sizeof(struct mac_address))) -+ return TRUE; /* Already in the mc table */ -+ -+ mc_addr = context->mc_addr; -+ for (i = 0; i < MAX_MCADDR_TABLE; i++, mc_addr++) { -+ if (!memcmp((char *)mc_addr, -+ (char *)&all_zeroes_mc, sizeof(struct mac_address))) { -+ memcpy((char *)mc_addr, -+ (char *)new_mc_addr, sizeof(struct mac_address)); -+ LOG_DEBUG("IPv6: mc_addr added " -+ "%02x:%02x:%02x:%02x:%02x:%02x", -+ *(u8_t *)new_mc_addr, -+ *((u8_t *)new_mc_addr + 1), -+ *((u8_t *)new_mc_addr + 2), -+ *((u8_t *)new_mc_addr + 3), -+ *((u8_t *)new_mc_addr + 4), -+ *((u8_t *)new_mc_addr + 5)); -+ return TRUE; -+ } -+ } -+ return FALSE; -+} -+ -+int iscsiL2IsOurMcAddr(struct ipv6_context *context, -+ struct mac_address *dest_mac) -+{ -+ int i; -+ struct mac_address *mc_addr; -+ -+ mc_addr = context->mc_addr; -+ for (i = 0; i < MAX_MCADDR_TABLE; i++, mc_addr++) -+ if (!memcmp((char *)mc_addr, -+ (char *)dest_mac->addr, sizeof(struct mac_address))) -+ return TRUE; -+ return FALSE; -+} -+ -+void ipv6_init(struct ndpc_state *ndp, int cfg) -+{ -+ int i; -+ struct ipv6_context *context = (struct ipv6_context *)ndp->ipv6_context; -+ struct mac_address *mac_addr = (struct mac_address *)ndp->mac_addr; -+ struct ipv6_arp_entry *ipv6_arp_table; -+ struct ipv6_prefix_entry *ipv6_prefix_table; -+ struct mac_address mc_addr; -+ -+ if (context == NULL) { -+ LOG_ERR("IPV6: INIT ipv6_context is NULL"); -+ return; -+ } -+ -+ memset((char *)context, 0, sizeof(struct ipv6_context)); -+ -+ /* Associate the nic_iface's ustack to this ipv6_context */ -+ context->ustack = ndp->ustack; -+ -+ ipv6_arp_table = &context->ipv6_arp_table[0]; -+ ipv6_prefix_table = &context->ipv6_prefix_table[0]; -+ -+ memset((char *)ipv6_arp_table, 0, sizeof(*ipv6_arp_table)); -+ memset((char *)ipv6_prefix_table, 0, sizeof(*ipv6_prefix_table)); -+ memcpy((char *)&context->mac_addr, -+ (char *)mac_addr, sizeof(struct mac_address)); -+ /* -+ * Per RFC 2373. -+ * There are two types of local-use unicast addresses defined. These -+ * are Link-Local and Site-Local. The Link-Local is for use on a single -+ * link and the Site-Local is for use in a single site. Link-Local -+ * addresses have the following format: -+ * -+ * | 10 | -+ * | bits | 54 bits | 64 bits | -+ * +----------+-------------------------+----------------------------+ -+ * |1111111010| 0 | interface ID | -+ * +----------+-------------------------+----------------------------+ -+ */ -+ if (context->ustack->linklocal_autocfg != IPV6_LL_AUTOCFG_OFF) { -+ context->link_local_addr.addr8[0] = 0xfe; -+ context->link_local_addr.addr8[1] = 0x80; -+ /* Bit 1 is 1 to indicate universal scope. */ -+ context->link_local_addr.addr8[8] = mac_addr->addr[0] | 0x2; -+ context->link_local_addr.addr8[9] = mac_addr->addr[1]; -+ context->link_local_addr.addr8[10] = mac_addr->addr[2]; -+ context->link_local_addr.addr8[11] = 0xff; -+ context->link_local_addr.addr8[12] = 0xfe; -+ context->link_local_addr.addr8[13] = mac_addr->addr[3]; -+ context->link_local_addr.addr8[14] = mac_addr->addr[4]; -+ context->link_local_addr.addr8[15] = mac_addr->addr[5]; -+ -+ context->link_local_multi.addr8[0] = 0xff; -+ context->link_local_multi.addr8[1] = 0x02; -+ context->link_local_multi.addr8[11] = 0x01; -+ context->link_local_multi.addr8[12] = 0xff; -+ context->link_local_multi.addr8[13] |= -+ context->link_local_addr.addr8[13]; -+ context->link_local_multi.addr16[7] = -+ context->link_local_addr.addr16[7]; -+ -+ /* Default Prefix length is 64 */ -+ /* Add Link local address to the head of the ipv6 address -+ list */ -+ ipv6_add_prefix_entry(context, -+ &context->link_local_addr, 64); -+ } -+ /* -+ * Convert Multicast IP address to Multicast MAC adress per -+ * RFC 2464: Transmission of IPv6 Packets over Ethernet Networks -+ * -+ * An IPv6 packet with a multicast destination address DST, consisting -+ * of the sixteen octets DST[1] through DST[16], is transmitted to the -+ * Ethernet multicast address whose first two octets are the value 3333 -+ * hexadecimal and whose last four octets are the last four octets of -+ * DST. -+ * -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * |0 0 1 1 0 0 1 1|0 0 1 1 0 0 1 1| -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * | DST[13] | DST[14] | -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * | DST[15] | DST[16] | -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * -+ * IPv6 requires the following Multicast IP addresses setup per node. -+ */ -+ for (i = 0; i < 3; i++) { -+ mc_addr.addr[0] = 0x33; -+ mc_addr.addr[1] = 0x33; -+ mc_addr.addr[2] = 0x0; -+ mc_addr.addr[3] = 0x0; -+ mc_addr.addr[4] = 0x0; -+ -+ switch (i) { -+ case 0: -+ /* All Nodes Multicast IPv6 address : ff02::1 */ -+ mc_addr.addr[5] = 0x1; -+ break; -+ -+ case 1: -+ /* All Host Multicast IPv6 address : ff02::3 */ -+ mc_addr.addr[5] = 0x3; -+ break; -+ -+ case 2: -+ /* Solicited Node Multicast Address: ff02::01:ffxx:yyzz -+ */ -+ mc_addr.addr[2] = 0xff; -+ mc_addr.addr[3] = mac_addr->addr[3]; -+ mc_addr.addr[4] = mac_addr->addr[4]; -+ mc_addr.addr[5] = mac_addr->addr[5]; -+ break; -+ -+ default: -+ break; -+ } -+ iscsiL2AddMcAddr(context, &mc_addr); -+ } -+ -+ /* Default HOP number */ -+ context->hop_limit = IPV6_HOP_LIMIT; -+} -+ -+int ipv6_add_prefix_entry(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr, u8_t prefix_len) -+{ -+ int i; -+ struct ipv6_prefix_entry *prefix_entry; -+ struct ipv6_prefix_entry *ipv6_prefix_table = -+ context->ipv6_prefix_table; -+ char addr_str[INET6_ADDRSTRLEN]; -+ -+ /* Check if there is an valid entry already. */ -+ for (i = 0; i < IPV6_NUM_OF_ADDRESS_ENTRY; i++) { -+ prefix_entry = &ipv6_prefix_table[i]; -+ -+ if (prefix_entry->prefix_len != 0) { -+ if (memcmp((char *)&prefix_entry->ip_addr, -+ (char *)ip_addr, -+ sizeof(struct ipv6_addr)) == 0) { -+ /* We already initialize on this interface. -+ There is nothing to do */ -+ return 0; -+ } -+ } -+ } -+ -+ /* Find an unused entry */ -+ for (i = 0; i < IPV6_NUM_OF_ADDRESS_ENTRY; i++) { -+ prefix_entry = &ipv6_prefix_table[i]; -+ -+ if (prefix_entry->prefix_len == 0) -+ break; -+ } -+ -+ if (prefix_entry->prefix_len != 0) -+ return -1; -+ -+ prefix_entry->prefix_len = prefix_len / 8; -+ -+ memcpy((char *)&prefix_entry->ip_addr, -+ (char *)ip_addr, sizeof(struct ipv6_addr)); -+ -+ inet_ntop(AF_INET6, &prefix_entry->ip_addr.addr8, addr_str, -+ sizeof(addr_str)); -+ -+ LOG_DEBUG("IPv6: add prefix IP addr %s", addr_str); -+ -+ /* Put it on the list on head of the list. */ -+ if (context->addr_list != NULL) -+ prefix_entry->next = context->addr_list; -+ else -+ prefix_entry->next = NULL; -+ -+ context->addr_list = prefix_entry; -+ -+ return 0; -+} -+ -+void ipv6_rx_packet(struct ipv6_context *context, u16_t len) -+{ -+ struct ipv6_hdr *ipv6; -+ u16_t protocol; -+ -+ if (!context->ustack) { -+ LOG_WARN("ipv6 rx pkt ipv6_context = %p ustack = %p", context, -+ context->ustack); -+ return; -+ } -+ ipv6 = (struct ipv6_hdr *)context->ustack->network_layer; -+ /* Make sure it's an IPv6 packet */ -+ if ((ipv6->ipv6_version_fc & 0xf0) != IPV6_VERSION) { -+ /* It's not an IPv6 packet. Drop it. */ -+ LOG_WARN("IPv6 version 0x%x not IPv6", ipv6->ipv6_version_fc); -+ return; -+ } -+ protocol = ipv6_process_rx(ipv6); -+ -+ switch (protocol) { -+ case IPPROTO_ICMPV6: -+ ipv6_icmp_rx(context); -+ break; -+ -+ case IPPROTO_UDP: -+ /* Indicate to UDP processing code */ -+ ipv6_udp_rx(context); -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+void ipv6_mc_init_dest_mac(struct eth_hdr *eth, struct ipv6_hdr *ipv6) -+{ -+ int i; -+ /* -+ * Initialize address mapping of IPV6 Multicast to multicast MAC -+ * address per RFC 2464. -+ * -+ * An IPv6 packet with a multicast destination address DST, consisting -+ * of the sixteen octets DST[1] through DST[16], is transmitted to the -+ * Ethernet multicast address whose first two octets are the value 3333 -+ * hexadecimal and whose last four octets are the last four octets of -+ * DST. -+ * -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * |0 0 1 1 0 0 1 1|0 0 1 1 0 0 1 1| -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * | DST[13] | DST[14] | -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ * | DST[15] | DST[16] | -+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+ */ -+ eth->dest_mac.addr[0] = 0x33; -+ eth->dest_mac.addr[1] = 0x33; -+ for (i = 0; i < 4; i++) -+ eth->dest_mac.addr[2 + i] = ipv6->ipv6_dst.addr8[12 + i]; -+} -+ -+int ipv6_autoconfig(struct ipv6_context *context) -+{ -+ return ipv6_discover_address(context); -+} -+ -+int ipv6_discover_address(struct ipv6_context *context) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ int rc = 0; -+ -+ /* Retrieve tx buffer */ -+ if (eth == NULL || ipv6 == NULL) -+ return -EAGAIN; -+ -+ /* Setup IPv6 All Routers Multicast address : ff02::2 */ -+ memset((char *)&ipv6->ipv6_dst, 0, sizeof(struct ipv6_addr)); -+ ipv6->ipv6_dst.addr8[0] = 0xff; -+ ipv6->ipv6_dst.addr8[1] = 0x02; -+ ipv6->ipv6_dst.addr8[15] = 0x02; -+ ipv6->ipv6_hop_limit = 255; -+ -+ /* Initialize MAC header based on destination MAC address */ -+ ipv6_mc_init_dest_mac(eth, ipv6); -+ ipv6->ipv6_nxt_hdr = IPPROTO_ICMPV6; -+ -+ icmp->icmpv6_type = ICMPV6_RTR_SOL; -+ icmp->icmpv6_code = 0; -+ icmp->icmpv6_data = 0; -+ icmp->icmpv6_cksum = 0; -+ ipv6_icmp_init_link_option(context, -+ (struct icmpv6_opt_link_addr *)((u8_t *)icmp -+ + sizeof(struct icmpv6_hdr)), -+ IPV6_ICMP_OPTION_SRC_ADDR); -+ ipv6->ipv6_plen = HOST_TO_NET16((sizeof(struct icmpv6_hdr) + -+ sizeof(struct icmpv6_opt_link_addr))); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&context->link_local_addr, -+ sizeof(struct ipv6_addr)); -+ -+ icmp->icmpv6_cksum = 0; -+ LOG_DEBUG("IPv6: Send rtr sol"); -+ ipv6_send(context, (u8_t *) icmp - (u8_t *) eth + -+ sizeof(struct icmpv6_hdr) + -+ sizeof(struct icmpv6_opt_link_addr)); -+ return rc; -+} -+ -+u16_t ipv6_process_rx(struct ipv6_hdr *ipv6) -+{ -+ return ipv6->ipv6_nxt_hdr; -+} -+ -+int ipv6_send(struct ipv6_context *context, u16_t packet_len) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ -+ ipv6_setup_hdrs(context, eth, ipv6, packet_len); -+ -+ return iscsiL2Send(context, packet_len); -+} -+ -+void ipv6_send_udp_packet(struct ipv6_context *context, u16_t packet_len) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct udp_hdr *udp = (struct udp_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ -+ ipv6->ipv6_nxt_hdr = IPPROTO_UDP; -+ ipv6->ipv6_plen = -+ HOST_TO_NET16(packet_len - ((u8_t *)udp - (u8_t *)eth)); -+ -+ udp->chksum = 0; -+ -+ /* -+ * We only use UDP packet for DHCPv6. The source address is always -+ * link-local address. -+ */ -+ ipv6->ipv6_src.addr[0] = 0; -+ -+ /* Hop limit is always 1 for DHCPv6 packet. */ -+ ipv6->ipv6_hop_limit = 1; -+ -+ ipv6_send(context, packet_len); -+} -+ -+void ipv6_setup_hdrs(struct ipv6_context *context, struct eth_hdr *eth, -+ struct ipv6_hdr *ipv6, u16_t packet_len) -+{ -+ struct ipv6_addr *our_address; -+ -+ /* VLAN will be taken cared of in the nic layer */ -+ eth->len_type = HOST_TO_NET16(LAYER2_TYPE_IPV6); -+ memcpy((char *)ð->src_mac, -+ (char *)&context->mac_addr, sizeof(struct mac_address)); -+ -+ /* Put the traffic class into the packet. */ -+ memset(&ipv6->ipv6_version_fc, 0, sizeof(u32_t)); -+ ipv6->ipv6_version_fc = IPV6_VERSION; -+ if (ipv6->ipv6_hop_limit == 0) -+ ipv6->ipv6_hop_limit = context->hop_limit; -+ -+ if (ipv6->ipv6_src.addr[0] == 0) { -+ /* Need to initialize source IP address. */ -+ our_address = ipv6_our_address(context); -+ if (our_address != NULL) { -+ /* Assume that caller has filled in the destination -+ IP address */ -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)our_address, sizeof(struct ipv6_addr)); -+ } -+ } -+ -+ ipv6_insert_protocol_chksum(ipv6); -+} -+ -+static void ipv6_insert_protocol_chksum(struct ipv6_hdr *ipv6) -+{ -+ u32_t sum; -+ u16_t *ptr; -+ u16_t *protocol_data_ptr; -+ int i; -+ u16_t protocol_data_len; -+ u16_t checksum; -+ -+ /* -+ * This routine assumes that there is no extension header. This driver -+ * doesn't user extension header to keep driver small and simple. -+ * -+ * Pseudo check consists of the following: -+ * SRC IP, DST IP, Protocol Data Length, and Next Header. -+ */ -+ sum = 0; -+ ptr = (u16_t *)&ipv6->ipv6_src; -+ -+ for (i = 0; i < sizeof(struct ipv6_addr); i++) { -+ sum += HOST_TO_NET16(*ptr); -+ ptr++; -+ } -+ -+ /* Keep track where the layer header is */ -+ protocol_data_ptr = ptr; -+ -+ protocol_data_len = HOST_TO_NET16(ipv6->ipv6_plen); -+ sum += protocol_data_len; -+ sum += ipv6->ipv6_nxt_hdr; -+ /* Sum now contains sum of IPv6 pseudo header. Let's add the data -+ streams. */ -+ if (protocol_data_len & 1) { -+ /* Length of data is odd */ -+ *((u8_t *) ptr + protocol_data_len) = 0; -+ protocol_data_len++; -+ } -+ -+ for (i = 0; i < protocol_data_len / 2; i++) { -+ sum += HOST_TO_NET16(*ptr); -+ ptr++; -+ } -+ -+ sum = (sum >> 16) + (sum & 0xffff); -+ sum += (sum >> 16); -+ sum &= 0xffff; -+ checksum = (u16_t) (~sum); -+ checksum = HOST_TO_NET16(checksum); -+ -+ switch (ipv6->ipv6_nxt_hdr) { -+ case IPPROTO_ICMPV6: -+ /* Insert correct ICMPv6 checksum */ -+ ((struct icmpv6_hdr *)(protocol_data_ptr))->icmpv6_cksum = -+ checksum; -+ break; -+ case IPPROTO_UDP: -+ /* Insert correct UDP checksum */ -+ ((struct udp_hdr *)protocol_data_ptr)->chksum = checksum; -+ break; -+ default: -+ break; -+ } -+} -+ -+int ipv6_is_it_our_link_local_address(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr) -+{ -+ u8_t *test_addr = (u8_t *) ip_addr->addr8; -+ u8_t test_remainder; -+ -+ if (test_addr[0] != context->link_local_addr.addr8[0]) -+ return FALSE; -+ -+ test_remainder = (test_addr[1] & 0xC0) >> 6; -+ if (test_remainder != 2) -+ return FALSE; -+ -+ return TRUE; -+} -+ -+static int ipv6_is_it_our_address(struct ipv6_context *context, -+ struct ipv6_addr *ipv6_addr) -+{ -+ struct ipv6_prefix_entry *ipv6_prefix; -+ -+ for (ipv6_prefix = context->addr_list; ipv6_prefix != NULL; -+ ipv6_prefix = ipv6_prefix->next) { -+ if (IPV6_ARE_ADDR_EQUAL(&ipv6_prefix->ip_addr, ipv6_addr)) -+ return TRUE; -+ } -+ -+ return FALSE; -+} -+ -+struct ipv6_addr *ipv6_our_address(struct ipv6_context *context) -+{ -+ return &context->link_local_addr; -+} -+ -+int ipv6_ip_in_arp_table(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr, -+ struct mac_address *mac_addr) -+{ -+ struct ipv6_arp_entry *arp_entry; -+ int i; -+ -+ for (i = 0; i < UIP_ARPTAB_SIZE; i++) { -+ arp_entry = &context->ipv6_arp_table[i]; -+ -+ if (IPV6_ARE_ADDR_EQUAL(&arp_entry->ip_addr, ip_addr)) { -+ memcpy((char *)mac_addr, &arp_entry->mac_addr, -+ sizeof(struct mac_address)); -+ return 1; -+ } -+ } -+ return 0; -+} -+ -+struct ipv6_addr *ipv6_find_longest_match(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr) -+{ -+ struct ipv6_prefix_entry *ipv6_prefix; -+ struct ipv6_prefix_entry *best_match = NULL; -+ int longest_len = -1; -+ int len; -+ -+ for (ipv6_prefix = context->addr_list; ipv6_prefix != NULL; -+ ipv6_prefix = ipv6_prefix->next) { -+ if (!IPV6_IS_ADDR_LINKLOCAL(&ipv6_prefix->ip_addr)) { -+ len = best_match_bufcmp((u8_t *)&ipv6_prefix->ip_addr, -+ (u8_t *)ip_addr, -+ sizeof(struct ipv6_addr)); -+ if (len > longest_len) { -+ best_match = ipv6_prefix; -+ longest_len = len; -+ } -+ } -+ } -+ -+ if (best_match) -+ return &best_match->ip_addr; -+ -+ return NULL; -+} -+ -+void ipv6_arp_out(struct ipv6_context *context, int *uip_len) -+{ -+ /* Empty routine */ -+} -+ -+ -+static void ipv6_update_arp_table(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr, -+ struct mac_address *mac_addr) -+{ -+ struct ipv6_arp_entry *arp_entry; -+ int i; -+ struct ipv6_arp_entry *ipv6_arp_table = context->ipv6_arp_table; -+ -+ LOG_DEBUG("IPv6: Neighbor update"); -+ /* -+ * Walk through the ARP mapping table and try to find an entry to -+ * update. If none is found, the IP -> MAC address mapping is -+ * inserted in the ARP table. -+ */ -+ for (i = 0; i < UIP_ARPTAB_SIZE; i++) { -+ arp_entry = &ipv6_arp_table[i]; -+ -+ /* Only check those entries that are actually in use. */ -+ if (arp_entry->ip_addr.addr[0] != 0) { -+ /* -+ * Check if the source IP address of the incoming -+ * packet matches the IP address in this ARP table -+ * entry. -+ */ -+ if (IPV6_ARE_ADDR_EQUAL(&arp_entry->ip_addr, ip_addr)) { -+ /* An old entry found, update this and return */ -+ memcpy((char *)&arp_entry->mac_addr, -+ (char *)mac_addr, -+ sizeof(struct mac_address)); -+ arp_entry->time = context->arptime; -+ return; -+ } -+ } -+ } -+ -+ /* -+ * If we get here, no existing ARP table entry was found, so we -+ * create one. -+ * -+ * First, we try to find an unused entry in the ARP table. -+ */ -+ for (i = 0; i < UIP_ARPTAB_SIZE; i++) { -+ arp_entry = &ipv6_arp_table[i]; -+ -+ if (arp_entry->ip_addr.addr[0] == 0) -+ break; -+ } -+ -+ if (i == UIP_ARPTAB_SIZE) -+ return; -+ -+ /* Index j is the entry that is least used */ -+ arp_entry = &ipv6_arp_table[i]; -+ memcpy((char *)&arp_entry->ip_addr, (char *)ip_addr, -+ sizeof(struct ipv6_addr)); -+ memcpy((char *)&arp_entry->mac_addr, -+ (char *)mac_addr, sizeof(struct mac_address)); -+ -+ arp_entry->time = context->arptime; -+} -+ -+/* DestIP is intact */ -+int ipv6_send_nd_solicited_packet(struct ipv6_context *context, -+ struct eth_hdr *eth, struct ipv6_hdr *ipv6) -+{ -+ struct icmpv6_hdr *icmp; -+ int pkt_len = 0; -+ struct ipv6_addr *longest_match_addr; -+ char addr_str[INET6_ADDRSTRLEN]; -+ -+ ipv6->ipv6_nxt_hdr = IPPROTO_ICMPV6; -+ -+ /* Depending on the IPv6 address of the target, we'll need to determine -+ whether we use the assigned IPv6 address/RA or the link local address -+ */ -+ /* Use Link-local as source address */ -+ if (ipv6_is_it_our_link_local_address(context, &ipv6->ipv6_dst) == -+ TRUE) { -+ LOG_DEBUG("IPv6: NS using link local"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&context->link_local_addr, -+ sizeof(struct ipv6_addr)); -+ } else { -+ longest_match_addr = -+ ipv6_find_longest_match(context, &ipv6->ipv6_dst); -+ if (longest_match_addr) { -+ LOG_DEBUG("IPv6: NS using longest match addr"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)longest_match_addr, -+ sizeof(struct ipv6_addr)); -+ } else { -+ LOG_DEBUG("IPv6: NS using link local instead"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&context->link_local_addr, -+ sizeof(struct ipv6_addr)); -+ } -+ } -+ icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + sizeof(struct ipv6_hdr)); -+ -+ inet_ntop(AF_INET6, &ipv6->ipv6_src.addr8, addr_str, sizeof(addr_str)); -+ LOG_DEBUG("IPv6: NS host IP addr: %s", addr_str); -+ /* -+ * Destination IP address to be resolved is after the ICMPv6 -+ * header. -+ */ -+ memcpy((char *)((u8_t *)icmp + sizeof(struct icmpv6_hdr)), -+ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)); -+ -+ /* -+ * Destination IP in the IPv6 header contains solicited-node multicast -+ * address corresponding to the target address. -+ * -+ * ff02::01:ffxx:yyzz. Where xyz are least -+ * significant of 24-bit MAC address. -+ */ -+ memset((char *)&ipv6->ipv6_dst, 0, sizeof(struct ipv6_addr) - 3); -+ ipv6->ipv6_dst.addr8[0] = 0xff; -+ ipv6->ipv6_dst.addr8[1] = 0x02; -+ ipv6->ipv6_dst.addr8[11] = 0x01; -+ ipv6->ipv6_dst.addr8[12] = 0xff; -+ ipv6_mc_init_dest_mac(eth, ipv6); -+ ipv6->ipv6_hop_limit = 255; -+ -+ icmp->icmpv6_type = ICMPV6_NEIGH_SOL; -+ icmp->icmpv6_code = 0; -+ icmp->icmpv6_data = 0; -+ icmp->icmpv6_cksum = 0; -+ ipv6_icmp_init_link_option(context, -+ (struct icmpv6_opt_link_addr *)((u8_t *)icmp -+ + sizeof(struct icmpv6_hdr) -+ + sizeof(struct ipv6_addr)), -+ IPV6_ICMP_OPTION_SRC_ADDR); -+ ipv6->ipv6_plen = HOST_TO_NET16((sizeof(struct icmpv6_hdr) + -+ sizeof(struct icmpv6_opt_link_addr) + -+ sizeof(struct ipv6_addr))); -+ /* Total packet size */ -+ pkt_len = (u8_t *) icmp - (u8_t *) eth + -+ sizeof(struct icmpv6_hdr) + -+ sizeof(struct icmpv6_opt_link_addr) + sizeof(struct ipv6_addr); -+ ipv6_setup_hdrs(context, eth, ipv6, pkt_len); -+ return pkt_len; -+} -+ -+static void ipv6_icmp_init_link_option(struct ipv6_context *context, -+ struct icmpv6_opt_link_addr *link_opt, -+ u8_t type) -+{ -+ link_opt->hdr.type = type; -+ link_opt->hdr.len = sizeof(struct icmpv6_opt_link_addr) / 8; -+ memcpy((char *)&link_opt->link_addr, -+ (char *)&context->mac_addr, sizeof(struct mac_address)); -+} -+ -+static void ipv6_icmp_rx(struct ipv6_context *context) -+{ -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ -+ switch (icmp->icmpv6_type) { -+ case ICMPV6_RTR_ADV: -+ ipv6_icmp_handle_router_adv(context); -+ break; -+ -+ case ICMPV6_NEIGH_SOL: -+ ipv6_icmp_handle_nd_sol(context); -+ break; -+ -+ case ICMPV6_NEIGH_ADV: -+ ipv6_icmp_handle_nd_adv(context); -+ break; -+ -+ case ICMPV6_ECHO_REQUEST: -+ /* Response with ICMP reply */ -+ ipv6_icmp_handle_echo_request(context); -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+static void ipv6_icmp_handle_router_adv(struct ipv6_context *context) -+{ -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct icmpv6_router_advert *icmp = -+ (struct icmpv6_router_advert *)((u8_t *)ipv6 + sizeof(struct ipv6_hdr)); -+ struct icmpv6_opt_hdr *icmp_opt; -+ u16_t opt_len; -+ u16_t len; -+ char addr_str[INET6_ADDRSTRLEN]; -+ -+ if (context->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED) -+ return; -+ -+ opt_len = HOST_TO_NET16(ipv6->ipv6_plen) - -+ sizeof(struct icmpv6_router_advert); -+ -+ icmp_opt = (struct icmpv6_opt_hdr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_router_advert)); -+ len = 0; -+ while (len < opt_len) { -+ icmp_opt = (struct icmpv6_opt_hdr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_router_advert) + -+ len); -+ -+ switch (icmp_opt->type) { -+ case IPV6_ICMP_OPTION_PREFIX: -+ ipv6_icmp_process_prefix(context, -+ (struct icmpv6_opt_prefix *)icmp_opt); -+ context->flags |= IPV6_FLAGS_ROUTER_ADV_RECEIVED; -+ break; -+ -+ default: -+ break; -+ } -+ -+ len += icmp_opt->len * 8; -+ } -+ -+ if (context->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED) { -+ LOG_DEBUG("IPv6: RTR ADV nd_ra_flags = 0x%x", -+ icmp->nd_ra_flags_reserved); -+ if (icmp->nd_ra_curhoplimit > 0) -+ context->hop_limit = icmp->nd_ra_curhoplimit; -+ -+ if (icmp->nd_ra_flags_reserved & IPV6_RA_MANAGED_FLAG) -+ context->flags |= IPV6_FLAGS_MANAGED_ADDR_CONFIG; -+ -+ if (icmp->nd_ra_flags_reserved & IPV6_RA_CONFIG_FLAG) -+ context->flags |= IPV6_FLAGS_OTHER_STATEFUL_CONFIG; -+ -+ if (icmp->nd_ra_router_lifetime != 0) { -+ /* There is a default router. */ -+ if (context->ustack->router_autocfg != -+ IPV6_RTR_AUTOCFG_OFF) -+ memcpy( -+ (char *)&context->default_router, -+ (char *)&ipv6->ipv6_src, -+ sizeof(struct ipv6_addr)); -+ inet_ntop(AF_INET6, &context->default_router, -+ addr_str, sizeof(addr_str)); -+ LOG_DEBUG("IPv6: Got default router IP addr: %s", -+ addr_str); -+ } -+ } -+} -+ -+static void ipv6_icmp_process_prefix(struct ipv6_context *context, -+ struct icmpv6_opt_prefix *icmp_prefix) -+{ -+ struct ipv6_addr addr; -+ char addr_str[INET6_ADDRSTRLEN]; -+ -+ /* we only process on-link address info */ -+ if (!(icmp_prefix->flags & ICMPV6_OPT_PREFIX_FLAG_ON_LINK)) -+ return; -+ -+ /* -+ * We only process prefix length of 64 since our Identifier is 64-bit -+ */ -+ if (icmp_prefix->prefix_len == 64) { -+ /* Copy 64-bit from the local-link address to create -+ IPv6 address */ -+ memcpy((char *)&addr, -+ (char *)&icmp_prefix->prefix, 8); -+ memcpy((char *)&addr.addr8[8], -+ &context->link_local_addr.addr8[8], 8); -+ inet_ntop(AF_INET6, &addr, addr_str, sizeof(addr_str)); -+ LOG_DEBUG("IPv6: Got RA ICMP option IP addr: %s", addr_str); -+ ipv6_add_prefix_entry(context, &addr, 64); -+ } -+} -+ -+static void ipv6_icmp_handle_nd_adv(struct ipv6_context *context) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ struct icmpv6_opt_link_addr *link_opt = -+ (struct icmpv6_opt_link_addr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_hdr) + sizeof(struct ipv6_addr)); -+ struct ipv6_addr *tar_addr6; -+ char addr_str[INET6_ADDRSTRLEN]; -+ -+ /* Added the multicast check for ARP table update */ -+ /* Should we qualify for only our host's multicast and our -+ link_local_multicast?? */ -+ LOG_DEBUG("IPv6: Handle nd adv"); -+ if ((ipv6_is_it_our_address(context, &ipv6->ipv6_dst) == TRUE) || -+ (memcmp((char *)&context->link_local_multi, -+ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)) == 0) || -+ (memcmp((char *)&context->multi, -+ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)) == 0)) { -+ /* -+ * This is an ARP reply for our addresses. Let's update the -+ * ARP table. -+ */ -+ ipv6_update_arp_table(context, &ipv6->ipv6_src, -+ ð->src_mac); -+ -+ /* Now check for the target address option and update that as -+ well */ -+ if (link_opt->hdr.type == IPV6_ICMP_OPTION_TAR_ADDR) { -+ tar_addr6 = (struct ipv6_addr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_hdr)); -+ LOG_DEBUG("IPV6: Target MAC " -+ "%02x:%02x:%02x:%02x:%02x:%02x", -+ link_opt->link_addr[0], link_opt->link_addr[1], -+ link_opt->link_addr[2], link_opt->link_addr[3], -+ link_opt->link_addr[4], link_opt->link_addr[5]); -+ inet_ntop(AF_INET6, &tar_addr6->addr8, addr_str, -+ sizeof(addr_str)); -+ LOG_DEBUG("IPv6: Target IP addr %s", addr_str); -+ ipv6_update_arp_table(context, tar_addr6, -+ (struct mac_address *)link_opt->link_addr); -+ } -+ -+ } -+} -+ -+static void ipv6_icmp_handle_nd_sol(struct ipv6_context *context) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ struct icmpv6_opt_link_addr *link_opt = -+ (struct icmpv6_opt_link_addr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_hdr) + sizeof(struct ipv6_addr)); -+ int icmpv6_opt_len = 0; -+ struct ipv6_addr tmp; -+ struct ipv6_addr *longest_match_addr, *tar_addr6; -+ -+ LOG_DEBUG("IPv6: Handle nd sol"); -+ -+ if ((memcmp((char *)&context->mac_addr, -+ (char *)ð->dest_mac, sizeof(struct mac_address)) != 0) && -+ (iscsiL2IsOurMcAddr(context, (struct mac_address *)ð->dest_mac) -+ == FALSE)) { -+ /* This packet is not for us to handle */ -+ LOG_DEBUG("IPv6: MAC not addressed to us " -+ "%02x:%02x:%02x:%02x:%02x:%02x", -+ eth->dest_mac.addr[0], eth->dest_mac.addr[1], -+ eth->dest_mac.addr[2], eth->dest_mac.addr[3], -+ eth->dest_mac.addr[4], eth->dest_mac.addr[5]); -+ return; -+ } -+ -+ /* Also check for the icmpv6_data before generating the reply */ -+ if (ipv6_is_it_our_address(context, -+ (struct ipv6_addr *) ((u8_t *) icmp + -+ sizeof(struct icmpv6_hdr))) -+ == FALSE) { -+ /* This packet is not for us to handle */ -+ LOG_DEBUG("IPv6: IP not addressed to us"); -+ return; -+ } -+ -+ /* Copy source MAC to Destination MAC */ -+ memcpy((char *)ð->dest_mac, -+ (char *)ð->src_mac, sizeof(struct mac_address)); -+ -+ /* Dest IP contains source IP */ -+ memcpy((char *)&tmp, -+ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)); -+ memcpy((char *)&ipv6->ipv6_dst, -+ (char *)&ipv6->ipv6_src, sizeof(struct ipv6_addr)); -+ -+ /* Examine the Neighbor Solicitation ICMPv6 target address field. -+ If target address exist, use that to find best match src address -+ for the reply */ -+ if (link_opt->hdr.type == IPV6_ICMP_OPTION_SRC_ADDR) { -+ tar_addr6 = (struct ipv6_addr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_hdr)); -+ if (ipv6_is_it_our_link_local_address(context, tar_addr6) -+ == TRUE) { -+ LOG_DEBUG("IPv6: NA using link local"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&context->link_local_addr, -+ sizeof(struct ipv6_addr)); -+ } else { -+ longest_match_addr = -+ ipv6_find_longest_match(context, tar_addr6); -+ if (longest_match_addr) { -+ LOG_DEBUG("IPv6: NA using longest match addr"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)longest_match_addr, -+ sizeof(struct ipv6_addr)); -+ } else { -+ LOG_DEBUG("IPv6: NA using link local instead"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&context->link_local_addr, -+ sizeof(struct ipv6_addr)); -+ } -+ } -+ } else { -+ /* No target link address, just use whatever it sent to us */ -+ LOG_DEBUG("IPv6: NA use dst addr"); -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&tmp, -+ sizeof(struct ipv6_addr)); -+ } -+ ipv6->ipv6_hop_limit = 255; -+ icmp->icmpv6_type = ICMPV6_NEIGH_ADV; -+ icmp->icmpv6_code = 0; -+ icmp->icmpv6_data = 0; -+ icmp->icmpv6_cksum = 0; -+ icmp->data.icmpv6_un_data8[0] = -+ IPV6_NA_FLAG_SOLICITED | IPV6_NA_FLAG_OVERRIDE; -+ memcpy((char *)((u8_t *)icmp + sizeof(struct icmpv6_hdr)), -+ (char *)&ipv6->ipv6_src, -+ sizeof(struct ipv6_addr)); -+ -+ /* Add the target link address option only for all solicitation */ -+ ipv6_icmp_init_link_option(context, -+ (struct icmpv6_opt_link_addr *)((u8_t *)icmp + -+ sizeof(struct icmpv6_hdr) + -+ sizeof(struct ipv6_addr)), -+ IPV6_ICMP_OPTION_TAR_ADDR); -+ icmpv6_opt_len = sizeof(struct icmpv6_opt_link_addr); -+ ipv6->ipv6_plen = HOST_TO_NET16((sizeof(struct icmpv6_hdr) + -+ icmpv6_opt_len + sizeof(struct ipv6_addr))); -+ LOG_DEBUG("IPv6: Send nd adv"); -+ ipv6_send(context, -+ (u8_t *) icmp - (u8_t *) eth + -+ sizeof(struct icmpv6_hdr) + -+ sizeof(struct icmpv6_opt_link_addr) + -+ sizeof(struct ipv6_addr)); -+ return; -+} -+ -+static void ipv6_icmp_handle_echo_request(struct ipv6_context *context) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct icmpv6_hdr *icmp = (struct icmpv6_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ struct ipv6_addr temp; -+ -+ /* Copy source MAC to Destination MAC */ -+ memcpy((char *)ð->dest_mac, -+ (char *)ð->src_mac, sizeof(struct mac_address)); -+ -+ memcpy((char *)&temp, -+ (char *)&ipv6->ipv6_dst, sizeof(struct ipv6_addr)); -+ -+ /* Dest IP contains source IP */ -+ memcpy((char *)&ipv6->ipv6_dst, -+ (char *)&ipv6->ipv6_src, sizeof(struct ipv6_addr)); -+ /* Use Link-local as source address */ -+ memcpy((char *)&ipv6->ipv6_src, -+ (char *)&temp, sizeof(struct ipv6_addr)); -+ -+ ipv6->ipv6_hop_limit = context->hop_limit; -+ icmp->icmpv6_type = ICMPV6_ECHO_REPLY; -+ icmp->icmpv6_code = 0; -+ icmp->icmpv6_cksum = 0; -+ LOG_DEBUG("IPv6: Send echo reply"); -+ ipv6_send(context, (u8_t *) icmp - (u8_t *) eth + -+ sizeof(struct ipv6_hdr) + HOST_TO_NET16(ipv6->ipv6_plen)); -+ return; -+} -+ -+void ipv6_set_ip_params(struct ipv6_context *context, -+ struct ipv6_addr *src_ip, u8_t prefix_len, -+ struct ipv6_addr *default_gateway, -+ struct ipv6_addr *linklocal) -+{ -+ if (!(IPV6_IS_ADDR_UNSPECIFIED(src_ip))) { -+ ipv6_add_prefix_entry(context, src_ip, prefix_len); -+ /* Create the multi_dest address */ -+ memset(&context->multi_dest, 0, sizeof(struct ipv6_addr)); -+ context->multi_dest.addr8[0] = 0xff; -+ context->multi_dest.addr8[1] = 0x02; -+ context->multi_dest.addr8[11] = 0x01; -+ context->multi_dest.addr8[12] = 0xff; -+ context->multi_dest.addr8[13] = src_ip->addr8[13]; -+ context->multi_dest.addr16[7] = src_ip->addr16[7]; -+ /* Create the multi address */ -+ memset(&context->multi, 0, sizeof(struct ipv6_addr)); -+ context->multi.addr8[0] = 0xfc; -+ context->multi.addr8[2] = 0x02; -+ context->multi.addr16[7] = src_ip->addr16[7]; -+ } -+ -+ if (!(IPV6_IS_ADDR_UNSPECIFIED(default_gateway))) { -+ /* Override the default gateway addr */ -+ memcpy((char *)&context->default_router, -+ (char *)default_gateway, sizeof(struct ipv6_addr)); -+ ipv6_add_prefix_entry(context, default_gateway, -+ prefix_len); -+ } -+ if (!(IPV6_IS_ADDR_UNSPECIFIED(linklocal))) { -+ /* Override the linklocal addr */ -+ memcpy((char *)&context->link_local_addr, -+ (char *)linklocal, sizeof(struct ipv6_addr)); -+ context->link_local_multi.addr8[0] = 0xff; -+ context->link_local_multi.addr8[1] = 0x02; -+ context->link_local_multi.addr8[11] = 0x01; -+ context->link_local_multi.addr8[12] = 0xff; -+ context->link_local_multi.addr8[13] |= -+ context->link_local_addr.addr8[13]; -+ context->link_local_multi.addr16[7] = -+ context->link_local_addr.addr16[7]; -+ -+ /* Default Prefix length is 64 */ -+ /* Add Link local address to the head of the ipv6 address -+ list */ -+ ipv6_add_prefix_entry(context, -+ &context->link_local_addr, 64); -+ } -+} -+ -+int ipv6_get_source_ip_addrs(struct ipv6_context *context, -+ struct ipv6_addr_entry *addr_list) -+{ -+ struct ipv6_prefix_entry *ipv6_prefix; -+ int i; -+ -+ for (i = 0, ipv6_prefix = context->addr_list; ipv6_prefix != NULL; -+ ipv6_prefix = ipv6_prefix->next) { -+ memcpy((char *)&addr_list->ip_addr, -+ (char *)&ipv6_prefix->ip_addr, -+ sizeof(struct ipv6_addr)); -+ addr_list->prefix_len = ipv6_prefix->prefix_len * 8; -+ -+ i++; -+ addr_list++; -+ } -+ -+ return i; -+} -+ -+int ipv6_get_default_router_ip_addrs(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr) -+{ -+ /* This is a default router. */ -+ memcpy((char *)ip_addr, -+ (char *)&context->default_router, -+ sizeof(struct ipv6_addr)); -+ -+ return 1; -+} -+ -+static void ipv6_udp_rx(struct ipv6_context *context) -+{ -+ struct eth_hdr *eth = -+ (struct eth_hdr *)context->ustack->data_link_layer; -+ struct ipv6_hdr *ipv6 = -+ (struct ipv6_hdr *)context->ustack->network_layer; -+ struct udp_hdr *udp = (struct udp_hdr *)((u8_t *)ipv6 + -+ sizeof(struct ipv6_hdr)); -+ struct dhcpv6_context *dhcpv6c; -+ -+ /* -+ * We only care about DHCPv6 packets from the DHCPv6 server. We drop -+ * all others. -+ */ -+ if (!(context->flags & IPV6_FLAGS_DISABLE_DHCPV6)) { -+ if ((udp->src_port == HOST_TO_NET16(DHCPV6_SERVER_PORT)) && -+ (udp->dest_port == HOST_TO_NET16(DHCPV6_CLIENT_PORT))) { -+ dhcpv6c = context->dhcpv6_context; -+ dhcpv6c->eth = eth; -+ dhcpv6c->ipv6 = ipv6; -+ dhcpv6c->udp = udp; -+ ipv6_udp_handle_dhcp(dhcpv6c); -+ } -+ } -+} -+ -+struct mac_address *ipv6_get_link_addr(struct ipv6_context *context) -+{ -+ return &context->mac_addr; -+} -+ -+u16_t ipv6_do_stateful_dhcpv6(struct ipv6_context *context, u32_t flags) -+{ -+ u16_t task = 0; -+ u16_t ra_flags; -+ -+ ra_flags = context->flags & -+ (IPV6_FLAGS_MANAGED_ADDR_CONFIG | IPV6_FLAGS_OTHER_STATEFUL_CONFIG); -+ -+ if (!(context->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED)) { -+ LOG_DEBUG("IPv6: There is no IPv6 router on the network"); -+ ra_flags |= -+ (IPV6_FLAGS_MANAGED_ADDR_CONFIG | -+ IPV6_FLAGS_OTHER_STATEFUL_CONFIG); -+ } -+ -+ if ((flags & ISCSI_FLAGS_DHCP_TCPIP_CONFIG) && -+ (ra_flags & IPV6_FLAGS_MANAGED_ADDR_CONFIG)) -+ task |= DHCPV6_TASK_GET_IP_ADDRESS; -+ -+ if ((flags & ISCSI_FLAGS_DHCP_ISCSI_CONFIG) && -+ (ra_flags & IPV6_FLAGS_OTHER_STATEFUL_CONFIG)) -+ task |= DHCPV6_TASK_GET_OTHER_PARAMS; -+ -+ LOG_DEBUG("IPv6: Stateful flags = 0x%x, ra_flags = 0x%x, task = 0x%x", -+ flags, ra_flags, task); -+ -+ return task; -+} -+ -+void ipv6_add_solit_node_address(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr) -+{ -+ struct mac_address mac_addr; -+ -+ /* -+ * Add Solicited Node Multicast Address for statically configured IPv6 -+ * address. -+ */ -+ mac_addr.addr[0] = 0x33; -+ mac_addr.addr[1] = 0x33; -+ mac_addr.addr[2] = 0xff; -+ mac_addr.addr[3] = ip_addr->addr8[13]; -+ mac_addr.addr[4] = ip_addr->addr8[14]; -+ mac_addr.addr[5] = ip_addr->addr8[15]; -+ iscsiL2AddMcAddr(context, (struct mac_address *)&mac_addr); -+} -+ -+void ipv6_cfg_link_local_addr(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr) -+{ -+ memcpy((char *)&context->link_local_addr, -+ (char *)ip_addr, sizeof(struct ipv6_addr)); -+} -+ -+void ipv6_disable_dhcpv6(struct ipv6_context *context) -+{ -+ context->flags |= IPV6_FLAGS_DISABLE_DHCPV6; -+} -diff --git a/iscsiuio/src/uip/ipv6.h b/iscsiuio/src/uip/ipv6.h -new file mode 100644 -index 0000000..91bfaa6 ---- /dev/null -+++ b/iscsiuio/src/uip/ipv6.h -@@ -0,0 +1,346 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai (eddie.wai@broadcom.com) -+ * Based on Kevin Tran's iSCSI boot code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * ipv6.h - This file contains macro definitions pertaining to IPv6. -+ * -+ * RFC 2460 : IPv6 Specification. -+ * RFC 2373 : IPv6 Addressing Architecture. -+ * RFC 2462 : IPv6 Stateless Address Autoconfiguration. -+ * RFC 2464 : Transmission of IPv6 Packets over Ethernet Networks. -+ * -+ */ -+#ifndef __IPV6_H__ -+#define __IPV6_H__ -+ -+#include "ipv6_ndpc.h" -+ -+#define FALSE 0 -+#define TRUE 1 -+ -+#define LINK_LOCAL_PREFIX_LENGTH 2 -+#define LAYER2_HEADER_LENGTH 14 -+#define LAYER2_VLAN_HEADER_LENGTH 16 -+#define LAYER2_TYPE_IPV6 0x86dd -+ -+struct ipv6_addr { -+ union { -+ u8_t addr8[16]; -+ u16_t addr16[8]; -+ u32_t addr[4]; -+ }; -+}; -+ -+struct udp_hdr { -+ u16_t src_port; -+ u16_t dest_port; -+ u16_t length; -+ u16_t chksum; -+}; -+ -+struct mac_address { -+ u8_t addr[6]; -+}; -+ -+#define HOST_TO_NET16(a) htons(a) -+#define HOST_TO_NET32(a) htonl(a) -+#define NET_TO_HOST16(a) ntohs(a) -+/* -+ * Local definition for masks -+ */ -+#define IPV6_MASK0 { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } -+#define IPV6_MASK32 { { { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } } -+#define IPV6_MASK64 { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } } -+#define IPV6_MASK96 { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ -+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } } } -+#define IPV6_MASK128 { { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } } } -+ -+#ifdef BIG_ENDIAN -+#define IPV6_ADDR_INT32_ONE 1 -+#define IPV6_ADDR_INT32_TWO 2 -+#define IPV6_ADDR_INT32_MNL 0xff010000 -+#define IPV6_ADDR_INT32_MLL 0xff020000 -+#define IPV6_ADDR_INT32_SMP 0x0000ffff -+#define IPV6_ADDR_INT16_ULL 0xfe80 -+#define IPV6_ADDR_INT16_USL 0xfec0 -+#define IPV6_ADDR_INT16_MLL 0xff02 -+#else /* LITTE ENDIAN */ -+#define IPV6_ADDR_INT32_ONE 0x01000000 -+#define IPV6_ADDR_INT32_TWO 0x02000000 -+#define IPV6_ADDR_INT32_MNL 0x000001ff -+#define IPV6_ADDR_INT32_MLL 0x000002ff -+#define IPV6_ADDR_INT32_SMP 0xffff0000 -+#define IPV6_ADDR_INT16_ULL 0x80fe -+#define IPV6_ADDR_INT16_USL 0xc0fe -+#define IPV6_ADDR_INT16_MLL 0x02ff -+#endif -+ -+/* -+ * Definition of some useful macros to handle IP6 addresses -+ */ -+#define IPV6_ADDR_ANY_INIT \ -+ { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } } -+#define IPV6_ADDR_LOOPBACK_INIT \ -+ { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } -+#define IPV6_ADDR_NODELOCAL_ALLNODES_INIT \ -+ { { { 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } -+#define IPV6_ADDR_INTFACELOCAL_ALLNODES_INIT \ -+ { { { 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } -+#define IPV6_ADDR_LINKLOCAL_ALLNODES_INIT \ -+ { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } } } -+#define IPV6_ADDR_LINKLOCAL_ALLROUTERS_INIT \ -+ { { { 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } } } -+ -+#define IPV6_ARE_ADDR_EQUAL(a, b) \ -+ (memcmp((char *)a, (char *)b, sizeof(struct ipv6_addr)) == 0) -+ -+/* Unspecified IPv6 address */ -+#define IPV6_IS_ADDR_UNSPECIFIED(a) \ -+ ((*(u32_t *)(&(a)->addr8[0]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[4]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[8]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[12]) == 0)) -+ -+/* Loopback IPv6 address */ -+#define IPV6_IS_ADDR_LOOPBACK(a) \ -+ ((*(u32_t *)(&(a)->addr8[0]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[4]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[8]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[12]) == 0x1)) -+ -+/* IPv4 compatible */ -+#define IPV6_IS_ADDR_IPV4_COMPAT(a) \ -+ ((*(u32_t *)(&(a)->addr8[0]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[4]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[8]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[12]) != 0) && \ -+ (*(u32_t *)(&(a)->addr8[12]) != 0x1)) -+ -+/* Mapped IPv4-IPv6 address */ -+#define IPV6_IS_ADDR_IPV4_MAPPED(a) \ -+ ((*(u32_t *)(&(a)->addr8[0]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[4]) == 0) && \ -+ (*(u32_t *)(&(a)->addr8[8]) == ntohl(0x0000ffff))) -+ -+/* IPv6 Scope Values */ -+#define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 /* Node-local scope */ -+#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 /* Link-local scope */ -+#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 /* Site-local scope */ -+#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* Organization-local scope */ -+#define IPV6_ADDR_SCOPE_GLOBAL 0x0e /* Global scope */ -+ -+/* Link-local Unicast : 10-bits much be 1111111010b --> 0xfe80. */ -+#define IPV6_IS_ADDR_LINKLOCAL(a) \ -+ (((a)->addr8[0] == 0xfe) && (((a)->addr8[1] & 0xc0) == 0x80)) -+ -+/* Site-local Unicast : 10-bits much be 1111111011b --> 0xfec0. */ -+#define IPV6_IS_ADDR_SITELOCAL(a) \ -+ (((a)->addr8[0] == 0xfe) && (((a)->addr8[1] & 0xc0) == 0xc0)) -+ -+/* Multicast : 10bits much be 11111111b. Next 4 bits is flags | 4-bit scope */ -+#define IPV6_IS_ADDR_MULTICAST(a) ((a)->addr8[0] == 0xff) -+ -+#define IPV6_ADDR_MC_SCOPE(a) ((a)->addr8[1] & 0x0f) -+ -+/* Multicast Scope */ -+ -+struct eth_hdr { -+ struct mac_address dest_mac; -+ struct mac_address src_mac; -+ u16_t len_type; -+}; -+ -+struct ipv6_hdr { -+ union { -+ struct { -+ u32_t ipv6_flow; /* Version (4-bit) | -+ Traffic Class (8-bit) | -+ Flow ID (20-bit) */ -+ u16_t ipv6_plen; /* Payload length */ -+ u8_t ipv6_nxt_hdr; /* Next Header */ -+ u8_t ipv6_hop_limit; /* hop limit */ -+ } ipv6_dw1; -+ -+ u8_t ipv6_version_fc; /* 4 bits version, top 4 bits class */ -+ } ipv6_ctrl; -+ -+ struct ipv6_addr ipv6_src; /* Source address */ -+ struct ipv6_addr ipv6_dst; /* Destination address */ -+}; -+ -+#define ipv6_version_fc ipv6_ctrl.ipv6_version_fc -+#define ipv6_flow ipv6_ctrl.ipv6_dw1.ipv6_flow -+#define ipv6_plen ipv6_ctrl.ipv6_dw1.ipv6_plen -+#define ipv6_nxt_hdr ipv6_ctrl.ipv6_dw1.ipv6_nxt_hdr -+#define ipv6_hop_limit ipv6_ctrl.ipv6_dw1.ipv6_hop_limit -+ -+#define IPV6_VERSION 0x60 -+#define IPV6_VERSION_MASK 0xf0 -+#define IPV6_HOP_LIMIT 64 -+ -+/* Length of the IP header with no next header */ -+#define IPV6_HEADER_LEN sizeof(struct ipv6_hdr) -+ -+#ifdef BIG_ENDIAN -+#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ -+#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ -+#else /* LITTLE_ENDIAN */ -+#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ -+#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ -+#endif -+ -+struct packet_ipv6 { -+ struct mac_address dest_mac; -+ struct mac_address src_mac; -+ u16_t len_type; -+ struct ipv6_hdr ipv6; -+ union { -+ struct udp_hdr udp; -+ } layer4_prot; -+}; -+ -+struct packet_ipv6_vlan { -+ struct mac_address dest_mac; -+ struct mac_address src_mac; -+ u16_t len_type; -+ u16_t vlan_id; -+ struct ipv6_hdr ipv6; -+ union { -+ struct udp_hdr udp; -+ } layer4_prot; -+}; -+ -+struct ipv6_arp_entry { -+ struct ipv6_addr ip_addr; -+ struct mac_address mac_addr; -+ u8_t time; -+}; -+ -+#define IPV6_NUM_OF_ADDRESS_ENTRY 4 -+ -+struct ipv6_prefix_entry { -+ struct ipv6_prefix_entry *next; -+ struct ipv6_addr ip_addr; -+ u8_t prefix_len; -+}; -+ -+struct ipv6_addr_entry { -+ struct ipv6_addr ip_addr; -+ u8_t prefix_len; -+}; -+ -+struct ipv6_context { -+ u16_t flags; -+#define IPV6_FLAGS_MANAGED_ADDR_CONFIG (1 << 0) -+#define IPV6_FLAGS_OTHER_STATEFUL_CONFIG (1 << 1) -+#define IPV6_FLAGS_ROUTER_ADV_RECEIVED (1 << 2) -+#define IPV6_FLAGS_DISABLE_DHCPV6 (1 << 3) -+ -+ struct mac_address mac_addr; -+ struct ipv6_addr link_local_addr; -+ struct ipv6_addr link_local_multi; -+ struct ipv6_addr multi; /* For Static IPv6 only */ -+ struct ipv6_addr multi_dest; /* For Static IPv6 only */ -+ struct ipv6_addr default_router; -+ struct ipv6_prefix_entry *addr_list; -+ u8_t hop_limit; -+#define UIP_ARPTAB_SIZE 8 -+ -+ struct uip_stack *ustack; -+#define MAX_MCADDR_TABLE 5 -+ struct mac_address mc_addr[MAX_MCADDR_TABLE]; -+ u8_t arptime; -+ struct ipv6_arp_entry ipv6_arp_table[UIP_ARPTAB_SIZE]; -+ struct ipv6_prefix_entry ipv6_prefix_table[IPV6_NUM_OF_ADDRESS_ENTRY]; -+ -+ /* VLAN support */ -+ -+ void *dhcpv6_context; -+}; -+ -+#define ISCSI_FLAGS_DHCP_TCPIP_CONFIG (1<<0) -+#define ISCSI_FLAGS_DHCP_ISCSI_CONFIG (1<<1) -+ -+#define IPV6_MAX_ROUTER_SOL_DELAY 4 -+#define IPV6_MAX_ROUTER_SOL_RETRY 3 -+ -+#define DHCPV6_CLIENT_PORT 546 -+#define DHCPV6_SERVER_PORT 547 -+ -+/* Function prototype */ -+void ipv6_init(struct ndpc_state *ndp, int cfg); -+int ipv6_autoconfig(struct ipv6_context *context); -+int ipv6_discover_address(struct ipv6_context *context); -+struct ipv6_addr *ipv6_our_address(struct ipv6_context *context); -+int ipv6_ip_in_arp_table(struct ipv6_context *context, -+ struct ipv6_addr *ipv6_addr, -+ struct mac_address *mac_addr); -+void ipv6_arp_timer(struct ipv6_context *context); -+void ipv6_arp_out(struct ipv6_context *context, int *uip_len); -+int ipv6_add_prefix_entry(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr, u8_t prefix_len); -+void ipv6_set_ip_params(struct ipv6_context *context, -+ struct ipv6_addr *src_ip, u8_t prefix_len, -+ struct ipv6_addr *default_gateway, -+ struct ipv6_addr *linklocal); -+void ipv6_set_host_addr(struct ipv6_context *context, struct ipv6_addr *src_ip); -+int ipv6_get_default_router_ip_addrs(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr); -+struct mac_address *ipv6_get_link_addr(struct ipv6_context *context); -+u16_t ipv6_do_stateful_dhcpv6(struct ipv6_context *context, u32_t flags); -+void ipv6_add_solit_node_address(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr); -+int ipv6_get_source_ip_addrs(struct ipv6_context *context, -+ struct ipv6_addr_entry *addr_list); -+void ipv6_cfg_link_local_addr(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr); -+void ipv6_disable_dhcpv6(struct ipv6_context *context); -+int ipv6_send_nd_solicited_packet(struct ipv6_context *context, -+ struct eth_hdr *eth, struct ipv6_hdr *ipv6); -+int ipv6_is_it_our_link_local_address(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr); -+void ipv6_mc_init_dest_mac(struct eth_hdr *eth, struct ipv6_hdr *ipv6); -+struct ipv6_addr *ipv6_find_longest_match(struct ipv6_context *context, -+ struct ipv6_addr *ip_addr); -+ -+#endif /* __IPV6_H__ */ -diff --git a/iscsiuio/src/uip/ipv6_ndpc.c b/iscsiuio/src/uip/ipv6_ndpc.c -new file mode 100644 -index 0000000..6f965f4 ---- /dev/null -+++ b/iscsiuio/src/uip/ipv6_ndpc.c -@@ -0,0 +1,426 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai (eddie.wai@broadcom.com) -+ * Based on the Swedish Institute of Computer Science's -+ * dhcpc.c code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * ipv6_ndpc.c - Top level IPv6 Network Discovery Protocol Engine (RFC4861) -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "uip.h" -+#include "ipv6_ndpc.h" -+#include "timer.h" -+#include "pt.h" -+ -+#include "debug.h" -+#include "logger.h" -+#include "nic.h" -+#include "nic_utils.h" -+#include "ipv6.h" -+#include "ipv6_pkt.h" -+#include "dhcpv6.h" -+ -+const int dhcpv6_retry_timeout[DHCPV6_NUM_OF_RETRY] = { 1, 2, 4, 8 }; -+ -+static PT_THREAD(handle_ndp(struct uip_stack *ustack, int force)) -+{ -+ struct ndpc_state *s; -+ struct ipv6_context *ipv6c; -+ struct dhcpv6_context *dhcpv6c = NULL; -+ u16_t task = 0; -+ char buf[INET6_ADDRSTRLEN]; -+ -+ s = ustack->ndpc; -+ if (s == NULL) { -+ LOG_DEBUG("NDP: Could not find ndpc state"); -+ return PT_ENDED; -+ } -+ -+ ipv6c = s->ipv6_context; -+ if (!ipv6c) -+ goto ndpc_state_null; -+ -+ dhcpv6c = s->dhcpv6_context; -+ -+ PT_BEGIN(&s->pt); -+ -+ if (s->state == NDPC_STATE_BACKGROUND_LOOP) -+ goto ipv6_loop; -+ -+ if (s->state == NDPC_STATE_RTR_ADV) -+ goto rtr_adv; -+ -+ /* For AUTOCFG == DHCPv6, do all -+ For == ND, skip DHCP only and do RTR -+ For == UNUSED/UNSPEC, do all as according to DHCP or not */ -+ s->state = NDPC_STATE_RTR_SOL; -+ /* try_again: */ -+ s->ticks = CLOCK_SECOND * IPV6_MAX_ROUTER_SOL_DELAY; -+ s->retry_count = 0; -+ do { -+ /* Perform router solicitation and wait for -+ router advertisement */ -+ LOG_DEBUG("%s: ndpc_handle send rtr sol", s->nic->log_name); -+ ipv6_autoconfig(s->ipv6_context); -+ -+ timer_set(&s->timer, s->ticks); -+wait_rtr: -+ s->ustack->uip_flags &= ~UIP_NEWDATA; -+ LOG_DEBUG("%s: ndpc_handle wait for rtr adv flags=0x%x", -+ s->nic->log_name, ipv6c->flags); -+ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) -+ || timer_expired(&s->timer) || force); -+ -+ if (uip_newdata(s->ustack)) { -+ /* Validate incoming packets -+ Note that the uip_len is init from nic loop */ -+ ipv6_rx_packet(ipv6c, (u16_t) uip_datalen(s->ustack)); -+ if (ipv6c->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED) { -+ LOG_INFO("%s: ROUTER_ADV_RECEIVED", -+ s->nic->log_name); -+ /* Success */ -+ break; -+ } else if (!timer_expired(&s->timer)) { -+ /* Yes new data, but not what we want, -+ check for timer expiration before bumping -+ tick */ -+ goto wait_rtr; -+ } -+ } -+ s->retry_count++; -+ if (s->retry_count >= IPV6_MAX_ROUTER_SOL_RETRY) -+ /* Max router solicitation retry reached. Move to -+ IPv6 loop (no DHCPv6) */ -+ goto no_rtr_adv; -+ -+ } while (!(ipv6c->flags & IPV6_FLAGS_ROUTER_ADV_RECEIVED)); -+ -+ LOG_DEBUG("%s: ndpc_handle got rtr adv", s->nic->log_name); -+ -+no_rtr_adv: -+ s->state = NDPC_STATE_RTR_ADV; -+ -+rtr_adv: -+ if (!(ustack->ip_config & IPV6_CONFIG_DHCP)) -+ goto staticv6; -+ -+ /* Only DHCPv6 comes here */ -+ task = ipv6_do_stateful_dhcpv6(ipv6c, ISCSI_FLAGS_DHCP_TCPIP_CONFIG); -+ if (task) { -+ /* Run the DHCPv6 engine */ -+ -+ if (!dhcpv6c) -+ goto ipv6_loop; -+ -+ dhcpv6c->dhcpv6_task = task; -+ s->retry_count = 0; -+ s->state = NDPC_STATE_DHCPV6_DIS; -+ do { -+ /* Do dhcpv6 */ -+ dhcpv6c->timeout = dhcpv6_retry_timeout[s->retry_count]; -+ s->ticks = CLOCK_SECOND * dhcpv6c->timeout; -+ LOG_DEBUG("%s: ndpc_handle send dhcpv6 sol retry " -+ "cnt=%d", s->nic->log_name, s->retry_count); -+ dhcpv6_do_discovery(dhcpv6c); -+ -+ timer_set(&s->timer, s->ticks); -+wait_dhcp: -+ s->ustack->uip_flags &= ~UIP_NEWDATA; -+ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack) -+ || timer_expired(&s->timer) || force); -+ -+ if (uip_newdata(s->ustack)) { -+ /* Validate incoming packets -+ Note that the uip_len is init from nic -+ loop */ -+ ipv6_rx_packet(ipv6c, -+ (u16_t) uip_datalen(s->ustack)); -+ if (dhcpv6c->dhcpv6_done == TRUE) -+ break; -+ else if (!timer_expired(&s->timer)) { -+ /* Yes new data, but not what we want, -+ check for timer expiration before -+ bumping tick */ -+ goto wait_dhcp; -+ } -+ } -+ s->retry_count++; -+ if (s->retry_count < DHCPV6_NUM_OF_RETRY) { -+ dhcpv6c->seconds += dhcpv6c->timeout; -+ } else { -+ LOG_DEBUG("%s: ndpc_handle DHCP failed", -+ s->nic->log_name); -+ /* Allow to goto background loop */ -+ goto ipv6_loop; -+ } -+ } while (dhcpv6c->dhcpv6_done == FALSE); -+ s->state = NDPC_STATE_DHCPV6_DONE; -+ -+ LOG_DEBUG("%s: ndpc_handle got dhcpv6", s->nic->log_name); -+ -+ /* End of DHCPv6 engine */ -+ } else { -+ /* Static IPv6 */ -+ if (ustack->ip_config == IPV6_CONFIG_DHCP) { -+ LOG_DEBUG("%s: ndpc_handle DHCP failed", -+ s->nic->log_name); -+ PT_RESTART(&s->pt); -+ } -+staticv6: -+ ipv6_disable_dhcpv6(ipv6c); -+ } -+ /* Copy out the default_router_addr6 and ll */ -+ if (ustack->router_autocfg != IPV6_RTR_AUTOCFG_OFF) -+ memcpy(&ustack->default_route_addr6, -+ &ipv6c->default_router, sizeof(struct ipv6_addr)); -+ inet_ntop(AF_INET6, &ustack->default_route_addr6, -+ buf, sizeof(buf)); -+ LOG_INFO("%s: Default router IP: %s", s->nic->log_name, -+ buf); -+ -+ if (ustack->linklocal_autocfg != IPV6_LL_AUTOCFG_OFF) -+ memcpy(&ustack->linklocal6, &ipv6c->link_local_addr, -+ sizeof(struct ipv6_addr)); -+ inet_ntop(AF_INET6, &ustack->linklocal6, -+ buf, sizeof(buf)); -+ LOG_INFO("%s: Linklocal IP: %s", s->nic->log_name, -+ buf); -+ -+ipv6_loop: -+ s->state = NDPC_STATE_BACKGROUND_LOOP; -+ LOG_DEBUG("%s: Loop", s->nic->log_name); -+ /* Background IPv6 loop */ -+ while (1) { -+ /* Handle all neightbor solicitation/advertisement here */ -+ s->ustack->uip_flags &= ~UIP_NEWDATA; -+ PT_WAIT_UNTIL(&s->pt, uip_newdata(s->ustack)); -+ -+ /* Validate incoming packets */ -+ ipv6_rx_packet(ipv6c, (u16_t) uip_datalen(s->ustack)); -+ } -+ -+ndpc_state_null: -+ -+ while (1) -+ PT_YIELD(&s->pt); -+ -+ PT_END(&(s->pt)); -+} -+ -+/*---------------------------------------------------------------------------*/ -+int ndpc_init(nic_t *nic, struct uip_stack *ustack, -+ const void *mac_addr, int mac_len) -+{ -+ struct ipv6_context *ipv6c; -+ struct dhcpv6_context *dhcpv6c; -+ struct ndpc_state *s = ustack->ndpc; -+ struct ipv6_addr src, gw, ll; -+ char buf[INET6_ADDRSTRLEN]; -+ -+ if (s) { -+ LOG_DEBUG("NDP: NDP context already allocated"); -+ /* Already allocated, skip*/ -+ return -EALREADY; -+ } -+ s = malloc(sizeof(*s)); -+ if (s == NULL) { -+ LOG_ERR("%s: Couldn't allocate size for ndpc info", -+ nic->log_name); -+ goto error; -+ } -+ memset(s, 0, sizeof(*s)); -+ -+ if (s->ipv6_context) { -+ LOG_DEBUG("NDP: IPv6 context already allocated"); -+ ipv6c = s->ipv6_context; -+ goto init1; -+ } -+ ipv6c = malloc(sizeof(struct ipv6_context)); -+ if (ipv6c == NULL) { -+ LOG_ERR("%s: Couldn't allocate mem for IPv6 context info", -+ nic->log_name); -+ goto error1; -+ } -+init1: -+ if (s->dhcpv6_context) { -+ LOG_DEBUG("NDP: DHCPv6 context already allocated"); -+ dhcpv6c = s->dhcpv6_context; -+ goto init2; -+ } -+ dhcpv6c = malloc(sizeof(struct dhcpv6_context)); -+ if (dhcpv6c == NULL) { -+ LOG_ERR("%s: Couldn't allocate mem for DHCPv6 context info", -+ nic->log_name); -+ goto error2; -+ } -+init2: -+ memset(s, 0, sizeof(*s)); -+ memset(ipv6c, 0, sizeof(*ipv6c)); -+ memset(dhcpv6c, 0, sizeof(*dhcpv6c)); -+ -+ s->ipv6_context = ipv6c; -+ s->dhcpv6_context = dhcpv6c; -+ -+ s->nic = nic; -+ s->ustack = ustack; -+ s->mac_addr = (void *)mac_addr; -+ s->mac_len = mac_len; -+ s->state = NDPC_STATE_INIT; -+ -+ /* Init IPV6_CONTEXT */ -+ ipv6_init(s, ustack->ip_config); -+ -+ dhcpv6c->ipv6_context = ipv6c; -+ ipv6c->dhcpv6_context = dhcpv6c; -+ -+ /* Init DHCPV6_CONTEXT */ -+ dhcpv6_init(dhcpv6c); -+ -+ ustack->ndpc = s; -+ -+ PT_INIT(&s->pt); -+ -+ if (ustack->ip_config == IPV6_CONFIG_DHCP) { -+ /* DHCPv6 specific */ -+ memset(&src, 0, sizeof(src)); -+ } else { -+ /* Static v6 specific */ -+ memcpy(&src.addr8, &ustack->hostaddr6, -+ sizeof(struct ipv6_addr)); -+ ipv6_add_solit_node_address(ipv6c, &src); -+ -+ inet_ntop(AF_INET6, &src.addr8, buf, sizeof(buf)); -+ LOG_INFO("%s: Static hostaddr IP: %s", s->nic->log_name, -+ buf); -+ } -+ /* Copy out the default_router_addr6 and ll */ -+ if (ustack->router_autocfg == IPV6_RTR_AUTOCFG_OFF) -+ memcpy(&gw.addr8, &ustack->default_route_addr6, -+ sizeof(struct ipv6_addr)); -+ else -+ memset(&gw, 0, sizeof(gw)); -+ -+ if (ustack->linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) -+ memcpy(&ll.addr8, &ustack->linklocal6, -+ sizeof(struct ipv6_addr)); -+ else -+ memset(&ll, 0, sizeof(ll)); -+ ipv6_set_ip_params(ipv6c, &src, -+ ustack->prefix_len, &gw, &ll); -+ -+ return 0; -+error2: -+ free(ipv6c); -+ s->ipv6_context = NULL; -+error1: -+ free(s); -+ ustack->ndpc = NULL; -+error: -+ return -ENOMEM; -+} -+ -+/*---------------------------------------------------------------------------*/ -+void ndpc_call(struct uip_stack *ustack) -+{ -+ handle_ndp(ustack, 0); -+} -+ -+void ndpc_exit(struct ndpc_state *ndp) -+{ -+ LOG_DEBUG("NDP - Exit ndpc_state = %p", ndp); -+ if (!ndp) -+ return; -+ if (ndp->ipv6_context) -+ free(ndp->ipv6_context); -+ if (ndp->dhcpv6_context) -+ free(ndp->dhcpv6_context); -+ free(ndp); -+} -+ -+int ndpc_request(struct uip_stack *ustack, void *in, void *out, int request) -+{ -+ struct ndpc_state *s; -+ struct ipv6_context *ipv6c; -+ int ret = 0; -+ -+ if (!ustack) { -+ LOG_DEBUG("NDP: ustack == NULL"); -+ return -EINVAL; -+ } -+ s = ustack->ndpc; -+ if (s == NULL) { -+ LOG_DEBUG("NDP: Could not find ndpc state for request %d", -+ request); -+ return -EINVAL; -+ } -+ while (s->state != NDPC_STATE_BACKGROUND_LOOP) { -+ LOG_DEBUG("%s: ndpc state not in background loop, run handler " -+ "request = %d", s->nic->log_name, request); -+ handle_ndp(ustack, 1); -+ } -+ -+ ipv6c = s->ipv6_context; -+ switch (request) { -+ case NEIGHBOR_SOLICIT: -+ *(int *)out = ipv6_send_nd_solicited_packet(ipv6c, -+ (struct eth_hdr *)((struct ndpc_reqptr *)in)->eth, -+ (struct ipv6_hdr *)((struct ndpc_reqptr *)in)->ipv6); -+ break; -+ case CHECK_LINK_LOCAL_ADDR: -+ *(int *)out = ipv6_is_it_our_link_local_address(ipv6c, -+ (struct ipv6_addr *)in); -+ break; -+ case CHECK_ARP_TABLE: -+ *(int *)out = ipv6_ip_in_arp_table(ipv6c, -+ (struct ipv6_addr *)((struct ndpc_reqptr *)in)->ipv6, -+ (struct mac_address *)((struct ndpc_reqptr *)in)->eth); -+ break; -+ case GET_HOST_ADDR: -+ *(struct ipv6_addr **)out = ipv6_find_longest_match(ipv6c, -+ (struct ipv6_addr *)in); -+ break; -+ default: -+ ret = -EINVAL; -+ break; -+ } -+ return ret; -+} -+ -+/*---------------------------------------------------------------------------*/ -diff --git a/iscsiuio/src/uip/ipv6_ndpc.h b/iscsiuio/src/uip/ipv6_ndpc.h -new file mode 100644 -index 0000000..1eaced9 ---- /dev/null -+++ b/iscsiuio/src/uip/ipv6_ndpc.h -@@ -0,0 +1,97 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai (eddie.wai@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * ipv6_ndpc.h - Top level IPv6 Network Discovery Protocol Engine (RFC4861) -+ * -+ */ -+#ifndef __NDPC_H__ -+#define __NDPC_H__ -+ -+#include -+ -+#include "nic.h" -+#include "timer.h" -+#include "pt.h" -+ -+struct ndpc_reqptr { -+ void *eth; -+ void *ipv6; -+}; -+ -+struct ndpc_state { -+ struct pt pt; -+ -+ nic_t *nic; -+ struct uip_stack *ustack; -+ char state; -+ struct timer timer; -+ u16_t ticks; -+ void *mac_addr; -+ int mac_len; -+ int retry_count; -+ -+ time_t last_update; -+ -+ void *ipv6_context; -+ void *dhcpv6_context; -+}; -+ -+enum { -+ NDPC_STATE_INIT, -+ NDPC_STATE_RTR_SOL, -+ NDPC_STATE_RTR_ADV, -+ NDPC_STATE_DHCPV6_DIS, -+ NDPC_STATE_DHCPV6_DONE, -+ NDPC_STATE_BACKGROUND_LOOP -+}; -+ -+int ndpc_init(nic_t *nic, struct uip_stack *ustack, -+ const void *mac_addr, int mac_len); -+void ndpc_call(struct uip_stack *ustack); -+void ndpc_exit(struct ndpc_state *ndp); -+ -+enum { -+ NEIGHBOR_SOLICIT, -+ CHECK_LINK_LOCAL_ADDR, -+ GET_LINK_LOCAL_ADDR, -+ GET_DEFAULT_ROUTER_ADDR, -+ CHECK_ARP_TABLE, -+ GET_HOST_ADDR -+}; -+ -+int ndpc_request(struct uip_stack *ustack, void *in, void *out, int request); -+ -+#define UIP_NDP_CALL ndpc_call -+ -+#endif /* __NDPC_H__ */ -diff --git a/iscsiuio/src/uip/ipv6_pkt.h b/iscsiuio/src/uip/ipv6_pkt.h -new file mode 100644 -index 0000000..e0da018 ---- /dev/null -+++ b/iscsiuio/src/uip/ipv6_pkt.h -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (c) 2011, Broadcom Corporation -+ * -+ * Written by: Eddie Wai (eddie.wai@broadcom.com) -+ * Based on Kevin Tran's iSCSI boot code -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * ipv6_packet.h - IPv6 routine include file -+ * -+ */ -+#ifndef __IPV6_PKT_H__ -+#define __IPV6_PKT_H__ -+ -+u16_t ipv6_process_rx(struct ipv6_hdr *ipv6); -+void ipv6_rx_packet(struct ipv6_context *context, u16_t len); -+void ipv6_setup_hdrs(struct ipv6_context *context, struct eth_hdr *eth, -+ struct ipv6_hdr *ipv6, u16_t packet_len); -+int ipv6_send(struct ipv6_context *context, u16_t packet_len); -+void ipv6_send_udp_packet(struct ipv6_context *context, u16_t packet_len); -+ -+#endif /* __IPV6_PKT_H__ */ -diff --git a/iscsiuio/src/uip/lc-addrlabels.h b/iscsiuio/src/uip/lc-addrlabels.h -new file mode 100644 -index 0000000..c394b22 ---- /dev/null -+++ b/iscsiuio/src/uip/lc-addrlabels.h -@@ -0,0 +1,80 @@ -+/* -+ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+/** -+ * \addtogroup lc -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Implementation of local continuations based on the "Labels as -+ * values" feature of gcc -+ * \author -+ * Adam Dunkels -+ * -+ * This implementation of local continuations is based on a special -+ * feature of the GCC C compiler called "labels as values". This -+ * feature allows assigning pointers with the address of the code -+ * corresponding to a particular C label. -+ * -+ * For more information, see the GCC documentation: -+ * http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html -+ * -+ * Thanks to dividuum for finding the nice local scope label -+ * implementation. -+ */ -+ -+#ifndef __LC_ADDRLABELS_H__ -+#define __LC_ADDRLABELS_H__ -+ -+/** \hideinitializer */ -+ -+#define LC_INIT(s) (s = NULL) -+ -+#define LC_RESUME(s) \ -+ do { \ -+ if (s != NULL) { \ -+ goto *s; \ -+ } \ -+ } while (0) -+ -+#define LC_SET(s) \ -+ do { ({ __label__ resume; resume: (s) = &&resume; }); } while (0) -+ -+#define LC_END(s) -+ -+#endif /* __LC_ADDRLABELS_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/lc-switch.h b/iscsiuio/src/uip/lc-switch.h -new file mode 100644 -index 0000000..1839b36 ---- /dev/null -+++ b/iscsiuio/src/uip/lc-switch.h -@@ -0,0 +1,73 @@ -+/* -+ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+/** -+ * \addtogroup lc -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Implementation of local continuations based on switch() statment -+ * \author Adam Dunkels -+ * -+ * This implementation of local continuations uses the C switch() -+ * statement to resume execution of a function somewhere inside the -+ * function's body. The implementation is based on the fact that -+ * switch() statements are able to jump directly into the bodies of -+ * control structures such as if() or while() statmenets. -+ * -+ * This implementation borrows heavily from Simon Tatham's coroutines -+ * implementation in C: -+ * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html -+ */ -+ -+#ifndef __LC_SWITCH_H__ -+#define __LC_SWTICH_H__ -+ -+/* WARNING! lc implementation using switch() does not work if an -+ LC_SET() is done within another switch() statement! */ -+ -+/** \hideinitializer */ -+#define LC_INIT(s) s = 0; -+ -+#define LC_RESUME(s) switch (s) { case 0: -+ -+#define LC_SET(s) s = __LINE__; case __LINE__: -+ -+#define LC_END(s) } -+ -+#endif /* __LC_SWITCH_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/lc.h b/iscsiuio/src/uip/lc.h -new file mode 100644 -index 0000000..2e4a7bb ---- /dev/null -+++ b/iscsiuio/src/uip/lc.h -@@ -0,0 +1,130 @@ -+/* -+ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+/** -+ * \addtogroup pt -+ * @{ -+ */ -+ -+/** -+ * \defgroup lc Local continuations -+ * @{ -+ * -+ * Local continuations form the basis for implementing protothreads. A -+ * local continuation can be set in a specific function to -+ * capture the state of the function. After a local continuation has -+ * been set can be resumed in order to restore the state of the -+ * function at the point where the local continuation was set. -+ * -+ * -+ */ -+ -+/** -+ * \file lc.h -+ * Local continuations -+ * \author -+ * Adam Dunkels -+ * -+ */ -+ -+#ifdef DOXYGEN -+/** -+ * Initialize a local continuation. -+ * -+ * This operation initializes the local continuation, thereby -+ * unsetting any previously set continuation state. -+ * -+ * \hideinitializer -+ */ -+#define LC_INIT(lc) -+ -+/** -+ * Set a local continuation. -+ * -+ * The set operation saves the state of the function at the point -+ * where the operation is executed. As far as the set operation is -+ * concerned, the state of the function does not include the -+ * call-stack or local (automatic) variables, but only the program -+ * counter and such CPU registers that needs to be saved. -+ * -+ * \hideinitializer -+ */ -+#define LC_SET(lc) -+ -+/** -+ * Resume a local continuation. -+ * -+ * The resume operation resumes a previously set local continuation, thus -+ * restoring the state in which the function was when the local -+ * continuation was set. If the local continuation has not been -+ * previously set, the resume operation does nothing. -+ * -+ * \hideinitializer -+ */ -+#define LC_RESUME(lc) -+ -+/** -+ * Mark the end of local continuation usage. -+ * -+ * The end operation signifies that local continuations should not be -+ * used any more in the function. This operation is not needed for -+ * most implementations of local continuation, but is required by a -+ * few implementations. -+ * -+ * \hideinitializer -+ */ -+#define LC_END(lc) -+ -+/** -+ * \var typedef lc_t; -+ * -+ * The local continuation type. -+ * -+ * \hideinitializer -+ */ -+#endif /* DOXYGEN */ -+ -+#ifndef __LC_H__ -+#define __LC_H__ -+ -+#ifdef LC_CONF_INCLUDE -+#include LC_CONF_INCLUDE -+#else -+#include "lc-switch.h" -+#endif /* LC_CONF_INCLUDE */ -+ -+#endif /* __LC_H__ */ -+ -+/** @} */ -+/** @} */ -diff --git a/iscsiuio/src/uip/psock.c b/iscsiuio/src/uip/psock.c -new file mode 100644 -index 0000000..fcffbe7 ---- /dev/null -+++ b/iscsiuio/src/uip/psock.c -@@ -0,0 +1,339 @@ -+/* -+ * Copyright (c) 2004, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+#include -+#include -+ -+#include "uipopt.h" -+#include "psock.h" -+#include "uip.h" -+ -+#define STATE_NONE 0 -+#define STATE_ACKED 1 -+#define STATE_READ 2 -+#define STATE_BLOCKED_NEWDATA 3 -+#define STATE_BLOCKED_CLOSE 4 -+#define STATE_BLOCKED_SEND 5 -+#define STATE_DATA_SENT 6 -+ -+/* -+ * Return value of the buffering functions that indicates that a -+ * buffer was not filled by incoming data. -+ * -+ */ -+#define BUF_NOT_FULL 0 -+#define BUF_NOT_FOUND 0 -+ -+/* -+ * Return value of the buffering functions that indicates that a -+ * buffer was completely filled by incoming data. -+ * -+ */ -+#define BUF_FULL 1 -+ -+/* -+ * Return value of the buffering functions that indicates that an -+ * end-marker byte was found. -+ * -+ */ -+#define BUF_FOUND 2 -+ -+/*---------------------------------------------------------------------------*/ -+static void buf_setup(struct psock_buf *buf, u8_t *bufptr, u16_t bufsize) -+{ -+ buf->ptr = bufptr; -+ buf->left = bufsize; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t -+buf_bufdata(struct psock_buf *buf, u16_t len, u8_t **dataptr, u16_t *datalen) -+{ -+ if (*datalen < buf->left) { -+ memcpy(buf->ptr, *dataptr, *datalen); -+ buf->ptr += *datalen; -+ buf->left -= *datalen; -+ *dataptr += *datalen; -+ *datalen = 0; -+ return BUF_NOT_FULL; -+ } else if (*datalen == buf->left) { -+ memcpy(buf->ptr, *dataptr, *datalen); -+ buf->ptr += *datalen; -+ buf->left = 0; -+ *dataptr += *datalen; -+ *datalen = 0; -+ return BUF_FULL; -+ } else { -+ memcpy(buf->ptr, *dataptr, buf->left); -+ buf->ptr += buf->left; -+ *datalen -= buf->left; -+ *dataptr += buf->left; -+ buf->left = 0; -+ return BUF_FULL; -+ } -+} -+ -+/*---------------------------------------------------------------------------*/ -+static u8_t -+buf_bufto(register struct psock_buf *buf, u8_t endmarker, -+ register u8_t **dataptr, register u16_t *datalen) -+{ -+ u8_t c; -+ while (buf->left > 0 && *datalen > 0) { -+ c = *buf->ptr = **dataptr; -+ ++*dataptr; -+ ++buf->ptr; -+ --*datalen; -+ --buf->left; -+ -+ if (c == endmarker) -+ return BUF_FOUND; -+ } -+ -+ if (*datalen == 0) -+ return BUF_NOT_FOUND; -+ -+ while (*datalen > 0) { -+ c = **dataptr; -+ --*datalen; -+ ++*dataptr; -+ -+ if (c == endmarker) -+ return BUF_FOUND | BUF_FULL; -+ } -+ -+ return BUF_FULL; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static char send_data(register struct psock *s) -+{ -+ if (s->state != STATE_DATA_SENT || uip_rexmit(s->ustack)) { -+ if (s->sendlen > uip_mss(s->ustack)) -+ uip_appsend(s->ustack, s->sendptr, uip_mss(s->ustack)); -+ else -+ uip_appsend(s->ustack, s->sendptr, s->sendlen); -+ s->state = STATE_DATA_SENT; -+ return 1; -+ } -+ return 0; -+} -+ -+/*---------------------------------------------------------------------------*/ -+static char data_acked(struct psock *s) -+{ -+ if (s->state == STATE_DATA_SENT && uip_acked(s->ustack)) { -+ if (s->sendlen > uip_mss(s->ustack)) { -+ s->sendlen -= uip_mss(s->ustack); -+ s->sendptr += uip_mss(s->ustack); -+ } else { -+ s->sendptr += s->sendlen; -+ s->sendlen = 0; -+ } -+ s->state = STATE_ACKED; -+ return 1; -+ } -+ return 0; -+} -+ -+/*---------------------------------------------------------------------------*/ -+PT_THREAD(psock_send(struct uip_stack *ustack, -+ register struct psock *s, const u8_t *buf, -+ unsigned int len)) -+{ -+ PT_BEGIN(&s->psockpt); -+ -+ /* If there is no data to send, we exit immediately. */ -+ if (len == 0) { -+ PT_EXIT(&s->psockpt); -+ } -+ -+ /* Save the length of and a pointer to the data that is to be -+ sent. */ -+ s->sendptr = buf; -+ s->sendlen = len; -+ -+ s->state = STATE_NONE; -+ -+ /* We loop here until all data is sent. The s->sendlen variable is -+ updated by the data_sent() function. */ -+ while (s->sendlen > 0) { -+ -+ /* -+ * The condition for this PT_WAIT_UNTIL is a little tricky: the -+ * protothread will wait here until all data has been acked -+ * (data_acked() returns true) and until all data has been sent -+ * (send_data() returns true). The two functions data_acked() -+ * and send_data() must be called in succession to ensure that -+ * all data is sent. Therefore the & operator is used instead of -+ * the && operator, which would cause only the data_acked() -+ * function to be called when it returns false. -+ */ -+ PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); -+ } -+ -+ s->state = STATE_NONE; -+ -+ PT_END(&s->psockpt); -+} -+ -+/*---------------------------------------------------------------------------*/ -+PT_THREAD(psock_generator_send(register struct psock *s, -+ unsigned short (*generate) (void *), void *arg)) -+{ -+ PT_BEGIN(&s->psockpt); -+ -+ /* Ensure that there is a generator function to call. */ -+ if (generate == NULL) { -+ PT_EXIT(&s->psockpt); -+ } -+ -+ /* Call the generator function to generate the data in the -+ uip_appdata buffer. */ -+ s->sendlen = generate(arg); -+ s->sendptr = s->ustack->uip_appdata; -+ -+ s->state = STATE_NONE; -+ do { -+ /* Call the generator function again if we are called to perform -+ a retransmission. */ -+ if (uip_rexmit(s->ustack)) -+ generate(arg); -+ /* Wait until all data is sent and acknowledged. */ -+ PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); -+ } while (s->sendlen > 0); -+ -+ s->state = STATE_NONE; -+ -+ PT_END(&s->psockpt); -+} -+ -+/*---------------------------------------------------------------------------*/ -+u16_t psock_datalen(struct psock *psock) -+{ -+ return psock->bufsize - psock->buf.left; -+} -+ -+/*---------------------------------------------------------------------------*/ -+char psock_newdata(struct psock *s) -+{ -+ if (s->readlen > 0) { -+ /* There is data in the uip_appdata buffer that has not yet been -+ read with the PSOCK_READ functions. */ -+ return 1; -+ } else if (s->state == STATE_READ) { -+ /* All data in uip_appdata buffer already consumed. */ -+ s->state = STATE_BLOCKED_NEWDATA; -+ return 0; -+ } else if (uip_newdata(s->ustack)) { -+ /* There is new data that has not been consumed. */ -+ return 1; -+ } else { -+ /* There is no new data. */ -+ return 0; -+ } -+} -+ -+/*---------------------------------------------------------------------------*/ -+PT_THREAD(psock_readto(register struct psock *psock, u8_t c)) -+{ -+ PT_BEGIN(&psock->psockpt); -+ -+ buf_setup(&psock->buf, psock->bufptr, psock->bufsize); -+ -+ /* XXX: Should add buf_checkmarker() before do{} loop, if -+ incoming data has been handled while waiting for a write. */ -+ -+ do { -+ if (psock->readlen == 0) { -+ PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); -+ psock->state = STATE_READ; -+ psock->readptr = (u8_t *) psock->ustack->uip_appdata; -+ psock->readlen = uip_datalen(psock->ustack); -+ } -+ } while ((buf_bufto(&psock->buf, c, -+ &psock->readptr, -+ &psock->readlen) & BUF_FOUND) == 0); -+ -+ if (psock_datalen(psock) == 0) { -+ psock->state = STATE_NONE; -+ PT_RESTART(&psock->psockpt); -+ } -+ PT_END(&psock->psockpt); -+} -+ -+/*---------------------------------------------------------------------------*/ -+PT_THREAD(psock_readbuf(register struct psock *psock)) -+{ -+ PT_BEGIN(&psock->psockpt); -+ -+ buf_setup(&psock->buf, psock->bufptr, psock->bufsize); -+ -+ /* XXX: Should add buf_checkmarker() before do{} loop, if -+ incoming data has been handled while waiting for a write. */ -+ -+ do { -+ if (psock->readlen == 0) { -+ PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); -+ printf("Waited for newdata\n"); -+ psock->state = STATE_READ; -+ psock->readptr = (u8_t *) psock->ustack->uip_appdata; -+ psock->readlen = uip_datalen(psock->ustack); -+ } -+ } while (buf_bufdata(&psock->buf, psock->bufsize, -+ &psock->readptr, &psock->readlen) != BUF_FULL); -+ -+ if (psock_datalen(psock) == 0) { -+ psock->state = STATE_NONE; -+ PT_RESTART(&psock->psockpt); -+ } -+ PT_END(&psock->psockpt); -+} -+ -+/*---------------------------------------------------------------------------*/ -+void -+psock_init(struct uip_stack *ustack, -+ register struct psock *psock, u8_t *buffer, unsigned int buffersize) -+{ -+ psock->state = STATE_NONE; -+ psock->readlen = 0; -+ psock->bufptr = buffer; -+ psock->bufsize = buffersize; -+ psock->ustack = ustack; -+ buf_setup(&psock->buf, buffer, buffersize); -+ PT_INIT(&psock->pt); -+ PT_INIT(&psock->psockpt); -+} -+ -+/*---------------------------------------------------------------------------*/ -diff --git a/iscsiuio/src/uip/psock.h b/iscsiuio/src/uip/psock.h -new file mode 100644 -index 0000000..ea86ef5 ---- /dev/null -+++ b/iscsiuio/src/uip/psock.h -@@ -0,0 +1,383 @@ -+/* -+ * Copyright (c) 2004, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+/** -+ * \defgroup psock Protosockets library -+ * @{ -+ * -+ * The protosocket library provides an interface to the uIP stack that is -+ * similar to the traditional BSD socket interface. Unlike programs -+ * written for the ordinary uIP event-driven interface, programs -+ * written with the protosocket library are executed in a sequential -+ * fashion and does not have to be implemented as explicit state -+ * machines. -+ * -+ * Protosockets only work with TCP connections. -+ * -+ * The protosocket library uses \ref pt protothreads to provide -+ * sequential control flow. This makes the protosockets lightweight in -+ * terms of memory, but also means that protosockets inherits the -+ * functional limitations of protothreads. Each protosocket lives only -+ * within a single function. Automatic variables (stack variables) are -+ * not retained across a protosocket library function call. -+ * -+ * \note Because the protosocket library uses protothreads, local -+ * variables will not always be saved across a call to a protosocket -+ * library function. It is therefore advised that local variables are -+ * used with extreme care. -+ * -+ * The protosocket library provides functions for sending data without -+ * having to deal with retransmissions and acknowledgements, as well -+ * as functions for reading data without having to deal with data -+ * being split across more than one TCP segment. -+ * -+ * Because each protosocket runs as a protothread, the protosocket has to be -+ * started with a call to PSOCK_BEGIN() at the start of the function -+ * in which the protosocket is used. Similarly, the protosocket protothread can -+ * be terminated by a call to PSOCK_EXIT(). -+ * -+ */ -+ -+/** -+ * \file -+ * Protosocket library header file -+ * \author -+ * Adam Dunkels -+ * -+ */ -+ -+#ifndef __PSOCK_H__ -+#define __PSOCK_H__ -+ -+#include "uip.h" -+#include "uipopt.h" -+#include "pt.h" -+ -+ /* -+ * The structure that holds the state of a buffer. -+ * -+ * This structure holds the state of a uIP buffer. The structure has -+ * no user-visible elements, but is used through the functions -+ * provided by the library. -+ * -+ */ -+struct psock_buf { -+ u8_t *ptr; -+ unsigned short left; -+}; -+ -+/** -+ * The representation of a protosocket. -+ * -+ * The protosocket structrure is an opaque structure with no user-visible -+ * elements. -+ */ -+struct psock { -+ struct pt pt, psockpt; /* Protothreads - one that's using the psock -+ functions, and one that runs inside the -+ psock functions. */ -+ const u8_t *sendptr; /* Pointer to the next data to be sent. */ -+ u8_t *readptr; /* Pointer to the next data to be read. */ -+ -+ u8_t *bufptr; /* Pointer to the buffer used for buffering -+ incoming data. */ -+ -+ u16_t sendlen; /* The number of bytes left to be sent. */ -+ u16_t readlen; /* The number of bytes left to be read. */ -+ -+ struct psock_buf buf; /* The structure holding the state of the -+ input buffer. */ -+ unsigned int bufsize; /* The size of the input buffer. */ -+ -+ unsigned char state; /* The state of the protosocket. */ -+ -+ struct uip_stack *ustack; -+}; -+ -+void psock_init(struct uip_stack *ustack, -+ struct psock *psock, u8_t *buffer, unsigned int buffersize); -+/** -+ * Initialize a protosocket. -+ * -+ * This macro initializes a protosocket and must be called before the -+ * protosocket is used. The initialization also specifies the input buffer -+ * for the protosocket. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket to be -+ * initialized -+ * -+ * \param buffer (char *) A pointer to the input buffer for the -+ * protosocket. -+ * -+ * \param buffersize (unsigned int) The size of the input buffer. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_INIT(psock, buffer, buffersize) \ -+ psock_init(psock, buffer, buffersize) -+ -+/** -+ * Start the protosocket protothread in a function. -+ * -+ * This macro starts the protothread associated with the protosocket and -+ * must come before other protosocket calls in the function it is used. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket to be -+ * started. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_BEGIN(psock) PT_BEGIN(&((psock)->pt)) -+ -+PT_THREAD(psock_send(struct uip_stack *ustack, -+ struct psock *psock, const u8_t *buf, unsigned int len)); -+/** -+ * Send data. -+ * -+ * This macro sends data over a protosocket. The protosocket protothread blocks -+ * until all data has been sent and is known to have been received by -+ * the remote end of the TCP connection. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket over which -+ * data is to be sent. -+ * -+ * \param data (char *) A pointer to the data that is to be sent. -+ * -+ * \param datalen (unsigned int) The length of the data that is to be -+ * sent. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_SEND(psock, data, datalen) \ -+ PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, data, datalen)) -+ -+/** -+ * \brief Send a null-terminated string. -+ * \param psock Pointer to the protosocket. -+ * \param str The string to be sent. -+ * -+ * This function sends a null-terminated string over the -+ * protosocket. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_SEND_STR(psock, str) \ -+ PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, str, strlen(str))) -+ -+PT_THREAD(psock_generator_send(struct psock *psock, -+ unsigned short (*f) (void *), void *arg)); -+ -+/** -+ * \brief Generate data with a function and send it -+ * \param psock Pointer to the protosocket. -+ * \param generator Pointer to the generator function -+ * \param arg Argument to the generator function -+ * -+ * This function generates data and sends it over the -+ * protosocket. This can be used to dynamically generate -+ * data for a transmission, instead of generating the data -+ * in a buffer beforehand. This function reduces the need for -+ * buffer memory. The generator function is implemented by -+ * the application, and a pointer to the function is given -+ * as an argument with the call to PSOCK_GENERATOR_SEND(). -+ * -+ * The generator function should place the generated data -+ * directly in the uip_appdata buffer, and return the -+ * length of the generated data. The generator function is -+ * called by the protosocket layer when the data first is -+ * sent, and once for every retransmission that is needed. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_GENERATOR_SEND(psock, generator, arg) \ -+ PT_WAIT_THREAD(&((psock)->pt), \ -+ psock_generator_send(psock, generator, arg)) -+ -+/** -+ * Close a protosocket. -+ * -+ * This macro closes a protosocket and can only be called from within the -+ * protothread in which the protosocket lives. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket that is to -+ * be closed. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_CLOSE(psock) uip_close() -+ -+PT_THREAD(psock_readbuf(struct psock *psock)); -+/** -+ * Read data until the buffer is full. -+ * -+ * This macro will block waiting for data and read the data into the -+ * input buffer specified with the call to PSOCK_INIT(). Data is read -+ * until the buffer is full.. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket from which -+ * data should be read. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_READBUF(psock) \ -+ PT_WAIT_THREAD(&((psock)->pt), psock_readbuf(psock)) -+ -+PT_THREAD(psock_readto(struct psock *psock, unsigned char c)); -+/** -+ * Read data up to a specified character. -+ * -+ * This macro will block waiting for data and read the data into the -+ * input buffer specified with the call to PSOCK_INIT(). Data is only -+ * read until the specifieed character appears in the data stream. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket from which -+ * data should be read. -+ * -+ * \param c (char) The character at which to stop reading. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_READTO(psock, c) \ -+ PT_WAIT_THREAD(&((psock)->pt), psock_readto(psock, c)) -+ -+/** -+ * The length of the data that was previously read. -+ * -+ * This macro returns the length of the data that was previously read -+ * using PSOCK_READTO() or PSOCK_READ(). -+ * -+ * \param psock (struct psock *) A pointer to the protosocket holding the data. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_DATALEN(psock) psock_datalen(psock) -+ -+u16_t psock_datalen(struct psock *psock); -+ -+/** -+ * Exit the protosocket's protothread. -+ * -+ * This macro terminates the protothread of the protosocket and should -+ * almost always be used in conjunction with PSOCK_CLOSE(). -+ * -+ * \sa PSOCK_CLOSE_EXIT() -+ * -+ * \param psock (struct psock *) A pointer to the protosocket. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_EXIT(psock) PT_EXIT(&((psock)->pt)) -+ -+/** -+ * Close a protosocket and exit the protosocket's protothread. -+ * -+ * This macro closes a protosocket and exits the protosocket's protothread. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_CLOSE_EXIT(psock) \ -+ do { \ -+ PSOCK_CLOSE(psock); \ -+ PSOCK_EXIT(psock); \ -+ } while (0) -+ -+/** -+ * Declare the end of a protosocket's protothread. -+ * -+ * This macro is used for declaring that the protosocket's protothread -+ * ends. It must always be used together with a matching PSOCK_BEGIN() -+ * macro. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_END(psock) PT_END(&((psock)->pt)) -+ -+char psock_newdata(struct psock *s); -+ -+/** -+ * Check if new data has arrived on a protosocket. -+ * -+ * This macro is used in conjunction with the PSOCK_WAIT_UNTIL() -+ * macro to check if data has arrived on a protosocket. -+ * -+ * \param psock (struct psock *) A pointer to the protosocket. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_NEWDATA(psock) psock_newdata(psock) -+ -+/** -+ * Wait until a condition is true. -+ * -+ * This macro blocks the protothread until the specified condition is -+ * true. The macro PSOCK_NEWDATA() can be used to check if new data -+ * arrives when the protosocket is waiting. -+ * -+ * Typically, this macro is used as follows: -+ * -+ \code -+ PT_THREAD(thread(struct psock *s, struct timer *t)) -+ { -+ PSOCK_BEGIN(s); -+ -+ PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t)); -+ -+ if(PSOCK_NEWDATA(s)) { -+ PSOCK_READTO(s, '\n'); -+ } else { -+ handle_timed_out(s); -+ } -+ -+ PSOCK_END(s); -+ } -+ \endcode -+ * -+ * \param psock (struct psock *) A pointer to the protosocket. -+ * \param condition The condition to wait for. -+ * -+ * \hideinitializer -+ */ -+#define PSOCK_WAIT_UNTIL(psock, condition) \ -+ PT_WAIT_UNTIL(&((psock)->pt), (condition)); -+ -+#define PSOCK_WAIT_THREAD(psock, condition) \ -+ PT_WAIT_THREAD(&((psock)->pt), (condition)) -+ -+#endif /* __PSOCK_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/pt.h b/iscsiuio/src/uip/pt.h -new file mode 100644 -index 0000000..87465b4 ---- /dev/null -+++ b/iscsiuio/src/uip/pt.h -@@ -0,0 +1,322 @@ -+/* -+ * Copyright (c) 2004-2005, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+/** -+ * \addtogroup pt -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Protothreads implementation. -+ * \author -+ * Adam Dunkels -+ * -+ */ -+ -+#ifndef __PT_H__ -+#define __PT_H__ -+ -+#include "lc.h" -+ -+struct pt { -+ unsigned short lc; -+}; -+ -+#define PT_WAITING 0 -+#define PT_EXITED 1 -+#define PT_ENDED 2 -+#define PT_YIELDED 3 -+ -+/** -+ * \name Initialization -+ * @{ -+ */ -+ -+/** -+ * Initialize a protothread. -+ * -+ * Initializes a protothread. Initialization must be done prior to -+ * starting to execute the protothread. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * -+ * \sa PT_SPAWN() -+ * -+ * \hideinitializer -+ */ -+#define PT_INIT(pt) LC_INIT((pt)->lc) -+ -+/** @} */ -+ -+/** -+ * \name Declaration and definition -+ * @{ -+ */ -+ -+/** -+ * Declaration of a protothread. -+ * -+ * This macro is used to declare a protothread. All protothreads must -+ * be declared with this macro. -+ * -+ * \param name_args The name and arguments of the C function -+ * implementing the protothread. -+ * -+ * \hideinitializer -+ */ -+#define PT_THREAD(name_args) char name_args -+ -+/** -+ * Declare the start of a protothread inside the C function -+ * implementing the protothread. -+ * -+ * This macro is used to declare the starting point of a -+ * protothread. It should be placed at the start of the function in -+ * which the protothread runs. All C statements above the PT_BEGIN() -+ * invokation will be executed each time the protothread is scheduled. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * -+ * \hideinitializer -+ */ -+#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) -+ -+/** -+ * Declare the end of a protothread. -+ * -+ * This macro is used for declaring that a protothread ends. It must -+ * always be used together with a matching PT_BEGIN() macro. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * -+ * \hideinitializer -+ */ -+#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ -+ PT_INIT(pt); return PT_ENDED; } -+ -+/** @} */ -+ -+/** -+ * \name Blocked wait -+ * @{ -+ */ -+ -+/** -+ * Block and wait until condition is true. -+ * -+ * This macro blocks the protothread until the specified condition is -+ * true. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * \param condition The condition. -+ * -+ * \hideinitializer -+ */ -+#define PT_WAIT_UNTIL(pt, condition) \ -+ do { \ -+ LC_SET((pt)->lc); \ -+ if (!(condition)) { \ -+ return PT_WAITING; \ -+ } \ -+ } while (0) -+ -+/** -+ * Block and wait while condition is true. -+ * -+ * This function blocks and waits while condition is true. See -+ * PT_WAIT_UNTIL(). -+ * -+ * \param pt A pointer to the protothread control structure. -+ * \param cond The condition. -+ * -+ * \hideinitializer -+ */ -+#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) -+ -+/** @} */ -+ -+/** -+ * \name Hierarchical protothreads -+ * @{ -+ */ -+ -+/** -+ * Block and wait until a child protothread completes. -+ * -+ * This macro schedules a child protothread. The current protothread -+ * will block until the child protothread completes. -+ * -+ * \note The child protothread must be manually initialized with the -+ * PT_INIT() function before this function is used. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * \param thread The child protothread with arguments -+ * -+ * \sa PT_SPAWN() -+ * -+ * \hideinitializer -+ */ -+#define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) -+ -+/** -+ * Spawn a child protothread and wait until it exits. -+ * -+ * This macro spawns a child protothread and waits until it exits. The -+ * macro can only be used within a protothread. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * \param child A pointer to the child protothread's control structure. -+ * \param thread The child protothread with arguments -+ * -+ * \hideinitializer -+ */ -+#define PT_SPAWN(pt, child, thread) \ -+ do { \ -+ PT_INIT((child)); \ -+ PT_WAIT_THREAD((pt), (thread)); \ -+ } while (0) -+ -+/** @} */ -+ -+/** -+ * \name Exiting and restarting -+ * @{ -+ */ -+ -+/** -+ * Restart the protothread. -+ * -+ * This macro will block and cause the running protothread to restart -+ * its execution at the place of the PT_BEGIN() call. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * -+ * \hideinitializer -+ */ -+#define PT_RESTART(pt) \ -+ do { \ -+ PT_INIT(pt); \ -+ return PT_WAITING; \ -+ } while (0) -+ -+/** -+ * Exit the protothread. -+ * -+ * This macro causes the protothread to exit. If the protothread was -+ * spawned by another protothread, the parent protothread will become -+ * unblocked and can continue to run. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * -+ * \hideinitializer -+ */ -+#define PT_EXIT(pt) \ -+ do { \ -+ PT_INIT(pt); \ -+ return PT_EXITED; \ -+ } while (0) -+ -+/** @} */ -+ -+/** -+ * \name Calling a protothread -+ * @{ -+ */ -+ -+/** -+ * Schedule a protothread. -+ * -+ * This function shedules a protothread. The return value of the -+ * function is non-zero if the protothread is running or zero if the -+ * protothread has exited. -+ * -+ * \param f The call to the C function implementing the protothread to -+ * be scheduled -+ * -+ * \hideinitializer -+ */ -+#define PT_SCHEDULE(f) ((f) == PT_WAITING) -+ -+/** @} */ -+ -+/** -+ * \name Yielding from a protothread -+ * @{ -+ */ -+ -+/** -+ * Yield from the current protothread. -+ * -+ * This function will yield the protothread, thereby allowing other -+ * processing to take place in the system. -+ * -+ * \param pt A pointer to the protothread control structure. -+ * -+ * \hideinitializer -+ */ -+#define PT_YIELD(pt) \ -+ do { \ -+ PT_YIELD_FLAG = 0; \ -+ LC_SET((pt)->lc); \ -+ if (PT_YIELD_FLAG == 0) { \ -+ return PT_YIELDED; \ -+ } \ -+ } while (0) -+ -+/** -+ * \brief Yield from the protothread until a condition occurs. -+ * \param pt A pointer to the protothread control structure. -+ * \param cond The condition. -+ * -+ * This function will yield the protothread, until the -+ * specified condition evaluates to true. -+ * -+ * -+ * \hideinitializer -+ */ -+#define PT_YIELD_UNTIL(pt, cond) \ -+ do { \ -+ PT_YIELD_FLAG = 0; \ -+ LC_SET((pt)->lc); \ -+ if ((PT_YIELD_FLAG == 0) || !(cond)) { \ -+ return PT_YIELDED; \ -+ } \ -+ } while (0) -+ -+/** @} */ -+ -+#endif /* __PT_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/timer.c b/iscsiuio/src/uip/timer.c -new file mode 100644 -index 0000000..da77148 ---- /dev/null -+++ b/iscsiuio/src/uip/timer.c -@@ -0,0 +1,127 @@ -+/** -+ * \addtogroup timer -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Timer library implementation. -+ * \author -+ * Adam Dunkels -+ */ -+ -+/* -+ * Copyright (c) 2004, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+ -+#include "clock.h" -+#include "timer.h" -+ -+/*---------------------------------------------------------------------------*/ -+/** -+ * Set a timer. -+ * -+ * This function is used to set a timer for a time sometime in the -+ * future. The function timer_expired() will evaluate to true after -+ * the timer has expired. -+ * -+ * \param t A pointer to the timer -+ * \param interval The interval before the timer expires. -+ * -+ */ -+void timer_set(struct timer *t, clock_time_t interval) -+{ -+ t->interval = interval; -+ t->start = clock_time(); -+} -+ -+/*---------------------------------------------------------------------------*/ -+/** -+ * Reset the timer with the same interval. -+ * -+ * This function resets the timer with the same interval that was -+ * given to the timer_set() function. The start point of the interval -+ * is the exact time that the timer last expired. Therefore, this -+ * function will cause the timer to be stable over time, unlike the -+ * timer_rester() function. -+ * -+ * \param t A pointer to the timer. -+ * -+ * \sa timer_restart() -+ */ -+void timer_reset(struct timer *t) -+{ -+ t->start += t->interval; -+} -+ -+/*---------------------------------------------------------------------------*/ -+/** -+ * Restart the timer from the current point in time -+ * -+ * This function restarts a timer with the same interval that was -+ * given to the timer_set() function. The timer will start at the -+ * current time. -+ * -+ * \note A periodic timer will drift if this function is used to reset -+ * it. For preioric timers, use the timer_reset() function instead. -+ * -+ * \param t A pointer to the timer. -+ * -+ * \sa timer_reset() -+ */ -+void timer_restart(struct timer *t) -+{ -+ t->start = clock_time(); -+} -+ -+/*---------------------------------------------------------------------------*/ -+/** -+ * Check if a timer has expired. -+ * -+ * This function tests if a timer has expired and returns true or -+ * false depending on its status. -+ * -+ * \param t A pointer to the timer -+ * -+ * \return Non-zero if the timer has expired, zero otherwise. -+ * -+ */ -+int timer_expired(struct timer *t) -+{ -+ return (clock_time_t) (clock_time() - t->start) >= -+ (clock_time_t) t->interval; -+} -+ -+/*---------------------------------------------------------------------------*/ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/timer.h b/iscsiuio/src/uip/timer.h -new file mode 100644 -index 0000000..12739fd ---- /dev/null -+++ b/iscsiuio/src/uip/timer.h -@@ -0,0 +1,84 @@ -+/** -+ * \defgroup timer Timer library -+ * -+ * The timer library provides functions for setting, resetting and -+ * restarting timers, and for checking if a timer has expired. An -+ * application must "manually" check if its timers have expired; this -+ * is not done automatically. -+ * -+ * A timer is declared as a \c struct \c timer and all access to the -+ * timer is made by a pointer to the declared timer. -+ * -+ * \note The timer library uses the \ref clock "Clock library" to -+ * measure time. Intervals should be specified in the format used by -+ * the clock library. -+ * -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Timer library header file. -+ * \author -+ * Adam Dunkels -+ */ -+ -+/* -+ * Copyright (c) 2004, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ * Author: Adam Dunkels -+ * -+ */ -+#ifndef __TIMER_H__ -+#define __TIMER_H__ -+ -+#include "clock.h" -+ -+/** -+ * A timer. -+ * -+ * This structure is used for declaring a timer. The timer must be set -+ * with timer_set() before it can be used. -+ * -+ * \hideinitializer -+ */ -+struct timer { -+ clock_time_t start; -+ clock_time_t interval; -+}; -+ -+void timer_set(struct timer *t, clock_time_t interval); -+void timer_reset(struct timer *t); -+void timer_restart(struct timer *t); -+int timer_expired(struct timer *t); -+ -+#endif /* __TIMER_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/uip-neighbor.c b/iscsiuio/src/uip/uip-neighbor.c -new file mode 100644 -index 0000000..4c80c32 ---- /dev/null -+++ b/iscsiuio/src/uip/uip-neighbor.c -@@ -0,0 +1,219 @@ -+/* -+ * Copyright (c) 2006, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+ -+/** -+ * \file -+ * Database of link-local neighbors, used by IPv6 code and -+ * to be used by a future ARP code rewrite. -+ * \author -+ * Adam Dunkels -+ */ -+ -+#include "logger.h" -+#include "uip.h" -+#include "uip-neighbor.h" -+ -+#include -+#include -+#include -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define PFX "uip-neigh " -+ -+#define MAX_TIME 128 -+ -+/*---------------------------------------------------------------------------*/ -+void uip_neighbor_init(struct uip_stack *ustack) -+{ -+ int i; -+ -+ pthread_mutex_lock(&ustack->lock); -+ for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { -+ memset(&(ustack->neighbor_entries[i].ipaddr), 0, -+ sizeof(ustack->neighbor_entries[i].ipaddr)); -+ memset(&(ustack->neighbor_entries[i].mac_addr), 0, -+ sizeof(ustack->neighbor_entries[i].mac_addr)); -+ ustack->neighbor_entries[i].time = MAX_TIME; -+ } -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+void uip_neighbor_add(struct uip_stack *ustack, -+ struct in6_addr *addr6, struct uip_eth_addr *addr) -+{ -+ int i, oldest; -+ u8_t oldest_time; -+ char buf[INET6_ADDRSTRLEN]; -+ -+ inet_ntop(AF_INET6, addr6, buf, sizeof(buf)); -+ -+ pthread_mutex_lock(&ustack->lock); -+ -+ /* Find the first unused entry or the oldest used entry. */ -+ oldest_time = 0; -+ oldest = 0; -+ for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { -+ if (ustack->neighbor_entries[i].time == MAX_TIME) { -+ oldest = i; -+ break; -+ } -+ if (uip_ip6addr_cmp -+ (ustack->neighbor_entries[i].ipaddr.s6_addr, addr6)) { -+ oldest = i; -+ break; -+ } -+ if (ustack->neighbor_entries[i].time > oldest_time) { -+ oldest = i; -+ oldest_time = ustack->neighbor_entries[i].time; -+ } -+ } -+ -+ /* Use the oldest or first free entry (either pointed to by the -+ "oldest" variable). */ -+ ustack->neighbor_entries[oldest].time = 0; -+ uip_ip6addr_copy(ustack->neighbor_entries[oldest].ipaddr.s6_addr, -+ addr6); -+ memcpy(&ustack->neighbor_entries[oldest].mac_addr, addr, -+ sizeof(struct uip_eth_addr)); -+ -+ LOG_DEBUG("Adding neighbor %s with " -+ "mac address %02x:%02x:%02x:%02x:%02x:%02x at %d", -+ buf, addr->addr[0], addr->addr[1], addr->addr[2], -+ addr->addr[3], addr->addr[4], addr->addr[5], oldest); -+ -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+/*---------------------------------------------------------------------------*/ -+static struct neighbor_entry *find_entry(struct uip_stack *ustack, -+ struct in6_addr *addr6) -+{ -+ int i; -+ -+ for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { -+ if (uip_ip6addr_cmp -+ (ustack->neighbor_entries[i].ipaddr.s6_addr, -+ addr6->s6_addr)) { -+ return &ustack->neighbor_entries[i]; -+ } -+ } -+ -+ return NULL; -+} -+ -+/*---------------------------------------------------------------------------*/ -+void uip_neighbor_update(struct uip_stack *ustack, struct in6_addr *addr6) -+{ -+ struct neighbor_entry *e; -+ -+ pthread_mutex_lock(&ustack->lock); -+ -+ e = find_entry(ustack, addr6); -+ if (e != NULL) -+ e->time = 0; -+ -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+/*---------------------------------------------------------------------------*/ -+int uip_neighbor_lookup(struct uip_stack *ustack, -+ struct in6_addr *addr6, uint8_t *mac_addr) -+{ -+ struct neighbor_entry *e; -+ -+ pthread_mutex_lock(&ustack->lock); -+ e = find_entry(ustack, addr6); -+ if (e != NULL) { -+ char addr6_str[INET6_ADDRSTRLEN]; -+ uint8_t *entry_mac_addr; -+ -+ addr6_str[0] = '\0'; -+ inet_ntop(AF_INET6, addr6->s6_addr, addr6_str, -+ sizeof(addr6_str)); -+ entry_mac_addr = (uint8_t *)&e->mac_addr.addr; -+ -+ LOG_DEBUG(PFX -+ "Found %s at %02x:%02x:%02x:%02x:%02x:%02x", -+ addr6_str, -+ entry_mac_addr[0], entry_mac_addr[1], -+ entry_mac_addr[2], entry_mac_addr[3], -+ entry_mac_addr[4], entry_mac_addr[5]); -+ -+ memcpy(mac_addr, entry_mac_addr, sizeof(e->mac_addr)); -+ pthread_mutex_unlock(&ustack->lock); -+ return 0; -+ } -+ -+ pthread_mutex_unlock(&ustack->lock); -+ return -ENOENT; -+} -+ -+void uip_neighbor_out(struct uip_stack *ustack) -+{ -+ struct neighbor_entry *e; -+ struct uip_eth_hdr *eth_hdr = -+ (struct uip_eth_hdr *)ustack->data_link_layer; -+ struct uip_ipv6_hdr *ipv6_hdr = -+ (struct uip_ipv6_hdr *)ustack->network_layer; -+ -+ pthread_mutex_lock(&ustack->lock); -+ -+ /* Find the destination IP address in the neighbor table and construct -+ the Ethernet header. If the destination IP addres isn't on the -+ local network, we use the default router's IP address instead. -+ -+ If not ARP table entry is found, we overwrite the original IP -+ packet with an ARP request for the IP address. */ -+ e = find_entry(ustack, (struct in6_addr *)ipv6_hdr->destipaddr); -+ if (e == NULL) { -+ struct uip_eth_addr eth_addr_tmp; -+ -+ memcpy(ð_addr_tmp, eth_hdr->src.addr, sizeof(eth_addr_tmp)); -+ memcpy(eth_hdr->src.addr, ustack->uip_ethaddr.addr, -+ sizeof(eth_hdr->src.addr)); -+ memcpy(eth_hdr->dest.addr, ð_addr_tmp, -+ sizeof(eth_hdr->dest.addr)); -+ -+ pthread_mutex_unlock(&ustack->lock); -+ return; -+ } -+ -+ memcpy(eth_hdr->dest.addr, &e->mac_addr, sizeof(eth_hdr->dest.addr)); -+ memcpy(eth_hdr->src.addr, ustack->uip_ethaddr.addr, -+ sizeof(eth_hdr->src.addr)); -+ -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+/*---------------------------------------------------------------------------*/ -diff --git a/iscsiuio/src/uip/uip-neighbor.h b/iscsiuio/src/uip/uip-neighbor.h -new file mode 100644 -index 0000000..d10c57b ---- /dev/null -+++ b/iscsiuio/src/uip/uip-neighbor.h -@@ -0,0 +1,105 @@ -+/* -+ * Copyright (c) 2006, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+ -+/** -+ * \file -+ * Header file for database of link-local neighbors, used by -+ * IPv6 code and to be used by future ARP code. -+ * \author -+ * Adam Dunkels -+ */ -+ -+#ifndef __UIP_NEIGHBOR_H__ -+#define __UIP_NEIGHBOR_H__ -+ -+#include "uip.h" -+#include "uip_eth.h" -+ -+/* ICMP types */ -+/* ICMPv6 error Messages */ -+#define ICMPV6_DEST_UNREACH 1 -+#define ICMPV6_PKT_TOOBIG 2 -+#define ICMPV6_TIME_EXCEED 3 -+#define ICMPV6_PARAMPROB 4 -+ -+/* ICMPv6 Informational Messages */ -+#define ICMPV6_ECHO_REQUEST 128 -+#define ICMPV6_ECHO_REPLY 129 -+#define ICMPV6_MGM_QUERY 130 -+#define ICMPV6_MGM_REPORT 131 -+#define ICMPV6_MGM_REDUCTION 132 -+ -+/* Codes for Destination Unreachable */ -+#define ICMPV6_NOROUTE 0 -+#define ICMPV6_ADM_PROHIBITED 1 -+#define ICMPV6_NOT_NEIGHBOUR 2 -+#define ICMPV6_ADDR_UNREACH 3 -+#define ICMPV6_PORT_UNREACH 4 -+ -+/* Codes for Time Exceeded */ -+#define ICMPV6_EXC_HOPLIMIT 0 -+#define ICMPV6_EXC_FRAGTIME 1 -+ -+/* Codes for Parameter Problem */ -+#define ICMPV6_HDR_FIELD 0 -+#define ICMPV6_UNK_NEXTHDR 1 -+#define ICMPV6_UNK_OPTION 2 -+ -+#if 0 -+struct __attribute__ ((__packed__)) icmpv6_hdr { -+ u8_t type; -+ u8_t code; -+ u16_t checksum; -+ union { -+ struct { -+ u16_t id; -+ u16_t sequence; -+ } echo; -+ u32_t gateway; -+ struct { -+ u16_t unused; -+ u16_t mtu; -+ } frag; -+ } un; -+}; -+#endif -+ -+void uip_neighbor_init(struct uip_stack *ustack); -+void uip_neighbor_add(struct uip_stack *ustack, -+ struct in6_addr *addr6, struct uip_eth_addr *addr); -+void uip_neighbor_update(struct uip_stack *ustack, struct in6_addr *addr6); -+int uip_neighbor_lookup(struct uip_stack *ustack, struct in6_addr *ipaddr, -+ uint8_t *mac_addr); -+void uip_neighbor_periodic(void); -+void uip_neighbor_out(struct uip_stack *ustack); -+ -+#endif /* __UIP-NEIGHBOR_H__ */ -diff --git a/iscsiuio/src/uip/uip.c b/iscsiuio/src/uip/uip.c -new file mode 100644 -index 0000000..703cefc ---- /dev/null -+++ b/iscsiuio/src/uip/uip.c -@@ -0,0 +1,2405 @@ -+#include -+#include -+#include -+#include -+#include -+#include "uip.h" -+#include "dhcpc.h" -+#include "ipv6_ndpc.h" -+#include "brcm_iscsi.h" -+ -+/** -+ * \defgroup uip The uIP TCP/IP stack -+ * @{ -+ * -+ * uIP is an implementation of the TCP/IP protocol stack intended for -+ * small 8-bit and 16-bit microcontrollers. -+ * -+ * uIP provides the necessary protocols for Internet communication, -+ * with a very small code footprint and RAM requirements - the uIP -+ * code size is on the order of a few kilobytes and RAM usage is on -+ * the order of a few hundred bytes. -+ */ -+ -+/** -+ * \file -+ * The uIP TCP/IP stack code. -+ * \author Adam Dunkels -+ */ -+ -+/* -+ * Copyright (c) 2001-2003, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+/* -+ * uIP is a small implementation of the IP, UDP and TCP protocols (as -+ * well as some basic ICMP stuff). The implementation couples the IP, -+ * UDP, TCP and the application layers very tightly. To keep the size -+ * of the compiled code down, this code frequently uses the goto -+ * statement. While it would be possible to break the uip_process() -+ * function into many smaller functions, this would increase the code -+ * size because of the overhead of parameter passing and the fact that -+ * the optimier would not be as efficient. -+ * -+ * The principle is that we have a small buffer, called the uip_buf, -+ * in which the device driver puts an incoming packet. The TCP/IP -+ * stack parses the headers in the packet, and calls the -+ * application. If the remote host has sent data to the application, -+ * this data is present in the uip_buf and the application read the -+ * data from there. It is up to the application to put this data into -+ * a byte stream if needed. The application will not be fed with data -+ * that is out of sequence. -+ * -+ * If the application whishes to send data to the peer, it should put -+ * its data into the uip_buf. The uip_appdata pointer points to the -+ * first available byte. The TCP/IP stack will calculate the -+ * checksums, and fill in the necessary header fields and finally send -+ * the packet back to the peer. -+*/ -+ -+#include "logger.h" -+ -+#include "uip.h" -+#include "uipopt.h" -+#include "uip_arch.h" -+#include "uip_eth.h" -+#include "uip-neighbor.h" -+ -+#include -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define PFX "uip " -+ -+static const uip_ip6addr_t all_ones_addr6 = { -+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff -+}; -+static const uip_ip4addr_t all_ones_addr4 = { 0xffff, 0xffff }; -+ -+const uip_ip6addr_t all_zeroes_addr6 = { -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -+}; -+const uip_ip4addr_t all_zeroes_addr4 = { 0x0000, 0x0000 }; -+ -+const uint8_t mutlicast_ipv6_prefix[16] = { -+ 0xfc, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+ -+const uint8_t link_local_addres_prefix[16] = { -+ 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -+}; -+const uint32_t link_local_address_prefix_length = 10; -+ -+/* Structures and definitions. */ -+#define TCP_FIN 0x01 -+#define TCP_SYN 0x02 -+#define TCP_RST 0x04 -+#define TCP_PSH 0x08 -+#define TCP_ACK 0x10 -+#define TCP_URG 0x20 -+#define TCP_CTL 0x3f -+ -+#define TCP_OPT_END 0 /* End of TCP options list */ -+#define TCP_OPT_NOOP 1 /* "No-operation" TCP option */ -+#define TCP_OPT_MSS 2 /* Maximum segment size TCP option */ -+ -+#define TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ -+ -+#define ICMP_ECHO_REPLY 0 -+#define ICMP_ECHO 8 -+ -+#define ICMP6_ECHO_REPLY 129 -+#define ICMP6_ECHO 128 -+#define ICMP6_NEIGHBOR_SOLICITATION 135 -+#define ICMP6_NEIGHBOR_ADVERTISEMENT 136 -+ -+#define ICMP6_FLAG_S (1 << 6) -+ -+#define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 -+#define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 -+ -+/* Macros. */ -+#define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0]) -+#define UDPBUF(ustack) ((struct uip_udpip_hdr *)ustack->network_layer) -+ -+/****************************************************************************** -+ * Utility Functions -+ *****************************************************************************/ -+static int is_ipv6(struct uip_stack *ustack) -+{ -+ u16_t type; -+ -+ type = ETH_BUF(ustack->uip_buf)->type; -+ type = ntohs(type); -+ if (type == UIP_ETHTYPE_8021Q) -+ type = ntohs(VLAN_ETH_BUF(ustack->uip_buf)->type); -+ else -+ type = ntohs(ETH_BUF(ustack->uip_buf)->type); -+ -+ return (type == UIP_ETHTYPE_IPv6); -+} -+ -+int is_ipv6_link_local_address(uip_ip6addr_t *addr) -+{ -+ u8_t *test_adddr = (u8_t *) addr; -+ u8_t test_remainder; -+ -+ if (test_adddr[0] != link_local_addres_prefix[0]) -+ return 0; -+ -+ test_remainder = (test_adddr[1] & 0xC0) >> 6; -+ if (test_remainder != 2) -+ return 0; -+ -+ return 1; -+} -+ -+void uip_sethostaddr4(struct uip_stack *ustack, uip_ip4addr_t *addr) -+{ -+ pthread_mutex_lock(&ustack->lock); -+ uip_ip4addr_copy(ustack->hostaddr, (addr)); -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+void uip_setdraddr4(struct uip_stack *ustack, uip_ip4addr_t *addr) -+{ -+ pthread_mutex_lock(&ustack->lock); -+ uip_ip4addr_copy(ustack->default_route_addr, (addr)); -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+void uip_setnetmask4(struct uip_stack *ustack, uip_ip4addr_t *addr) -+{ -+ pthread_mutex_lock(&ustack->lock); -+ uip_ip4addr_copy(ustack->netmask, (addr)); -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+void uip_setethernetmac(struct uip_stack *ustack, uint8_t *mac) -+{ -+ pthread_mutex_lock(&ustack->lock); -+ memcpy(ustack->uip_ethaddr.addr, (mac), 6); -+ pthread_mutex_unlock(&ustack->lock); -+} -+ -+void set_uip_stack(struct uip_stack *ustack, -+ uip_ip4addr_t *ip, -+ uip_ip4addr_t *netmask, -+ uip_ip4addr_t *default_route, uint8_t *mac_addr) -+{ -+ uip_sethostaddr4(ustack, ip); -+ uip_setnetmask4(ustack, netmask); -+ uip_setdraddr4(ustack, default_route); -+ uip_setethernetmac(ustack, mac_addr); -+} -+ -+#if !UIP_ARCH_ADD32 -+void uip_add32(u8_t *op32, u16_t op16, u8_t *uip_acc32) -+{ -+ uip_acc32[3] = op32[3] + (op16 & 0xff); -+ uip_acc32[2] = op32[2] + (op16 >> 8); -+ uip_acc32[1] = op32[1]; -+ uip_acc32[0] = op32[0]; -+ -+ if (uip_acc32[2] < (op16 >> 8)) { -+ ++uip_acc32[1]; -+ if (uip_acc32[1] == 0) -+ ++uip_acc32[0]; -+ } -+ -+ if (uip_acc32[3] < (op16 & 0xff)) { -+ ++uip_acc32[2]; -+ if (uip_acc32[2] == 0) { -+ ++uip_acc32[1]; -+ if (uip_acc32[1] == 0) -+ ++uip_acc32[0]; -+ } -+ } -+} -+ -+#endif /* UIP_ARCH_ADD32 */ -+ -+#if !UIP_ARCH_CHKSUM -+/*---------------------------------------------------------------------------*/ -+static u16_t chksum(u16_t sum, const u8_t *data, u16_t len) -+{ -+ u16_t t; -+ const u8_t *dataptr; -+ const u8_t *last_byte; -+ -+ dataptr = data; -+ last_byte = data + len - 1; -+ -+ while (dataptr < last_byte) { /* At least two more bytes */ -+ t = (dataptr[0] << 8) + dataptr[1]; -+ sum += t; -+ if (sum < t) -+ sum++; /* carry */ -+ dataptr += 2; -+ } -+ -+ if (dataptr == last_byte) { -+ t = (dataptr[0] << 8) + 0; -+ sum += t; -+ if (sum < t) -+ sum++; /* carry */ -+ } -+ -+ /* Return sum in host byte order. */ -+ return sum; -+} -+ -+/*---------------------------------------------------------------------------*/ -+u16_t uip_chksum(u16_t *data, u16_t len) -+{ -+ return htons(chksum(0, (u8_t *)data, len)); -+} -+ -+/*---------------------------------------------------------------------------*/ -+#ifndef UIP_ARCH_IPCHKSUM -+u16_t uip_ipchksum(struct uip_stack *ustack) -+{ -+ u16_t sum; -+ u16_t uip_iph_len; -+ -+ if (is_ipv6(ustack)) -+ uip_iph_len = UIP_IPv6_H_LEN; -+ else -+ uip_iph_len = UIP_IPv4_H_LEN; -+ -+ sum = chksum(0, ustack->network_layer, uip_iph_len); -+ return (sum == 0) ? 0xffff : htons(sum); -+} -+#endif -+ -+/*---------------------------------------------------------------------------*/ -+static u16_t upper_layer_chksum_ipv4(struct uip_stack *ustack, u8_t proto) -+{ -+ u16_t upper_layer_len; -+ u16_t sum; -+ struct uip_tcp_ipv4_hdr *tcp_ipv4_hdr = NULL; -+ -+ tcp_ipv4_hdr = (struct uip_tcp_ipv4_hdr *)ustack->network_layer; -+ -+ upper_layer_len = (((u16_t) (tcp_ipv4_hdr->len[0]) << 8) + -+ tcp_ipv4_hdr->len[1]) - UIP_IPv4_H_LEN; -+ -+ /* First sum pseudoheader. */ -+ /* IP protocol and length fields. This addition cannot carry. */ -+ sum = upper_layer_len + proto; -+ -+ sum = -+ chksum(sum, (u8_t *)&tcp_ipv4_hdr->srcipaddr[0], -+ 2 * sizeof(uip_ip4addr_t)); -+ /* Sum TCP header and data. */ -+ sum = chksum(sum, ustack->network_layer + UIP_IPv4_H_LEN, -+ upper_layer_len); -+ -+ return (sum == 0) ? 0xffff : htons(sum); -+} -+ -+/*---------------------------------------------------------------------------*/ -+static uint16_t upper_layer_checksum_ipv6(uint8_t *data, uint8_t proto) -+{ -+ uint16_t upper_layer_len; -+ uint16_t sum; -+ struct ip6_hdr *ipv6_hdr; -+ uint8_t *upper_layer; -+ uint32_t val; -+ -+ ipv6_hdr = (struct ip6_hdr *)data; -+ -+ upper_layer_len = ntohs(ipv6_hdr->ip6_plen); -+ -+ /* First sum pseudoheader. */ -+ sum = 0; -+ sum = chksum(sum, (const u8_t *)ipv6_hdr->ip6_src.s6_addr, -+ sizeof(ipv6_hdr->ip6_src)); -+ sum = chksum(sum, (const u8_t *)ipv6_hdr->ip6_dst.s6_addr, -+ sizeof(ipv6_hdr->ip6_dst)); -+ -+ val = htons(upper_layer_len); -+ sum = chksum(sum, (u8_t *)&val, sizeof(val)); -+ -+ val = htons(proto); -+ sum = chksum(sum, (u8_t *)&val, sizeof(val)); -+ -+ upper_layer = (uint8_t *)(ipv6_hdr + 1); -+ sum = chksum(sum, upper_layer, upper_layer_len); -+ -+ return (sum == 0) ? 0xffff : htons(sum); -+} -+ -+/*---------------------------------------------------------------------------*/ -+ -+u16_t uip_icmp6chksum(struct uip_stack *ustack) -+{ -+ uint8_t *data = ustack->network_layer; -+ -+ return upper_layer_checksum_ipv6(data, UIP_PROTO_ICMP6); -+} -+ -+uint16_t icmpv6_checksum(uint8_t *data) -+{ -+ return upper_layer_checksum_ipv6(data, IPPROTO_ICMPV6); -+} -+ -+/*---------------------------------------------------------------------------*/ -+u16_t uip_tcpchksum(struct uip_stack *ustack) -+{ -+ return upper_layer_chksum_ipv4(ustack, UIP_PROTO_TCP); -+} -+ -+/*---------------------------------------------------------------------------*/ -+#if UIP_UDP_CHECKSUMS -+static u16_t uip_udpchksum_ipv4(struct uip_stack *ustack) -+{ -+ return upper_layer_chksum_ipv4(ustack, UIP_PROTO_UDP); -+} -+ -+static u16_t uip_udpchksum_ipv6(struct uip_stack *ustack) -+{ -+ uint8_t *data = ustack->network_layer; -+ -+ return upper_layer_checksum_ipv6(data, UIP_PROTO_UDP); -+} -+ -+u16_t uip_udpchksum(struct uip_stack *ustack) -+{ -+ if (is_ipv6(ustack)) -+ return uip_udpchksum_ipv6(ustack); -+ else -+ return uip_udpchksum_ipv4(ustack); -+} -+#endif /* UIP_UDP_CHECKSUMS */ -+#endif /* UIP_ARCH_CHKSUM */ -+/*---------------------------------------------------------------------------*/ -+void uip_init(struct uip_stack *ustack, uint8_t ipv6_enabled) -+{ -+ u8_t c; -+ -+ for (c = 0; c < UIP_LISTENPORTS; ++c) -+ ustack->uip_listenports[c] = 0; -+ for (c = 0; c < UIP_CONNS; ++c) -+ ustack->uip_conns[c].tcpstateflags = UIP_CLOSED; -+#if UIP_ACTIVE_OPEN -+ ustack->lastport = 1024; -+#endif /* UIP_ACTIVE_OPEN */ -+ -+#if UIP_UDP -+ for (c = 0; c < UIP_UDP_CONNS; ++c) -+ ustack->uip_udp_conns[c].lport = 0; -+#endif /* UIP_UDP */ -+ -+ /* IPv4 initialization. */ -+#if UIP_FIXEDADDR == 0 -+ /* uip_hostaddr[0] = uip_hostaddr[1] = 0; */ -+#endif /* UIP_FIXEDADDR */ -+ -+ /* zero out the uIP statistics */ -+ memset(&ustack->stats, 0, sizeof(ustack->stats)); -+ -+ /* prepare the uIP lock */ -+ pthread_mutex_init(&ustack->lock, NULL); -+ -+ if (ipv6_enabled) -+ ustack->enable_IPv6 = UIP_SUPPORT_IPv6_ENABLED; -+ else -+ ustack->enable_IPv6 = UIP_SUPPORT_IPv6_DISABLED; -+ -+ ustack->dhcpc = NULL; -+ ustack->ndpc = NULL; -+} -+void uip_reset(struct uip_stack *ustack) -+{ -+ /* There was an associated DHCP object, this memory needs to be -+ * freed */ -+ if (ustack->dhcpc) -+ free(ustack->dhcpc); -+ -+ ndpc_exit(ustack->ndpc); -+ -+ memset(ustack, 0, sizeof(*ustack)); -+} -+ -+/*---------------------------------------------------------------------------*/ -+#if UIP_ACTIVE_OPEN -+struct uip_conn *uip_connect(struct uip_stack *ustack, uip_ip4addr_t *ripaddr, -+ u16_t rport) -+{ -+ u8_t c; -+ register struct uip_conn *conn, *cconn; -+ -+ /* Find an unused local port. */ -+again: -+ ++ustack->lastport; -+ -+ if (ustack->lastport >= 32000) -+ ustack->lastport = 4096; -+ -+ /* Check if this port is already in use, and if so try to find -+ another one. */ -+ for (c = 0; c < UIP_CONNS; ++c) { -+ conn = &ustack->uip_conns[c]; -+ if (conn->tcpstateflags != UIP_CLOSED && -+ conn->lport == htons(ustack->lastport)) { -+ goto again; -+ } -+ } -+ -+ conn = 0; -+ for (c = 0; c < UIP_CONNS; ++c) { -+ cconn = &ustack->uip_conns[c]; -+ if (cconn->tcpstateflags == UIP_CLOSED) { -+ conn = cconn; -+ break; -+ } -+ if (cconn->tcpstateflags == UIP_TIME_WAIT) { -+ if (conn == 0 || cconn->timer > conn->timer) -+ conn = cconn; -+ } -+ } -+ -+ if (conn == 0) -+ return 0; -+ -+ conn->tcpstateflags = UIP_SYN_SENT; -+ -+ conn->snd_nxt[0] = ustack->iss[0]; -+ conn->snd_nxt[1] = ustack->iss[1]; -+ conn->snd_nxt[2] = ustack->iss[2]; -+ conn->snd_nxt[3] = ustack->iss[3]; -+ -+ conn->initialmss = conn->mss = UIP_TCP_MSS; -+ -+ conn->len = 1; /* TCP length of the SYN is one. */ -+ conn->nrtx = 0; -+ conn->timer = 1; /* Send the SYN next time around. */ -+ conn->rto = UIP_RTO; -+ conn->sa = 0; -+ conn->sv = 16; /* Initial value of the RTT variance. */ -+ conn->lport = htons(ustack->lastport); -+ conn->rport = rport; -+ uip_ip4addr_copy(&conn->ripaddr, ripaddr); -+ -+ return conn; -+} -+#endif /* UIP_ACTIVE_OPEN */ -+/*---------------------------------------------------------------------------*/ -+#if UIP_UDP -+struct uip_udp_conn *uip_udp_new(struct uip_stack *ustack, -+ uip_ip4addr_t *ripaddr, u16_t rport) -+{ -+ u8_t c; -+ register struct uip_udp_conn *conn; -+ -+ /* Find an unused local port. */ -+again: -+ ++ustack->lastport; -+ -+ if (ustack->lastport >= 32000) -+ ustack->lastport = 4096; -+ -+ for (c = 0; c < UIP_UDP_CONNS; ++c) { -+ if (ustack->uip_udp_conns[c].lport == htons(ustack->lastport)) -+ goto again; -+ } -+ -+ conn = 0; -+ for (c = 0; c < UIP_UDP_CONNS; ++c) { -+ if (ustack->uip_udp_conns[c].lport == 0) { -+ conn = &ustack->uip_udp_conns[c]; -+ break; -+ } -+ } -+ -+ if (conn == 0) -+ return 0; -+ -+ conn->lport = htons(ustack->lastport); -+ conn->rport = rport; -+ if (ripaddr == NULL) -+ memset(conn->ripaddr, 0, sizeof(uip_ip4addr_t)); -+ else -+ uip_ip4addr_copy(&conn->ripaddr, ripaddr); -+ conn->ttl = UIP_TTL; -+ -+ return conn; -+} -+#endif /* UIP_UDP */ -+/*---------------------------------------------------------------------------*/ -+void uip_unlisten(struct uip_stack *ustack, u16_t port) -+{ -+ u8_t c; -+ -+ for (c = 0; c < UIP_LISTENPORTS; ++c) { -+ if (ustack->uip_listenports[c] == port) { -+ ustack->uip_listenports[c] = 0; -+ return; -+ } -+ } -+} -+ -+/*---------------------------------------------------------------------------*/ -+void uip_listen(struct uip_stack *ustack, u16_t port) -+{ -+ u8_t c; -+ -+ for (c = 0; c < UIP_LISTENPORTS; ++c) { -+ if (ustack->uip_listenports[c] == 0) { -+ ustack->uip_listenports[c] = port; -+ return; -+ } -+ } -+} -+ -+/** -+ * Is new incoming data available? -+ * -+ * Will reduce to non-zero if there is new data for the application -+ * present at the uip_appdata pointer. The size of the data is -+ * avaliable through the uip_len variable. -+ * -+ * \hideinitializer -+ */ -+int uip_newdata(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_NEWDATA; -+} -+ -+/** -+ * Has previously sent data been acknowledged? -+ * -+ * Will reduce to non-zero if the previously sent data has been -+ * acknowledged by the remote host. This means that the application -+ * can send new data. -+ * -+ * \hideinitializer -+ */ -+#define uip_acked() (uip_flags & UIP_ACKDATA) -+ -+/** -+ * Has the connection just been connected? -+ * -+ * Reduces to non-zero if the current connection has been connected to -+ * a remote host. This will happen both if the connection has been -+ * actively opened (with uip_connect()) or passively opened (with -+ * uip_listen()). -+ * -+ * \hideinitializer -+ */ -+int uip_connected(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_CONNECTED; -+} -+ -+/** -+ * Has the connection been closed by the other end? -+ * -+ * Is non-zero if the connection has been closed by the remote -+ * host. The application may then do the necessary clean-ups. -+ * -+ * \hideinitializer -+ */ -+int uip_closed(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_CLOSE; -+} -+ -+/** -+ * Has the connection been aborted by the other end? -+ * -+ * Non-zero if the current connection has been aborted (reset) by the -+ * remote host. -+ * -+ * \hideinitializer -+ */ -+int uip_aborted(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_ABORT; -+} -+ -+/** -+ * Has the connection timed out? -+ * -+ * Non-zero if the current connection has been aborted due to too many -+ * retransmissions. -+ * -+ * \hideinitializer -+ */ -+int uip_timedout(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_TIMEDOUT; -+} -+ -+/** -+ * Do we need to retransmit previously data? -+ * -+ * Reduces to non-zero if the previously sent data has been lost in -+ * the network, and the application should retransmit it. The -+ * application should send the exact same data as it did the last -+ * time, using the uip_send() function. -+ * -+ * \hideinitializer -+ */ -+int uip_rexmit(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_REXMIT; -+} -+ -+/** -+ * Is the connection being polled by uIP? -+ * -+ * Is non-zero if the reason the application is invoked is that the -+ * current connection has been idle for a while and should be -+ * polled. -+ * -+ * The polling event can be used for sending data without having to -+ * wait for the remote host to send data. -+ * -+ * \hideinitializer -+ */ -+int uip_poll(struct uip_stack *ustack) -+{ -+ return ustack->uip_flags & UIP_POLL; -+} -+ -+int uip_initialmss(struct uip_stack *ustack) -+{ -+ return ustack->uip_conn->initialmss; -+} -+ -+int uip_mss(struct uip_stack *ustack) -+{ -+ return ustack->uip_conn->mss; -+} -+ -+/*---------------------------------------------------------------------------*/ -+/* XXX: IP fragment reassembly: not well-tested. */ -+ -+#if UIP_REASSEMBLY && !UIP_CONF_IPV6 -+#define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN) -+static u8_t uip_reassbuf[UIP_REASS_BUFSIZE]; -+static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)]; -+static const u8_t bitmap_bits[8] = { 0xff, 0x7f, 0x3f, 0x1f, -+ 0x0f, 0x07, 0x03, 0x01 -+}; -+static u16_t uip_reasslen; -+static u8_t uip_reassflags; -+#define UIP_REASS_FLAG_LASTFRAG 0x01 -+static u8_t uip_reasstmr; -+ -+#define IP_MF 0x20 -+ -+static u8_t uip_reass(void) -+{ -+ u16_t offset, len; -+ u16_t i; -+ -+ /* If ip_reasstmr is zero, no packet is present in the buffer, so we -+ write the IP header of the fragment into the reassembly -+ buffer. The timer is updated with the maximum age. */ -+ if (uip_reasstmr == 0) { -+ memcpy(uip_reassbuf, &BUF(ustack)->vhl, uip_iph_len); -+ uip_reasstmr = UIP_REASS_MAXAGE; -+ uip_reassflags = 0; -+ /* Clear the bitmap. */ -+ memset(uip_reassbitmap, 0, sizeof(uip_reassbitmap)); -+ } -+ -+ /* Check if the incoming fragment matches the one currently present -+ in the reasembly buffer. If so, we proceed with copying the -+ fragment into the buffer. */ -+ if (BUF(ustack)->srcipaddr[0] == FBUF(ustack)->srcipaddr[0] && -+ BUF(ustack)->srcipaddr[1] == FBUF(ustack)->srcipaddr[1] && -+ BUF(ustack)->destipaddr[0] == FBUF(ustack)->destipaddr[0] && -+ BUF(ustack)->destipaddr[1] == FBUF(ustack)->destipaddr[1] && -+ BUF(ustack)->ipid[0] == FBUF(ustack)->ipid[0] && -+ BUF(ustack)->ipid[1] == FBUF(ustack)->ipid[1]) { -+ -+ len = -+ (BUF(ustack)->len[0] << 8) + BUF(ustack)->len[1] - -+ (BUF(ustack)->vhl & 0x0f) * 4; -+ offset = -+ (((BUF(ustack)->ipoffset[0] & 0x3f) << 8) + -+ BUF(ustack)->ipoffset[1]) * 8; -+ -+ /* If the offset or the offset + fragment length overflows the -+ reassembly buffer, we discard the entire packet. */ -+ if (offset > UIP_REASS_BUFSIZE || -+ offset + len > UIP_REASS_BUFSIZE) { -+ uip_reasstmr = 0; -+ goto nullreturn; -+ } -+ -+ /* Copy the fragment into the reassembly buffer, at the right -+ offset. */ -+ memcpy(&uip_reassbuf[uip_iph_len + offset], -+ (char *)BUF + (int)((BUF(ustack)->vhl & 0x0f) * 4), len); -+ -+ /* Update the bitmap. */ -+ if (offset / (8 * 8) == (offset + len) / (8 * 8)) { -+ /* If the two endpoints are in the same byte, we only -+ update that byte. */ -+ -+ uip_reassbitmap[offset / (8 * 8)] |= -+ bitmap_bits[(offset / 8) & 7] & -+ ~bitmap_bits[((offset + len) / 8) & 7]; -+ } else { -+ /* If the two endpoints are in different bytes, we -+ update the bytes in the endpoints and fill the -+ stuff inbetween with 0xff. */ -+ uip_reassbitmap[offset / (8 * 8)] |= -+ bitmap_bits[(offset / 8) & 7]; -+ for (i = 1 + offset / (8 * 8); -+ i < (offset + len) / (8 * 8); ++i) { -+ uip_reassbitmap[i] = 0xff; -+ } -+ uip_reassbitmap[(offset + len) / (8 * 8)] |= -+ ~bitmap_bits[((offset + len) / 8) & 7]; -+ } -+ -+ /* If this fragment has the More Fragments flag set to zero, we -+ know that this is the last fragment, so we can calculate the -+ size of the entire packet. We also set the -+ IP_REASS_FLAG_LASTFRAG flag to indicate that we have received -+ the final fragment. */ -+ -+ if ((BUF(ustack)->ipoffset[0] & IP_MF) == 0) { -+ uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; -+ uip_reasslen = offset + len; -+ } -+ -+ /* Finally, we check if we have a full packet in the buffer. -+ We do this by checking if we have the last fragment and if -+ all bits in the bitmap are set. */ -+ if (uip_reassflags & UIP_REASS_FLAG_LASTFRAG) { -+ /* Check all bytes up to and including all but the last -+ byte in the bitmap. */ -+ for (i = 0; i < uip_reasslen / (8 * 8) - 1; ++i) { -+ if (uip_reassbitmap[i] != 0xff) -+ goto nullreturn; -+ } -+ /* Check the last byte in the bitmap. It should contain -+ just the right amount of bits. */ -+ if (uip_reassbitmap[uip_reasslen / (8 * 8)] != -+ (u8_t) ~bitmap_bits[uip_reasslen / 8 & 7]) -+ goto nullreturn; -+ -+ /* If we have come this far, we have a full packet in -+ the buffer, so we allocate a pbuf and copy the -+ packet into it. We also reset the timer. */ -+ uip_reasstmr = 0; -+ memcpy(BUF, FBUF, uip_reasslen); -+ -+ /* Pretend to be a "normal" (i.e., not fragmented) IP -+ packet from now on. */ -+ BUF(ustack)->ipoffset[0] = BUF(ustack)->ipoffset[1] = 0; -+ BUF(ustack)->len[0] = uip_reasslen >> 8; -+ BUF(ustack)->len[1] = uip_reasslen & 0xff; -+ BUF(ustack)->ipchksum = 0; -+ BUF(ustack)->ipchksum = ~(uip_ipchksum()); -+ -+ return uip_reasslen; -+ } -+ } -+ -+nullreturn: -+ return 0; -+} -+#endif /* UIP_REASSEMBLY */ -+/*---------------------------------------------------------------------------*/ -+static void uip_add_rcv_nxt(struct uip_stack *ustack, u16_t n) -+{ -+ u8_t uip_acc32[4]; -+ -+ uip_add32(ustack->uip_conn->rcv_nxt, n, uip_acc32); -+ ustack->uip_conn->rcv_nxt[0] = uip_acc32[0]; -+ ustack->uip_conn->rcv_nxt[1] = uip_acc32[1]; -+ ustack->uip_conn->rcv_nxt[2] = uip_acc32[2]; -+ ustack->uip_conn->rcv_nxt[3] = uip_acc32[3]; -+} -+ -+/*---------------------------------------------------------------------------*/ -+ -+/** @} */ -+ -+/** -+ * \defgroup uipdevfunc uIP device driver functions -+ * @{ -+ * -+ * These functions are used by a network device driver for interacting -+ * with uIP. -+ */ -+ -+/** -+ * Process an incoming packet. -+ * -+ * This function should be called when the device driver has received -+ * a packet from the network. The packet from the device driver must -+ * be present in the uip_buf buffer, and the length of the packet -+ * should be placed in the uip_len variable. -+ * -+ * When the function returns, there may be an outbound packet placed -+ * in the uip_buf packet buffer. If so, the uip_len variable is set to -+ * the length of the packet. If no packet is to be sent out, the -+ * uip_len variable is set to 0. -+ * -+ * The usual way of calling the function is presented by the source -+ * code below. -+ \code -+ uip_len = devicedriver_poll(); -+ if(uip_len > 0) { -+ uip_input(); -+ if(uip_len > 0) { -+ devicedriver_send(); -+ } -+ } -+ \endcode -+ * -+ * \note If you are writing a uIP device driver that needs ARP -+ * (Address Resolution Protocol), e.g., when running uIP over -+ * Ethernet, you will need to call the uIP ARP code before calling -+ * this function: -+ \code -+ #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) -+ uip_len = ethernet_devicedrver_poll(); -+ if(uip_len > 0) { -+ if (BUF(ustack)->type == HTONS(UIP_ETHTYPE_IP)) { -+ uip_arp_ipin(); -+ uip_input(); -+ if (uip_len > 0) { -+ uip_arp_out(); -+ ethernet_devicedriver_send(); -+ } -+ } else if (BUF(ustack)->type == HTONS(UIP_ETHTYPE_ARP)) { -+ uip_arp_arpin(); -+ if (uip_len > 0) -+ ethernet_devicedriver_send(); -+ } -+ \endcode -+ * -+ * \hideinitializer -+ */ -+void uip_input(struct uip_stack *ustack) -+{ -+ uip_process(ustack, UIP_DATA); -+} -+ -+/** -+ * Periodic processing for a connection identified by its number. -+ * -+ * This function does the necessary periodic processing (timers, -+ * polling) for a uIP TCP conneciton, and should be called when the -+ * periodic uIP timer goes off. It should be called for every -+ * connection, regardless of whether they are open of closed. -+ * -+ * When the function returns, it may have an outbound packet waiting -+ * for service in the uIP packet buffer, and if so the uip_len -+ * variable is set to a value larger than zero. The device driver -+ * should be called to send out the packet. -+ * -+ * The ususal way of calling the function is through a for() loop like -+ * this: -+ \code -+ for(i = 0; i < UIP_CONNS; ++i) { -+ uip_periodic(i); -+ if(uip_len > 0) { -+ devicedriver_send(); -+ } -+ } -+ \endcode -+ * -+ * \note If you are writing a uIP device driver that needs ARP -+ * (Address Resolution Protocol), e.g., when running uIP over -+ * Ethernet, you will need to call the uip_arp_out() function before -+ * calling the device driver: -+ \code -+ for(i = 0; i < UIP_CONNS; ++i) { -+ uip_periodic(i); -+ if(uip_len > 0) { -+ uip_arp_out(); -+ ethernet_devicedriver_send(); -+ } -+ } -+ \endcode -+ * -+ * \param conn The number of the connection which is to be periodically polled. -+ * -+ * \hideinitializer -+ */ -+void uip_periodic(struct uip_stack *ustack, int conn) -+{ -+ ustack->uip_conn = &ustack->uip_conns[conn]; -+ uip_process(ustack, UIP_TIMER); -+} -+ -+#if UIP_UDP -+/** -+ * Periodic processing for a UDP connection identified by its number. -+ * -+ * This function is essentially the same as uip_periodic(), but for -+ * UDP connections. It is called in a similar fashion as the -+ * uip_periodic() function: -+ \code -+ for(i = 0; i < UIP_UDP_CONNS; i++) { -+ uip_udp_periodic(i); -+ if(uip_len > 0) { -+ devicedriver_send(); -+ } -+ } -+ \endcode -+ * -+ * \note As for the uip_periodic() function, special care has to be -+ * taken when using uIP together with ARP and Ethernet: -+ \code -+ for(i = 0; i < UIP_UDP_CONNS; i++) { -+ uip_udp_periodic(i); -+ if(uip_len > 0) { -+ uip_arp_out(); -+ ethernet_devicedriver_send(); -+ } -+ } -+ \endcode -+ * -+ * \param conn The number of the UDP connection to be processed. -+ * -+ * \hideinitializer -+ */ -+void uip_udp_periodic(struct uip_stack *ustack, int conn) -+{ -+ ustack->uip_udp_conn = &ustack->uip_udp_conns[conn]; -+ uip_process(ustack, UIP_UDP_TIMER); -+} -+#endif -+ -+void uip_ndp_periodic(struct uip_stack *ustack) -+{ -+ uip_process(ustack, UIP_NDP_TIMER); -+} -+ -+void uip_process(struct uip_stack *ustack, u8_t flag) -+{ -+ u8_t c; -+ u16_t tmp16; -+ register struct uip_conn *uip_connr = ustack->uip_conn; -+ -+ u16_t uip_iph_len = 0; -+ u16_t uip_ip_udph_len = 0; -+ u16_t uip_ip_tcph_len = 0; -+ struct ip6_hdr *ipv6_hdr = NULL; -+ struct uip_tcp_ipv4_hdr *tcp_ipv4_hdr = NULL; -+ struct uip_tcp_hdr *tcp_hdr = NULL; -+ struct uip_icmpv4_hdr *icmpv4_hdr = NULL; -+ struct uip_icmpv6_hdr *icmpv6_hdr = NULL; -+ struct uip_udp_hdr *udp_hdr = NULL; -+ -+ /* Drop invalid packets */ -+ if (ustack->uip_buf == NULL) { -+ LOG_ERR(PFX "ustack->uip_buf == NULL."); -+ return; -+ } -+ -+ if (is_ipv6(ustack)) { -+ uint8_t *buf; -+ uip_iph_len = UIP_IPv6_H_LEN; -+ uip_ip_udph_len = UIP_IPv6_UDPH_LEN; -+ uip_ip_tcph_len = UIP_IPv6_TCPH_LEN; -+ -+ ipv6_hdr = (struct ip6_hdr *)ustack->network_layer; -+ -+ buf = ustack->network_layer; -+ buf += sizeof(struct uip_ipv6_hdr); -+ tcp_hdr = (struct uip_tcp_hdr *)buf; -+ -+ buf = ustack->network_layer; -+ buf += sizeof(struct uip_ipv6_hdr); -+ udp_hdr = (struct uip_udp_hdr *)buf; -+ -+ buf = ustack->network_layer; -+ buf += sizeof(struct uip_ipv6_hdr); -+ icmpv6_hdr = (struct uip_icmpv6_hdr *)buf; -+ } else { -+ uint8_t *buf; -+ -+ uip_iph_len = UIP_IPv4_H_LEN; -+ uip_ip_udph_len = UIP_IPv4_UDPH_LEN; -+ uip_ip_tcph_len = UIP_IPv4_TCPH_LEN; -+ -+ tcp_ipv4_hdr = (struct uip_tcp_ipv4_hdr *)ustack->network_layer; -+ -+ buf = ustack->network_layer; -+ buf += sizeof(struct uip_ipv4_hdr); -+ tcp_hdr = (struct uip_tcp_hdr *)buf; -+ -+ buf = ustack->network_layer; -+ buf += sizeof(struct uip_ipv4_hdr); -+ icmpv4_hdr = (struct uip_icmpv4_hdr *)buf; -+ -+ buf = ustack->network_layer; -+ buf += sizeof(struct uip_ipv4_hdr); -+ udp_hdr = (struct uip_udp_hdr *)buf; -+ } /* End of ipv6 */ -+ -+#if UIP_UDP -+ if (flag == UIP_UDP_SEND_CONN) -+ goto udp_send; -+#endif /* UIP_UDP */ -+ ustack->uip_sappdata = ustack->uip_appdata = ustack->network_layer + -+ uip_ip_tcph_len; -+ -+ /* Check if we were invoked because of a poll request for a -+ particular connection. */ -+ if (flag == UIP_POLL_REQUEST) { -+ if ((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED -+ && !uip_outstanding(uip_connr)) { -+ ustack->uip_flags = UIP_POLL; -+ UIP_APPCALL(ustack); -+ goto appsend; -+ } -+ goto drop; -+ -+ /* Check if we were invoked because of the perodic timer -+ firing. */ -+ } else if (flag == UIP_TIMER) { -+#if UIP_REASSEMBLY -+ if (uip_reasstmr != 0) -+ --uip_reasstmr; -+#endif /* UIP_REASSEMBLY */ -+ /* Increase the initial sequence number. */ -+ if (++ustack->iss[3] == 0) { -+ if (++ustack->iss[2] == 0) { -+ if (++ustack->iss[1] == 0) -+ ++ustack->iss[0]; -+ } -+ } -+ -+ /* Reset the length variables. */ -+ ustack->uip_len = 0; -+ ustack->uip_slen = 0; -+ -+ /* Check if the connection is in a state in which we simply wait -+ for the connection to time out. If so, we increase the -+ connection's timer and remove the connection if it times -+ out. */ -+ if (uip_connr->tcpstateflags == UIP_TIME_WAIT || -+ uip_connr->tcpstateflags == UIP_FIN_WAIT_2) { -+ ++(uip_connr->timer); -+ if (uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) -+ uip_connr->tcpstateflags = UIP_CLOSED; -+ } else if (uip_connr->tcpstateflags != UIP_CLOSED) { -+ /* If the connection has outstanding data, we increase -+ the connection's timer and see if it has reached the -+ RTO value in which case we retransmit. */ -+ if (uip_outstanding(uip_connr)) { -+ if (uip_connr->timer-- == 0) { -+ if (uip_connr->nrtx == UIP_MAXRTX || -+ ((uip_connr->tcpstateflags == -+ UIP_SYN_SENT -+ || uip_connr->tcpstateflags == -+ UIP_SYN_RCVD) -+ && uip_connr->nrtx == -+ UIP_MAXSYNRTX)) { -+ uip_connr->tcpstateflags = -+ UIP_CLOSED; -+ -+ /* We call UIP_APPCALL() with -+ uip_flags set to UIP_TIMEDOUT -+ to inform the application -+ that the connection has timed -+ out. */ -+ ustack->uip_flags = -+ UIP_TIMEDOUT; -+ UIP_APPCALL(ustack); -+ -+ /* We also send a reset packet -+ to the remote host. */ -+ tcp_hdr->flags = -+ TCP_RST | TCP_ACK; -+ goto tcp_send_nodata; -+ } -+ -+ /* Exponential backoff. */ -+ uip_connr->timer = -+ UIP_RTO << (uip_connr->nrtx > -+ 4 ? 4 : uip_connr-> -+ nrtx); -+ ++(uip_connr->nrtx); -+ -+ /* Ok, so we need to retransmit. -+ We do this differently depending on -+ which state we are in. -+ In ESTABLISHED, we call upon the -+ application so that it may prepare -+ the data for the retransmit. -+ In SYN_RCVD, we resend the SYNACK -+ that we sent earlier and in LAST_ACK -+ we have to retransmit our FINACK. */ -+ ++ustack->stats.tcp.rexmit; -+ switch (uip_connr-> -+ tcpstateflags & UIP_TS_MASK) { -+ case UIP_SYN_RCVD: -+ /* In the SYN_RCVD state, we -+ should retransmit our SYNACK -+ */ -+ goto tcp_send_synack; -+#if UIP_ACTIVE_OPEN -+ case UIP_SYN_SENT: -+ /* In the SYN_SENT state, -+ we retransmit out SYN. */ -+ tcp_hdr->flags = 0; -+ goto tcp_send_syn; -+#endif /* UIP_ACTIVE_OPEN */ -+ -+ case UIP_ESTABLISHED: -+ /* In the ESTABLISHED state, -+ we call upon the application -+ to do the actual retransmit -+ after which we jump into -+ the code for sending out the -+ packet (the apprexmit -+ label). */ -+ ustack->uip_flags = UIP_REXMIT; -+ UIP_APPCALL(ustack); -+ goto apprexmit; -+ -+ case UIP_FIN_WAIT_1: -+ case UIP_CLOSING: -+ case UIP_LAST_ACK: -+ /* In all these states we should -+ retransmit a FINACK. */ -+ goto tcp_send_finack; -+ -+ } -+ } -+ } else if ((uip_connr->tcpstateflags & UIP_TS_MASK) == -+ UIP_ESTABLISHED) { -+ /* If there was no need for a retransmission, -+ we poll the application for new data. */ -+ ustack->uip_flags = UIP_POLL; -+ UIP_APPCALL(ustack); -+ goto appsend; -+ } -+ } -+ goto drop; -+ } /* End of UIP_TIMER */ -+#if UIP_UDP -+ if (flag == UIP_UDP_TIMER) { -+ /* This is for IPv4 DHCP only! */ -+ if (ustack->uip_udp_conn->lport != 0) { -+ ustack->uip_conn = NULL; -+ ustack->uip_sappdata = ustack->uip_appdata = -+ ustack->network_layer + uip_ip_udph_len; -+ ustack->uip_len = ustack->uip_slen = 0; -+ ustack->uip_flags = UIP_POLL; -+ UIP_UDP_APPCALL(ustack); -+ goto udp_send; -+ } else { -+ goto drop; -+ } -+ } -+#endif -+ if (flag == UIP_NDP_TIMER) { -+ /* This is for IPv6 NDP Only! */ -+ if (1) { /* If NDP engine active */ -+ ustack->uip_len = ustack->uip_slen = 0; -+ ustack->uip_flags = UIP_POLL; -+ goto ndp_send; -+ } -+ } -+ -+ /* This is where the input processing starts. */ -+ ++ustack->stats.ip.recv; -+ -+ /* Start of IP input header processing code. */ -+ -+ if (is_ipv6(ustack)) { -+ u8_t version = ((ipv6_hdr->ip6_vfc) & 0xf0) >> 4; -+ -+ /* Check validity of the IP header. */ -+ if (version != 0x6) { /* IP version and header length. */ -+ ++ustack->stats.ip.drop; -+ ++ustack->stats.ip.vhlerr; -+ LOG_DEBUG(PFX "ipv6: invalid version(0x%x).", version); -+ goto drop; -+ } -+ } else { -+ /* Check validity of the IP header. */ -+ if (tcp_ipv4_hdr->vhl != 0x45) { -+ /* IP version and header length. */ -+ ++ustack->stats.ip.drop; -+ ++ustack->stats.ip.vhlerr; -+ LOG_DEBUG(PFX -+ "ipv4: invalid version or header length: " -+ "0x%x.", -+ tcp_ipv4_hdr->vhl); -+ goto drop; -+ } -+ } -+ -+ /* Check the size of the packet. If the size reported to us in -+ uip_len is smaller the size reported in the IP header, we assume -+ that the packet has been corrupted in transit. If the size of -+ uip_len is larger than the size reported in the IP packet header, -+ the packet has been padded and we set uip_len to the correct -+ value.. */ -+ -+ if (is_ipv6(ustack)) { -+ u16_t len = ntohs(ipv6_hdr->ip6_plen); -+ if (len > ustack->uip_len) { -+ LOG_DEBUG(PFX -+ "ip: packet shorter than reported in IP header" -+ ":IPv6_BUF(ustack)->len: %d ustack->uip_len: " -+ "%d", len, ustack->uip_len); -+ goto drop; -+ } -+ } else { -+ if ((tcp_ipv4_hdr->len[0] << 8) + -+ tcp_ipv4_hdr->len[1] <= ustack->uip_len) { -+ ustack->uip_len = (tcp_ipv4_hdr->len[0] << 8) + -+ tcp_ipv4_hdr->len[1]; -+ } else { -+ LOG_DEBUG(PFX -+ "ip: packet shorter than reported in IP header" -+ ":tcp_ipv4_hdr->len: %d ustack->uip_len:%d.", -+ (tcp_ipv4_hdr->len[0] << 8) + -+ tcp_ipv4_hdr->len[1], ustack->uip_len); -+ goto drop; -+ } -+ } -+ -+ if (!is_ipv6(ustack)) { -+ /* Check the fragment flag. */ -+ if ((tcp_ipv4_hdr->ipoffset[0] & 0x3f) != 0 || -+ tcp_ipv4_hdr->ipoffset[1] != 0) { -+#if UIP_REASSEMBLY -+ uip_len = uip_reass(); -+ if (uip_len == 0) -+ goto drop; -+#else /* UIP_REASSEMBLY */ -+ ++ustack->stats.ip.drop; -+ ++ustack->stats.ip.fragerr; -+ LOG_WARN(PFX "ip: fragment dropped."); -+ goto drop; -+#endif /* UIP_REASSEMBLY */ -+ } -+ } -+ -+ if (!is_ipv6(ustack)) { -+ /* ipv4 */ -+ if (uip_ip4addr_cmp(ustack->hostaddr, all_zeroes_addr4)) { -+ /* If we are configured to use ping IP address -+ configuration and hasn't been assigned an IP -+ address yet, we accept all ICMP packets. */ -+#if UIP_PINGADDRCONF && !UIP_CONF_IPV6 -+ if (tcp_ipv4_hdr->proto == UIP_PROTO_ICMP) { -+ LOG_WARN(PFX -+ "ip: possible ping config packet " -+ "received."); -+ goto icmp_input; -+ } else { -+ LOG_WARN(PFX -+ "ip: packet dropped since no " -+ "address assigned."); -+ goto drop; -+ } -+#endif /* UIP_PINGADDRCONF */ -+ } else { -+ int broadcast_addr = 0xFFFFFFFF; -+ /* If IP broadcast support is configured, we check for -+ a broadcast UDP packet, which may be destined to us -+ */ -+ if ((tcp_ipv4_hdr->proto == UIP_PROTO_UDP) && -+ (uip_ip4addr_cmp -+ (tcp_ipv4_hdr->destipaddr, &broadcast_addr)) -+ /*&& -+ uip_ipchksum() == 0xffff */ -+ ) { -+ goto udp_input; -+ } -+ -+ /* Check if the packet is destined for our IP address -+ */ -+ if (!uip_ip4addr_cmp(tcp_ipv4_hdr->destipaddr, -+ ustack->hostaddr)) { -+ ++ustack->stats.ip.drop; -+ goto drop; -+ } -+ } -+ if (uip_ipchksum(ustack) != 0xffff) { -+ /* Compute and check the IP header checksum. */ -+ ++ustack->stats.ip.drop; -+ ++ustack->stats.ip.chkerr; -+ LOG_ERR(PFX "ip: bad checksum."); -+ goto drop; -+ } -+ } /* End of ipv4 */ -+ -+ if (is_ipv6(ustack)) { -+ if (ipv6_hdr->ip6_nxt == UIP_PROTO_TCP) { -+ /* Check for TCP packet. If so, proceed with TCP input -+ processing. */ -+ goto ndp_newdata; -+ } -+#if UIP_UDP -+ if (ipv6_hdr->ip6_nxt == UIP_PROTO_UDP) -+ goto ndp_newdata; -+#endif /* UIP_UDP */ -+ -+ /* This is IPv6 ICMPv6 processing code. */ -+ if (ipv6_hdr->ip6_nxt != UIP_PROTO_ICMP6) { -+ /* We only allow ICMPv6 packets from here. */ -+ ++ustack->stats.ip.drop; -+ ++ustack->stats.ip.protoerr; -+ goto drop; -+ } -+ -+ ++ustack->stats.icmp.recv; -+ -+ndp_newdata: -+ /* This call is to handle the IPv6 Network Discovery Protocol */ -+ ustack->uip_flags = UIP_NEWDATA; -+ ustack->uip_slen = 0; -+ndp_send: -+ UIP_NDP_CALL(ustack); -+ if (ustack->uip_slen != 0) { -+ ustack->uip_len = ustack->uip_slen; -+ goto send; -+ } else { -+ goto drop; -+ } -+ } else { -+ /* IPv4 Processing */ -+ if (tcp_ipv4_hdr->proto == UIP_PROTO_TCP) { -+ /* Check for TCP packet. If so, proceed with TCP input -+ processing. */ -+ goto tcp_input; -+ } -+#if UIP_UDP -+ if (tcp_ipv4_hdr->proto == UIP_PROTO_UDP) -+ goto udp_input; -+#endif /* UIP_UDP */ -+ -+ /* ICMPv4 processing code follows. */ -+ if (tcp_ipv4_hdr->proto != UIP_PROTO_ICMP) { -+ /* We only allow ICMP packets from here. */ -+ ++ustack->stats.ip.drop; -+ ++ustack->stats.ip.protoerr; -+ LOG_DEBUG(PFX "ip: neither tcp nor icmp."); -+ goto drop; -+ } -+#if UIP_PINGADDRCONF -+icmp_input: -+#endif /* UIP_PINGADDRCONF */ -+ ++ustack->stats.icmp.recv; -+ -+ /* ICMP echo (i.e., ping) processing. This is simple, we only -+ change the ICMP type from ECHO to ECHO_REPLY and adjust the -+ ICMP checksum before we return the packet. */ -+ if (icmpv4_hdr->type != ICMP_ECHO) { -+ ++ustack->stats.icmp.drop; -+ ++ustack->stats.icmp.typeerr; -+ LOG_DEBUG(PFX "icmp: not icmp echo."); -+ goto drop; -+ } -+ -+ /* If we are configured to use ping IP address assignment, we -+ use the destination IP address of this ping packet and assign -+ it to ourself. */ -+#if UIP_PINGADDRCONF -+ if ((ustack->hostaddr[0] | ustack->hostaddr[1]) == 0) { -+ ustack->hostaddr[0] = tcp_ipv4_hdr->destipaddr[0]; -+ ustack->hostaddr[1] = tcp_ipv4_hdr->destipaddr[1]; -+ } -+#endif /* UIP_PINGADDRCONF */ -+ -+ icmpv4_hdr->type = ICMP_ECHO_REPLY; -+ -+ if (icmpv4_hdr->icmpchksum >= htons(0xffff - -+ (ICMP_ECHO << 8))) { -+ icmpv4_hdr->icmpchksum += htons(ICMP_ECHO << 8) + 1; -+ } else { -+ icmpv4_hdr->icmpchksum += htons(ICMP_ECHO << 8); -+ } -+ -+ /* Swap IP addresses. */ -+ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, -+ tcp_ipv4_hdr->srcipaddr); -+ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); -+ -+ ++ustack->stats.icmp.sent; -+ goto send; -+ -+ /* End of IPv4 input header processing code. */ -+ } -+ -+#if UIP_UDP -+ /* UDP input processing. */ -+udp_input: -+ /* UDP processing is really just a hack. We don't do anything to the -+ UDP/IP headers, but let the UDP application do all the hard -+ work. If the application sets uip_slen, it has a packet to -+ send. */ -+#if UIP_UDP_CHECKSUMS -+ ustack->uip_len = ustack->uip_len - uip_ip_udph_len; -+ ustack->uip_appdata = ustack->network_layer + uip_ip_udph_len; -+ if (UDPBUF(ustack)->udpchksum != 0 && uip_udpchksum(ustack) != 0xffff) { -+ ++ustack->stats.udp.drop; -+ ++ustack->stats.udp.chkerr; -+ LOG_DEBUG(PFX "udp: bad checksum."); -+ goto drop; -+ } -+#else /* UIP_UDP_CHECKSUMS */ -+ uip_len = uip_len - uip_ip_udph_len; -+#endif /* UIP_UDP_CHECKSUMS */ -+ -+ if (is_ipv6(ustack)) -+ goto udp_found; -+ -+ /* Demultiplex this UDP packet between the UDP "connections". */ -+ for (ustack->uip_udp_conn = &ustack->uip_udp_conns[0]; -+ ustack->uip_udp_conn < &ustack->uip_udp_conns[UIP_UDP_CONNS]; -+ ++ustack->uip_udp_conn) { -+ /* If the local UDP port is non-zero, the connection is -+ considered to be used. If so, the local port number is -+ checked against the destination port number in the -+ received packet. If the two port -+ numbers match, the remote port number is checked if the -+ connection is bound to a remote port. Finally, if the -+ connection is bound to a remote IP address, the source IP -+ address of the packet is checked. */ -+ -+ if (ustack->uip_udp_conn->lport != 0 && -+ UDPBUF(ustack)->destport == ustack->uip_udp_conn->lport && -+ (ustack->uip_udp_conn->rport == 0 || -+ UDPBUF(ustack)->srcport == ustack->uip_udp_conn->rport) && -+ (uip_ip4addr_cmp(ustack->uip_udp_conn->ripaddr, -+ all_zeroes_addr4) || -+ uip_ip4addr_cmp(ustack->uip_udp_conn->ripaddr, -+ all_ones_addr4) || -+ uip_ip4addr_cmp(tcp_ipv4_hdr->srcipaddr, -+ ustack->uip_udp_conn->ripaddr))) { -+ goto udp_found; -+ } -+ } -+ LOG_DEBUG(PFX -+ "udp: no matching connection found: dest port: %d src port: " -+ "%d", udp_hdr->destport, udp_hdr->srcport); -+ goto drop; -+ -+udp_found: -+ ustack->uip_conn = NULL; -+ ustack->uip_flags = UIP_NEWDATA; -+ ustack->uip_sappdata = ustack->uip_appdata = ustack->network_layer + -+ uip_ip_udph_len; -+ ustack->uip_slen = 0; -+ if (is_ipv6(ustack)) -+ UIP_NDP_CALL(ustack); -+ else -+ UIP_UDP_APPCALL(ustack); -+udp_send: -+ if (ustack->uip_slen == 0) -+ goto drop; -+ -+ ustack->uip_len = ustack->uip_slen + uip_ip_udph_len; -+ -+ if (is_ipv6(ustack)) { -+ goto ip_send_nolen; -+ } else { -+ tcp_ipv4_hdr->len[0] = (ustack->uip_len >> 8); -+ tcp_ipv4_hdr->len[1] = (ustack->uip_len & 0xff); -+ tcp_ipv4_hdr->ttl = ustack->uip_udp_conn->ttl; -+ tcp_ipv4_hdr->proto = UIP_PROTO_UDP; -+ } -+ -+ udp_hdr->udplen = htons(ustack->uip_slen + UIP_UDPH_LEN); -+ udp_hdr->udpchksum = 0; -+ -+ udp_hdr->srcport = ustack->uip_udp_conn->lport; -+ udp_hdr->destport = ustack->uip_udp_conn->rport; -+ -+ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); -+ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, -+ ustack->uip_udp_conn->ripaddr); -+ -+ ustack->uip_appdata = ustack->network_layer + uip_ip_tcph_len; -+ -+ if (ustack->uip_buf == NULL) { -+ LOG_WARN(PFX "uip_buf == NULL on udp send"); -+ goto drop; -+ } -+#if UIP_UDP_CHECKSUMS -+ /* Calculate UDP checksum. */ -+ udp_hdr->udpchksum = ~(uip_udpchksum(ustack)); -+ if (udp_hdr->udpchksum == 0) -+ udp_hdr->udpchksum = 0xffff; -+#endif /* UIP_UDP_CHECKSUMS */ -+ -+ goto ip_send_nolen; -+#endif /* UIP_UDP */ -+ -+ /* TCP input processing. */ -+tcp_input: -+ ++ustack->stats.tcp.recv; -+ -+ /* Start of TCP input header processing code. */ -+ -+ if (uip_tcpchksum(ustack) != 0xffff) { /* Compute and check the TCP -+ checksum. */ -+ ++ustack->stats.tcp.drop; -+ ++ustack->stats.tcp.chkerr; -+ LOG_WARN(PFX "tcp: bad checksum."); -+ goto drop; -+ } -+ -+ if (is_ipv6(ustack)) { -+ /* Demultiplex this segment. */ -+ /* First check any active connections. */ -+ for (uip_connr = &ustack->uip_conns[0]; -+ uip_connr <= &ustack->uip_conns[UIP_CONNS - 1]; -+ ++uip_connr) { -+ if (uip_connr->tcpstateflags != UIP_CLOSED && -+ tcp_hdr->destport == uip_connr->lport && -+ tcp_hdr->srcport == uip_connr->rport && -+ uip_ip6addr_cmp(IPv6_BUF(ustack)->srcipaddr, -+ uip_connr->ripaddr)) { -+ goto found; -+ } -+ } -+ } else { -+ /* Demultiplex this segment. */ -+ /* First check any active connections. */ -+ for (uip_connr = &ustack->uip_conns[0]; -+ uip_connr <= &ustack->uip_conns[UIP_CONNS - 1]; -+ ++uip_connr) { -+ if (uip_connr->tcpstateflags != UIP_CLOSED && -+ tcp_hdr->destport == uip_connr->lport && -+ tcp_hdr->srcport == uip_connr->rport && -+ uip_ip4addr_cmp(tcp_ipv4_hdr->srcipaddr, -+ uip_connr->ripaddr)) { -+ goto found; -+ } -+ } -+ } -+ -+ /* If we didn't find and active connection that expected the packet, -+ either this packet is an old duplicate, or this is a SYN packet -+ destined for a connection in LISTEN. If the SYN flag isn't set, -+ it is an old packet and we send a RST. */ -+ if ((tcp_hdr->flags & TCP_CTL) != TCP_SYN) -+ goto reset; -+ -+ tmp16 = tcp_hdr->destport; -+ /* Next, check listening connections. */ -+ for (c = 0; c < UIP_LISTENPORTS; ++c) { -+ if (tmp16 == ustack->uip_listenports[c]) -+ goto found_listen; -+ } -+ -+ /* No matching connection found, so we send a RST packet. */ -+ ++ustack->stats.tcp.synrst; -+reset: -+ -+ /* We do not send resets in response to resets. */ -+ if (tcp_hdr->flags & TCP_RST) -+ goto drop; -+ -+ ++ustack->stats.tcp.rst; -+ -+ tcp_hdr->flags = TCP_RST | TCP_ACK; -+ ustack->uip_len = uip_ip_tcph_len; -+ tcp_hdr->tcpoffset = 5 << 4; -+ -+ /* Flip the seqno and ackno fields in the TCP header. */ -+ c = tcp_hdr->seqno[3]; -+ tcp_hdr->seqno[3] = tcp_hdr->ackno[3]; -+ tcp_hdr->ackno[3] = c; -+ -+ c = tcp_hdr->seqno[2]; -+ tcp_hdr->seqno[2] = tcp_hdr->ackno[2]; -+ tcp_hdr->ackno[2] = c; -+ -+ c = tcp_hdr->seqno[1]; -+ tcp_hdr->seqno[1] = tcp_hdr->ackno[1]; -+ tcp_hdr->ackno[1] = c; -+ -+ c = tcp_hdr->seqno[0]; -+ tcp_hdr->seqno[0] = tcp_hdr->ackno[0]; -+ tcp_hdr->ackno[0] = c; -+ -+ /* We also have to increase the sequence number we are -+ acknowledging. If the least significant byte overflowed, we need -+ to propagate the carry to the other bytes as well. */ -+ if (++tcp_hdr->ackno[3] == 0) { -+ if (++tcp_hdr->ackno[2] == 0) { -+ if (++tcp_hdr->ackno[1] == 0) -+ ++tcp_hdr->ackno[0]; -+ } -+ } -+ -+ /* Swap port numbers. */ -+ tmp16 = tcp_hdr->srcport; -+ tcp_hdr->srcport = tcp_hdr->destport; -+ tcp_hdr->destport = tmp16; -+ -+ /* Swap IP addresses. */ -+ if (is_ipv6(ustack)) { -+ uip_ip6addr_copy(IPv6_BUF(ustack)->destipaddr, -+ IPv6_BUF(ustack)->srcipaddr); -+ uip_ip6addr_copy(IPv6_BUF(ustack)->srcipaddr, -+ ustack->hostaddr6); -+ } else { -+ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, -+ tcp_ipv4_hdr->srcipaddr); -+ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); -+ } -+ -+ /* And send out the RST packet! */ -+ goto tcp_send_noconn; -+ -+ /* This label will be jumped to if we matched the incoming packet -+ with a connection in LISTEN. In that case, we should create a new -+ connection and send a SYNACK in return. */ -+found_listen: -+ /* First we check if there are any connections avaliable. Unused -+ connections are kept in the same table as used connections, but -+ unused ones have the tcpstate set to CLOSED. Also, connections in -+ TIME_WAIT are kept track of and we'll use the oldest one if no -+ CLOSED connections are found. Thanks to Eddie C. Dost for a very -+ nice algorithm for the TIME_WAIT search. */ -+ uip_connr = 0; -+ for (c = 0; c < UIP_CONNS; ++c) { -+ if (ustack->uip_conns[c].tcpstateflags == UIP_CLOSED) { -+ uip_connr = &ustack->uip_conns[c]; -+ break; -+ } -+ if (ustack->uip_conns[c].tcpstateflags == UIP_TIME_WAIT) { -+ if (uip_connr == 0 || -+ ustack->uip_conns[c].timer > uip_connr->timer) { -+ uip_connr = &ustack->uip_conns[c]; -+ } -+ } -+ } -+ -+ if (uip_connr == 0) { -+ /* All connections are used already, we drop packet and hope -+ that the remote end will retransmit the packet at a time when -+ we have more spare connections. */ -+ ++ustack->stats.tcp.syndrop; -+ LOG_WARN(PFX "tcp: found no unused connections."); -+ goto drop; -+ } -+ ustack->uip_conn = uip_connr; -+ -+ /* Fill in the necessary fields for the new connection. */ -+ uip_connr->rto = uip_connr->timer = UIP_RTO; -+ uip_connr->sa = 0; -+ uip_connr->sv = 4; -+ uip_connr->nrtx = 0; -+ uip_connr->lport = tcp_hdr->destport; -+ uip_connr->rport = tcp_hdr->srcport; -+ if (is_ipv6(ustack)) { -+ uip_ip6addr_copy(uip_connr->ripaddr, -+ IPv6_BUF(ustack)->srcipaddr); -+ } else { -+ uip_ip4addr_copy(uip_connr->ripaddr, tcp_ipv4_hdr->srcipaddr); -+ } -+ uip_connr->tcpstateflags = UIP_SYN_RCVD; -+ -+ uip_connr->snd_nxt[0] = ustack->iss[0]; -+ uip_connr->snd_nxt[1] = ustack->iss[1]; -+ uip_connr->snd_nxt[2] = ustack->iss[2]; -+ uip_connr->snd_nxt[3] = ustack->iss[3]; -+ uip_connr->len = 1; -+ -+ /* rcv_nxt should be the seqno from the incoming packet + 1. */ -+ uip_connr->rcv_nxt[3] = tcp_hdr->seqno[3]; -+ uip_connr->rcv_nxt[2] = tcp_hdr->seqno[2]; -+ uip_connr->rcv_nxt[1] = tcp_hdr->seqno[1]; -+ uip_connr->rcv_nxt[0] = tcp_hdr->seqno[0]; -+ uip_add_rcv_nxt(ustack, 1); -+ -+ /* Parse the TCP MSS option, if present. */ -+ if ((tcp_hdr->tcpoffset & 0xf0) > 0x50) { -+ for (c = 0; c < ((tcp_hdr->tcpoffset >> 4) - 5) << 2;) { -+ ustack->opt = -+ ustack->uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + c]; -+ if (ustack->opt == TCP_OPT_END) { -+ /* End of options. */ -+ break; -+ } else if (ustack->opt == TCP_OPT_NOOP) { -+ ++c; -+ /* NOP option. */ -+ } else if (ustack->opt == TCP_OPT_MSS && -+ ustack->uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 1 + c] == -+ TCP_OPT_MSS_LEN) { -+ /* An MSS option with the right option length.*/ -+ tmp16 = -+ ((u16_t) ustack-> -+ uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + 2 + -+ c] << 8) | (u16_t) ustack-> -+ uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + 3 + -+ c]; -+ uip_connr->initialmss = uip_connr->mss = -+ tmp16 > UIP_TCP_MSS ? UIP_TCP_MSS : tmp16; -+ -+ /* And we are done processing options. */ -+ break; -+ } else { -+ /* All other options have a length field, so -+ that we easily can skip past them. */ -+ if (ustack-> -+ uip_buf[uip_ip_tcph_len + UIP_LLH_LEN + 1 + -+ c] == 0) { -+ /* If the length field is zero, the -+ options are malformed -+ and we don't process them further. */ -+ break; -+ } -+ c += ustack->uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 1 + c]; -+ } -+ } -+ } -+ -+ /* Our response will be a SYNACK. */ -+#if UIP_ACTIVE_OPEN -+tcp_send_synack: -+ tcp_hdr->flags = TCP_ACK; -+ -+tcp_send_syn: -+ tcp_hdr->flags |= TCP_SYN; -+#else /* UIP_ACTIVE_OPEN */ -+tcp_send_synack: -+ tcp_hdr->flags = TCP_SYN | TCP_ACK; -+#endif /* UIP_ACTIVE_OPEN */ -+ -+ /* We send out the TCP Maximum Segment Size option with our -+ SYNACK. */ -+ tcp_hdr->optdata[0] = TCP_OPT_MSS; -+ tcp_hdr->optdata[1] = TCP_OPT_MSS_LEN; -+ tcp_hdr->optdata[2] = (UIP_TCP_MSS) / 256; -+ tcp_hdr->optdata[3] = (UIP_TCP_MSS) & 255; -+ ustack->uip_len = uip_ip_tcph_len + TCP_OPT_MSS_LEN; -+ tcp_hdr->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4; -+ goto tcp_send; -+ -+ /* This label will be jumped to if we found an active connection. */ -+found: -+ ustack->uip_conn = uip_connr; -+ ustack->uip_flags = 0; -+ /* We do a very naive form of TCP reset processing; we just accept -+ any RST and kill our connection. We should in fact check if the -+ sequence number of this reset is wihtin our advertised window -+ before we accept the reset. */ -+ if (tcp_hdr->flags & TCP_RST) { -+ uip_connr->tcpstateflags = UIP_CLOSED; -+ LOG_WARN(PFX "tcp: got reset, aborting connection."); -+ ustack->uip_flags = UIP_ABORT; -+ UIP_APPCALL(ustack); -+ goto drop; -+ } -+ /* Calculated the length of the data, if the application has sent -+ any data to us. */ -+ c = (tcp_hdr->tcpoffset >> 4) << 2; -+ /* uip_len will contain the length of the actual TCP data. This is -+ calculated by subtracing the length of the TCP header (in -+ c) and the length of the IP header (20 bytes). */ -+ ustack->uip_len = ustack->uip_len - c - uip_iph_len; -+ -+ /* First, check if the sequence number of the incoming packet is -+ what we're expecting next. If not, we send out an ACK with the -+ correct numbers in. */ -+ if (!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) && -+ ((tcp_hdr->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) { -+ if ((ustack->uip_len > 0 -+ || ((tcp_hdr->flags & (TCP_SYN | TCP_FIN)) != 0)) -+ && (tcp_hdr->seqno[0] != uip_connr->rcv_nxt[0] -+ || tcp_hdr->seqno[1] != uip_connr->rcv_nxt[1] -+ || tcp_hdr->seqno[2] != uip_connr->rcv_nxt[2] -+ || tcp_hdr->seqno[3] != uip_connr->rcv_nxt[3])) { -+ goto tcp_send_ack; -+ } -+ } -+ -+ { -+ u8_t uip_acc32[4]; -+ -+ /* Next, check if the incoming segment acks any outstanding -+ data. If so, we update the sequence number, reset the len of -+ the outstanding data, calc RTT estimations, and reset the -+ retransmission timer. */ -+ if ((tcp_hdr->flags & TCP_ACK) && uip_outstanding(uip_connr)) { -+ uip_add32(uip_connr->snd_nxt, uip_connr->len, -+ uip_acc32); -+ -+ if (tcp_hdr->ackno[0] == uip_acc32[0] && -+ tcp_hdr->ackno[1] == uip_acc32[1] && -+ tcp_hdr->ackno[2] == uip_acc32[2] && -+ tcp_hdr->ackno[3] == uip_acc32[3]) { -+ /* Update sequence number. */ -+ uip_connr->snd_nxt[0] = uip_acc32[0]; -+ uip_connr->snd_nxt[1] = uip_acc32[1]; -+ uip_connr->snd_nxt[2] = uip_acc32[2]; -+ uip_connr->snd_nxt[3] = uip_acc32[3]; -+ -+ /* Do RTT estimation, unless we have done -+ retransmissions. */ -+ if (uip_connr->nrtx == 0) { -+ signed char m; -+ m = uip_connr->rto - uip_connr->timer; -+ /* This is taken directly from VJs -+ original code in his paper */ -+ m = m - (uip_connr->sa >> 3); -+ uip_connr->sa += m; -+ if (m < 0) -+ m = -m; -+ m = m - (uip_connr->sv >> 2); -+ uip_connr->sv += m; -+ uip_connr->rto = -+ (uip_connr->sa >> 3) + -+ uip_connr->sv; -+ -+ } -+ /* Set the acknowledged flag. */ -+ ustack->uip_flags = UIP_ACKDATA; -+ /* Reset the retransmission timer. */ -+ uip_connr->timer = uip_connr->rto; -+ -+ /* Reset length of outstanding data. */ -+ uip_connr->len = 0; -+ } -+ -+ } -+ -+ } -+ -+ /* Do different things depending on in what state the connection is. */ -+ switch (uip_connr->tcpstateflags & UIP_TS_MASK) { -+ /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not -+ implemented, since we force the application to close when the -+ peer sends a FIN (hence the application goes directly from -+ ESTABLISHED to LAST_ACK). */ -+ case UIP_SYN_RCVD: -+ /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, -+ and we are waiting for an ACK that acknowledges the data we -+ sent out the last time. Therefore, we want to have the -+ UIP_ACKDATA flag set. -+ If so, we enter the ESTABLISHED state. */ -+ if (ustack->uip_flags & UIP_ACKDATA) { -+ uip_connr->tcpstateflags = UIP_ESTABLISHED; -+ ustack->uip_flags = UIP_CONNECTED; -+ uip_connr->len = 0; -+ if (ustack->uip_len > 0) { -+ ustack->uip_flags |= UIP_NEWDATA; -+ uip_add_rcv_nxt(ustack, ustack->uip_len); -+ } -+ ustack->uip_slen = 0; -+ UIP_APPCALL(ustack); -+ goto appsend; -+ } -+ goto drop; -+#if UIP_ACTIVE_OPEN -+ case UIP_SYN_SENT: -+ /* In SYN_SENT, we wait for a SYNACK that is sent in response to -+ our SYN. The rcv_nxt is set to sequence number in the SYNACK -+ plus one, and we send an ACK. We move into the ESTABLISHED -+ state. */ -+ if ((ustack->uip_flags & UIP_ACKDATA) && -+ (tcp_hdr->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) { -+ -+ /* Parse the TCP MSS option, if present. */ -+ if ((tcp_hdr->tcpoffset & 0xf0) > 0x50) { -+ for (c = 0; -+ c < -+ ((tcp_hdr->tcpoffset >> 4) - 5) << 2;) { -+ ustack->opt = -+ ustack->uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + c]; -+ if (ustack->opt == TCP_OPT_END) { -+ /* End of options. */ -+ break; -+ } else if (ustack->opt == -+ TCP_OPT_NOOP) { -+ ++c; -+ /* NOP option. */ -+ } else if (ustack->opt == TCP_OPT_MSS && -+ ustack-> -+ uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 1 + -+ c] == -+ TCP_OPT_MSS_LEN) { -+ /* An MSS option with the right -+ option length. */ -+ tmp16 = -+ (ustack-> -+ uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 2 + -+ c] << 8) | ustack-> -+ uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 3 + -+ c]; -+ uip_connr->initialmss = -+ uip_connr->mss = -+ tmp16 > -+ UIP_TCP_MSS ? UIP_TCP_MSS : -+ tmp16; -+ -+ /* And we are done processing -+ options. */ -+ break; -+ } else { -+ /* All other options have a -+ length field, so that we -+ easily can skip past them */ -+ if (ustack-> -+ uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 1 + -+ c] == 0) { -+ /* If the length field -+ is zero, the options -+ are malformed and we -+ don't process them -+ further. */ -+ break; -+ } -+ c += ustack-> -+ uip_buf[uip_ip_tcph_len + -+ UIP_LLH_LEN + 1 + -+ c]; -+ } -+ } -+ } -+ uip_connr->tcpstateflags = UIP_ESTABLISHED; -+ uip_connr->rcv_nxt[0] = tcp_hdr->seqno[0]; -+ uip_connr->rcv_nxt[1] = tcp_hdr->seqno[1]; -+ uip_connr->rcv_nxt[2] = tcp_hdr->seqno[2]; -+ uip_connr->rcv_nxt[3] = tcp_hdr->seqno[3]; -+ uip_add_rcv_nxt(ustack, 1); -+ ustack->uip_flags = UIP_CONNECTED | UIP_NEWDATA; -+ uip_connr->len = 0; -+ ustack->uip_len = 0; -+ ustack->uip_slen = 0; -+ UIP_APPCALL(ustack); -+ goto appsend; -+ } -+ /* Inform the application that the connection failed */ -+ ustack->uip_flags = UIP_ABORT; -+ UIP_APPCALL(ustack); -+ /* The connection is closed after we send the RST */ -+ ustack->uip_conn->tcpstateflags = UIP_CLOSED; -+ goto reset; -+#endif /* UIP_ACTIVE_OPEN */ -+ -+ case UIP_ESTABLISHED: -+ /* In the ESTABLISHED state, we call upon the application to -+ feed data into the uip_buf. If the UIP_ACKDATA flag is set, -+ the application should put new data into the buffer, -+ otherwise we are retransmitting an old segment, and the -+ application should put that data into the buffer. -+ -+ If the incoming packet is a FIN, we should close the -+ connection on this side as well, and we send out a FIN and -+ enter the LAST_ACK state. We require that there is no -+ outstanding data; otherwise the sequence numbers will be -+ screwed up. */ -+ -+ if (tcp_hdr->flags & TCP_FIN -+ && !(uip_connr->tcpstateflags & UIP_STOPPED)) { -+ if (uip_outstanding(uip_connr)) -+ goto drop; -+ uip_add_rcv_nxt(ustack, 1 + ustack->uip_len); -+ ustack->uip_flags |= UIP_CLOSE; -+ if (ustack->uip_len > 0) -+ ustack->uip_flags |= UIP_NEWDATA; -+ UIP_APPCALL(ustack); -+ uip_connr->len = 1; -+ uip_connr->tcpstateflags = UIP_LAST_ACK; -+ uip_connr->nrtx = 0; -+tcp_send_finack: -+ tcp_hdr->flags = TCP_FIN | TCP_ACK; -+ goto tcp_send_nodata; -+ } -+ -+ /* Check the URG flag. If this is set, the segment carries -+ urgent data that we must pass to the application. */ -+ if ((tcp_hdr->flags & TCP_URG) != 0) { -+#if UIP_URGDATA > 0 -+ uip_urglen = (tcp_hdr->urgp[0] << 8) | tcp_hdr->urgp[1]; -+ if (uip_urglen > uip_len) { -+ /* There is more urgent data in the next segment -+ to come. */ -+ uip_urglen = uip_len; -+ } -+ uip_add_rcv_nxt(uip_urglen); -+ uip_len -= uip_urglen; -+ uip_urgdata = uip_appdata; -+ uip_appdata += uip_urglen; -+ } else { -+ uip_urglen = 0; -+#else /* UIP_URGDATA > 0 */ -+ ustack->uip_appdata = -+ ((char *)ustack->uip_appdata) + -+ ((tcp_hdr->urgp[0] << 8) | tcp_hdr->urgp[1]); -+ ustack->uip_len -= -+ (tcp_hdr->urgp[0] << 8) | tcp_hdr->urgp[1]; -+#endif /* UIP_URGDATA > 0 */ -+ } -+ -+ /* If uip_len > 0 we have TCP data in the packet, and we flag -+ this by setting the UIP_NEWDATA flag and update the sequence -+ number we acknowledge. If the application has stopped the -+ dataflow using uip_stop(), we must not accept any data -+ packets from the remote host. */ -+ if (ustack->uip_len > 0 -+ && !(uip_connr->tcpstateflags & UIP_STOPPED)) { -+ ustack->uip_flags |= UIP_NEWDATA; -+ uip_add_rcv_nxt(ustack, ustack->uip_len); -+ } -+ -+ /* Check if the available buffer space advertised by the other -+ end is smaller than the initial MSS for this connection. -+ If so, we set the current MSS to the window size to ensure -+ that the application does not send more data than the other -+ end can handle. -+ -+ If the remote host advertises a zero window, we set the MSS -+ to the initial MSS so that the application will send an -+ entire MSS of data. This data will not be acknowledged by -+ the receiver, and the application will retransmit it. -+ This is called the "persistent timer" and uses the -+ retransmission mechanim. -+ */ -+ tmp16 = -+ ((u16_t) tcp_hdr->wnd[0] << 8) + (u16_t) tcp_hdr->wnd[1]; -+ if (tmp16 > uip_connr->initialmss || tmp16 == 0) -+ tmp16 = uip_connr->initialmss; -+ uip_connr->mss = tmp16; -+ -+ /* If this packet constitutes an ACK for outstanding data -+ (flagged by the UIP_ACKDATA flag, we should call the -+ application since it might want to send more data. -+ If the incoming packet had data from the peer -+ (as flagged by the UIP_NEWDATA flag), the application -+ must also be notified. -+ -+ When the application is called, the global variable uip_len -+ contains the length of the incoming data. The application can -+ access the incoming data through the global pointer -+ uip_appdata, which usually points uip_ip_tcph_len + -+ UIP_LLH_LEN bytes into the uip_buf array. -+ -+ If the application wishes to send any data, this data should -+ be put into the uip_appdata and the length of the data should -+ be put into uip_len. If the application don't have any data -+ to send, uip_len must be set to 0. */ -+ if (ustack->uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) { -+ ustack->uip_slen = 0; -+ UIP_APPCALL(ustack); -+ -+appsend: -+ -+ if (ustack->uip_flags & UIP_ABORT) { -+ ustack->uip_slen = 0; -+ uip_connr->tcpstateflags = UIP_CLOSED; -+ tcp_hdr->flags = TCP_RST | TCP_ACK; -+ goto tcp_send_nodata; -+ } -+ -+ if (ustack->uip_flags & UIP_CLOSE) { -+ ustack->uip_slen = 0; -+ uip_connr->len = 1; -+ uip_connr->tcpstateflags = UIP_FIN_WAIT_1; -+ uip_connr->nrtx = 0; -+ tcp_hdr->flags = TCP_FIN | TCP_ACK; -+ goto tcp_send_nodata; -+ } -+ -+ /* If uip_slen > 0, the application has data to be sent -+ */ -+ if (ustack->uip_slen > 0) { -+ -+ /* If the connection has acknowledged data, the -+ contents of the ->len variable should be -+ discarded. */ -+ if ((ustack->uip_flags & UIP_ACKDATA) != 0) -+ uip_connr->len = 0; -+ -+ /* If the ->len variable is non-zero the -+ connection has already data in transit and -+ cannot send anymore right now. */ -+ if (uip_connr->len == 0) { -+ -+ /* The application cannot send more than -+ what is allowed by the mss (the -+ minumum of the MSS and the available -+ window). */ -+ if (ustack->uip_slen > uip_connr->mss) { -+ ustack->uip_slen = -+ uip_connr->mss; -+ } -+ -+ /* Remember how much data we send out -+ now so that we know when everything -+ has been acknowledged. */ -+ uip_connr->len = ustack->uip_slen; -+ } else { -+ -+ /* If the application already had -+ unacknowledged data, we make sure -+ that the application does not send -+ (i.e., retransmit) out more than it -+ previously sent out. */ -+ ustack->uip_slen = uip_connr->len; -+ } -+ } -+ uip_connr->nrtx = 0; -+apprexmit: -+ ustack->uip_appdata = ustack->uip_sappdata; -+ -+ /* If the application has data to be sent, or if the -+ incoming packet had new data in it, we must send -+ out a packet. */ -+ if (ustack->uip_slen > 0 && uip_connr->len > 0) { -+ /* Add the length of the IP and TCP headers. */ -+ ustack->uip_len = -+ uip_connr->len + uip_ip_tcph_len; -+ /* We always set the ACK flag in response -+ packets. */ -+ tcp_hdr->flags = TCP_ACK | TCP_PSH; -+ /* Send the packet. */ -+ goto tcp_send_noopts; -+ } -+ /* If there is no data to send, just send out a pure ACK -+ if there is newdata. */ -+ if (ustack->uip_flags & UIP_NEWDATA) { -+ ustack->uip_len = uip_ip_tcph_len; -+ tcp_hdr->flags = TCP_ACK; -+ goto tcp_send_noopts; -+ } -+ } -+ goto drop; -+ case UIP_LAST_ACK: -+ /* We can close this connection if the peer has acknowledged our -+ FIN. This is indicated by the UIP_ACKDATA flag. */ -+ if (ustack->uip_flags & UIP_ACKDATA) { -+ uip_connr->tcpstateflags = UIP_CLOSED; -+ ustack->uip_flags = UIP_CLOSE; -+ UIP_APPCALL(ustack); -+ } -+ break; -+ -+ case UIP_FIN_WAIT_1: -+ /* The application has closed the connection, but the remote -+ host hasn't closed its end yet. Thus we do nothing but wait -+ for a FIN from the other side. */ -+ if (ustack->uip_len > 0) -+ uip_add_rcv_nxt(ustack, ustack->uip_len); -+ if (tcp_hdr->flags & TCP_FIN) { -+ if (ustack->uip_flags & UIP_ACKDATA) { -+ uip_connr->tcpstateflags = UIP_TIME_WAIT; -+ uip_connr->timer = 0; -+ uip_connr->len = 0; -+ } else { -+ uip_connr->tcpstateflags = UIP_CLOSING; -+ } -+ uip_add_rcv_nxt(ustack, 1); -+ ustack->uip_flags = UIP_CLOSE; -+ UIP_APPCALL(ustack); -+ goto tcp_send_ack; -+ } else if (ustack->uip_flags & UIP_ACKDATA) { -+ uip_connr->tcpstateflags = UIP_FIN_WAIT_2; -+ uip_connr->len = 0; -+ goto drop; -+ } -+ if (ustack->uip_len > 0) -+ goto tcp_send_ack; -+ goto drop; -+ -+ case UIP_FIN_WAIT_2: -+ if (ustack->uip_len > 0) -+ uip_add_rcv_nxt(ustack, ustack->uip_len); -+ if (tcp_hdr->flags & TCP_FIN) { -+ uip_connr->tcpstateflags = UIP_TIME_WAIT; -+ uip_connr->timer = 0; -+ uip_add_rcv_nxt(ustack, 1); -+ ustack->uip_flags = UIP_CLOSE; -+ UIP_APPCALL(ustack); -+ goto tcp_send_ack; -+ } -+ if (ustack->uip_len > 0) -+ goto tcp_send_ack; -+ goto drop; -+ -+ case UIP_TIME_WAIT: -+ goto tcp_send_ack; -+ -+ case UIP_CLOSING: -+ if (ustack->uip_flags & UIP_ACKDATA) { -+ uip_connr->tcpstateflags = UIP_TIME_WAIT; -+ uip_connr->timer = 0; -+ } -+ } -+ goto drop; -+ -+ /* We jump here when we are ready to send the packet, and just want -+ to set the appropriate TCP sequence numbers in the TCP header. */ -+tcp_send_ack: -+ tcp_hdr->flags = TCP_ACK; -+tcp_send_nodata: -+ ustack->uip_len = uip_ip_tcph_len; -+tcp_send_noopts: -+ tcp_hdr->tcpoffset = (UIP_TCPH_LEN / 4) << 4; -+tcp_send: -+ /* We're done with the input processing. We are now ready to send a -+ reply. Our job is to fill in all the fields of the TCP and IP -+ headers before calculating the checksum and finally send the -+ packet. */ -+ tcp_hdr->ackno[0] = uip_connr->rcv_nxt[0]; -+ tcp_hdr->ackno[1] = uip_connr->rcv_nxt[1]; -+ tcp_hdr->ackno[2] = uip_connr->rcv_nxt[2]; -+ tcp_hdr->ackno[3] = uip_connr->rcv_nxt[3]; -+ -+ tcp_hdr->seqno[0] = uip_connr->snd_nxt[0]; -+ tcp_hdr->seqno[1] = uip_connr->snd_nxt[1]; -+ tcp_hdr->seqno[2] = uip_connr->snd_nxt[2]; -+ tcp_hdr->seqno[3] = uip_connr->snd_nxt[3]; -+ -+ if (is_ipv6(ustack)) { -+ IPv6_BUF(ustack)->proto = UIP_PROTO_TCP; -+ uip_ip6addr_copy(IPv6_BUF(ustack)->srcipaddr, -+ ustack->hostaddr6); -+ uip_ip6addr_copy(IPv6_BUF(ustack)->destipaddr, -+ uip_connr->ripaddr6); -+ } else { -+ tcp_ipv4_hdr->proto = UIP_PROTO_TCP; -+ uip_ip4addr_copy(tcp_ipv4_hdr->srcipaddr, ustack->hostaddr); -+ uip_ip4addr_copy(tcp_ipv4_hdr->destipaddr, uip_connr->ripaddr); -+ } -+ -+ tcp_hdr->srcport = uip_connr->lport; -+ tcp_hdr->destport = uip_connr->rport; -+ -+ if (uip_connr->tcpstateflags & UIP_STOPPED) { -+ /* If the connection has issued uip_stop(), we advertise a zero -+ window so that the remote host will stop sending data. */ -+ tcp_hdr->wnd[0] = tcp_hdr->wnd[1] = 0; -+ } else { -+ tcp_hdr->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8); -+ tcp_hdr->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff); -+ } -+ -+tcp_send_noconn: -+ if (is_ipv6(ustack)) { -+ IPv6_BUF(ustack)->ttl = UIP_TTL; -+ -+ /* For IPv6, the IP length field does not include the IPv6 IP -+ header length. */ -+ IPv6_BUF(ustack)->len[0] = -+ ((ustack->uip_len - uip_iph_len) >> 8); -+ IPv6_BUF(ustack)->len[1] = -+ ((ustack->uip_len - uip_iph_len) & 0xff); -+ } else { -+ tcp_ipv4_hdr->ttl = UIP_TTL; -+ tcp_ipv4_hdr->len[0] = (ustack->uip_len >> 8); -+ tcp_ipv4_hdr->len[1] = (ustack->uip_len & 0xff); -+ } -+ -+ tcp_hdr->urgp[0] = tcp_hdr->urgp[1] = 0; -+ -+ /* Calculate TCP checksum. */ -+ tcp_hdr->tcpchksum = 0; -+ tcp_hdr->tcpchksum = ~(uip_tcpchksum(ustack)); -+ -+ip_send_nolen: -+ -+ if (!is_ipv6(ustack)) { -+ tcp_ipv4_hdr->vhl = 0x45; -+ tcp_ipv4_hdr->tos = 0; -+ tcp_ipv4_hdr->ipoffset[0] = tcp_ipv4_hdr->ipoffset[1] = 0; -+ ++ustack->ipid; -+ tcp_ipv4_hdr->ipid[0] = ustack->ipid >> 8; -+ tcp_ipv4_hdr->ipid[1] = ustack->ipid & 0xff; -+ /* Calculate IP checksum. */ -+ tcp_ipv4_hdr->ipchksum = 0; -+ tcp_ipv4_hdr->ipchksum = ~(uip_ipchksum(ustack)); -+ } -+ -+ ++ustack->stats.tcp.sent; -+send: -+ if (is_ipv6(ustack)) { -+ LOG_DEBUG(PFX "Sending packet with length %d (%d)", -+ ustack->uip_len, ipv6_hdr ? ipv6_hdr->ip6_plen : 0); -+ } else { -+ LOG_DEBUG(PFX "Sending packet with length %d (%d)", -+ ustack->uip_len, -+ (tcp_ipv4_hdr->len[0] << 8) | tcp_ipv4_hdr->len[1]); -+ } -+ ++ustack->stats.ip.sent; -+ /* Return and let the caller do the actual transmission. */ -+ ustack->uip_flags = 0; -+ return; -+drop: -+ ustack->uip_len = 0; -+ ustack->uip_flags = 0; -+ return; -+} -+ -+/*---------------------------------------------------------------------------*/ -+void uip_send(struct uip_stack *ustack, const void *data, int len) -+{ -+ if (len > 0) { -+ ustack->uip_slen = len; -+ if (data != ustack->uip_buf) -+ memcpy(ustack->uip_buf, (data), ustack->uip_slen); -+ } -+} -+ -+void uip_appsend(struct uip_stack *ustack, const void *data, int len) -+{ -+ if (len > 0) { -+ ustack->uip_slen = len; -+ if (data != ustack->uip_sappdata) -+ memcpy(ustack->uip_sappdata, (data), ustack->uip_slen); -+ } -+} -+ -+u16_t uip_datalen(struct uip_stack *ustack) -+{ -+ return ustack->uip_len; -+} -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/uip.h b/iscsiuio/src/uip/uip.h -new file mode 100644 -index 0000000..0225f6a ---- /dev/null -+++ b/iscsiuio/src/uip/uip.h -@@ -0,0 +1,1569 @@ -+ -+/** -+ * \addtogroup uip -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Header file for the uIP TCP/IP stack. -+ * \author Adam Dunkels -+ * -+ * The uIP TCP/IP stack header file contains definitions for a number -+ * of C macros that are used by uIP programs as well as internal uIP -+ * structures, TCP/IP header structures and function declarations. -+ * -+ */ -+ -+/* -+ * Copyright (c) 2001-2003, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+#ifndef __UIP_H__ -+#define __UIP_H__ -+ -+#include -+#include -+ -+#include "uipopt.h" -+ -+#include "debug.h" -+ -+#include "uip_eth.h" -+ -+/* Forware declaration */ -+struct uip_stack; -+ -+/** -+ * Repressentation of an IP address. -+ * -+ */ -+typedef u16_t uip_ip4addr_t[2]; -+typedef u16_t uip_ip6addr_t[8]; -+ -+const uip_ip6addr_t all_zeroes_addr6; -+const uip_ip4addr_t all_zeroes_addr4; -+ -+#define ETH_BUF(buf) ((struct uip_eth_hdr *)buf) -+#define VLAN_ETH_BUF(buf) ((struct uip_vlan_eth_hdr *)buf) -+#define IPv4_BUF(buf) ((struct uip_tcp_ipv4_hdr *)buf) -+#define IPv6_BUF(buf) ((struct uip_tcp_ipv6_hdr *)buf) -+ -+/*---------------------------------------------------------------------------*/ -+/* First, the functions that should be called from the -+ * system. Initialization, the periodic timer and incoming packets are -+ * handled by the following three functions. -+ */ -+ -+/** -+ * Set the IP address of this host. -+ * -+ * The IP address is represented as a 4-byte array where the first -+ * octet of the IP address is put in the first member of the 4-byte -+ * array. -+ * -+ * Example: -+ \code -+ -+ uip_ipaddr_t addr; -+ -+ uip_ipaddr(&addr, 192,168,1,2); -+ uip_sethostaddr(&addr); -+ -+ \endcode -+ * \param addr A pointer to an IP address of type uip_ipaddr_t; -+ * -+ * \sa uip_ipaddr() -+ * -+ * \hideinitializer -+ */ -+void uip_sethostaddr4(struct uip_stack *ustack, uip_ip4addr_t *addr); -+ -+/** -+ * Set the default router's IP address. -+ * -+ * \param addr A pointer to a uip_ipaddr_t variable containing the IP -+ * address of the default router. -+ * -+ * \sa uip_ipaddr() -+ * -+ * \hideinitializer -+ */ -+void uip_setdraddr4(struct uip_stack *ustack, uip_ip4addr_t *addr); -+ -+/** -+ * Set the netmask. -+ * -+ * \param addr A pointer to a uip_ipaddr_t variable containing the IP -+ * address of the netmask. -+ * -+ * \sa uip_ipaddr() -+ * -+ * \hideinitializer -+ */ -+void uip_setnetmask4(struct uip_stack *ustack, uip_ip4addr_t *addr); -+ -+/** -+ * Set the ethernet MAC address. -+ * -+ * \param addr A pointer to a uip_ipaddr_t variable containing the IP -+ * address of the netmask. -+ * -+ * \sa uip_ipaddr() -+ * -+ * \hideinitializer -+ */ -+void uip_setethernetmac(struct uip_stack *ustack, uint8_t *mac); -+ -+/** -+ * Get the default router's IP address. -+ * -+ * \param addr A pointer to a uip_ipaddr_t variable that will be -+ * filled in with the IP address of the default router. -+ * -+ * \hideinitializer -+ */ -+#define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr) -+ -+/** -+ * Get the netmask. -+ * -+ * \param addr A pointer to a uip_ipaddr_t variable that will be -+ * filled in with the value of the netmask. -+ * -+ * \hideinitializer -+ */ -+#define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask) -+ -+void set_uip_stack(struct uip_stack *ustack, -+ uip_ip4addr_t *ip, -+ uip_ip4addr_t *netmask, -+ uip_ip4addr_t *default_route, uint8_t *mac_addr); -+ -+/** @} */ -+ -+/** -+ * \defgroup uipinit uIP initialization functions -+ * @{ -+ * -+ * The uIP initialization functions are used for booting uIP. -+ */ -+ -+/** -+ * uIP initialization function. -+ * -+ * This function should be called at boot up to initilize the uIP -+ * TCP/IP stack. -+ */ -+void uip_init(struct uip_stack *ustack, uint8_t enable_ipv6); -+ -+/** -+ * uIP reset function. -+ * -+ * This function should be called at to reset the uIP TCP/IP stack. -+ */ -+void uip_reset(struct uip_stack *ustack); -+ -+/** -+ * uIP initialization function. -+ * -+ * This function may be used at boot time to set the initial ip_id. -+ */ -+void uip_setipid(u16_t id); -+ -+/** -+ * -+ * -+ */ -+#define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED) -+ -+#if UIP_UDP -+void uip_udp_periodic(struct uip_stack *ustack, int conn); -+#endif /* UIP_UDP */ -+ -+void uip_ndp_periodic(struct uip_stack *ustack); -+ -+/** -+ * The uIP packet buffer. -+ * -+ * The uip_buf array is used to hold incoming and outgoing -+ * packets. The device driver should place incoming data into this -+ * buffer. When sending data, the device driver should read the link -+ * level headers and the TCP/IP headers from this buffer. The size of -+ * the link level headers is configured by the UIP_LLH_LEN define. -+ * -+ * \note The application data need not be placed in this buffer, so -+ * the device driver must read it from the place pointed to by the -+ * uip_appdata pointer as illustrated by the following example: -+ \code -+ void -+ devicedriver_send(void) -+ { -+ hwsend(&uip_buf[0], UIP_LLH_LEN); -+ if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { -+ hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); -+ } else { -+ hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); -+ hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); -+ } -+ } -+ \endcode -+ */ -+/*extern u8_t uip_buf[UIP_BUFSIZE+2]; */ -+ -+/** @} */ -+ -+/*---------------------------------------------------------------------------*/ -+/* Functions that are used by the uIP application program. Opening and -+ * closing connections, sending and receiving data, etc. is all -+ * handled by the functions below. -+*/ -+/** -+ * \defgroup uipappfunc uIP application functions -+ * @{ -+ * -+ * Functions used by an application running of top of uIP. -+ */ -+ -+/** -+ * Start listening to the specified port. -+ * -+ * \note Since this function expects the port number in network byte -+ * order, a conversion using HTONS() or htons() is necessary. -+ * -+ \code -+ uip_listen(HTONS(80)); -+ \endcode -+ * -+ * \param port A 16-bit port number in network byte order. -+ */ -+void uip_listen(struct uip_stack *ustack, u16_t port); -+ -+/** -+ * Stop listening to the specified port. -+ * -+ * \note Since this function expects the port number in network byte -+ * order, a conversion using HTONS() or htons() is necessary. -+ * -+ \code -+ uip_unlisten(HTONS(80)); -+ \endcode -+ * -+ * \param port A 16-bit port number in network byte order. -+ */ -+void uip_unlisten(struct uip_stack *ustack, u16_t port); -+ -+/** -+ * Connect to a remote host using TCP. -+ * -+ * This function is used to start a new connection to the specified -+ * port on the specied host. It allocates a new connection identifier, -+ * sets the connection to the SYN_SENT state and sets the -+ * retransmission timer to 0. This will cause a TCP SYN segment to be -+ * sent out the next time this connection is periodically processed, -+ * which usually is done within 0.5 seconds after the call to -+ * uip_connect(). -+ * -+ * \note This function is avaliable only if support for active open -+ * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h. -+ * -+ * \note Since this function requires the port number to be in network -+ * byte order, a conversion using HTONS() or htons() is necessary. -+ * -+ \code -+ uip_ipaddr_t ipaddr; -+ -+ uip_ipaddr(&ipaddr, 192,168,1,2); -+ uip_connect(&ipaddr, HTONS(80)); -+ \endcode -+ * -+ * \param ripaddr The IP address of the remote hot. -+ * -+ * \param port A 16-bit port number in network byte order. -+ * -+ * \return A pointer to the uIP connection identifier for the new connection, -+ * or NULL if no connection could be allocated. -+ * -+ */ -+struct uip_conn *uip_connect(struct uip_stack *ustack, -+ uip_ip4addr_t *ripaddr, u16_t port); -+ -+/** -+ * \internal -+ * -+ * Check if a connection has outstanding (i.e., unacknowledged) data. -+ * -+ * \param conn A pointer to the uip_conn structure for the connection. -+ * -+ * \hideinitializer -+ */ -+#define uip_outstanding(conn) ((conn)->len) -+ -+/** -+ * Send data on the current connection. -+ * -+ * This function is used to send out a single segment of TCP -+ * data. Only applications that have been invoked by uIP for event -+ * processing can send data. -+ * -+ * The amount of data that actually is sent out after a call to this -+ * funcion is determined by the maximum amount of data TCP allows. uIP -+ * will automatically crop the data so that only the appropriate -+ * amount of data is sent. The function uip_mss() can be used to query -+ * uIP for the amount of data that actually will be sent. -+ * -+ * \note This function does not guarantee that the sent data will -+ * arrive at the destination. If the data is lost in the network, the -+ * application will be invoked with the uip_rexmit() event being -+ * set. The application will then have to resend the data using this -+ * function. -+ * -+ * \param data A pointer to the data which is to be sent. -+ * -+ * \param len The maximum amount of data bytes to be sent. -+ * -+ * \hideinitializer -+ */ -+void uip_send(struct uip_stack *ustack, const void *data, int len); -+void uip_appsend(struct uip_stack *ustack, const void *data, int len); -+ -+/** -+ * The length of any incoming data that is currently avaliable (if avaliable) -+ * in the uip_appdata buffer. -+ * -+ * The test function uip_data() must first be used to check if there -+ * is any data available at all. -+ * -+ * \hideinitializer -+ */ -+/*void uip_datalen(void);*/ -+u16_t uip_datalen(struct uip_stack *ustack); -+ -+/** -+ * The length of any out-of-band data (urgent data) that has arrived -+ * on the connection. -+ * -+ * \note The configuration parameter UIP_URGDATA must be set for this -+ * function to be enabled. -+ * -+ * \hideinitializer -+ */ -+#define uip_urgdatalen() uip_urglen -+ -+/** -+ * Close the current connection. -+ * -+ * This function will close the current connection in a nice way. -+ * -+ * \hideinitializer -+ */ -+#define uip_close() (uip_flags = UIP_CLOSE) -+ -+/** -+ * Abort the current connection. -+ * -+ * This function will abort (reset) the current connection, and is -+ * usually used when an error has occured that prevents using the -+ * uip_close() function. -+ * -+ * \hideinitializer -+ */ -+#define uip_abort() (uip_flags = UIP_ABORT) -+ -+/** -+ * Tell the sending host to stop sending data. -+ * -+ * This function will close our receiver's window so that we stop -+ * receiving data for the current connection. -+ * -+ * \hideinitializer -+ */ -+#define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED) -+ -+/** -+ * Find out if the current connection has been previously stopped with -+ * uip_stop(). -+ * -+ * \hideinitializer -+ */ -+#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED) -+ -+/** -+ * Restart the current connection, if is has previously been stopped -+ * with uip_stop(). -+ * -+ * This function will open the receiver's window again so that we -+ * start receiving data for the current connection. -+ * -+ * \hideinitializer -+ */ -+#define uip_restart() do { uip_flags |= UIP_NEWDATA; \ -+ uip_conn->tcpstateflags &= ~UIP_STOPPED; \ -+ } while (0) -+ -+/* uIP tests that can be made to determine in what state the current -+ connection is, and what the application function should do. */ -+ -+/** -+ * Is the current connection a UDP connection? -+ * -+ * This function checks whether the current connection is a UDP connection. -+ * -+ * \hideinitializer -+ * -+ */ -+#define uip_udpconnection() (uip_conn == NULL) -+ -+/** -+ * Function declarations for hte uip_flags -+ */ -+/** -+ * Is new incoming data available? -+ * -+ * Will reduce to non-zero if there is new data for the application -+ * present at the uip_appdata pointer. The size of the data is -+ * avaliable through the uip_len variable. -+ * -+ * \hideinitializer -+ */ -+int uip_newdata(struct uip_stack *ustack); -+ -+/** -+ * Has previously sent data been acknowledged? -+ * -+ * Will reduce to non-zero if the previously sent data has been -+ * acknowledged by the remote host. This means that the application -+ * can send new data. -+ * -+ * \hideinitializer -+ */ -+int uip_acked(struct uip_stack *ustack); -+ -+/** -+ * Has the connection just been connected? -+ * -+ * Reduces to non-zero if the current connection has been connected to -+ * a remote host. This will happen both if the connection has been -+ * actively opened (with uip_connect()) or passively opened (with -+ * uip_listen()). -+ * -+ * \hideinitializer -+ */ -+int uip_connected(struct uip_stack *ustack); -+ -+/** -+ * Has the connection been closed by the other end? -+ * -+ * Is non-zero if the connection has been closed by the remote -+ * host. The application may then do the necessary clean-ups. -+ * -+ * \hideinitializer -+ */ -+int uip_closed(struct uip_stack *ustack); -+ -+/** -+ * Has the connection been aborted by the other end? -+ * -+ * Non-zero if the current connection has been aborted (reset) by the -+ * remote host. -+ * -+ * \hideinitializer -+ */ -+int uip_aborted(struct uip_stack *ustack); -+ -+/** -+ * Has the connection timed out? -+ * -+ * Non-zero if the current connection has been aborted due to too many -+ * retransmissions. -+ * -+ * \hideinitializer -+ */ -+int uip_timedout(struct uip_stack *ustack); -+ -+/** -+ * Do we need to retransmit previously data? -+ * -+ * Reduces to non-zero if the previously sent data has been lost in -+ * the network, and the application should retransmit it. The -+ * application should send the exact same data as it did the last -+ * time, using the uip_send() function. -+ * -+ * \hideinitializer -+ */ -+int uip_rexmit(struct uip_stack *ustack); -+ -+/** -+ * Is the connection being polled by uIP? -+ * -+ * Is non-zero if the reason the application is invoked is that the -+ * current connection has been idle for a while and should be -+ * polled. -+ * -+ * The polling event can be used for sending data without having to -+ * wait for the remote host to send data. -+ * -+ * \hideinitializer -+ */ -+int uip_poll(struct uip_stack *ustack); -+ -+/** -+ * Get the initial maxium segment size (MSS) of the current -+ * connection. -+ * -+ * \hideinitializer -+ */ -+int uip_initialmss(struct uip_stack *ustack); -+ -+/** -+ * Get the current maxium segment size that can be sent on the current -+ * connection. -+ * -+ * The current maxiumum segment size that can be sent on the -+ * connection is computed from the receiver's window and the MSS of -+ * the connection (which also is available by calling -+ * uip_initialmss()). -+ * -+ * \hideinitializer -+ */ -+int uip_mss(struct uip_stack *ustack); -+ -+/** -+ * Set up a new UDP connection. -+ * -+ * This function sets up a new UDP connection. The function will -+ * automatically allocate an unused local port for the new -+ * connection. However, another port can be chosen by using the -+ * uip_udp_bind() call, after the uip_udp_new() function has been -+ * called. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t addr; -+ struct uip_udp_conn *c; -+ -+ uip_ipaddr(&addr, 192,168,2,1); -+ c = uip_udp_new(&addr, HTONS(12345)); -+ if(c != NULL) { -+ uip_udp_bind(c, HTONS(12344)); -+ } -+ \endcode -+ * \param ripaddr The IP address of the remote host. -+ * -+ * \param rport The remote port number in network byte order. -+ * -+ * \return The uip_udp_conn structure for the new connection or NULL -+ * if no connection could be allocated. -+ */ -+struct uip_udp_conn *uip_udp_new(struct uip_stack *ustack, -+ uip_ip4addr_t *ripaddr, u16_t rport); -+ -+/** -+ * Removed a UDP connection. -+ * -+ * \param conn A pointer to the uip_udp_conn structure for the connection. -+ * -+ * \hideinitializer -+ */ -+#define uip_udp_remove(conn) ((conn)->lport = 0) -+ -+/** -+ * Bind a UDP connection to a local port. -+ * -+ * \param conn A pointer to the uip_udp_conn structure for the -+ * connection. -+ * -+ * \param port The local port number, in network byte order. -+ * -+ * \hideinitializer -+ */ -+#define uip_udp_bind(conn, port) ((conn)->lport = port) -+ -+/** -+ * Send a UDP datagram of length len on the current connection. -+ * -+ * This function can only be called in response to a UDP event (poll -+ * or newdata). The data must be present in the uip_buf buffer, at the -+ * place pointed to by the uip_appdata pointer. -+ * -+ * \param len The length of the data in the uip_buf buffer. -+ * -+ * \hideinitializer -+ */ -+#define uip_udp_send(len) uip_appsend((char *)uip_appdata, len) -+ -+/** @} */ -+ -+/* uIP convenience and converting functions. */ -+ -+/** -+ * \defgroup uipconvfunc uIP conversion functions -+ * @{ -+ * -+ * These functions can be used for converting between different data -+ * formats used by uIP. -+ */ -+ -+/** -+ * Construct an IP address from four bytes. -+ * -+ * This function constructs an IP address of the type that uIP handles -+ * internally from four bytes. The function is handy for specifying IP -+ * addresses to use with e.g. the uip_connect() function. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr; -+ struct uip_conn *c; -+ -+ uip_ipaddr(&ipaddr, 192,168,1,2); -+ c = uip_connect(&ipaddr, HTONS(80)); -+ \endcode -+ * -+ * \param addr A pointer to a uip_ipaddr_t variable that will be -+ * filled in with the IP address. -+ * -+ * \param addr0 The first octet of the IP address. -+ * \param addr1 The second octet of the IP address. -+ * \param addr2 The third octet of the IP address. -+ * \param addr3 The forth octet of the IP address. -+ * -+ * \hideinitializer -+ */ -+#define uip_ipaddr(addr, addr0, addr1, addr2, addr3) do { \ -+ ((u16_t *)(addr))[0] = const_htons(((addr0) << 8) | (addr1)); \ -+ ((u16_t *)(addr))[1] = const_htons(((addr2) << 8) | (addr3)); \ -+ } while (0) -+ -+/** -+ * Construct an IPv6 address from eight 16-bit words. -+ * -+ * This function constructs an IPv6 address. -+ * -+ * \hideinitializer -+ */ -+#define uip_ip6addr(addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, \ -+ addr7) \ -+ do { \ -+ ((u16_t *)(addr))[0] = HTONS((addr0)); \ -+ ((u16_t *)(addr))[1] = HTONS((addr1)); \ -+ ((u16_t *)(addr))[2] = HTONS((addr2)); \ -+ ((u16_t *)(addr))[3] = HTONS((addr3)); \ -+ ((u16_t *)(addr))[4] = HTONS((addr4)); \ -+ ((u16_t *)(addr))[5] = HTONS((addr5)); \ -+ ((u16_t *)(addr))[6] = HTONS((addr6)); \ -+ ((u16_t *)(addr))[7] = HTONS((addr7)); \ -+ } while (0) -+ -+/** -+ * Copy an IP address to another IP address. -+ * -+ * Copies an IP address from one place to another. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr1, ipaddr2; -+ -+ uip_ipaddr(&ipaddr1, 192,16,1,2); -+ uip_ipaddr_copy(&ipaddr2, &ipaddr1); -+ \endcode -+ * -+ * \param dest The destination for the copy. -+ * \param src The source from where to copy. -+ * -+ * \hideinitializer -+ */ -+#define uip_ip4addr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip4addr_t)) -+#define uip_ip6addr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) -+ -+/** -+ * Compare two IP addresses -+ * -+ * Compares two IP addresses. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr1, ipaddr2; -+ -+ uip_ipaddr(&ipaddr1, 192,16,1,2); -+ if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) { -+ printf("They are the same"); -+ } -+ \endcode -+ * -+ * \param addr1 The first IP address. -+ * \param addr2 The second IP address. -+ * -+ * \hideinitializer -+ */ -+#define uip_ip4addr_cmp(addr1, addr2) (memcmp(addr1, addr2, \ -+ sizeof(uip_ip4addr_t)) == 0) -+#define uip_ip6addr_cmp(addr1, addr2) (memcmp(addr1, addr2, \ -+ sizeof(uip_ip6addr_t)) == 0) -+ -+/** -+ * Compare two IP addresses with netmasks -+ * -+ * Compares two IP addresses with netmasks. The masks are used to mask -+ * out the bits that are to be compared. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr1, ipaddr2, mask; -+ -+ uip_ipaddr(&mask, 255,255,255,0); -+ uip_ipaddr(&ipaddr1, 192,16,1,2); -+ uip_ipaddr(&ipaddr2, 192,16,1,3); -+ if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) { -+ printf("They are the same"); -+ } -+ \endcode -+ * -+ * \param addr1 The first IP address. -+ * \param addr2 The second IP address. -+ * \param mask The netmask. -+ * -+ * \hideinitializer -+ */ -+#define uip_ip4addr_maskcmp(addr1, addr2, mask) \ -+ (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \ -+ (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \ -+ ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \ -+ (((u16_t *)addr2)[1] & ((u16_t *)mask)[1]))) -+ -+/** -+ * Mask out the network part of an IP address. -+ * -+ * Masks out the network part of an IP address, given the address and -+ * the netmask. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr1, ipaddr2, netmask; -+ -+ uip_ipaddr(&ipaddr1, 192,16,1,2); -+ uip_ipaddr(&netmask, 255,255,255,0); -+ uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask); -+ \endcode -+ * -+ * In the example above, the variable "ipaddr2" will contain the IP -+ * address 192.168.1.0. -+ * -+ * \param dest Where the result is to be placed. -+ * \param src The IP address. -+ * \param mask The netmask. -+ * -+ * \hideinitializer -+ */ -+#define uip_ip4addr_mask(dest, src, mask) do { \ -+ ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \ -+ ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \ -+ } while (0) -+ -+/** -+ * Pick the first octet of an IP address. -+ * -+ * Picks out the first octet of an IP address. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr; -+ u8_t octet; -+ -+ uip_ipaddr(&ipaddr, 1,2,3,4); -+ octet = uip_ipaddr1(&ipaddr); -+ \endcode -+ * -+ * In the example above, the variable "octet" will contain the value 1. -+ * -+ * \hideinitializer -+ */ -+#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8) -+ -+/** -+ * Pick the second octet of an IP address. -+ * -+ * Picks out the second octet of an IP address. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr; -+ u8_t octet; -+ -+ uip_ipaddr(&ipaddr, 1,2,3,4); -+ octet = uip_ipaddr2(&ipaddr); -+ \endcode -+ * -+ * In the example above, the variable "octet" will contain the value 2. -+ * -+ * \hideinitializer -+ */ -+#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff) -+ -+/** -+ * Pick the third octet of an IP address. -+ * -+ * Picks out the third octet of an IP address. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr; -+ u8_t octet; -+ -+ uip_ipaddr(&ipaddr, 1,2,3,4); -+ octet = uip_ipaddr3(&ipaddr); -+ \endcode -+ * -+ * In the example above, the variable "octet" will contain the value 3. -+ * -+ * \hideinitializer -+ */ -+#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8) -+ -+/** -+ * Pick the fourth octet of an IP address. -+ * -+ * Picks out the fourth octet of an IP address. -+ * -+ * Example: -+ \code -+ uip_ipaddr_t ipaddr; -+ u8_t octet; -+ -+ uip_ipaddr(&ipaddr, 1,2,3,4); -+ octet = uip_ipaddr4(&ipaddr); -+ \endcode -+ * -+ * In the example above, the variable "octet" will contain the value 4. -+ * -+ * \hideinitializer -+ */ -+#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff) -+ -+/** -+ * Convert 16-bit quantity from host byte order to network byte order. -+ * -+ * This macro is primarily used for converting constants from host -+ * byte order to network byte order. For converting variables to -+ * network byte order, use the htons() function instead. -+ * -+ * \hideinitializer -+ */ -+#if 0 -+#ifndef HTONS -+# if UIP_BYTE_ORDER == UIP_BIG_ENDIAN -+# define HTONS(n) (n) -+# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ -+# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) -+# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ -+#else -+#error "HTONS already defined!" -+#endif /* HTONS */ -+#endif -+ -+#if UIP_BYTE_ORDER == UIP_BIG_ENDIAN -+# error "Should not be here" -+# define const_htons(n) (n) -+# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ -+# define const_htons(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) -+# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ -+ -+/* BWL */ -+#if 0 -+/** -+ * Convert 16-bit quantity from host byte order to network byte order. -+ * -+ * This function is primarily used for converting variables from host -+ * byte order to network byte order. For converting constants to -+ * network byte order, use the HTONS() macro instead. -+ */ -+#ifndef htons -+u16_t htons(u16_t val); -+#endif /* htons */ -+#ifndef ntohs -+#define ntohs htons -+#endif -+#endif -+ -+/** @} */ -+ -+/** -+ * Pointer to the application data in the packet buffer. -+ * -+ * This pointer points to the application data when the application is -+ * called. If the application wishes to send data, the application may -+ * use this space to write the data into before calling uip_send(). -+ */ -+/* extern void *uip_appdata; */ -+ -+#if UIP_URGDATA > 0 -+/* u8_t *uip_urgdata: -+ * -+ * This pointer points to any urgent data that has been received. Only -+ * present if compiled with support for urgent data (UIP_URGDATA). -+ */ -+extern void *uip_urgdata; -+#endif /* UIP_URGDATA > 0 */ -+ -+/** -+ * \defgroup uipdrivervars Variables used in uIP device drivers -+ * @{ -+ * -+ * uIP has a few global variables that are used in device drivers for -+ * uIP. -+ */ -+ -+/** -+ * The length of the packet in the uip_buf buffer. -+ * -+ * The global variable uip_len holds the length of the packet in the -+ * uip_buf buffer. -+ * -+ * When the network device driver calls the uIP input function, -+ * uip_len should be set to the length of the packet in the uip_buf -+ * buffer. -+ * -+ * When sending packets, the device driver should use the contents of -+ * the uip_len variable to determine the length of the outgoing -+ * packet. -+ * -+ */ -+/* extern u16_t uip_len; */ -+ -+/** @} */ -+ -+#if UIP_URGDATA > 0 -+extern u16_t uip_urglen, uip_surglen; -+#endif /* UIP_URGDATA > 0 */ -+ -+/** -+ * Representation of a uIP TCP connection. -+ * -+ * The uip_conn structure is used for identifying a connection. All -+ * but one field in the structure are to be considered read-only by an -+ * application. The only exception is the appstate field whos purpose -+ * is to let the application store application-specific state (e.g., -+ * file pointers) for the connection. The type of this field is -+ * configured in the "uipopt.h" header file. -+ */ -+struct __attribute__ ((__packed__)) uip_conn { -+ uip_ip4addr_t ripaddr; -+ uip_ip6addr_t ripaddr6; -+ /**< The IP address of the remote host. */ -+ -+ u16_t lport; /**< The local TCP port, in network byte order. */ -+ u16_t rport; /**< The local remote TCP port, in network byte -+ order. */ -+ -+ u8_t rcv_nxt[4]; -+ /**< The sequence number that we expect to -+ receive next. */ -+ u8_t snd_nxt[4]; -+ /**< The sequence number that was last sent by -+ us. */ -+ u16_t len; /**< Length of the data that was previously sent. */ -+ u16_t mss; /**< Current maximum segment size for the -+ connection. */ -+ u16_t initialmss; -+ /**< Initial maximum segment size for the -+ connection. */ -+ u8_t sa; /**< Retransmission time-out calculation state -+ variable. */ -+ u8_t sv; /**< Retransmission time-out calculation state -+ variable. */ -+ u8_t rto; /**< Retransmission time-out. */ -+ u8_t tcpstateflags; -+ /**< TCP state and flags. */ -+ u8_t timer; /**< The retransmission timer. */ -+ u8_t nrtx; /**< The number of retransmissions for the last -+ segment sent. */ -+}; -+ -+/** -+ * \addtogroup uiparch -+ * @{ -+ */ -+ -+/** -+ * 4-byte array used for the 32-bit sequence number calculations. -+ */ -+extern u8_t uip_acc32[4]; -+ -+/** @} */ -+ -+#if UIP_UDP -+/** -+ * Representation of a uIP UDP connection. -+ */ -+struct uip_udp_conn { -+ uip_ip4addr_t ripaddr; -+ /**< The IP address of the remote peer. */ -+ u16_t lport; /**< The local port number in network byte order. */ -+ u16_t rport; /**< The remote port number in network byte order. */ -+ u8_t ttl; /**< Default time-to-live. */ -+ -+ /** The application state. */ -+/* uip_udp_appstate_t appstate; */ -+}; -+ -+#endif /* UIP_UDP */ -+ -+/** -+ * The structure holding the TCP/IP statistics that are gathered if -+ * UIP_STATISTICS is set to 1. -+ * -+ */ -+struct uip_stats { -+ struct { -+ uip_stats_t drop; -+ /**< Number of dropped packets at the IP -+ layer. */ -+ uip_stats_t recv; -+ /**< Number of received packets at the IP -+ layer. */ -+ uip_stats_t sent; -+ /**< Number of sent packets at the IP -+ layer. */ -+ uip_stats_t vhlerr; -+ /**< Number of packets dropped due to wrong -+ IP version or header length. */ -+ uip_stats_t hblenerr; -+ /**< Number of packets dropped due to wrong -+ IP length, high byte. */ -+ uip_stats_t lblenerr; -+ /**< Number of packets dropped due to wrong -+ IP length, low byte. */ -+ uip_stats_t fragerr; -+ /**< Number of packets dropped since they -+ were IP fragments. */ -+ uip_stats_t chkerr; -+ /**< Number of packets dropped due to IP -+ checksum errors. */ -+ uip_stats_t protoerr; -+ /**< Number of packets dropped since they -+ were neither ICMP, UDP nor TCP. */ -+ } ip; /**< IP statistics. */ -+ struct { -+ uip_stats_t drop; -+ /**< Number of dropped ICMP packets. */ -+ uip_stats_t recv; -+ /**< Number of received ICMP packets. */ -+ uip_stats_t sent; -+ /**< Number of sent ICMP packets. */ -+ uip_stats_t typeerr; -+ /**< Number of ICMP packets with a wrong -+ type. */ -+ } icmp; /**< ICMP statistics. */ -+ struct { -+ uip_stats_t drop; -+ /**< Number of dropped TCP segments. */ -+ uip_stats_t recv; -+ /**< Number of recived TCP segments. */ -+ uip_stats_t sent; -+ /**< Number of sent TCP segments. */ -+ uip_stats_t chkerr; -+ /**< Number of TCP segments with a bad -+ checksum. */ -+ uip_stats_t ackerr; -+ /**< Number of TCP segments with a bad ACK -+ number. */ -+ uip_stats_t rst; -+ /**< Number of recevied TCP RST (reset) segments. */ -+ uip_stats_t rexmit; -+ /**< Number of retransmitted TCP segments. */ -+ uip_stats_t syndrop; -+ /**< Number of dropped SYNs due to too few -+ connections was avaliable. */ -+ uip_stats_t synrst; -+ /**< Number of SYNs for closed ports, -+ triggering a RST. */ -+ } tcp; /**< TCP statistics. */ -+#if UIP_UDP -+ struct { -+ uip_stats_t drop; -+ /**< Number of dropped UDP segments. */ -+ uip_stats_t recv; -+ /**< Number of recived UDP segments. */ -+ uip_stats_t sent; -+ /**< Number of sent UDP segments. */ -+ uip_stats_t chkerr; -+ /**< Number of UDP segments with a bad -+ checksum. */ -+ } udp; /**< UDP statistics. */ -+#endif /* UIP_UDP */ -+}; -+ -+/*---------------------------------------------------------------------------*/ -+/* All the stuff below this point is internal to uIP and should not be -+ * used directly by an application or by a device driver. -+ */ -+/*---------------------------------------------------------------------------*/ -+/* u8_t uip_flags: -+ * -+ * When the application is called, uip_flags will contain the flags -+ * that are defined in this file. Please read below for more -+ * infomation. -+ */ -+/* extern u8_t uip_flags; */ -+ -+/* The following flags may be set in the global variable uip_flags -+ before calling the application callback. The UIP_ACKDATA, -+ UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time, -+ whereas the others are mutualy exclusive. Note that these flags -+ should *NOT* be accessed directly, but only through the uIP -+ functions/macros. */ -+ -+#define UIP_ACKDATA 1 /* Signifies that the outstanding data was -+ acked and the application should send -+ out new data instead of retransmitting -+ the last data. */ -+#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent -+ us new data. */ -+#define UIP_REXMIT 4 /* Tells the application to retransmit the -+ data that was last sent. */ -+#define UIP_POLL 8 /* Used for polling the application, to -+ check if the application has data that -+ it wants to send. */ -+#define UIP_CLOSE 16 /* The remote host has closed the -+ connection, thus the connection has -+ gone away. Or the application signals -+ that it wants to close the -+ connection. */ -+#define UIP_ABORT 32 /* The remote host has aborted the -+ connection, thus the connection has -+ gone away. Or the application signals -+ that it wants to abort the -+ connection. */ -+#define UIP_CONNECTED 64 /* We have got a connection from a remote -+ host and have set up a new connection -+ for it, or an active connection has -+ been successfully established. */ -+ -+#define UIP_TIMEDOUT 128 /* The connection has been aborted due to -+ too many retransmissions. */ -+ -+void uip_input(struct uip_stack *ustack); -+void uip_periodic(struct uip_stack *ustack, int conn); -+ -+/* uip_process(flag): -+ * -+ * The actual uIP function which does all the work. -+ */ -+void uip_process(struct uip_stack *ustack, u8_t flag); -+ -+/* The following flags are passed as an argument to the uip_process() -+ function. They are used to distinguish between the two cases where -+ uip_process() is called. It can be called either because we have -+ incoming data that should be processed, or because the periodic -+ timer has fired. These values are never used directly, but only in -+ the macrose defined in this file. */ -+ -+#define UIP_DATA 1 /* Tells uIP that there is incoming -+ data in the uip_buf buffer. The -+ length of the data is stored in the -+ global variable uip_len. */ -+#define UIP_TIMER 2 /* Tells uIP that the periodic timer -+ has fired. */ -+#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should -+ be polled. */ -+#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram -+ should be constructed in the -+ uip_buf buffer. */ -+#if UIP_UDP -+#define UIP_UDP_TIMER 5 -+#endif /* UIP_UDP */ -+ -+#define UIP_NDP_TIMER 6 -+ -+/* The TCP states used in the uip_conn->tcpstateflags. */ -+#define UIP_CLOSED 0 -+#define UIP_SYN_RCVD 1 -+#define UIP_SYN_SENT 2 -+#define UIP_ESTABLISHED 3 -+#define UIP_FIN_WAIT_1 4 -+#define UIP_FIN_WAIT_2 5 -+#define UIP_CLOSING 6 -+#define UIP_TIME_WAIT 7 -+#define UIP_LAST_ACK 8 -+#define UIP_TS_MASK 15 -+ -+#define UIP_STOPPED 16 -+ -+struct __attribute__ ((__packed__)) uip_tcp_hdr { -+ /* TCP header. */ -+ u16_t srcport, destport; -+ u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; -+ u16_t tcpchksum; -+ u8_t urgp[2]; -+ u8_t optdata[4]; -+}; -+ -+struct __attribute__ ((__packed__)) uip_ipv4_hdr { -+ /* IPv4 header. */ -+ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; -+ u16_t ipchksum; -+ u16_t srcipaddr[2], destipaddr[2]; -+}; -+ -+struct __attribute__ ((__packed__)) uip_ipv6_hdr { -+ /* IPv6 header. */ -+ u8_t vtc, tcflow; -+ u16_t flow; -+ u16_t len; -+ u8_t proto, ttl; -+ uip_ip6addr_t srcipaddr, destipaddr; -+}; -+ -+/* The TCP and IPv4 headers. */ -+struct __attribute__ ((__packed__)) uip_tcp_ipv4_hdr { -+ /* IPv4 header. */ -+ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; -+ u16_t ipchksum; -+ u16_t srcipaddr[2], destipaddr[2]; -+ -+ /* TCP header. */ -+ u16_t srcport, destport; -+ u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; -+ u16_t tcpchksum; -+ u8_t urgp[2]; -+ u8_t optdata[4]; -+}; -+ -+/* The TCP and IP headers. */ -+struct __attribute__ ((__packed__)) uip_tcp_ipv6_hdr { -+ /* IPv6 header. */ -+ u8_t vtc, tcflow; -+ u16_t flow; -+ u8_t len[2]; -+ u8_t proto, ttl; -+ uip_ip6addr_t srcipaddr, destipaddr; -+ -+ /* TCP header. */ -+ u16_t srcport, destport; -+ u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; -+ u16_t tcpchksum; -+ u8_t urgp[2]; -+ u8_t optdata[4]; -+}; -+ -+/* The ICMPv4 */ -+struct __attribute__ ((__packed__)) uip_icmpv4_hdr { -+ /* ICMP (echo) header. */ -+ u8_t type, icode; -+ u16_t icmpchksum; -+ u16_t id, seqno; -+}; -+ -+/* The ICMPv6 */ -+struct __attribute__ ((__packed__)) uip_icmpv6_hdr { -+ /* ICMP (echo) header. */ -+ u8_t type, icode; -+ u16_t icmpchksum; -+ u8_t flags, reserved1, reserved2, reserved3; -+ u8_t icmp6data[16]; -+ u8_t options[1]; -+}; -+ -+/* The ICMP and IP headers. */ -+struct __attribute__ ((__packed__)) uip_icmpip_hdr { -+#if UIP_CONF_IPV6 -+ /* IPv6 header. */ -+ u8_t vtc, tcf; -+ u16_t flow; -+ u8_t len[2]; -+ u8_t proto, ttl; -+ uip_ip6addr_t srcipaddr, destipaddr; -+#else /* UIP_CONF_IPV6 */ -+ /* IPv4 header. */ -+ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; -+ u16_t ipchksum; -+ u16_t srcipaddr[2], destipaddr[2]; -+#endif /* UIP_CONF_IPV6 */ -+ -+ /* ICMP (echo) header. */ -+ u8_t type, icode; -+ u16_t icmpchksum; -+#if !UIP_CONF_IPV6 -+ u16_t id, seqno; -+#else /* !UIP_CONF_IPV6 */ -+ u8_t flags, reserved1, reserved2, reserved3; -+ u8_t icmp6data[16]; -+ u8_t options[1]; -+#endif /* !UIP_CONF_IPV6 */ -+}; -+ -+/* The UDP */ -+struct __attribute__ ((__packed__)) uip_udp_hdr { -+ /* UDP header. */ -+ u16_t srcport, destport; -+ u16_t udplen; -+ u16_t udpchksum; -+}; -+ -+/* The UDP and IP headers. */ -+struct __attribute__ ((__packed__)) uip_udpip_hdr { -+#if UIP_CONF_IPV6 -+ /* IPv6 header. */ -+ u8_t vtc, tcf; -+ u16_t flow; -+ u8_t len[2]; -+ u8_t proto, ttl; -+ uip_ip6addr_t srcipaddr, destipaddr; -+#else /* UIP_CONF_IPV6 */ -+ /* IP header. */ -+ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; -+ u16_t ipchksum; -+ u16_t srcipaddr[2], destipaddr[2]; -+#endif /* UIP_CONF_IPV6 */ -+ -+ /* UDP header. */ -+ u16_t srcport, destport; -+ u16_t udplen; -+ u16_t udpchksum; -+}; -+ -+/** -+ * The buffer size available for user data in the \ref uip_buf buffer. -+ * -+ * This macro holds the available size for user data in the \ref -+ * uip_buf buffer. The macro is intended to be used for checking -+ * bounds of available user data. -+ * -+ * Example: -+ \code -+ snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i); -+ \endcode -+ * -+ * \hideinitializer -+ */ -+#define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) -+ -+#define UIP_PROTO_ICMP 1 -+#define UIP_PROTO_TCP 6 -+#define UIP_PROTO_UDP 17 -+#define UIP_PROTO_ICMP6 58 -+ -+/* Header sizes. */ -+#define UIP_IPv6_H_LEN 40 /* Size of IPv6 header */ -+#define UIP_IPv4_H_LEN 20 /* Size of IPv4 header */ -+ -+#define UIP_UDPH_LEN 8 /* Size of UDP header */ -+#define UIP_TCPH_LEN 20 /* Size of TCP header */ -+ -+#define UIP_IPv4_UDPH_LEN (UIP_UDPH_LEN + UIP_IPv4_H_LEN) /* Size of IPv4 -+ + UDP -+ header */ -+#define UIP_IPv4_TCPH_LEN (UIP_TCPH_LEN + UIP_IPv4_H_LEN) /* Size of IPv4 -+ + TCP -+ header */ -+#define UIP_TCP_IPv4_HLEN UIP_IPv4_TCPH_LEN -+ -+#define UIP_IPv6_UDPH_LEN (UIP_UDPH_LEN + UIP_IPv6_H_LEN) /* Size of IPv6 -+ + UDP -+ header */ -+#define UIP_IPv6_TCPH_LEN (UIP_TCPH_LEN + UIP_IPv6_H_LEN) /* Size of IPv6 -+ + TCP -+ header */ -+#define UIP_TCP_IPv6_HLEN UIP_IPv6_TCPH_LEN -+ -+/** -+ * Calculate the Internet checksum over a buffer. -+ * -+ * The Internet checksum is the one's complement of the one's -+ * complement sum of all 16-bit words in the buffer. -+ * -+ * See RFC1071. -+ * -+ * \param buf A pointer to the buffer over which the checksum is to be -+ * computed. -+ * -+ * \param len The length of the buffer over which the checksum is to -+ * be computed. -+ * -+ * \return The Internet checksum of the buffer. -+ */ -+u16_t uip_chksum(u16_t *buf, u16_t len); -+ -+/** -+ * Calculate the IP header checksum of the packet header in uip_buf. -+ * -+ * The IP header checksum is the Internet checksum of the 20 bytes of -+ * the IP header. -+ * -+ * \return The IP header checksum of the IP header in the uip_buf -+ * buffer. -+ */ -+u16_t uip_ipchksum(struct uip_stack *ustack); -+ -+/** -+ * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. -+ * -+ * The TCP checksum is the Internet checksum of data contents of the -+ * TCP segment, and a pseudo-header as defined in RFC793. -+ * -+ * \return The TCP checksum of the TCP segment in uip_buf and pointed -+ * to by uip_appdata. -+ */ -+u16_t uip_tcpchksum(struct uip_stack *ustack); -+ -+/** -+ * Calculate the UDP checksum of the packet in uip_buf and uip_appdata. -+ * -+ * The UDP checksum is the Internet checksum of data contents of the -+ * UDP segment, and a pseudo-header as defined in RFC768. -+ * -+ * \return The UDP checksum of the UDP segment in uip_buf and pointed -+ * to by uip_appdata. -+ */ -+u16_t uip_udpchksum(struct uip_stack *ustack); -+ -+/* IPv6 checksum */ -+uint16_t icmpv6_checksum(uint8_t *data); -+ -+struct neighbor_entry { -+ struct in6_addr ipaddr; -+ struct uip_eth_addr mac_addr; -+ u8_t time; -+}; -+ -+struct uip_stack { -+ struct uip_eth_addr uip_ethaddr; -+ -+ u8_t *uip_buf; -+ -+ uint8_t *data_link_layer; /* Pointer to the data link layer */ -+ uint8_t *network_layer; /* Pointer to the network layer */ -+ void *uip_appdata; /* The uip_appdata pointer points to -+ application data. */ -+ void *uip_sappdata; /* The uip_appdata pointer points to -+ the application data which is to -+ be sent. */ -+#if UIP_URGDATA > 0 -+ void *uip_urgdata; /* The uip_urgdata pointer points to -+ urgent data (out-of-band data), if -+ present. */ -+ u16_t uip_urglen, uip_surglen; -+#endif /* UIP_URGDATA > 0 */ -+ -+ u16_t uip_len, uip_slen; /* The uip_len is either 8 or 16 bits, -+ depending on the maximum packet -+ size. */ -+ u8_t uip_flags; /* The uip_flags variable is used for -+ communication between the TCP/IP stack -+ and the application program. */ -+ struct uip_conn *uip_conn; /* uip_conn always points to the current -+ connection. */ -+ -+ struct uip_conn uip_conns[UIP_CONNS]; -+ /* The uip_conns array holds all TCP -+ connections. */ -+ u16_t uip_listenports[UIP_LISTENPORTS]; -+ /* The uip_listenports list all currently -+ listning ports. */ -+#if UIP_UDP -+ struct uip_udp_conn *uip_udp_conn; -+ struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; -+#endif /* UIP_UDP */ -+ -+ u16_t ipid; /* This ipid variable is an increasing -+ number that is used for the IP ID -+ field. */ -+ -+ u8_t iss[4]; /* The iss variable is used for the TCP -+ initial sequence number. */ -+ -+#if UIP_ACTIVE_OPEN -+ u16_t lastport; /* Keeps track of the last port used for -+ a new connection. */ -+#endif /* UIP_ACTIVE_OPEN */ -+ -+#define IP_CONFIG_OFF 0x00 -+#define IPV4_CONFIG_OFF 0x01 -+#define IPV4_CONFIG_STATIC 0x02 -+#define IPV4_CONFIG_DHCP 0x04 -+#define IPV6_CONFIG_OFF 0x10 -+#define IPV6_CONFIG_STATIC 0x20 -+#define IPV6_CONFIG_DHCP 0x40 -+ u8_t ip_config; -+ -+ uip_ip4addr_t hostaddr, netmask, default_route_addr; -+ uip_ip6addr_t hostaddr6, netmask6, default_route_addr6, -+ linklocal6; -+ int prefix_len; -+ u8_t ipv6_autocfg; -+#define IPV6_AUTOCFG_DHCPV6 (1<<0) -+#define IPV6_AUTOCFG_ND (1<<1) -+#define IPV6_AUTOCFG_NOTSPEC (1<<6) -+#define IPV6_AUTOCFG_NOTUSED (1<<7) -+ u8_t linklocal_autocfg; -+#define IPV6_LL_AUTOCFG_ON (1<<0) -+#define IPV6_LL_AUTOCFG_OFF (1<<1) -+#define IPV6_LL_AUTOCFG_NOTSPEC (1<<6) -+#define IPV6_LL_AUTOCFG_NOTUSED (1<<7) -+ u8_t router_autocfg; -+#define IPV6_RTR_AUTOCFG_ON (1<<0) -+#define IPV6_RTR_AUTOCFG_OFF (1<<1) -+#define IPV6_RTR_AUTOCFG_NOTSPEC (1<<6) -+#define IPV6_RTR_AUTOCFG_NOTUSED (1<<7) -+ -+#define UIP_NEIGHBOR_ENTRIES 8 -+ struct neighbor_entry neighbor_entries[UIP_NEIGHBOR_ENTRIES]; -+ -+ struct uip_stats stats; -+ -+ u8_t opt; -+ -+ pthread_mutex_t lock; -+ -+ /* IPv6 support */ -+#define UIP_SUPPORT_IPv6_ENABLED 0x01 -+#define UIP_SUPPORT_IPv6_DISABLED 0x02 -+ u8_t enable_IPv6; -+ -+ /* DHCPC client attached */ -+ void *dhcpc; -+ -+ /* NDP client */ -+ void *ndpc; -+}; -+ -+/******************************************************************************* -+ * IPv6 Support -+ ******************************************************************************/ -+int set_ipv6_link_local_address(struct uip_stack *ustack); -+int is_ipv6_link_local_address(uip_ip6addr_t *addr); -+ -+void dump_uip_packet(struct uip_stack *ustack); -+ -+#endif /* __UIP_H__ */ -+ -+/** @} */ -diff --git a/iscsiuio/src/uip/uip_arch.h b/iscsiuio/src/uip/uip_arch.h -new file mode 100644 -index 0000000..3ddacec ---- /dev/null -+++ b/iscsiuio/src/uip/uip_arch.h -@@ -0,0 +1,137 @@ -+/** -+ * \addtogroup uip -+ * {@ -+ */ -+ -+/** -+ * \defgroup uiparch Architecture specific uIP functions -+ * @{ -+ * -+ * The functions in the architecture specific module implement the IP -+ * check sum and 32-bit additions. -+ * -+ * The IP checksum calculation is the most computationally expensive -+ * operation in the TCP/IP stack and it therefore pays off to -+ * implement this in efficient assembler. The purpose of the uip-arch -+ * module is to let the checksum functions to be implemented in -+ * architecture specific assembler. -+ * -+ */ -+ -+/** -+ * \file -+ * Declarations of architecture specific functions. -+ * \author Adam Dunkels -+ */ -+ -+/* -+ * Copyright (c) 2001, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+#ifndef __UIP_ARCH_H__ -+#define __UIP_ARCH_H__ -+ -+#include "uip.h" -+ -+/** -+ * Carry out a 32-bit addition. -+ * -+ * Because not all architectures for which uIP is intended has native -+ * 32-bit arithmetic, uIP uses an external C function for doing the -+ * required 32-bit additions in the TCP protocol processing. This -+ * function should add the two arguments and place the result in the -+ * global variable uip_acc32. -+ * -+ * \note The 32-bit integer pointed to by the op32 parameter and the -+ * result in the uip_acc32 variable are in network byte order (big -+ * endian). -+ * -+ * \param op32 A pointer to a 4-byte array representing a 32-bit -+ * integer in network byte order (big endian). -+ * -+ * \param op16 A 16-bit integer in host byte order. -+ */ -+void uip_add32(u8_t *op32, u16_t op16, u8_t *uip_add32); -+ -+/** -+ * Calculate the Internet checksum over a buffer. -+ * -+ * The Internet checksum is the one's complement of the one's -+ * complement sum of all 16-bit words in the buffer. -+ * -+ * See RFC1071. -+ * -+ * \note This function is not called in the current version of uIP, -+ * but future versions might make use of it. -+ * -+ * \param buf A pointer to the buffer over which the checksum is to be -+ * computed. -+ * -+ * \param len The length of the buffer over which the checksum is to -+ * be computed. -+ * -+ * \return The Internet checksum of the buffer. -+ */ -+u16_t uip_chksum(u16_t *buf, u16_t len); -+ -+/** -+ * Calculate the IP header checksum of the packet header in uip_buf. -+ * -+ * The IP header checksum is the Internet checksum of the 20 bytes of -+ * the IP header. -+ * -+ * \return The IP header checksum of the IP header in the uip_buf -+ * buffer. -+ */ -+u16_t uip_ipchksum(struct uip_stack *ustack); -+ -+/** -+ * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. -+ * -+ * The TCP checksum is the Internet checksum of data contents of the -+ * TCP segment, and a pseudo-header as defined in RFC793. -+ * -+ * \note The uip_appdata pointer that points to the packet data may -+ * point anywhere in memory, so it is not possible to simply calculate -+ * the Internet checksum of the contents of the uip_buf buffer. -+ * -+ * \return The TCP checksum of the TCP segment in uip_buf and pointed -+ * to by uip_appdata. -+ */ -+u16_t uip_tcpchksum(struct uip_stack *ustack); -+ -+u16_t uip_udpchksum(struct uip_stack *ustack); -+ -+/** @} */ -+/** @} */ -+ -+#endif /* __UIP_ARCH_H__ */ -diff --git a/iscsiuio/src/uip/uip_arp.c b/iscsiuio/src/uip/uip_arp.c -new file mode 100644 -index 0000000..f7a9594 ---- /dev/null -+++ b/iscsiuio/src/uip/uip_arp.c -@@ -0,0 +1,481 @@ -+#include -+#include -+#include -+ -+#include "logger.h" -+#include "packet.h" -+ -+/** -+ * \addtogroup uip -+ * @{ -+ */ -+ -+/** -+ * \defgroup uiparp uIP Address Resolution Protocol -+ * @{ -+ * -+ * The Address Resolution Protocol ARP is used for mapping between IP -+ * addresses and link level addresses such as the Ethernet MAC -+ * addresses. ARP uses broadcast queries to ask for the link level -+ * address of a known IP address and the host which is configured with -+ * the IP address for which the query was meant, will respond with its -+ * link level address. -+ * -+ * \note This ARP implementation only supports Ethernet. -+ */ -+ -+/** -+ * \file -+ * Implementation of the ARP Address Resolution Protocol. -+ * \author Adam Dunkels -+ * -+ */ -+ -+/* -+ * Copyright (c) 2001-2003, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+#include "uip_arp.h" -+#include "uip_eth.h" -+ -+#include -+#include -+ -+static const struct uip_eth_addr broadcast_ethaddr = { -+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} }; -+static const u16_t broadcast_ipaddr[2] = { 0xffff, 0xffff }; -+ -+pthread_mutex_t arp_table_mutex = PTHREAD_MUTEX_INITIALIZER; -+static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; -+ -+static u8_t arptime; -+ -+/** -+ * Initialize the ARP module. -+ * -+ */ -+/*----------------------------------------------------------------------------*/ -+void uip_arp_init(void) -+{ -+ u8_t i; -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) -+ memset(&arp_table[i], 0, sizeof(arp_table[i])); -+ -+ pthread_mutex_init(&arp_table_mutex, NULL); -+} -+ -+/*----------------------------------------------------------------------------*/ -+/** -+ * Periodic ARP processing function. -+ * -+ * This function performs periodic timer processing in the ARP module -+ * and should be called at regular intervals. The recommended interval -+ * is 10 seconds between the calls. -+ * -+ */ -+/*----------------------------------------------------------------------------*/ -+void uip_arp_timer(void) -+{ -+ u8_t i; -+ struct arp_entry *tabptr; -+ -+ ++arptime; -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { -+ tabptr = &arp_table[i]; -+ if ((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && -+ arptime - tabptr->time >= UIP_ARP_MAXAGE) -+ memset(tabptr->ipaddr, 0, 4); -+ } -+ -+} -+ -+/*----------------------------------------------------------------------------*/ -+static void uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr) -+{ -+ u8_t i; -+ struct arp_entry *tabptr; -+ -+ pthread_mutex_lock(&arp_table_mutex); -+ /* Walk through the ARP mapping table and try to find an entry to -+ update. If none is found, the IP -> MAC address mapping is -+ inserted in the ARP table. */ -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { -+ -+ tabptr = &arp_table[i]; -+ /* Only check those entries that are actually in use. */ -+ if (tabptr->ipaddr[0] != 0 && tabptr->ipaddr[1] != 0) { -+ -+ /* Check if the source IP address of the incoming packet -+ matches the IP address in this ARP table entry. */ -+ if (ipaddr[0] == tabptr->ipaddr[0] && -+ ipaddr[1] == tabptr->ipaddr[1]) { -+ -+ tabptr->time = arptime; -+ -+ pthread_mutex_unlock(&arp_table_mutex); -+ return; -+ } -+ } -+ } -+ -+ /* If we get here, no existing ARP table entry was found, so we -+ create one. */ -+ -+ /* First, we try to find an unused entry in the ARP table. */ -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { -+ tabptr = &arp_table[i]; -+ if (tabptr->ipaddr[0] == 0 && tabptr->ipaddr[1] == 0) -+ break; -+ } -+ -+ /* If no unused entry is found, we try to find the oldest entry and -+ throw it away. */ -+ if (i == UIP_ARPTAB_SIZE) { -+ u8_t c; -+ u8_t tmpage = 0; -+ c = 0; -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { -+ tabptr = &arp_table[i]; -+ if (arptime - tabptr->time > tmpage) { -+ tmpage = arptime - tabptr->time; -+ c = i; -+ } -+ } -+ i = c; -+ tabptr = &arp_table[i]; -+ } -+ -+ /* Now, i is the ARP table entry which we will fill with the new -+ information. */ -+ memcpy(tabptr->ipaddr, ipaddr, 4); -+ memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); -+ tabptr->time = arptime; -+ -+ pthread_mutex_unlock(&arp_table_mutex); -+} -+ -+/** -+ * ARP processing for incoming ARP packets. -+ * -+ * This function should be called by the device driver when an ARP -+ * packet has been received. The function will act differently -+ * depending on the ARP packet type: if it is a reply for a request -+ * that we previously sent out, the ARP cache will be filled in with -+ * the values from the ARP reply. If the incoming ARP packet is an ARP -+ * request for our IP address, an ARP reply packet is created and put -+ * into the uip_buf[] buffer. -+ * -+ * When the function returns, the value of the global variable uip_len -+ * indicates whether the device driver should send out a packet or -+ * not. If uip_len is zero, no packet should be sent. If uip_len is -+ * non-zero, it contains the length of the outbound packet that is -+ * present in the uip_buf[] buffer. -+ * -+ * This function expects an ARP packet with a prepended Ethernet -+ * header in the uip_buf[] buffer, and the length of the packet in the -+ * global variable uip_len. -+ */ -+void uip_arp_ipin(struct uip_stack *ustack, packet_t *pkt) -+{ -+ struct ip_hdr *ip; -+ struct uip_eth_hdr *eth; -+ -+ eth = (struct uip_eth_hdr *)pkt->data_link_layer; -+ ip = (struct ip_hdr *)pkt->network_layer; -+ -+ if (uip_ip4addr_cmp(ip->destipaddr, ustack->hostaddr)) { -+ /* First, we register the one who made the request in our ARP -+ table, since it is likely that we will do more communication -+ with this host in the future. */ -+ uip_arp_update(ip->srcipaddr, ð->src); -+ } -+} -+ -+void -+uip_arp_arpin(nic_interface_t *nic_iface, -+ struct uip_stack *ustack, packet_t *pkt) -+{ -+ struct arp_hdr *arp; -+ struct uip_eth_hdr *eth; -+ -+ if (pkt->buf_size < sizeof(struct arp_hdr)) { -+ pkt->buf_size = 0; -+ return; -+ } -+ pkt->buf_size = 0; -+ -+ eth = (struct uip_eth_hdr *)pkt->data_link_layer; -+ arp = (struct arp_hdr *)pkt->network_layer; -+ -+ switch (arp->opcode) { -+ case const_htons(ARP_REQUEST): -+ /* ARP request. If it asked for our address, we send out a -+ reply. */ -+ if (uip_ip4addr_cmp(arp->dipaddr, ustack->hostaddr)) { -+ /* First, we register the one who made the request in -+ our ARP table, since it is likely that we will do -+ more communication with this host in the future. */ -+ uip_arp_update(arp->sipaddr, &arp->shwaddr); -+ -+ /* The reply opcode is 2. */ -+ arp->opcode = htons(2); -+ -+ memcpy(arp->dhwaddr.addr, arp->shwaddr.addr, 6); -+ memcpy(arp->shwaddr.addr, ustack->uip_ethaddr.addr, 6); -+ memcpy(eth->src.addr, ustack->uip_ethaddr.addr, 6); -+ memcpy(eth->dest.addr, arp->dhwaddr.addr, 6); -+ -+ arp->dipaddr[0] = arp->sipaddr[0]; -+ arp->dipaddr[1] = arp->sipaddr[1]; -+ arp->sipaddr[0] = ustack->hostaddr[0]; -+ arp->sipaddr[1] = ustack->hostaddr[1]; -+ -+ if (nic_iface->vlan_id == 0) { -+ eth->type = htons(UIP_ETHTYPE_ARP); -+ pkt->buf_size = sizeof(*arp) + sizeof(*eth); -+ } else { -+ eth->type = htons(UIP_ETHTYPE_8021Q); -+ pkt->buf_size = sizeof(*arp) + -+ sizeof(struct uip_vlan_eth_hdr); -+ } -+ } -+ break; -+ case const_htons(ARP_REPLY): -+ uip_arp_update(arp->sipaddr, &arp->shwaddr); -+ break; -+ default: -+ LOG_WARN("Unknown ARP opcode: %d", ntohs(arp->opcode)); -+ break; -+ } -+ -+ return; -+} -+ -+/** -+ * Prepend Ethernet header to an outbound IP packet and see if we need -+ * to send out an ARP request. -+ * -+ * This function should be called before sending out an IP packet. The -+ * function checks the destination IP address of the IP packet to see -+ * what Ethernet MAC address that should be used as a destination MAC -+ * address on the Ethernet. -+ * -+ * If the destination IP address is in the local network (determined -+ * by logical ANDing of netmask and our IP address), the function -+ * checks the ARP cache to see if an entry for the destination IP -+ * address is found. If so, an Ethernet header is prepended and the -+ * function returns. If no ARP cache entry is found for the -+ * destination IP address, the packet in the uip_buf[] is replaced by -+ * an ARP request packet for the IP address. The IP packet is dropped -+ * and it is assumed that they higher level protocols (e.g., TCP) -+ * eventually will retransmit the dropped packet. -+ * -+ * If the destination IP address is not on the local network, the IP -+ * address of the default router is used instead. -+ * -+ * When the function returns, a packet is present in the uip_buf[] -+ * buffer, and the length of the packet is in the global variable -+ * uip_len. -+ */ -+ -+dest_ipv4_addr_t -+uip_determine_dest_ipv4_addr(struct uip_stack *ustack, u16_t *ipaddr) -+{ -+ struct arp_hdr *arp; -+ struct uip_eth_hdr *eth; -+ struct ip_hdr *ip_buf; -+ -+ arp = (struct arp_hdr *)ustack->network_layer; -+ eth = (struct uip_eth_hdr *)ustack->data_link_layer; -+ ip_buf = (struct ip_hdr *)ustack->network_layer; -+ -+ /* Find the destination IP address in the ARP table and construct -+ the Ethernet header. If the destination IP addres isn't on the -+ local network, we use the default router's IP address instead. -+ -+ If not ARP table entry is found, we overwrite the original IP -+ packet with an ARP request for the IP address. */ -+ -+ /* First check if destination is a local broadcast. */ -+ if (uip_ip4addr_cmp(ip_buf->destipaddr, broadcast_ipaddr)) { -+ memcpy(ð->dest, broadcast_ethaddr.addr, 6); -+ -+ return LOCAL_BROADCAST; -+ } else { -+ /* Check if the destination address is on the local network. */ -+ if (!uip_ip4addr_maskcmp(ip_buf->destipaddr, -+ ustack->hostaddr, ustack->netmask)) { -+ /* Destination address was not on the local network, -+ so we need to use the default router's IP address -+ instead of the destination address when determining -+ the MAC address. */ -+ uip_ip4addr_copy(ipaddr, ustack->default_route_addr); -+ } else { -+ /* Else, we use the destination IP address. */ -+ uip_ip4addr_copy(ipaddr, ip_buf->destipaddr); -+ } -+ -+ return NONLOCAL_BROADCAST; -+ } -+} -+ -+arp_out_t is_in_arp_table(u16_t *ipaddr, struct arp_entry **tabptr) -+{ -+ u8_t i; -+ -+ pthread_mutex_lock(&arp_table_mutex); -+ -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { -+ if (uip_ip4addr_cmp(ipaddr, arp_table[i].ipaddr)) { -+ *tabptr = &arp_table[i]; -+ break; -+ } -+ } -+ -+ pthread_mutex_unlock(&arp_table_mutex); -+ -+ if (i == UIP_ARPTAB_SIZE) -+ return NOT_IN_ARP_TABLE; -+ else -+ return IS_IN_ARP_TABLE; -+} -+ -+void uip_build_arp_request(struct uip_stack *ustack, u16_t *ipaddr) -+{ -+ struct arp_hdr *arp; -+ struct uip_eth_hdr *eth; -+ -+ arp = (struct arp_hdr *)ustack->network_layer; -+ eth = (struct uip_eth_hdr *)ustack->data_link_layer; -+ -+ /* The destination address was not in our ARP table, so we -+ overwrite the IP packet with an ARP request. */ -+ -+ memset(eth->dest.addr, 0xff, 6); -+ memset(arp->dhwaddr.addr, 0x00, 6); -+ memcpy(eth->src.addr, ustack->uip_ethaddr.addr, 6); -+ memcpy(arp->shwaddr.addr, ustack->uip_ethaddr.addr, 6); -+ -+ uip_ip4addr_copy(arp->dipaddr, ipaddr); -+ uip_ip4addr_copy(arp->sipaddr, ustack->hostaddr); -+ arp->opcode = const_htons(ARP_REQUEST); /* ARP request. */ -+ arp->hwtype = const_htons(ARP_HWTYPE_ETH); -+ arp->protocol = const_htons(UIP_ETHTYPE_IPv4); -+ arp->hwlen = 6; -+ arp->protolen = 4; -+ eth->type = const_htons(UIP_ETHTYPE_ARP); -+ -+ ustack->uip_appdata = &ustack->uip_buf[UIP_TCP_IPv4_HLEN + UIP_LLH_LEN]; -+ -+ ustack->uip_len = sizeof(*arp) + sizeof(*eth); -+} -+ -+void -+uip_build_eth_header(struct uip_stack *ustack, -+ u16_t *ipaddr, -+ struct arp_entry *tabptr, -+ struct packet *pkt, u16_t vlan_id) -+{ -+ struct uip_ipv4_hdr *ip_buf; -+ struct uip_eth_hdr *eth; -+ struct uip_vlan_eth_hdr *eth_vlan; -+ -+ ip_buf = (struct uip_ipv4_hdr *)ustack->network_layer; -+ eth = (struct uip_eth_hdr *)ustack->data_link_layer; -+ eth_vlan = (struct uip_vlan_eth_hdr *)ustack->data_link_layer; -+ -+ /* First check if destination is a local broadcast. */ -+ if (uip_ip4addr_cmp(ip_buf->destipaddr, broadcast_ipaddr)) { -+ memcpy(eth->dest.addr, broadcast_ethaddr.addr, 6); -+ } else { -+ /* Build an ethernet header. */ -+ memcpy(eth->dest.addr, tabptr->ethaddr.addr, 6); -+ } -+ memcpy(eth->src.addr, ustack->uip_ethaddr.addr, 6); -+ -+ if (vlan_id == 0) { -+ eth->type = htons(UIP_ETHTYPE_IPv4); -+ -+ ustack->uip_len += sizeof(struct uip_eth_hdr); -+ pkt->buf_size += sizeof(struct uip_eth_hdr); -+ } else { -+ eth_vlan->tpid = htons(UIP_ETHTYPE_8021Q); -+ eth_vlan->vid = htons(vlan_id); -+ eth_vlan->type = htons(UIP_ETHTYPE_IPv4); -+ -+ ustack->uip_len += sizeof(struct uip_vlan_eth_hdr); -+ pkt->buf_size += sizeof(struct uip_vlan_eth_hdr); -+ } -+} -+ -+static struct arp_entry *uip_get_arp_entry(int index) -+{ -+ return &arp_table[index]; -+} -+ -+int uip_lookup_arp_entry(uint32_t ip_addr, uint8_t *mac_addr) -+{ -+ int i; -+ int rc = -EINVAL; -+ -+ pthread_mutex_lock(&arp_table_mutex); -+ -+ for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { -+ struct arp_entry *entry = uip_get_arp_entry(i); -+ -+ if (((entry->ipaddr[1] << 16) == (ip_addr & 0xffff0000)) && -+ ((entry->ipaddr[0]) == (ip_addr & 0x0000ffff))) { -+ struct in_addr addr; -+ char *addr_str; -+ -+ addr.s_addr = ip_addr; -+ addr_str = inet_ntoa(addr); -+ -+ memcpy(mac_addr, entry->ethaddr.addr, 6); -+ -+ LOG_INFO("Found %s at %02x:%02x:%02x:%02x:%02x:%02x", -+ addr_str, -+ mac_addr[0], mac_addr[1], mac_addr[2], -+ mac_addr[3], mac_addr[4], mac_addr[5]); -+ rc = 0; -+ break; -+ } -+ } -+ -+ pthread_mutex_unlock(&arp_table_mutex); -+ return rc; -+} -+ -+/*----------------------------------------------------------------------------*/ -+ -+/** @} */ -+/** @} */ -diff --git a/iscsiuio/src/uip/uip_arp.h b/iscsiuio/src/uip/uip_arp.h -new file mode 100644 -index 0000000..339d57d ---- /dev/null -+++ b/iscsiuio/src/uip/uip_arp.h -@@ -0,0 +1,197 @@ -+/** -+ * \addtogroup uip -+ * @{ -+ */ -+ -+/** -+ * \addtogroup uiparp -+ * @{ -+ */ -+ -+/** -+ * \file -+ * Macros and definitions for the ARP module. -+ * \author Adam Dunkels -+ */ -+ -+/* -+ * Copyright (c) 2001-2003, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+#ifndef __UIP_ARP_H__ -+#define __UIP_ARP_H__ -+ -+#include "packet.h" -+#include "uip.h" -+#include "uip_eth.h" -+ -+#define ARP_REQUEST 1 -+#define ARP_REPLY 2 -+ -+#define ARP_HWTYPE_ETH 1 -+ -+struct __attribute__ ((__packed__)) arp_hdr { -+ u16_t hwtype; -+ u16_t protocol; -+ u8_t hwlen; -+ u8_t protolen; -+ u16_t opcode; -+ struct uip_eth_addr shwaddr; -+ u16_t sipaddr[2]; -+ struct uip_eth_addr dhwaddr; -+ u16_t dipaddr[2]; -+}; -+ -+struct __attribute__ ((__packed__)) ip_hdr { -+ /* IP header. */ -+ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; -+ u16_t ipchksum; -+ u16_t srcipaddr[2], destipaddr[2]; -+}; -+ -+struct __attribute__ ((__packed__)) ethip_hdr { -+ struct uip_eth_hdr ethhdr; -+ /* IP header. */ -+ u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; -+ u16_t ipchksum; -+ u16_t srcipaddr[2], destipaddr[2]; -+}; -+ -+struct arp_entry { -+ u16_t ipaddr[2]; -+ struct uip_eth_addr ethaddr; -+ u8_t time; -+}; -+ -+/* The uip_arp_init() function must be called before any of the other -+ ARP functions. */ -+void uip_arp_init(void); -+ -+/* The uip_arp_ipin() function should be called whenever an IP packet -+ arrives from the Ethernet. This function refreshes the ARP table or -+ inserts a new mapping if none exists. The function assumes that an -+ IP packet with an Ethernet header is present in the uip_buf buffer -+ and that the length of the packet is in the uip_len variable. */ -+/*void uip_arp_ipin(void);*/ -+/* #define uip_arp_ipin() */ -+void uip_arp_ipin(struct uip_stack *ustack, struct packet *pkt); -+ -+/* The uip_arp_arpin() should be called when an ARP packet is received -+ by the Ethernet driver. This function also assumes that the -+ Ethernet frame is present in the uip_buf buffer. When the -+ uip_arp_arpin() function returns, the contents of the uip_buf -+ buffer should be sent out on the Ethernet if the uip_len variable -+ is > 0. */ -+void uip_arp_arpin(nic_interface_t *nic_iface, -+ struct uip_stack *ustack, struct packet *pkt); -+ -+typedef enum { -+ ARP_SENT = 1, -+ ETH_HEADER_APPEDEND = 2, -+} arp_out_t; -+ -+typedef enum { -+ LOCAL_BROADCAST = 1, -+ NONLOCAL_BROADCAST = 2, -+} dest_ipv4_addr_t; -+ -+typedef enum { -+ IS_IN_ARP_TABLE = 1, -+ NOT_IN_ARP_TABLE = 2, -+} arp_table_query_t; -+ -+dest_ipv4_addr_t -+uip_determine_dest_ipv4_addr(struct uip_stack *ustack, u16_t *ipaddr); -+arp_out_t is_in_arp_table(u16_t *ipaddr, struct arp_entry **tabptr); -+ -+void uip_build_arp_request(struct uip_stack *ustack, u16_t *ipaddr); -+ -+void -+uip_build_eth_header(struct uip_stack *ustack, -+ u16_t *ipaddr, -+ struct arp_entry *tabptr, -+ struct packet *pkt, u16_t vlan_id); -+ -+/* The uip_arp_out() function should be called when an IP packet -+ should be sent out on the Ethernet. This function creates an -+ Ethernet header before the IP header in the uip_buf buffer. The -+ Ethernet header will have the correct Ethernet MAC destination -+ address filled in if an ARP table entry for the destination IP -+ address (or the IP address of the default router) is present. If no -+ such table entry is found, the IP packet is overwritten with an ARP -+ request and we rely on TCP to retransmit the packet that was -+ overwritten. In any case, the uip_len variable holds the length of -+ the Ethernet frame that should be transmitted. */ -+arp_out_t uip_arp_out(struct uip_stack *ustack); -+ -+/* The uip_arp_timer() function should be called every ten seconds. It -+ is responsible for flushing old entries in the ARP table. */ -+void uip_arp_timer(void); -+ -+int uip_lookup_arp_entry(uint32_t ip_addr, uint8_t *mac_addr); -+ -+/** @} */ -+ -+/** -+ * \addtogroup uipconffunc -+ * @{ -+ */ -+ -+/** -+ * Specifiy the Ethernet MAC address. -+ * -+ * The ARP code needs to know the MAC address of the Ethernet card in -+ * order to be able to respond to ARP queries and to generate working -+ * Ethernet headers. -+ * -+ * \note This macro only specifies the Ethernet MAC address to the ARP -+ * code. It cannot be used to change the MAC address of the Ethernet -+ * card. -+ * -+ * \param eaddr A pointer to a struct uip_eth_addr containing the -+ * Ethernet MAC address of the Ethernet card. -+ * -+ * \hideinitializer -+ */ -+#define uip_setethaddr(eaddr) do { \ -+ uip_ethaddr.addr[0] = eaddr.addr[0]; \ -+ uip_ethaddr.addr[1] = eaddr.addr[1]; \ -+ uip_ethaddr.addr[2] = eaddr.addr[2]; \ -+ uip_ethaddr.addr[3] = eaddr.addr[3]; \ -+ uip_ethaddr.addr[4] = eaddr.addr[4]; \ -+ uip_ethaddr.addr[5] = eaddr.addr[5]; \ -+ } while (0) -+ -+/** @} */ -+/** @} */ -+ -+#endif /* __UIP_ARP_H__ */ -diff --git a/iscsiuio/src/uip/uip_eth.c b/iscsiuio/src/uip/uip_eth.c -new file mode 100644 -index 0000000..449616e ---- /dev/null -+++ b/iscsiuio/src/uip/uip_eth.c -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * uip_eth.c - CNIC UIO uIP user space stack -+ * -+ */ -+ -+#include "uip.h" -+#include "uip_eth.h" -+ -+int is_vlan_packet(struct uip_vlan_eth_hdr *hdr) -+{ -+ /* The TPID field in a 802.1Q Header must be 0x8100 */ -+ if (hdr->tpid == const_htons(UIP_ETHTYPE_8021Q)) -+ return 1; -+ -+ return 0; -+} -diff --git a/iscsiuio/src/uip/uip_eth.h b/iscsiuio/src/uip/uip_eth.h -new file mode 100644 -index 0000000..830c04c ---- /dev/null -+++ b/iscsiuio/src/uip/uip_eth.h -@@ -0,0 +1,43 @@ -+#ifndef __UIP_ETH_H__ -+#define __UIP_ETH_H__ -+ -+#include "uipopt.h" -+ -+/******************************************************************************* -+ * Ether types -+ ******************************************************************************/ -+#define UIP_ETHTYPE_ARP 0x0806 -+#define UIP_ETHTYPE_IPv4 0x0800 -+#define UIP_ETHTYPE_8021Q 0x8100 -+#define UIP_ETHTYPE_IPv6 0x86dd -+ -+/** -+ * Representation of a 48-bit Ethernet address. -+ */ -+struct uip_eth_addr { -+ u8_t addr[6]; -+}; -+ -+/** -+ * The Ethernet header. -+ */ -+struct __attribute__ ((__packed__)) uip_eth_hdr { -+ struct uip_eth_addr dest; -+ struct uip_eth_addr src; -+ u16_t type; -+}; -+ -+/** -+ * The 802.1Q Ethernet header (VLAN). -+ */ -+struct __attribute__ ((__packed__)) uip_vlan_eth_hdr { -+ struct uip_eth_addr dest; -+ struct uip_eth_addr src; -+ u16_t tpid; -+ u16_t vid; -+ u16_t type; -+}; -+ -+int is_vlan_packet(struct uip_vlan_eth_hdr *hdr); -+ -+#endif /* __UIP_ETH_H__ */ -diff --git a/iscsiuio/src/uip/uipopt.h b/iscsiuio/src/uip/uipopt.h -new file mode 100644 -index 0000000..946fce2 ---- /dev/null -+++ b/iscsiuio/src/uip/uipopt.h -@@ -0,0 +1,536 @@ -+/** -+ * \defgroup uipopt Configuration options for uIP -+ * @{ -+ * -+ * uIP is configured using the per-project configuration file -+ * uipopt.h. This file contains all compile-time options for uIP and -+ * should be tweaked to match each specific project. The uIP -+ * distribution contains a documented example "uipopt.h" that can be -+ * copied and modified for each project. -+ * -+ * \note Most of the configuration options in the uipopt.h should not -+ * be changed, but rather the per-project uip-conf.h file. -+ */ -+ -+/** -+ * \file -+ * Configuration options for uIP. -+ * \author Adam Dunkels -+ * -+ * This file is used for tweaking various configuration options for -+ * uIP. You should make a copy of this file into one of your project's -+ * directories instead of editing this example "uipopt.h" file that -+ * comes with the uIP distribution. -+ */ -+ -+/* -+ * Copyright (c) 2001-2003, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+#ifndef __UIPOPT_H__ -+#define __UIPOPT_H__ -+ -+#ifndef UIP_LITTLE_ENDIAN -+#define UIP_LITTLE_ENDIAN 3412 -+#endif /* UIP_LITTLE_ENDIAN */ -+#ifndef UIP_BIG_ENDIAN -+#define UIP_BIG_ENDIAN 1234 -+#endif /* UIP_BIG_ENDIAN */ -+ -+#include "uip-conf.h" -+ -+/*----------------------------------------------------------------------------*/ -+ -+/** -+ * \name Static configuration options -+ * @{ -+ * -+ * These configuration options can be used for setting the IP address -+ * settings statically, but only if UIP_FIXEDADDR is set to 1. The -+ * configuration options for a specific node includes IP address, -+ * netmask and default router as well as the Ethernet address. The -+ * netmask, default router and Ethernet address are appliciable only -+ * if uIP should be run over Ethernet. -+ * -+ * All of these should be changed to suit your project. -+*/ -+ -+/** -+ * Determines if uIP should use a fixed IP address or not. -+ * -+ * If uIP should use a fixed IP address, the settings are set in the -+ * uipopt.h file. If not, the macros uip_sethostaddr(), -+ * uip_setdraddr() and uip_setnetmask() should be used instead. -+ * -+ * \hideinitializer -+ */ -+#define UIP_FIXEDADDR 0 -+ -+/** -+ * Ping IP address asignment. -+ * -+ * uIP uses a "ping" packets for setting its own IP address if this -+ * option is set. If so, uIP will start with an empty IP address and -+ * the destination IP address of the first incoming "ping" (ICMP echo) -+ * packet will be used for setting the hosts IP address. -+ * -+ * \note This works only if UIP_FIXEDADDR is 0. -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_PINGADDRCONF -+#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF -+#else /* UIP_CONF_PINGADDRCONF */ -+#define UIP_PINGADDRCONF 0 -+#endif /* UIP_CONF_PINGADDRCONF */ -+ -+/** -+ * Specifies if the uIP ARP module should be compiled with a fixed -+ * Ethernet MAC address or not. -+ * -+ * If this configuration option is 0, the macro uip_setethaddr() can -+ * be used to specify the Ethernet address at run-time. -+ * -+ * \hideinitializer -+ */ -+#define UIP_FIXEDETHADDR 0 -+ -+/** @} */ -+/*------------------------------------------------------------------------------*/ -+/** -+ * \name IP configuration options -+ * @{ -+ * -+ */ -+/** -+ * The IP TTL (time to live) of IP packets sent by uIP. -+ * -+ * This should normally not be changed. -+ */ -+#define UIP_TTL 64 -+ -+/** -+ * Turn on support for IP packet reassembly. -+ * -+ * uIP supports reassembly of fragmented IP packets. This features -+ * requires an additonal amount of RAM to hold the reassembly buffer -+ * and the reassembly code size is approximately 700 bytes. The -+ * reassembly buffer is of the same size as the uip_buf buffer -+ * (configured by UIP_BUFSIZE). -+ * -+ * \note IP packet reassembly is not heavily tested. -+ * -+ * \hideinitializer -+ */ -+#define UIP_REASSEMBLY 0 -+ -+/** -+ * The maximum time an IP fragment should wait in the reassembly -+ * buffer before it is dropped. -+ * -+ */ -+#define UIP_REASS_MAXAGE 40 -+ -+/** @} */ -+ -+/*----------------------------------------------------------------------------*/ -+/** -+ * \name UDP configuration options -+ * @{ -+ */ -+ -+/** -+ * Toggles wether UDP support should be compiled in or not. -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_UDP -+#define UIP_UDP UIP_CONF_UDP -+#else /* UIP_CONF_UDP */ -+#define UIP_UDP 0 -+#endif /* UIP_CONF_UDP */ -+ -+/** -+ * Toggles if UDP checksums should be used or not. -+ * -+ * \note Support for UDP checksums is currently not included in uIP, -+ * so this option has no function. -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_UDP_CHECKSUMS -+#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS -+#else -+#define UIP_UDP_CHECKSUMS 0 -+#endif -+ -+/** -+ * The maximum amount of concurrent UDP connections. -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_UDP_CONNS -+#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS -+#else /* UIP_CONF_UDP_CONNS */ -+#define UIP_UDP_CONNS 10 -+#endif /* UIP_CONF_UDP_CONNS */ -+ -+/** -+ * The name of the function that should be called when UDP datagrams arrive. -+ * -+ * \hideinitializer -+ */ -+ -+/** @} */ -+/*------------------------------------------------------------------------------*/ -+/** -+ * \name TCP configuration options -+ * @{ -+ */ -+ -+/** -+ * Determines if support for opening connections from uIP should be -+ * compiled in. -+ * -+ * If the applications that are running on top of uIP for this project -+ * do not need to open outgoing TCP connections, this configration -+ * option can be turned off to reduce the code size of uIP. -+ * -+ * \hideinitializer -+ */ -+#define UIP_ACTIVE_OPEN 1 -+ -+/** -+ * The maximum number of simultaneously open TCP connections. -+ * -+ * Since the TCP connections are statically allocated, turning this -+ * configuration knob down results in less RAM used. Each TCP -+ * connection requires approximatly 30 bytes of memory. -+ * -+ * \hideinitializer -+ */ -+#ifndef UIP_CONF_MAX_CONNECTIONS -+#define UIP_CONNS 10 -+#else /* UIP_CONF_MAX_CONNECTIONS */ -+#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS -+#endif /* UIP_CONF_MAX_CONNECTIONS */ -+ -+/** -+ * The maximum number of simultaneously listening TCP ports. -+ * -+ * Each listening TCP port requires 2 bytes of memory. -+ * -+ * \hideinitializer -+ */ -+#ifndef UIP_CONF_MAX_LISTENPORTS -+#define UIP_LISTENPORTS 20 -+#else /* UIP_CONF_MAX_LISTENPORTS */ -+#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS -+#endif /* UIP_CONF_MAX_LISTENPORTS */ -+ -+/** -+ * Determines if support for TCP urgent data notification should be -+ * compiled in. -+ * -+ * Urgent data (out-of-band data) is a rarely used TCP feature that -+ * very seldom would be required. -+ * -+ * \hideinitializer -+ */ -+#define UIP_URGDATA 0 -+ -+/** -+ * The initial retransmission timeout counted in timer pulses. -+ * -+ * This should not be changed. -+ */ -+#define UIP_RTO 3 -+ -+/** -+ * The maximum number of times a segment should be retransmitted -+ * before the connection should be aborted. -+ * -+ * This should not be changed. -+ */ -+#define UIP_MAXRTX 8 -+ -+/** -+ * The maximum number of times a SYN segment should be retransmitted -+ * before a connection request should be deemed to have been -+ * unsuccessful. -+ * -+ * This should not need to be changed. -+ */ -+#define UIP_MAXSYNRTX 5 -+ -+/** -+ * The TCP maximum segment size. -+ * -+ * This is should not be to set to more than -+ * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. -+ */ -+#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCP_IPv4_HLEN) -+ -+/** -+ * The size of the advertised receiver's window. -+ * -+ * Should be set low (i.e., to the size of the uip_buf buffer) is the -+ * application is slow to process incoming data, or high (32768 bytes) -+ * if the application processes data quickly. -+ * -+ * \hideinitializer -+ */ -+#ifndef UIP_CONF_RECEIVE_WINDOW -+#define UIP_RECEIVE_WINDOW UIP_TCP_MSS -+#else -+#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW -+#endif -+ -+/** -+ * How long a connection should stay in the TIME_WAIT state. -+ * -+ * This configiration option has no real implication, and it should be -+ * left untouched. -+ */ -+#define UIP_TIME_WAIT_TIMEOUT 120 -+ -+/** @} */ -+/*------------------------------------------------------------------------------*/ -+/** -+ * \name ARP configuration options -+ * @{ -+ */ -+ -+/** -+ * The size of the ARP table. -+ * -+ * This option should be set to a larger value if this uIP node will -+ * have many connections from the local network. -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_ARPTAB_SIZE -+#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE -+#else -+#define UIP_ARPTAB_SIZE 8 -+#endif -+ -+/** -+ * The maxium age of ARP table entries measured in 10ths of seconds. -+ * -+ * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD -+ * default). -+ * Changed the default to 30 which corresponds to 5 minutes (Linux default) -+ */ -+#define UIP_ARP_MAXAGE 30 -+ -+/** @} */ -+ -+/*----------------------------------------------------------------------------*/ -+ -+/** -+ * \name General configuration options -+ * @{ -+ */ -+ -+/** -+ * The size of the uIP packet buffer. -+ * -+ * The uIP packet buffer should not be smaller than 60 bytes, and does -+ * not need to be larger than 1500 bytes. Lower size results in lower -+ * TCP throughput, larger size results in higher TCP throughput. -+ * -+ * \hideinitializer -+ */ -+#ifndef UIP_CONF_BUFFER_SIZE -+#define UIP_BUFSIZE 400 -+#else /* UIP_CONF_BUFFER_SIZE */ -+#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE -+#endif /* UIP_CONF_BUFFER_SIZE */ -+ -+/** -+ * Determines if statistics support should be compiled in. -+ * -+ * The statistics is useful for debugging and to show the user. -+ * -+ * \hideinitializer -+ */ -+#ifndef UIP_CONF_STATISTICS -+#define UIP_STATISTICS 0 -+#else /* UIP_CONF_STATISTICS */ -+#define UIP_STATISTICS UIP_CONF_STATISTICS -+#endif /* UIP_CONF_STATISTICS */ -+ -+/** -+ * Determines if logging of certain events should be compiled in. -+ * -+ * This is useful mostly for debugging. The function uip_log() -+ * must be implemented to suit the architecture of the project, if -+ * logging is turned on. -+ * -+ * \hideinitializer -+ */ -+#ifndef UIP_CONF_LOGGING -+#define UIP_LOGGING 0 -+#else /* UIP_CONF_LOGGING */ -+#define UIP_LOGGING UIP_CONF_LOGGING -+#endif /* UIP_CONF_LOGGING */ -+ -+/** -+ * Broadcast support. -+ * -+ * This flag configures IP broadcast support. This is useful only -+ * together with UDP. -+ * -+ * \hideinitializer -+ * -+ */ -+#ifndef UIP_CONF_BROADCAST -+#define UIP_BROADCAST 0 -+#else /* UIP_CONF_BROADCAST */ -+#define UIP_BROADCAST UIP_CONF_BROADCAST -+#endif /* UIP_CONF_BROADCAST */ -+ -+/** -+ * Print out a uIP log message. -+ * -+ * This function must be implemented by the module that uses uIP, and -+ * is called by uIP whenever a log message is generated. -+ */ -+void uip_log(char *msg); -+ -+/** -+ * The link level header length. -+ * -+ * This is the offset into the uip_buf where the IP header can be -+ * found. For Ethernet, this should be set to 14. For SLIP, this -+ * should be set to 0. -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_LLH_LEN -+#define UIP_LLH_LEN UIP_CONF_LLH_LEN -+#else /* UIP_CONF_LLH_LEN */ -+#define UIP_LLH_LEN 14 -+#endif /* UIP_CONF_LLH_LEN */ -+ -+#if 0 -+/** @} */ -+/*------------------------------------------------------------------------------*/ -+/** -+ * \name CPU architecture configuration -+ * @{ -+ * -+ * The CPU architecture configuration is where the endianess of the -+ * CPU on which uIP is to be run is specified. Most CPUs today are -+ * little endian, and the most notable exception are the Motorolas -+ * which are big endian. The BYTE_ORDER macro should be changed to -+ * reflect the CPU architecture on which uIP is to be run. -+ */ -+ -+/** -+ * The byte order of the CPU architecture on which uIP is to be run. -+ * -+ * This option can be either BIG_ENDIAN (Motorola byte order) or -+ * LITTLE_ENDIAN (Intel byte order). -+ * -+ * \hideinitializer -+ */ -+#ifdef UIP_CONF_BYTE_ORDER -+#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER -+#else /* UIP_CONF_BYTE_ORDER */ -+#define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN -+#endif /* UIP_CONF_BYTE_ORDER */ -+#endif -+ -+/** @} */ -+/*------------------------------------------------------------------------------*/ -+ -+/** -+ * \name Appication specific configurations -+ * @{ -+ * -+ * An uIP application is implemented using a single application -+ * function that is called by uIP whenever a TCP/IP event occurs. The -+ * name of this function must be registered with uIP at compile time -+ * using the UIP_APPCALL definition. -+ * -+ * uIP applications can store the application state within the -+ * uip_conn structure by specifying the type of the application -+ * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. -+ * -+ * The file containing the definitions must be included in the -+ * uipopt.h file. -+ * -+ * The following example illustrates how this can look. -+ \code -+ -+void httpd_appcall(void); -+#define UIP_APPCALL httpd_appcall -+ -+struct httpd_state { -+ u8_t state; -+ u16_t count; -+ char *dataptr; -+ char *script; -+}; -+typedef struct httpd_state uip_tcp_appstate_t -+ \endcode -+ */ -+ -+/** -+ * \var #define UIP_APPCALL -+ * -+ * The name of the application function that uIP should call in -+ * response to TCP/IP events. -+ * -+ */ -+ -+/** -+ * \var typedef uip_tcp_appstate_t -+ * -+ * The type of the application state that is to be stored in the -+ * uip_conn structure. This usually is typedef:ed to a struct holding -+ * application state information. -+ */ -+ -+/** -+ * \var typedef uip_udp_appstate_t -+ * -+ * The type of the application state that is to be stored in the -+ * uip_conn structure. This usually is typedef:ed to a struct holding -+ * application state information. -+ */ -+/** @} */ -+/** @} */ -+ -+#endif /* __UIPOPT_H__ */ -diff --git a/iscsiuio/src/unix/Makefile.am b/iscsiuio/src/unix/Makefile.am -new file mode 100644 -index 0000000..ef853a7 ---- /dev/null -+++ b/iscsiuio/src/unix/Makefile.am -@@ -0,0 +1,39 @@ -+SUBDIRS= libs -+ -+INCLUDES = -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/unix/libs \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+sbin_PROGRAMS = iscsiuio -+ -+iscsiuio_SOURCES = build_date.c \ -+ main.c \ -+ clock-arch.c \ -+ logger.c \ -+ nic.c \ -+ nic_id.c \ -+ nic_vlan.c \ -+ nic_nl.c \ -+ nic_utils.c \ -+ packet.c \ -+ iscsid_ipc.c -+ -+iscsiuio_CFLAGS = $(AM_CFLAGS) \ -+ $(LIBNL_CFLAGS) \ -+ -DBYTE_ORDER=@ENDIAN@ -+ -+iscsiuio_LDFLAGS= $(AM_LDADD) \ -+ -ldl \ -+ -rdynamic \ -+ $(LIBNL_LIBS) \ -+ -lpthread -+ -+iscsiuio_LDADD = ${top_srcdir}/src/uip/lib_iscsi_uip.a \ -+ ${top_srcdir}/src/apps/dhcpc/lib_apps_dhcpc.a\ -+ ${top_srcdir}/src/apps/brcm-iscsi/lib_apps_brcm_iscsi.a \ -+ ${top_srcdir}/src/unix/libs/lib_iscsiuio_hw_cnic.a -+ -+iscsiuio_YFLAGS = -d -diff --git a/iscsiuio/src/unix/Makefile.in b/iscsiuio/src/unix/Makefile.in -new file mode 100644 -index 0000000..4552cb8 ---- /dev/null -+++ b/iscsiuio/src/unix/Makefile.in -@@ -0,0 +1,767 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = ../.. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+sbin_PROGRAMS = iscsiuio$(EXEEXT) -+subdir = src/unix -+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+am__installdirs = "$(DESTDIR)$(sbindir)" -+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -+PROGRAMS = $(sbin_PROGRAMS) -+am_iscsiuio_OBJECTS = iscsiuio-build_date.$(OBJEXT) \ -+ iscsiuio-main.$(OBJEXT) iscsiuio-clock-arch.$(OBJEXT) \ -+ iscsiuio-logger.$(OBJEXT) iscsiuio-nic.$(OBJEXT) \ -+ iscsiuio-nic_id.$(OBJEXT) iscsiuio-nic_vlan.$(OBJEXT) \ -+ iscsiuio-nic_nl.$(OBJEXT) iscsiuio-nic_utils.$(OBJEXT) \ -+ iscsiuio-packet.$(OBJEXT) iscsiuio-iscsid_ipc.$(OBJEXT) -+iscsiuio_OBJECTS = $(am_iscsiuio_OBJECTS) -+iscsiuio_DEPENDENCIES = ${top_srcdir}/src/uip/lib_iscsi_uip.a \ -+ ${top_srcdir}/src/apps/dhcpc/lib_apps_dhcpc.a \ -+ ${top_srcdir}/src/apps/brcm-iscsi/lib_apps_brcm_iscsi.a \ -+ ${top_srcdir}/src/unix/libs/lib_iscsiuio_hw_cnic.a -+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -+depcomp = $(SHELL) $(top_srcdir)/depcomp -+am__depfiles_maybe = depfiles -+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ -+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ -+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -+ $(AM_CFLAGS) $(CFLAGS) -+CCLD = $(CC) -+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -+ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -+SOURCES = $(iscsiuio_SOURCES) -+DIST_SOURCES = $(iscsiuio_SOURCES) -+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ -+ html-recursive info-recursive install-data-recursive \ -+ install-exec-recursive install-info-recursive \ -+ install-recursive installcheck-recursive installdirs-recursive \ -+ pdf-recursive ps-recursive uninstall-info-recursive \ -+ uninstall-recursive -+ETAGS = etags -+CTAGS = ctags -+DIST_SUBDIRS = $(SUBDIRS) -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+SUBDIRS = libs -+INCLUDES = -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/apps/brcm-iscsi \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/src/unix/libs \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+iscsiuio_SOURCES = build_date.c \ -+ main.c \ -+ clock-arch.c \ -+ logger.c \ -+ nic.c \ -+ nic_id.c \ -+ nic_vlan.c \ -+ nic_nl.c \ -+ nic_utils.c \ -+ packet.c \ -+ iscsid_ipc.c -+ -+iscsiuio_CFLAGS = $(AM_CFLAGS) \ -+ $(LIBNL_CFLAGS) \ -+ -DBYTE_ORDER=@ENDIAN@ -+ -+iscsiuio_LDFLAGS = $(AM_LDADD) \ -+ -ldl \ -+ -rdynamic \ -+ $(LIBNL_LIBS) \ -+ -lpthread -+ -+iscsiuio_LDADD = ${top_srcdir}/src/uip/lib_iscsi_uip.a \ -+ ${top_srcdir}/src/apps/dhcpc/lib_apps_dhcpc.a\ -+ ${top_srcdir}/src/apps/brcm-iscsi/lib_apps_brcm_iscsi.a \ -+ ${top_srcdir}/src/unix/libs/lib_iscsiuio_hw_cnic.a -+ -+iscsiuio_YFLAGS = -d -+all: all-recursive -+ -+.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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/unix/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/unix/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 -+install-sbinPROGRAMS: $(sbin_PROGRAMS) -+ @$(NORMAL_INSTALL) -+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" -+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \ -+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ -+ if test -f $$p \ -+ || test -f $$p1 \ -+ ; then \ -+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ -+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ -+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ -+ else :; fi; \ -+ done -+ -+uninstall-sbinPROGRAMS: -+ @$(NORMAL_UNINSTALL) -+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \ -+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ -+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ -+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \ -+ done -+ -+clean-sbinPROGRAMS: -+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \ -+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ -+ echo " rm -f $$p $$f"; \ -+ rm -f $$p $$f ; \ -+ done -+iscsiuio$(EXEEXT): $(iscsiuio_OBJECTS) $(iscsiuio_DEPENDENCIES) -+ @rm -f iscsiuio$(EXEEXT) -+ $(LINK) $(iscsiuio_LDFLAGS) $(iscsiuio_OBJECTS) $(iscsiuio_LDADD) $(LIBS) -+ -+mostlyclean-compile: -+ -rm -f *.$(OBJEXT) -+ -+distclean-compile: -+ -rm -f *.tab.c -+ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-build_date.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-clock-arch.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-iscsid_ipc.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-logger.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-main.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-nic.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-nic_id.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-nic_nl.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-nic_utils.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-nic_vlan.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iscsiuio-packet.Po@am__quote@ -+ -+.c.o: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c $< -+ -+.c.obj: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -+ -+.c.lo: -+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -+ -+iscsiuio-build_date.o: build_date.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-build_date.o -MD -MP -MF "$(DEPDIR)/iscsiuio-build_date.Tpo" -c -o iscsiuio-build_date.o `test -f 'build_date.c' || echo '$(srcdir)/'`build_date.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-build_date.Tpo" "$(DEPDIR)/iscsiuio-build_date.Po"; else rm -f "$(DEPDIR)/iscsiuio-build_date.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='build_date.c' object='iscsiuio-build_date.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-build_date.o `test -f 'build_date.c' || echo '$(srcdir)/'`build_date.c -+ -+iscsiuio-build_date.obj: build_date.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-build_date.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-build_date.Tpo" -c -o iscsiuio-build_date.obj `if test -f 'build_date.c'; then $(CYGPATH_W) 'build_date.c'; else $(CYGPATH_W) '$(srcdir)/build_date.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-build_date.Tpo" "$(DEPDIR)/iscsiuio-build_date.Po"; else rm -f "$(DEPDIR)/iscsiuio-build_date.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='build_date.c' object='iscsiuio-build_date.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-build_date.obj `if test -f 'build_date.c'; then $(CYGPATH_W) 'build_date.c'; else $(CYGPATH_W) '$(srcdir)/build_date.c'; fi` -+ -+iscsiuio-main.o: main.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-main.o -MD -MP -MF "$(DEPDIR)/iscsiuio-main.Tpo" -c -o iscsiuio-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-main.Tpo" "$(DEPDIR)/iscsiuio-main.Po"; else rm -f "$(DEPDIR)/iscsiuio-main.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='iscsiuio-main.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c -+ -+iscsiuio-main.obj: main.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-main.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-main.Tpo" -c -o iscsiuio-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-main.Tpo" "$(DEPDIR)/iscsiuio-main.Po"; else rm -f "$(DEPDIR)/iscsiuio-main.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='iscsiuio-main.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` -+ -+iscsiuio-clock-arch.o: clock-arch.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-clock-arch.o -MD -MP -MF "$(DEPDIR)/iscsiuio-clock-arch.Tpo" -c -o iscsiuio-clock-arch.o `test -f 'clock-arch.c' || echo '$(srcdir)/'`clock-arch.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-clock-arch.Tpo" "$(DEPDIR)/iscsiuio-clock-arch.Po"; else rm -f "$(DEPDIR)/iscsiuio-clock-arch.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='clock-arch.c' object='iscsiuio-clock-arch.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-clock-arch.o `test -f 'clock-arch.c' || echo '$(srcdir)/'`clock-arch.c -+ -+iscsiuio-clock-arch.obj: clock-arch.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-clock-arch.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-clock-arch.Tpo" -c -o iscsiuio-clock-arch.obj `if test -f 'clock-arch.c'; then $(CYGPATH_W) 'clock-arch.c'; else $(CYGPATH_W) '$(srcdir)/clock-arch.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-clock-arch.Tpo" "$(DEPDIR)/iscsiuio-clock-arch.Po"; else rm -f "$(DEPDIR)/iscsiuio-clock-arch.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='clock-arch.c' object='iscsiuio-clock-arch.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-clock-arch.obj `if test -f 'clock-arch.c'; then $(CYGPATH_W) 'clock-arch.c'; else $(CYGPATH_W) '$(srcdir)/clock-arch.c'; fi` -+ -+iscsiuio-logger.o: logger.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-logger.o -MD -MP -MF "$(DEPDIR)/iscsiuio-logger.Tpo" -c -o iscsiuio-logger.o `test -f 'logger.c' || echo '$(srcdir)/'`logger.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-logger.Tpo" "$(DEPDIR)/iscsiuio-logger.Po"; else rm -f "$(DEPDIR)/iscsiuio-logger.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='logger.c' object='iscsiuio-logger.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-logger.o `test -f 'logger.c' || echo '$(srcdir)/'`logger.c -+ -+iscsiuio-logger.obj: logger.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-logger.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-logger.Tpo" -c -o iscsiuio-logger.obj `if test -f 'logger.c'; then $(CYGPATH_W) 'logger.c'; else $(CYGPATH_W) '$(srcdir)/logger.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-logger.Tpo" "$(DEPDIR)/iscsiuio-logger.Po"; else rm -f "$(DEPDIR)/iscsiuio-logger.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='logger.c' object='iscsiuio-logger.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-logger.obj `if test -f 'logger.c'; then $(CYGPATH_W) 'logger.c'; else $(CYGPATH_W) '$(srcdir)/logger.c'; fi` -+ -+iscsiuio-nic.o: nic.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic.o -MD -MP -MF "$(DEPDIR)/iscsiuio-nic.Tpo" -c -o iscsiuio-nic.o `test -f 'nic.c' || echo '$(srcdir)/'`nic.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic.Tpo" "$(DEPDIR)/iscsiuio-nic.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic.c' object='iscsiuio-nic.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic.o `test -f 'nic.c' || echo '$(srcdir)/'`nic.c -+ -+iscsiuio-nic.obj: nic.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-nic.Tpo" -c -o iscsiuio-nic.obj `if test -f 'nic.c'; then $(CYGPATH_W) 'nic.c'; else $(CYGPATH_W) '$(srcdir)/nic.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic.Tpo" "$(DEPDIR)/iscsiuio-nic.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic.c' object='iscsiuio-nic.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic.obj `if test -f 'nic.c'; then $(CYGPATH_W) 'nic.c'; else $(CYGPATH_W) '$(srcdir)/nic.c'; fi` -+ -+iscsiuio-nic_id.o: nic_id.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_id.o -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_id.Tpo" -c -o iscsiuio-nic_id.o `test -f 'nic_id.c' || echo '$(srcdir)/'`nic_id.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_id.Tpo" "$(DEPDIR)/iscsiuio-nic_id.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_id.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_id.c' object='iscsiuio-nic_id.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_id.o `test -f 'nic_id.c' || echo '$(srcdir)/'`nic_id.c -+ -+iscsiuio-nic_id.obj: nic_id.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_id.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_id.Tpo" -c -o iscsiuio-nic_id.obj `if test -f 'nic_id.c'; then $(CYGPATH_W) 'nic_id.c'; else $(CYGPATH_W) '$(srcdir)/nic_id.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_id.Tpo" "$(DEPDIR)/iscsiuio-nic_id.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_id.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_id.c' object='iscsiuio-nic_id.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_id.obj `if test -f 'nic_id.c'; then $(CYGPATH_W) 'nic_id.c'; else $(CYGPATH_W) '$(srcdir)/nic_id.c'; fi` -+ -+iscsiuio-nic_vlan.o: nic_vlan.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_vlan.o -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_vlan.Tpo" -c -o iscsiuio-nic_vlan.o `test -f 'nic_vlan.c' || echo '$(srcdir)/'`nic_vlan.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_vlan.Tpo" "$(DEPDIR)/iscsiuio-nic_vlan.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_vlan.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_vlan.c' object='iscsiuio-nic_vlan.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_vlan.o `test -f 'nic_vlan.c' || echo '$(srcdir)/'`nic_vlan.c -+ -+iscsiuio-nic_vlan.obj: nic_vlan.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_vlan.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_vlan.Tpo" -c -o iscsiuio-nic_vlan.obj `if test -f 'nic_vlan.c'; then $(CYGPATH_W) 'nic_vlan.c'; else $(CYGPATH_W) '$(srcdir)/nic_vlan.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_vlan.Tpo" "$(DEPDIR)/iscsiuio-nic_vlan.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_vlan.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_vlan.c' object='iscsiuio-nic_vlan.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_vlan.obj `if test -f 'nic_vlan.c'; then $(CYGPATH_W) 'nic_vlan.c'; else $(CYGPATH_W) '$(srcdir)/nic_vlan.c'; fi` -+ -+iscsiuio-nic_nl.o: nic_nl.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_nl.o -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_nl.Tpo" -c -o iscsiuio-nic_nl.o `test -f 'nic_nl.c' || echo '$(srcdir)/'`nic_nl.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_nl.Tpo" "$(DEPDIR)/iscsiuio-nic_nl.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_nl.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_nl.c' object='iscsiuio-nic_nl.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_nl.o `test -f 'nic_nl.c' || echo '$(srcdir)/'`nic_nl.c -+ -+iscsiuio-nic_nl.obj: nic_nl.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_nl.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_nl.Tpo" -c -o iscsiuio-nic_nl.obj `if test -f 'nic_nl.c'; then $(CYGPATH_W) 'nic_nl.c'; else $(CYGPATH_W) '$(srcdir)/nic_nl.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_nl.Tpo" "$(DEPDIR)/iscsiuio-nic_nl.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_nl.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_nl.c' object='iscsiuio-nic_nl.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_nl.obj `if test -f 'nic_nl.c'; then $(CYGPATH_W) 'nic_nl.c'; else $(CYGPATH_W) '$(srcdir)/nic_nl.c'; fi` -+ -+iscsiuio-nic_utils.o: nic_utils.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_utils.o -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_utils.Tpo" -c -o iscsiuio-nic_utils.o `test -f 'nic_utils.c' || echo '$(srcdir)/'`nic_utils.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_utils.Tpo" "$(DEPDIR)/iscsiuio-nic_utils.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_utils.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_utils.c' object='iscsiuio-nic_utils.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_utils.o `test -f 'nic_utils.c' || echo '$(srcdir)/'`nic_utils.c -+ -+iscsiuio-nic_utils.obj: nic_utils.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-nic_utils.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-nic_utils.Tpo" -c -o iscsiuio-nic_utils.obj `if test -f 'nic_utils.c'; then $(CYGPATH_W) 'nic_utils.c'; else $(CYGPATH_W) '$(srcdir)/nic_utils.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-nic_utils.Tpo" "$(DEPDIR)/iscsiuio-nic_utils.Po"; else rm -f "$(DEPDIR)/iscsiuio-nic_utils.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nic_utils.c' object='iscsiuio-nic_utils.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-nic_utils.obj `if test -f 'nic_utils.c'; then $(CYGPATH_W) 'nic_utils.c'; else $(CYGPATH_W) '$(srcdir)/nic_utils.c'; fi` -+ -+iscsiuio-packet.o: packet.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-packet.o -MD -MP -MF "$(DEPDIR)/iscsiuio-packet.Tpo" -c -o iscsiuio-packet.o `test -f 'packet.c' || echo '$(srcdir)/'`packet.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-packet.Tpo" "$(DEPDIR)/iscsiuio-packet.Po"; else rm -f "$(DEPDIR)/iscsiuio-packet.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='packet.c' object='iscsiuio-packet.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-packet.o `test -f 'packet.c' || echo '$(srcdir)/'`packet.c -+ -+iscsiuio-packet.obj: packet.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-packet.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-packet.Tpo" -c -o iscsiuio-packet.obj `if test -f 'packet.c'; then $(CYGPATH_W) 'packet.c'; else $(CYGPATH_W) '$(srcdir)/packet.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-packet.Tpo" "$(DEPDIR)/iscsiuio-packet.Po"; else rm -f "$(DEPDIR)/iscsiuio-packet.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='packet.c' object='iscsiuio-packet.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-packet.obj `if test -f 'packet.c'; then $(CYGPATH_W) 'packet.c'; else $(CYGPATH_W) '$(srcdir)/packet.c'; fi` -+ -+iscsiuio-iscsid_ipc.o: iscsid_ipc.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-iscsid_ipc.o -MD -MP -MF "$(DEPDIR)/iscsiuio-iscsid_ipc.Tpo" -c -o iscsiuio-iscsid_ipc.o `test -f 'iscsid_ipc.c' || echo '$(srcdir)/'`iscsid_ipc.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-iscsid_ipc.Tpo" "$(DEPDIR)/iscsiuio-iscsid_ipc.Po"; else rm -f "$(DEPDIR)/iscsiuio-iscsid_ipc.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='iscsid_ipc.c' object='iscsiuio-iscsid_ipc.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-iscsid_ipc.o `test -f 'iscsid_ipc.c' || echo '$(srcdir)/'`iscsid_ipc.c -+ -+iscsiuio-iscsid_ipc.obj: iscsid_ipc.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -MT iscsiuio-iscsid_ipc.obj -MD -MP -MF "$(DEPDIR)/iscsiuio-iscsid_ipc.Tpo" -c -o iscsiuio-iscsid_ipc.obj `if test -f 'iscsid_ipc.c'; then $(CYGPATH_W) 'iscsid_ipc.c'; else $(CYGPATH_W) '$(srcdir)/iscsid_ipc.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/iscsiuio-iscsid_ipc.Tpo" "$(DEPDIR)/iscsiuio-iscsid_ipc.Po"; else rm -f "$(DEPDIR)/iscsiuio-iscsid_ipc.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='iscsid_ipc.c' object='iscsiuio-iscsid_ipc.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iscsiuio_CFLAGS) $(CFLAGS) -c -o iscsiuio-iscsid_ipc.obj `if test -f 'iscsid_ipc.c'; then $(CYGPATH_W) 'iscsid_ipc.c'; else $(CYGPATH_W) '$(srcdir)/iscsid_ipc.c'; fi` -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+# 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. -+$(RECURSIVE_TARGETS): -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ list='$(SUBDIRS)'; 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; \ -+ (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" -+ -+mostlyclean-recursive clean-recursive distclean-recursive \ -+maintainer-clean-recursive: -+ @failcom='exit 1'; \ -+ for f in x $$MAKEFLAGS; do \ -+ case $$f in \ -+ *=* | --[!k]*);; \ -+ *k*) failcom='fail=yes';; \ -+ esac; \ -+ done; \ -+ dot_seen=no; \ -+ case "$@" in \ -+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ -+ *) list='$(SUBDIRS)' ;; \ -+ esac; \ -+ rev=''; for subdir in $$list; do \ -+ if test "$$subdir" = "."; then :; else \ -+ rev="$$subdir $$rev"; \ -+ fi; \ -+ done; \ -+ rev="$$rev ."; \ -+ target=`echo $@ | sed s/-recursive//`; \ -+ for subdir in $$rev; do \ -+ echo "Making $$target in $$subdir"; \ -+ if test "$$subdir" = "."; then \ -+ local_target="$$target-am"; \ -+ else \ -+ local_target="$$target"; \ -+ fi; \ -+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ -+ || eval $$failcom; \ -+ done && test -z "$$fail" -+tags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ -+ done -+ctags-recursive: -+ list='$(SUBDIRS)'; for subdir in $$list; do \ -+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ -+ done -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ 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 || \ -+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ -+ fi; \ -+ done; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 \ -+ test -d "$(distdir)/$$subdir" \ -+ || $(mkdir_p) "$(distdir)/$$subdir" \ -+ || exit 1; \ -+ distdir=`$(am__cd) $(distdir) && pwd`; \ -+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ -+ (cd $$subdir && \ -+ $(MAKE) $(AM_MAKEFLAGS) \ -+ top_distdir="$$top_distdir" \ -+ distdir="$$distdir/$$subdir" \ -+ distdir) \ -+ || exit 1; \ -+ fi; \ -+ done -+check-am: all-am -+check: check-recursive -+all-am: Makefile $(PROGRAMS) -+installdirs: installdirs-recursive -+installdirs-am: -+ for dir in "$(DESTDIR)$(sbindir)"; 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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-recursive -+ -+clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ -+ mostlyclean-am -+ -+distclean: distclean-recursive -+ -rm -rf ./$(DEPDIR) -+ -rm -f Makefile -+distclean-am: clean-am distclean-compile distclean-generic \ -+ distclean-libtool distclean-tags -+ -+dvi: dvi-recursive -+ -+dvi-am: -+ -+html: html-recursive -+ -+info: info-recursive -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: install-sbinPROGRAMS -+ -+install-info: install-info-recursive -+ -+install-man: -+ -+installcheck-am: -+ -+maintainer-clean: maintainer-clean-recursive -+ -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-info-am uninstall-sbinPROGRAMS -+ -+uninstall-info: uninstall-info-recursive -+ -+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ -+ clean clean-generic clean-libtool clean-recursive \ -+ clean-sbinPROGRAMS ctags ctags-recursive distclean \ -+ distclean-compile distclean-generic distclean-libtool \ -+ distclean-recursive distclean-tags distdir dvi dvi-am html \ -+ html-am info info-am install install-am install-data \ -+ install-data-am install-exec install-exec-am install-info \ -+ install-info-am install-man install-sbinPROGRAMS install-strip \ -+ installcheck installcheck-am installdirs installdirs-am \ -+ maintainer-clean maintainer-clean-generic \ -+ maintainer-clean-recursive mostlyclean mostlyclean-compile \ -+ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ -+ pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ -+ uninstall-info-am uninstall-sbinPROGRAMS -+ -+# 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: -diff --git a/iscsiuio/src/unix/build_date.c b/iscsiuio/src/unix/build_date.c -new file mode 100644 -index 0000000..b6c31cb ---- /dev/null -+++ b/iscsiuio/src/unix/build_date.c -@@ -0,0 +1 @@ -+char *build_date = "Thu Sep 6 16:56:48 PDT 2012"; -diff --git a/iscsiuio/src/unix/build_date.h b/iscsiuio/src/unix/build_date.h -new file mode 100644 -index 0000000..1f18b6e ---- /dev/null -+++ b/iscsiuio/src/unix/build_date.h -@@ -0,0 +1 @@ -+char *build_date; -diff --git a/iscsiuio/src/unix/clock-arch.c b/iscsiuio/src/unix/clock-arch.c -new file mode 100644 -index 0000000..d853101 ---- /dev/null -+++ b/iscsiuio/src/unix/clock-arch.c -@@ -0,0 +1,54 @@ -+/* -+ * Copyright (c) 2006, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+ -+/** -+ * \file -+ * Implementation of architecture-specific clock functionality -+ * \author -+ * Adam Dunkels -+ */ -+ -+#include "clock-arch.h" -+#include -+ -+/*---------------------------------------------------------------------------*/ -+clock_time_t clock_time(void) -+{ -+ struct timeval tv; -+ struct timezone tz; -+ -+ gettimeofday(&tv, &tz); -+ -+ return tv.tv_sec * 1000 + tv.tv_usec / 1000; -+} -+ -+/*---------------------------------------------------------------------------*/ -diff --git a/iscsiuio/src/unix/clock-arch.h b/iscsiuio/src/unix/clock-arch.h -new file mode 100644 -index 0000000..888933f ---- /dev/null -+++ b/iscsiuio/src/unix/clock-arch.h -@@ -0,0 +1,39 @@ -+/* -+ * Copyright (c) 2006, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+ -+#ifndef __CLOCK_ARCH_H__ -+#define __CLOCK_ARCH_H__ -+ -+typedef int clock_time_t; -+#define CLOCK_CONF_SECOND 1000 -+ -+#endif /* __CLOCK_ARCH_H__ */ -diff --git a/iscsiuio/src/unix/iscsid_ipc.c b/iscsiuio/src/unix/iscsid_ipc.c -new file mode 100644 -index 0000000..5c097e6 ---- /dev/null -+++ b/iscsiuio/src/unix/iscsid_ipc.c -@@ -0,0 +1,1044 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * iscsi_ipc.c - Generic NIC management/utility functions -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define PFX "iscsi_ipc " -+ -+/* TODO fix me */ -+#define IFNAMSIZ 15 -+ -+#include "nic.h" -+#include "nic_utils.h" -+#include "nic_vlan.h" -+#include "options.h" -+#include "mgmt_ipc.h" -+#include "iscsid_ipc.h" -+#include "uip.h" -+#include "uip_mgmt_ipc.h" -+ -+#include "logger.h" -+#include "uip.h" -+ -+/* private iscsid options stucture */ -+struct iscsid_options { -+ int fd; -+ pthread_t thread; -+}; -+ -+struct iface_rec_decode { -+ /* General */ -+ int32_t iface_num; -+ uint32_t ip_type; -+ -+ /* IPv4 */ -+ struct in_addr ipv4_addr; -+ struct in_addr ipv4_subnet_mask; -+ struct in_addr ipv4_gateway; -+ -+ /* IPv6 */ -+ struct in6_addr ipv6_addr; -+ struct in6_addr ipv6_subnet_mask; -+ uint32_t prefix_len; -+ struct in6_addr ipv6_linklocal; -+ struct in6_addr ipv6_router; -+ -+ uint8_t ipv6_autocfg; -+ uint8_t linklocal_autocfg; -+ uint8_t router_autocfg; -+ -+ uint8_t vlan_state; -+ uint8_t vlan_priority; -+ uint16_t vlan_id; -+ -+#define MIN_MTU_SUPPORT 46 -+#define MAX_MTU_SUPPORT 9000 -+ uint16_t mtu; -+}; -+ -+ -+/****************************************************************************** -+ * iscsid_ipc Constants -+ *****************************************************************************/ -+static const char uio_udev_path_template[] = "/dev/uio%d"; -+ -+/****************************************************************************** -+ * Globals -+ *****************************************************************************/ -+static struct iscsid_options iscsid_opts = { -+ .fd = INVALID_FD, -+ .thread = INVALID_THREAD, -+}; -+ -+/****************************************************************************** -+ * iscsid Functions -+ *****************************************************************************/ -+ -+static void *enable_nic_thread(void *data) -+{ -+ nic_t *nic = (nic_t *) data; -+ -+ prepare_nic_thread(nic); -+ LOG_INFO(PFX "%s: started NIC enable thread state: 0x%x", -+ nic->log_name, nic->state) -+ -+ /* Enable the NIC */ -+ nic_enable(nic); -+ -+ nic->enable_thread = INVALID_THREAD; -+ -+ pthread_exit(NULL); -+} -+ -+static int decode_cidr(char *in_ipaddr_str, struct iface_rec_decode *ird) -+{ -+ int rc = 0, i; -+ char *tmp, *tok; -+ char ipaddr_str[NI_MAXHOST]; -+ char str[INET6_ADDRSTRLEN]; -+ int keepbits = 0; -+ struct in_addr ia; -+ struct in6_addr ia6; -+ -+ if (strlen(in_ipaddr_str) > NI_MAXHOST) -+ strncpy(ipaddr_str, in_ipaddr_str, NI_MAXHOST); -+ else -+ strcpy(ipaddr_str, in_ipaddr_str); -+ -+ /* Find the CIDR if any */ -+ tmp = strchr(ipaddr_str, '/'); -+ if (tmp) { -+ /* CIDR found, now decode, tmpbuf = ip, tmp = netmask */ -+ tmp = ipaddr_str; -+ tok = strsep(&tmp, "/"); -+ LOG_INFO(PFX "in cidr: bitmask '%s' ip '%s'", tmp, tok); -+ keepbits = atoi(tmp); -+ strcpy(ipaddr_str, tok); -+ } -+ -+ /* Determine if the IP address passed from the iface file is -+ * an IPv4 or IPv6 address */ -+ rc = inet_pton(AF_INET, ipaddr_str, &ird->ipv6_addr); -+ if (rc == 0) { -+ /* Test to determine if the addres is an IPv6 address */ -+ rc = inet_pton(AF_INET6, ipaddr_str, &ird->ipv6_addr); -+ if (rc == 0) { -+ LOG_ERR(PFX "Could not parse IP address: '%s'", -+ ipaddr_str); -+ goto out; -+ } -+ ird->ip_type = AF_INET6; -+ if (keepbits > 128) { -+ LOG_ERR(PFX "CIDR netmask > 128 for IPv6: %d(%s)", -+ keepbits, tmp); -+ goto out; -+ } -+ if (!keepbits) { -+ /* Default prefix mask to 64 */ -+ memcpy(&ird->ipv6_subnet_mask.s6_addr, all_zeroes_addr6, -+ sizeof(struct in6_addr)); -+ ird->prefix_len = 64; -+ for (i = 0; i < 2; i++) -+ ird->ipv6_subnet_mask.s6_addr32[i] = 0xffffffff; -+ goto out; -+ } -+ ird->prefix_len = keepbits; -+ memcpy(&ia6.s6_addr, all_zeroes_addr6, sizeof(struct in6_addr)); -+ for (i = 0; i < 4; i++) { -+ if (keepbits < 32) { -+ ia6.s6_addr32[i] = keepbits > 0 ? -+ 0x00 - (1 << (32 - keepbits)) : 0; -+ ia6.s6_addr32[i] = htonl(ia6.s6_addr32[i]); -+ break; -+ } else -+ ia6.s6_addr32[i] = 0xFFFFFFFF; -+ keepbits -= 32; -+ } -+ ird->ipv6_subnet_mask = ia6; -+ if (inet_ntop(AF_INET6, &ia6, str, sizeof(str))) -+ LOG_INFO(PFX "Using netmask: %s", str); -+ } else { -+ ird->ip_type = AF_INET; -+ rc = inet_pton(AF_INET, ipaddr_str, &ird->ipv4_addr); -+ -+ if (keepbits > 32) { -+ LOG_ERR(PFX "CIDR netmask > 32 for IPv4: %d(%s)", -+ keepbits, tmp); -+ goto out; -+ } -+ ia.s_addr = keepbits > 0 ? 0x00 - (1 << (32 - keepbits)) : 0; -+ ird->ipv4_subnet_mask.s_addr = htonl(ia.s_addr); -+ LOG_INFO(PFX "Using netmask: %s", -+ inet_ntoa(ird->ipv4_subnet_mask)); -+ } -+out: -+ return rc; -+} -+ -+static int decode_iface(struct iface_rec_decode *ird, struct iface_rec *rec) -+{ -+ int rc = 0; -+ char ipaddr_str[NI_MAXHOST]; -+ -+ /* Decodes the rec contents */ -+ memset(ird, 0, sizeof(struct iface_rec_decode)); -+ -+ /* Detect for CIDR notation and strip off the netmask if present */ -+ rc = decode_cidr(rec->ipaddress, ird); -+ if (rc && !ird->ip_type) { -+ LOG_ERR(PFX "cidr decode err: rc=%d, ip_type=%d", -+ rc, ird->ip_type); -+ /* Can't decode address, just exit */ -+ return rc; -+ } -+ rc = 0; -+ ird->iface_num = rec->iface_num; -+ ird->vlan_id = rec->vlan_id; -+ if (rec->iface_num != IFACE_NUM_INVALID) { -+ ird->mtu = rec->mtu; -+ if (rec->vlan_id && strcmp(rec->vlan_state, "disable")) { -+ ird->vlan_state = 1; -+ ird->vlan_priority = rec->vlan_priority; -+ ird->vlan_id = rec->vlan_id; -+ } -+ if (ird->ip_type == AF_INET6) { -+ if (!strcmp(rec->ipv6_autocfg, "dhcpv6")) -+ ird->ipv6_autocfg = IPV6_AUTOCFG_DHCPV6; -+ else if (!strcmp(rec->ipv6_autocfg, "nd")) -+ ird->ipv6_autocfg = IPV6_AUTOCFG_ND; -+ else -+ ird->ipv6_autocfg = IPV6_AUTOCFG_NOTSPEC; -+ -+ if (!strcmp(rec->linklocal_autocfg, "auto")) -+ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_ON; -+ else if (!strcmp(rec->linklocal_autocfg, "off")) -+ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_OFF; -+ else /* default */ -+ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_ON; -+ -+ if (!strcmp(rec->router_autocfg, "auto")) -+ ird->router_autocfg = IPV6_RTR_AUTOCFG_ON; -+ else if (!strcmp(rec->router_autocfg, "off")) -+ ird->router_autocfg = IPV6_RTR_AUTOCFG_OFF; -+ else /* default */ -+ ird->router_autocfg = IPV6_RTR_AUTOCFG_ON; -+ -+ /* Decode the addresses based on the control flags */ -+ /* For DHCP, ignore the IPv6 addr in the iface */ -+ if (ird->ipv6_autocfg == IPV6_AUTOCFG_DHCPV6) -+ memcpy(&ird->ipv6_addr, all_zeroes_addr6, -+ sizeof(struct in6_addr)); -+ /* Subnet mask priority: CIDR, then rec */ -+ if (!ird->ipv6_subnet_mask.s6_addr) -+ inet_pton(AF_INET, rec->subnet_mask, -+ &ird->ipv6_subnet_mask); -+ -+ /* For LL on, ignore the IPv6 addr in the iface */ -+ if (ird->linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) { -+ if (strlen(rec->ipv6_linklocal) > NI_MAXHOST) -+ strncpy(ipaddr_str, rec->ipv6_linklocal, -+ NI_MAXHOST); -+ else -+ strcpy(ipaddr_str, rec->ipv6_linklocal); -+ inet_pton(AF_INET6, ipaddr_str, -+ &ird->ipv6_linklocal); -+ } -+ -+ /* For RTR on, ignore the IPv6 addr in the iface */ -+ if (ird->router_autocfg == IPV6_RTR_AUTOCFG_OFF) { -+ if (strlen(rec->ipv6_router) > NI_MAXHOST) -+ strncpy(ipaddr_str, rec->ipv6_router, -+ NI_MAXHOST); -+ else -+ strcpy(ipaddr_str, rec->ipv6_router); -+ inet_pton(AF_INET6, ipaddr_str, -+ &ird->ipv6_router); -+ } -+ } else { -+ /* Subnet mask priority: CIDR, rec, default */ -+ if (!ird->ipv4_subnet_mask.s_addr) -+ inet_pton(AF_INET, rec->subnet_mask, -+ &ird->ipv4_subnet_mask); -+ if (!ird->ipv4_subnet_mask.s_addr) -+ ird->ipv4_subnet_mask.s_addr = -+ calculate_default_netmask( -+ ird->ipv4_addr.s_addr); -+ -+ if (strlen(rec->gateway) > NI_MAXHOST) -+ strncpy(ipaddr_str, rec->gateway, NI_MAXHOST); -+ else -+ strcpy(ipaddr_str, rec->gateway); -+ inet_pton(AF_INET, ipaddr_str, &ird->ipv4_gateway); -+ } -+ } else { -+ ird->ipv6_autocfg = IPV6_AUTOCFG_NOTUSED; -+ ird->linklocal_autocfg = IPV6_LL_AUTOCFG_NOTUSED; -+ ird->router_autocfg = IPV6_RTR_AUTOCFG_NOTUSED; -+ } -+ return rc; -+} -+ -+static int parse_iface(void *arg) -+{ -+ int rc, i; -+ nic_t *nic = NULL; -+ nic_interface_t *nic_iface; -+ char *transport_name; -+ size_t transport_name_size; -+ nic_lib_handle_t *handle; -+ iscsid_uip_broadcast_t *data; -+ char ipv6_buf_str[INET6_ADDRSTRLEN]; -+ int request_type = 0; -+ struct iface_rec *rec; -+ void *res; -+ struct iface_rec_decode ird; -+ struct in_addr src_match, dst_match; -+ -+ data = (iscsid_uip_broadcast_t *) arg; -+ rec = &data->u.iface_rec.rec; -+ LOG_INFO(PFX "Received request for '%s' to set IP address: '%s' " -+ "VLAN: '%d'", -+ rec->netdev, -+ rec->ipaddress, -+ rec->vlan_id); -+ -+ rc = decode_iface(&ird, rec); -+ if (ird.vlan_id && valid_vlan(ird.vlan_id) == 0) { -+ LOG_ERR(PFX "Invalid VLAN tag: %d", ird.vlan_id); -+ rc = -EIO; -+ goto early_exit; -+ } -+ if (rc && !ird.ip_type) { -+ LOG_ERR(PFX "iface err: rc=%d, ip_type=%d", rc, ird.ip_type); -+ goto early_exit; -+ } -+ -+ for (i = 0; i < 10; i++) { -+ struct timespec sleep_req, sleep_rem; -+ -+ if (pthread_mutex_trylock(&nic_list_mutex) == 0) -+ break; -+ -+ sleep_req.tv_sec = 0; -+ sleep_req.tv_nsec = 100000; -+ nanosleep(&sleep_req, &sleep_rem); -+ } -+ -+ if (i >= 10) { -+ LOG_WARN(PFX "Could not acquire nic_list_mutex lock"); -+ rc = -EIO; -+ goto early_exit; -+ } -+ -+ /* nic_list_mutex locked */ -+ -+ /* Check if we can find the NIC device using the netdev -+ * name */ -+ rc = from_netdev_name_find_nic(rec->netdev, &nic); -+ -+ if (rc != 0) { -+ LOG_WARN(PFX "Couldn't find NIC: %s, creating an instance", -+ rec->netdev); -+ -+ nic = nic_init(); -+ if (nic == NULL) { -+ LOG_ERR(PFX "Couldn't allocate space for NIC %s", -+ rec->netdev); -+ -+ rc = -ENOMEM; -+ goto done; -+ } -+ -+ strncpy(nic->eth_device_name, -+ rec->netdev, -+ sizeof(nic->eth_device_name)); -+ nic->config_device_name = nic->eth_device_name; -+ nic->log_name = nic->eth_device_name; -+ -+ if (nic_fill_name(nic) != 0) { -+ free(nic); -+ rc = -EIO; -+ goto done; -+ } -+ -+ nic_add(nic); -+ } else { -+ LOG_INFO(PFX " %s, using existing NIC", -+ rec->netdev); -+ } -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ if (nic->flags & NIC_GOING_DOWN) { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ rc = -EIO; -+ LOG_INFO(PFX "nic->flags GOING DOWN"); -+ goto done; -+ } -+ -+ /* If we retry too many times allow iscsid to timeout */ -+ if (nic->pending_count > 1000) { -+ nic->pending_count = 0; -+ nic->flags &= ~NIC_ENABLED_PENDING; -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ LOG_WARN(PFX "%s: pending count exceeded 1000", nic->log_name); -+ -+ rc = 0; -+ goto done; -+ } -+ -+ if (nic->flags & NIC_ENABLED_PENDING) { -+ struct timespec sleep_req, sleep_rem; -+ -+ nic->pending_count++; -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ sleep_req.tv_sec = 0; -+ sleep_req.tv_nsec = 100000; -+ nanosleep(&sleep_req, &sleep_rem); -+ -+ LOG_INFO(PFX "%s: enabled pending", nic->log_name); -+ -+ rc = -EAGAIN; -+ goto done; -+ } -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ prepare_library(nic); -+ -+ /* Sanity Check to ensure the transport names are the same */ -+ handle = nic->nic_library; -+ if (handle != NULL) { -+ (*handle->ops->lib_ops.get_transport_name) (&transport_name, -+ &transport_name_size); -+ -+ if (strncmp(transport_name, -+ rec->transport_name, -+ transport_name_size) != 0) { -+ LOG_ERR(PFX "%s Transport name is not equal " -+ "expected: %s got: %s", -+ nic->log_name, -+ rec->transport_name, -+ transport_name); -+ } -+ } else { -+ LOG_ERR(PFX "%s Couldn't find nic library ", nic->log_name); -+ rc = -EIO; -+ goto done; -+ } -+ -+ LOG_INFO(PFX "%s library set using transport_name %s", -+ nic->log_name, transport_name); -+ -+ /* Determine how to configure the IP address */ -+ if (ird.ip_type == AF_INET) { -+ if (memcmp(&ird.ipv4_addr, -+ all_zeroes_addr4, sizeof(uip_ip4addr_t)) == 0) { -+ LOG_INFO(PFX "%s: requesting configuration using DHCP", -+ nic->log_name); -+ request_type = IPV4_CONFIG_DHCP; -+ } else { -+ LOG_INFO(PFX "%s: requesting configuration using " -+ "static IP address", nic->log_name); -+ request_type = IPV4_CONFIG_STATIC; -+ } -+ } else if (ird.ip_type == AF_INET6) { -+ /* For the new 872_22, check ipv6_autocfg for DHCPv6 instead */ -+ switch (ird.ipv6_autocfg) { -+ case IPV6_AUTOCFG_DHCPV6: -+ request_type = IPV6_CONFIG_DHCP; -+ break; -+ case IPV6_AUTOCFG_ND: -+ request_type = IPV6_CONFIG_STATIC; -+ break; -+ case IPV6_AUTOCFG_NOTSPEC: -+ /* Treat NOTSPEC the same as NOTUSED for now */ -+ case IPV6_AUTOCFG_NOTUSED: -+ /* For 871 */ -+ default: -+ /* Just the IP address to determine */ -+ if (memcmp(&ird.ipv6_addr, -+ all_zeroes_addr6, -+ sizeof(struct in6_addr)) == 0) -+ request_type = IPV6_CONFIG_DHCP; -+ else -+ request_type = IPV6_CONFIG_STATIC; -+ } -+ } else { -+ LOG_ERR(PFX "%s: unknown ip_type to configure: 0x%x", -+ nic->log_name, ird.ip_type); -+ -+ rc = -EIO; -+ goto done; -+ } -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ nic_iface = nic_find_nic_iface(nic, ird.ip_type, ird.vlan_id, -+ ird.iface_num, request_type); -+ -+ if (nic->flags & NIC_PATHREQ_WAIT) { -+ if (!nic_iface || -+ !(nic_iface->flags & NIC_IFACE_PATHREQ_WAIT)) { -+ int pathreq_wait; -+ -+ if (nic_iface && -+ (nic_iface->flags & NIC_IFACE_PATHREQ_WAIT2)) -+ pathreq_wait = 12; -+ else -+ pathreq_wait = 10; -+ -+ if (nic->pathreq_pending_count < pathreq_wait) { -+ struct timespec sleep_req, sleep_rem; -+ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ nic->pathreq_pending_count++; -+ sleep_req.tv_sec = 0; -+ sleep_req.tv_nsec = 100000; -+ nanosleep(&sleep_req, &sleep_rem); -+ /* Somebody else is waiting for PATH_REQ */ -+ LOG_INFO(PFX "%s: path req pending cnt=%d", -+ nic->log_name, -+ nic->pathreq_pending_count); -+ rc = -EAGAIN; -+ goto done; -+ } else { -+ nic->pathreq_pending_count = 0; -+ LOG_DEBUG(PFX "%s: path req pending cnt " -+ "exceeded!", nic->log_name); -+ /* Allow to fall thru */ -+ } -+ } -+ } -+ -+ nic->flags |= NIC_PATHREQ_WAIT; -+ -+ /* Create the network interface if it doesn't exist */ -+ if (nic_iface == NULL) { -+ LOG_DEBUG(PFX "%s couldn't find interface with " -+ "ip_type: 0x%x creating it", -+ nic->log_name, ird.ip_type); -+ nic_iface = nic_iface_init(); -+ -+ if (nic_iface == NULL) { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ LOG_ERR(PFX "%s Couldn't allocate " -+ "interface with ip_type: 0x%x", -+ nic->log_name, ird.ip_type); -+ goto done; -+ } -+ nic_iface->protocol = ird.ip_type; -+ nic_iface->vlan_id = ird.vlan_id; -+ nic_iface->vlan_priority = ird.vlan_priority; -+ if (ird.mtu >= MIN_MTU_SUPPORT && ird.mtu <= MAX_MTU_SUPPORT) -+ nic_iface->mtu = ird.mtu; -+ nic_iface->iface_num = ird.iface_num; -+ nic_iface->request_type = request_type; -+ nic_add_nic_iface(nic, nic_iface); -+ -+ persist_all_nic_iface(nic); -+ -+ LOG_INFO(PFX "%s: created network interface", -+ nic->log_name); -+ } else { -+ /* Move the nic_iface to the front */ -+ set_nic_iface(nic, nic_iface); -+ LOG_INFO(PFX "%s: using existing network interface", -+ nic->log_name); -+ } -+ -+ nic_iface->flags |= NIC_IFACE_PATHREQ_WAIT1; -+ if (nic->nl_process_thread == INVALID_THREAD) { -+ rc = pthread_create(&nic->nl_process_thread, NULL, -+ nl_process_handle_thread, nic); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not create NIC NL " -+ "processing thread [%s]", nic->log_name, -+ strerror(rc)); -+ nic->nl_process_thread = INVALID_THREAD; -+ /* Reset both WAIT flags */ -+ nic_iface->flags &= ~NIC_IFACE_PATHREQ_WAIT; -+ nic->flags &= ~NIC_PATHREQ_WAIT; -+ } -+ } -+ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ if (nic_iface->ustack.ip_config == request_type) { -+ /* Same request_type, check for STATIC address change */ -+ if (request_type == IPV4_CONFIG_STATIC) { -+ if (memcmp(nic_iface->ustack.hostaddr, &ird.ipv4_addr, -+ sizeof(struct in_addr))) -+ goto reacquire; -+ } else if (request_type == IPV6_CONFIG_STATIC) { -+ if (memcmp(nic_iface->ustack.hostaddr6, &ird.ipv6_addr, -+ sizeof(struct in6_addr))) -+ goto reacquire; -+ else -+ inet_ntop(AF_INET6, &ird.ipv6_addr, -+ ipv6_buf_str, -+ sizeof(ipv6_buf_str)); -+ } -+ LOG_INFO(PFX "%s: IP configuration didn't change using 0x%x", -+ nic->log_name, nic_iface->ustack.ip_config); -+ /* No need to acquire the IP address */ -+ inet_ntop(AF_INET6, &ird.ipv6_addr, ipv6_buf_str, -+ sizeof(ipv6_buf_str)); -+ -+ goto enable_nic; -+ } -+reacquire: -+ /* Config needs to re-acquire for this nic_iface */ -+ pthread_mutex_lock(&nic->nic_mutex); -+ nic_iface->flags |= NIC_IFACE_ACQUIRE; -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ /* Disable the nic loop from further processing, upon returned, -+ the nic_iface should be cleared */ -+ nic_disable(nic, 0); -+ -+ /* Check to see if this is using DHCP or if this is -+ * a static IPv4 address. This is done by checking -+ * if the IP address is equal to 0.0.0.0. If it is -+ * then the user has specified to use DHCP. If not -+ * then the user has spcicied to use a static IP address -+ * an the default netmask will be used */ -+ switch (request_type) { -+ case IPV4_CONFIG_DHCP: -+ memset(nic_iface->ustack.hostaddr, 0, sizeof(struct in_addr)); -+ LOG_INFO(PFX "%s: configuring using DHCP", nic->log_name); -+ nic_iface->ustack.ip_config = IPV4_CONFIG_DHCP; -+ break; -+ -+ case IPV4_CONFIG_STATIC: -+ memcpy(nic_iface->ustack.hostaddr, &ird.ipv4_addr, -+ sizeof(struct in_addr)); -+ LOG_INFO(PFX "%s: configuring using static IP " -+ "IPv4 address :%s ", -+ nic->log_name, inet_ntoa(ird.ipv4_addr)); -+ -+ if (ird.ipv4_subnet_mask.s_addr) -+ memcpy(nic_iface->ustack.netmask, -+ &ird.ipv4_subnet_mask, sizeof(struct in_addr)); -+ LOG_INFO(PFX " netmask: %s", inet_ntoa(ird.ipv4_subnet_mask)); -+ -+ /* Default route */ -+ if (ird.ipv4_gateway.s_addr) { -+ /* Check for validity */ -+ src_match.s_addr = ird.ipv4_addr.s_addr & -+ ird.ipv4_subnet_mask.s_addr; -+ dst_match.s_addr = ird.ipv4_gateway.s_addr & -+ ird.ipv4_subnet_mask.s_addr; -+ if (src_match.s_addr == dst_match.s_addr) -+ memcpy(nic_iface->ustack.default_route_addr, -+ &ird.ipv4_gateway, -+ sizeof(struct in_addr)); -+ } -+ nic_iface->ustack.ip_config = IPV4_CONFIG_STATIC; -+ break; -+ -+ case IPV6_CONFIG_DHCP: -+ memset(nic_iface->ustack.hostaddr6, 0, -+ sizeof(struct in6_addr)); -+ nic_iface->ustack.prefix_len = ird.prefix_len; -+ nic_iface->ustack.ipv6_autocfg = ird.ipv6_autocfg; -+ nic_iface->ustack.linklocal_autocfg = ird.linklocal_autocfg; -+ nic_iface->ustack.router_autocfg = ird.router_autocfg; -+ -+ if (memcmp(&ird.ipv6_subnet_mask, all_zeroes_addr6, -+ sizeof(struct in6_addr))) -+ memcpy(nic_iface->ustack.netmask6, -+ &ird.ipv6_subnet_mask, sizeof(struct in6_addr)); -+ if (ird.linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) -+ memcpy(nic_iface->ustack.linklocal6, -+ &ird.ipv6_linklocal, sizeof(struct in6_addr)); -+ if (ird.router_autocfg == IPV6_RTR_AUTOCFG_OFF) -+ memcpy(nic_iface->ustack.default_route_addr6, -+ &ird.ipv6_router, sizeof(struct in6_addr)); -+ inet_ntop(AF_INET6, &ird.ipv6_addr, ipv6_buf_str, -+ sizeof(ipv6_buf_str)); -+ LOG_INFO(PFX "%s: configuring using DHCPv6", -+ nic->log_name); -+ nic_iface->ustack.ip_config = IPV6_CONFIG_DHCP; -+ break; -+ -+ case IPV6_CONFIG_STATIC: -+ memcpy(nic_iface->ustack.hostaddr6, &ird.ipv6_addr, -+ sizeof(struct in6_addr)); -+ nic_iface->ustack.prefix_len = ird.prefix_len; -+ nic_iface->ustack.ipv6_autocfg = ird.ipv6_autocfg; -+ nic_iface->ustack.linklocal_autocfg = ird.linklocal_autocfg; -+ nic_iface->ustack.router_autocfg = ird.router_autocfg; -+ -+ if (memcmp(&ird.ipv6_subnet_mask, all_zeroes_addr6, -+ sizeof(struct in6_addr))) -+ memcpy(nic_iface->ustack.netmask6, -+ &ird.ipv6_subnet_mask, sizeof(struct in6_addr)); -+ if (ird.linklocal_autocfg == IPV6_LL_AUTOCFG_OFF) -+ memcpy(nic_iface->ustack.linklocal6, -+ &ird.ipv6_linklocal, sizeof(struct in6_addr)); -+ if (ird.router_autocfg == IPV6_RTR_AUTOCFG_OFF) -+ memcpy(nic_iface->ustack.default_route_addr6, -+ &ird.ipv6_router, sizeof(struct in6_addr)); -+ -+ inet_ntop(AF_INET6, &ird.ipv6_addr, ipv6_buf_str, -+ sizeof(ipv6_buf_str)); -+ LOG_INFO(PFX "%s: configuring using static IP " -+ "IPv6 address: '%s'", nic->log_name, ipv6_buf_str); -+ -+ nic_iface->ustack.ip_config = IPV6_CONFIG_STATIC; -+ break; -+ -+ default: -+ LOG_INFO(PFX "%s: Unknown request type: 0x%x", -+ nic->log_name, request_type); -+ -+ } -+ -+enable_nic: -+ switch (nic->state) { -+ case NIC_STOPPED: -+ /* This thread will be thrown away when completed */ -+ if (nic->enable_thread != INVALID_THREAD) { -+ rc = pthread_join(nic->enable_thread, &res); -+ if (rc != 0) { -+ LOG_INFO(PFX "%s: failed joining enable NIC " -+ "thread\n", nic->log_name); -+ goto eagain; -+ } -+ } -+ rc = pthread_create(&nic->enable_thread, NULL, -+ enable_nic_thread, (void *)nic); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: failed starting enable NIC thread\n", -+ nic->log_name); -+eagain: -+ rc = -EAGAIN; -+ break; -+ -+ case NIC_RUNNING: -+ LOG_INFO(PFX "%s: NIC already enabled " -+ "flags: 0x%x state: 0x%x\n", -+ nic->log_name, nic->flags, nic->state); -+ rc = 0; -+ break; -+ default: -+ LOG_INFO(PFX "%s: NIC enable still in progress " -+ "flags: 0x%x state: 0x%x\n", -+ nic->log_name, nic->flags, nic->state); -+ rc = -EAGAIN; -+ } -+ -+ LOG_INFO(PFX "ISCSID_UIP_IPC_GET_IFACE: command: %x " -+ "name: %s, netdev: %s ipaddr: %s vlan: %d transport_name:%s", -+ data->header.command, rec->name, rec->netdev, -+ (ird.ip_type == AF_INET) ? inet_ntoa(ird.ipv4_addr) : -+ ipv6_buf_str, -+ ird.vlan_id, rec->transport_name); -+ -+done: -+ pthread_mutex_unlock(&nic_list_mutex); -+ -+early_exit: -+ return rc; -+} -+ -+/** -+ * process_iscsid_broadcast() - This function is used to process the -+ * broadcast messages from iscsid -+ */ -+int process_iscsid_broadcast(int s2) -+{ -+ int rc = 0; -+ iscsid_uip_broadcast_t *data; -+ iscsid_uip_rsp_t rsp; -+ FILE *fd; -+ size_t size; -+ iscsid_uip_cmd_e cmd; -+ uint32_t payload_len; -+ -+ fd = fdopen(s2, "r+"); -+ if (fd == NULL) { -+ LOG_ERR(PFX "Couldn't open file descriptor: %d(%s)", -+ errno, strerror(errno)); -+ return -EIO; -+ } -+ -+ /* This will be freed by parse_iface_thread() */ -+ data = (iscsid_uip_broadcast_t *) calloc(1, sizeof(*data)); -+ if (data == NULL) { -+ LOG_ERR(PFX "Couldn't allocate memory for iface data"); -+ rc = -ENOMEM; -+ goto error; -+ } -+ memset(data, 0, sizeof(*data)); -+ -+ size = fread(data, sizeof(iscsid_uip_broadcast_header_t), 1, fd); -+ if (!size) { -+ LOG_ERR(PFX "Could not read request: %d(%s)", -+ errno, strerror(errno)); -+ rc = ferror(fd); -+ goto error; -+ } -+ -+ cmd = data->header.command; -+ payload_len = data->header.payload_len; -+ -+ LOG_DEBUG(PFX "recv iscsid request: cmd: %d, payload_len: %d", -+ cmd, payload_len); -+ -+ size = fread(&data->u.iface_rec, payload_len, 1, fd); -+ if (!size) { -+ LOG_ERR(PFX "Could not read data: %d(%s)", -+ errno, strerror(errno)); -+ goto error; -+ } -+ -+ switch (cmd) { -+ case ISCSID_UIP_IPC_GET_IFACE: -+ rc = parse_iface(data); -+ switch (rc) { -+ case 0: -+ rsp.command = cmd; -+ rsp.err = ISCSID_UIP_MGMT_IPC_DEVICE_UP; -+ break; -+ case -EAGAIN: -+ rsp.command = cmd; -+ rsp.err = ISCSID_UIP_MGMT_IPC_DEVICE_INITIALIZING; -+ break; -+ default: -+ rsp.command = cmd; -+ rsp.err = ISCSID_UIP_MGMT_IPC_ERR; -+ } -+ -+ break; -+ default: -+ LOG_WARN(PFX "Unknown iscsid broadcast command: %x", -+ data->header.command); -+ -+ /* Send a response back to iscsid to tell it the -+ operation succeeded */ -+ rsp.command = cmd; -+ rsp.err = ISCSID_UIP_MGMT_IPC_OK; -+ break; -+ } -+ -+ size = fwrite(&rsp, sizeof(rsp), 1, fd); -+ if (size == -1) { -+ LOG_ERR(PFX "Could not send response: %d(%s)", -+ errno, strerror(errno)); -+ rc = ferror(fd); -+ } -+ -+error: -+ free(data); -+ fclose(fd); -+ -+ return rc; -+} -+ -+static void iscsid_loop_close(void *arg) -+{ -+ close(iscsid_opts.fd); -+ -+ LOG_INFO(PFX "iSCSI daemon socket closed"); -+} -+ -+/** -+ * iscsid_loop() - This is the function which will process the broadcast -+ * messages from iscsid -+ * -+ */ -+static void *iscsid_loop(void *arg) -+{ -+ int rc; -+ sigset_t set; -+ -+ pthread_cleanup_push(iscsid_loop_close, arg); -+ -+ sigfillset(&set); -+ rc = pthread_sigmask(SIG_BLOCK, &set, NULL); -+ if (rc != 0) { -+ LOG_ERR(PFX -+ "Couldn't set signal mask for the iscisd listening " -+ "thread"); -+ } -+ -+ LOG_DEBUG(PFX "Started iscsid listening thread"); -+ -+ while (1) { -+ struct sockaddr_un remote; -+ socklen_t sock_len; -+ int s2; -+ -+ LOG_DEBUG(PFX "Waiting for iscsid command"); -+ -+ sock_len = sizeof(remote); -+ s2 = accept(iscsid_opts.fd, -+ (struct sockaddr *)&remote, &sock_len); -+ if (s2 == -1) { -+ if (errno == EAGAIN) { -+ LOG_DEBUG("Got EAGAIN from accept"); -+ sleep(1); -+ continue; -+ } else if (errno == EINTR) { -+ LOG_DEBUG("Got EINTR from accept"); -+ /* The program is terminating, time to exit */ -+ break; -+ } -+ -+ LOG_ERR(PFX "Could not accept: %d(%s)", -+ s2, strerror(errno)); -+ continue; -+ } -+ -+ process_iscsid_broadcast(s2); -+ close(s2); -+ } -+ -+ pthread_cleanup_pop(0); -+ -+ LOG_ERR(PFX "exit iscsid listening thread"); -+ -+ pthread_exit(NULL); -+} -+ -+/****************************************************************************** -+ * Initialize/Cleanup routines -+ ******************************************************************************/ -+/** -+ * iscsid_init() - This function will setup the thread used to listen for -+ * the iscsid broadcast messages -+ * @return 0 on success, <0 on failure -+ */ -+int iscsid_init() -+{ -+ int rc; -+ struct sockaddr_un addr; -+ -+ iscsid_opts.fd = socket(AF_LOCAL, SOCK_STREAM, 0); -+ if (iscsid_opts.fd < 0) { -+ LOG_ERR(PFX "Can not create IPC socket"); -+ return iscsid_opts.fd; -+ } -+ -+ memset(&addr, 0, sizeof(addr)); -+ addr.sun_family = AF_LOCAL; -+ memcpy((char *)&addr.sun_path + 1, ISCSID_UIP_NAMESPACE, -+ strlen(ISCSID_UIP_NAMESPACE)); -+ -+ rc = bind(iscsid_opts.fd, (struct sockaddr *)&addr, sizeof(addr)); -+ if (rc < 0) { -+ LOG_ERR(PFX "Can not bind IPC socket: %s", strerror(errno)); -+ goto error; -+ } -+ -+ rc = listen(iscsid_opts.fd, 32); -+ if (rc < 0) { -+ LOG_ERR(PFX "Can not listen IPC socket: %s", strerror(errno)); -+ goto error; -+ } -+ -+ return 0; -+error: -+ close(iscsid_opts.fd); -+ iscsid_opts.fd = INVALID_FD; -+ -+ return rc; -+} -+ -+/** -+ * iscsid_start() - This function will start the thread used to listen for -+ * the iscsid broadcast messages -+ * @return 0 on success, <0 on failure -+ */ -+int iscsid_start() -+{ -+ int rc; -+ -+ rc = pthread_create(&iscsid_opts.thread, NULL, iscsid_loop, NULL); -+ if (rc != 0) { -+ LOG_ERR(PFX "Could not start iscsid listening thread rc=%d", -+ rc); -+ goto error; -+ } -+ -+ return 0; -+ -+error: -+ close(iscsid_opts.fd); -+ iscsid_opts.fd = INVALID_FD; -+ -+ return rc; -+} -+ -+/** -+ * iscsid_cleanup() - This is called when stoping the thread listening -+ * for the iscsid broadcast messages -+ */ -+void iscsid_cleanup() -+{ -+ int rc; -+ void *res; -+ -+ if (iscsid_opts.fd != INVALID_FD) { -+ rc = pthread_cancel(iscsid_opts.thread); -+ if (rc != 0) { -+ LOG_ERR("Could not cancel iscsid listening thread: %s", -+ strerror(rc)); -+ } -+ -+ rc = pthread_join(iscsid_opts.thread, &res); -+ if (rc != 0) { -+ LOG_ERR("Could not wait for the iscsid listening " -+ "thread: %s", strerror(rc)); -+ } -+ } -+ -+ LOG_INFO(PFX "iscsid listening thread has shutdown"); -+} -diff --git a/iscsiuio/src/unix/iscsid_ipc.h b/iscsiuio/src/unix/iscsid_ipc.h -new file mode 100644 -index 0000000..30843fb ---- /dev/null -+++ b/iscsiuio/src/unix/iscsid_ipc.h -@@ -0,0 +1,51 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * iscsid_ipc.h: Generic NIC management/utility functions -+ * -+ */ -+#ifndef __ISCSID_IPC_H__ -+#define __ISCSID_IPC_H__ -+ -+#include "uip.h" -+#include "mgmt_ipc.h" -+ -+enum mgmt_ipc_err iscsid_connect(int *fd); -+int iscsid_get_ipaddr(int fd, uip_ip4addr_t *ipaddr); -+ -+int iscsid_init(); -+int iscsid_start(); -+void iscsid_cleanup(); -+ -+#endif /* __ISCSID_IPC_H__ */ -diff --git a/iscsiuio/src/unix/libs/Makefile.am b/iscsiuio/src/unix/libs/Makefile.am -new file mode 100644 -index 0000000..19a1323 ---- /dev/null -+++ b/iscsiuio/src/unix/libs/Makefile.am -@@ -0,0 +1,13 @@ -+INCLUDES = -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/unix/libs \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_iscsiuio_hw_cnic.a -+ -+lib_iscsiuio_hw_cnic_a_SOURCES = ../build_date.c \ -+ cnic.c \ -+ bnx2.c \ -+ bnx2x.c -diff --git a/iscsiuio/src/unix/libs/Makefile.in b/iscsiuio/src/unix/libs/Makefile.in -new file mode 100644 -index 0000000..22ea36e ---- /dev/null -+++ b/iscsiuio/src/unix/libs/Makefile.in -@@ -0,0 +1,450 @@ -+# Makefile.in generated by automake 1.9.6 from Makefile.am. -+# @configure_input@ -+ -+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -+# 2003, 2004, 2005 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@ -+ -+srcdir = @srcdir@ -+top_srcdir = @top_srcdir@ -+VPATH = @srcdir@ -+pkgdatadir = $(datadir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkgincludedir = $(includedir)/@PACKAGE@ -+top_builddir = ../../.. -+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -+INSTALL = @INSTALL@ -+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@ -+subdir = src/unix/libs -+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -+am__aclocal_m4_deps = $(top_srcdir)/configure.ac -+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ -+ $(ACLOCAL_M4) -+mkinstalldirs = $(install_sh) -d -+CONFIG_HEADER = $(top_builddir)/config.h -+CONFIG_CLEAN_FILES = -+LIBRARIES = $(noinst_LIBRARIES) -+ARFLAGS = cru -+lib_iscsiuio_hw_cnic_a_AR = $(AR) $(ARFLAGS) -+lib_iscsiuio_hw_cnic_a_LIBADD = -+am_lib_iscsiuio_hw_cnic_a_OBJECTS = build_date.$(OBJEXT) \ -+ cnic.$(OBJEXT) bnx2.$(OBJEXT) bnx2x.$(OBJEXT) -+lib_iscsiuio_hw_cnic_a_OBJECTS = $(am_lib_iscsiuio_hw_cnic_a_OBJECTS) -+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -+depcomp = $(SHELL) $(top_srcdir)/depcomp -+am__depfiles_maybe = depfiles -+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ -+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ -+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ -+ $(AM_CFLAGS) $(CFLAGS) -+CCLD = $(CC) -+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -+ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -+SOURCES = $(lib_iscsiuio_hw_cnic_a_SOURCES) -+DIST_SOURCES = $(lib_iscsiuio_hw_cnic_a_SOURCES) -+ETAGS = etags -+CTAGS = ctags -+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -+ACLOCAL = @ACLOCAL@ -+AMDEP_FALSE = @AMDEP_FALSE@ -+AMDEP_TRUE = @AMDEP_TRUE@ -+AMTAR = @AMTAR@ -+AR = @AR@ -+AUTOCONF = @AUTOCONF@ -+AUTOHEADER = @AUTOHEADER@ -+AUTOMAKE = @AUTOMAKE@ -+AWK = @AWK@ -+BASH = @BASH@ -+CC = @CC@ -+CCDEPMODE = @CCDEPMODE@ -+CFLAGS = @CFLAGS@ -+CPP = @CPP@ -+CPPFLAGS = @CPPFLAGS@ -+CXX = @CXX@ -+CXXCPP = @CXXCPP@ -+CXXDEPMODE = @CXXDEPMODE@ -+CXXFLAGS = @CXXFLAGS@ -+CYGPATH_W = @CYGPATH_W@ -+DEBUG_FALSE = @DEBUG_FALSE@ -+DEBUG_TRUE = @DEBUG_TRUE@ -+DEFS = @DEFS@ -+DEPDIR = @DEPDIR@ -+ECHO = @ECHO@ -+ECHO_C = @ECHO_C@ -+ECHO_N = @ECHO_N@ -+ECHO_T = @ECHO_T@ -+EGREP = @EGREP@ -+ENDIAN = @ENDIAN@ -+EXEEXT = @EXEEXT@ -+F77 = @F77@ -+FFLAGS = @FFLAGS@ -+INSTALL_DATA = @INSTALL_DATA@ -+INSTALL_PROGRAM = @INSTALL_PROGRAM@ -+INSTALL_SCRIPT = @INSTALL_SCRIPT@ -+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -+LDFLAGS = @LDFLAGS@ -+LIBOBJS = @LIBOBJS@ -+LIBS = @LIBS@ -+LIBTOOL = @LIBTOOL@ -+LN_S = @LN_S@ -+LTLIBOBJS = @LTLIBOBJS@ -+MAKEINFO = @MAKEINFO@ -+OBJEXT = @OBJEXT@ -+PACKAGE = @PACKAGE@ -+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -+PACKAGE_NAME = @PACKAGE_NAME@ -+PACKAGE_STRING = @PACKAGE_STRING@ -+PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_VERSION = @PACKAGE_VERSION@ -+PATH_SEPARATOR = @PATH_SEPARATOR@ -+RANLIB = @RANLIB@ -+SED = @SED@ -+SET_MAKE = @SET_MAKE@ -+SHELL = @SHELL@ -+STRIP = @STRIP@ -+VERSION = @VERSION@ -+ac_ct_AR = @ac_ct_AR@ -+ac_ct_CC = @ac_ct_CC@ -+ac_ct_CXX = @ac_ct_CXX@ -+ac_ct_F77 = @ac_ct_F77@ -+ac_ct_RANLIB = @ac_ct_RANLIB@ -+ac_ct_STRIP = @ac_ct_STRIP@ -+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -+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@ -+datadir = @datadir@ -+exec_prefix = @exec_prefix@ -+host = @host@ -+host_alias = @host_alias@ -+host_cpu = @host_cpu@ -+host_os = @host_os@ -+host_vendor = @host_vendor@ -+includedir = @includedir@ -+infodir = @infodir@ -+install_sh = @install_sh@ -+libdir = @libdir@ -+libexecdir = @libexecdir@ -+localstatedir = @localstatedir@ -+mandir = @mandir@ -+mkdir_p = @mkdir_p@ -+oldincludedir = @oldincludedir@ -+prefix = @prefix@ -+program_transform_name = @program_transform_name@ -+sbindir = @sbindir@ -+sharedstatedir = @sharedstatedir@ -+sysconfdir = @sysconfdir@ -+target_alias = @target_alias@ -+INCLUDES = -I${top_srcdir}/src/uip \ -+ -I${top_srcdir}/src/unix \ -+ -I${top_srcdir}/src/unix/libs \ -+ -I${top_srcdir}/src/apps/dhcpc \ -+ -I${top_srcdir}/../include \ -+ -I${top_srcdir}/../usr -+ -+noinst_LIBRARIES = lib_iscsiuio_hw_cnic.a -+lib_iscsiuio_hw_cnic_a_SOURCES = ../build_date.c \ -+ cnic.c \ -+ bnx2.c \ -+ bnx2x.c -+ -+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 \ -+ && exit 0; \ -+ exit 1;; \ -+ esac; \ -+ done; \ -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/unix/libs/Makefile'; \ -+ cd $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/unix/libs/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 -+ -+clean-noinstLIBRARIES: -+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -+lib_iscsiuio_hw_cnic.a: $(lib_iscsiuio_hw_cnic_a_OBJECTS) $(lib_iscsiuio_hw_cnic_a_DEPENDENCIES) -+ -rm -f lib_iscsiuio_hw_cnic.a -+ $(lib_iscsiuio_hw_cnic_a_AR) lib_iscsiuio_hw_cnic.a $(lib_iscsiuio_hw_cnic_a_OBJECTS) $(lib_iscsiuio_hw_cnic_a_LIBADD) -+ $(RANLIB) lib_iscsiuio_hw_cnic.a -+ -+mostlyclean-compile: -+ -rm -f *.$(OBJEXT) -+ -+distclean-compile: -+ -rm -f *.tab.c -+ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bnx2.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bnx2x.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/build_date.Po@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cnic.Po@am__quote@ -+ -+.c.o: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c $< -+ -+.c.obj: -+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -+ -+.c.lo: -+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -+ -+build_date.o: ../build_date.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT build_date.o -MD -MP -MF "$(DEPDIR)/build_date.Tpo" -c -o build_date.o `test -f '../build_date.c' || echo '$(srcdir)/'`../build_date.c; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/build_date.Tpo" "$(DEPDIR)/build_date.Po"; else rm -f "$(DEPDIR)/build_date.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../build_date.c' object='build_date.o' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o build_date.o `test -f '../build_date.c' || echo '$(srcdir)/'`../build_date.c -+ -+build_date.obj: ../build_date.c -+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT build_date.obj -MD -MP -MF "$(DEPDIR)/build_date.Tpo" -c -o build_date.obj `if test -f '../build_date.c'; then $(CYGPATH_W) '../build_date.c'; else $(CYGPATH_W) '$(srcdir)/../build_date.c'; fi`; \ -+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/build_date.Tpo" "$(DEPDIR)/build_date.Po"; else rm -f "$(DEPDIR)/build_date.Tpo"; exit 1; fi -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../build_date.c' object='build_date.obj' libtool=no @AMDEPBACKSLASH@ -+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o build_date.obj `if test -f '../build_date.c'; then $(CYGPATH_W) '../build_date.c'; else $(CYGPATH_W) '$(srcdir)/../build_date.c'; fi` -+ -+mostlyclean-libtool: -+ -rm -f *.lo -+ -+clean-libtool: -+ -rm -rf .libs _libs -+ -+distclean-libtool: -+ -rm -f libtool -+uninstall-info-am: -+ -+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ mkid -fID $$unique -+tags: TAGS -+ -+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ test -n "$$unique" || unique=$$empty_fix; \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$tags $$unique; \ -+ fi -+ctags: CTAGS -+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ -+ $(TAGS_FILES) $(LISP) -+ tags=; \ -+ here=`pwd`; \ -+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ -+ unique=`for i in $$list; do \ -+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ -+ done | \ -+ $(AWK) ' { files[$$0] = 1; } \ -+ END { for (i in files) print i; }'`; \ -+ test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -+ $$tags $$unique -+ -+GTAGS: -+ here=`$(am__cd) $(top_builddir) && pwd` \ -+ && cd $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) $$here -+ -+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)'; for file in $$list; do \ -+ case $$file in \ -+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ -+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ -+ esac; \ -+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ -+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ -+ dir="/$$dir"; \ -+ $(mkdir_p) "$(distdir)$$dir"; \ -+ else \ -+ dir=''; \ -+ fi; \ -+ if test -d $$d/$$file; then \ -+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ fi; \ -+ cp -pR $$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 $(LIBRARIES) -+installdirs: -+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: -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ `test -z '$(STRIP)' || \ -+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+mostlyclean-generic: -+ -+clean-generic: -+ -+distclean-generic: -+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-generic clean-libtool clean-noinstLIBRARIES \ -+ mostlyclean-am -+ -+distclean: distclean-am -+ -rm -rf ./$(DEPDIR) -+ -rm -f Makefile -+distclean-am: clean-am distclean-compile distclean-generic \ -+ distclean-libtool distclean-tags -+ -+dvi: dvi-am -+ -+dvi-am: -+ -+html: html-am -+ -+info: info-am -+ -+info-am: -+ -+install-data-am: -+ -+install-exec-am: -+ -+install-info: install-info-am -+ -+install-man: -+ -+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-info-am -+ -+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ -+ clean-libtool clean-noinstLIBRARIES ctags distclean \ -+ distclean-compile distclean-generic distclean-libtool \ -+ distclean-tags distdir dvi dvi-am html html-am info info-am \ -+ install install-am install-data install-data-am install-exec \ -+ install-exec-am install-info install-info-am install-man \ -+ 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 uninstall uninstall-am \ -+ uninstall-info-am -+ -+# 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: -diff --git a/iscsiuio/src/unix/libs/bnx2.c b/iscsiuio/src/unix/libs/bnx2.c -new file mode 100644 -index 0000000..b72b8ce ---- /dev/null -+++ b/iscsiuio/src/unix/libs/bnx2.c -@@ -0,0 +1,1164 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * bnx2.c - bnx2 user space driver -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "config.h" -+ -+#include "build_date.h" -+#include "bnx2.h" -+#include "cnic.h" -+#include "logger.h" -+#include "nic.h" -+#include "nic_utils.h" -+#include "options.h" -+ -+#define PFX "bnx2 " -+ -+/* Foward struct declarations */ -+struct nic_ops bnx2_op; -+ -+/******************************************************************************* -+ * NIC Library Strings -+ ******************************************************************************/ -+static const char library_name[] = "bnx2"; -+static const char library_version[] = PACKAGE_VERSION; -+static const char library_uio_name[] = "bnx2_cnic"; -+ -+/* The name that should be returned from /sys/class/uio/uio0/name */ -+static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; -+static const char cnic_uio_sysfs_name[] = "bnx2_cnic"; -+ -+/******************************************************************************* -+ * String constants used to display human readable adapter name -+ ******************************************************************************/ -+static const char brcm_5706C[] = "Broadcom NetXtreme II BCM5706 1000Base-T"; -+static const char hp_NC370T[] = -+ "HP NC370T Multifunction Gigabit Server Adapter"; -+static const char hp_NC370I[] = -+ "HP NC370i Multifunction Gigabit Server Adapter"; -+static const char brcm_5706S[] = "Broadcom NetXtreme II BCM5706 1000Base-SX"; -+static const char hp_NC370F[] = -+ "HP NC370F Multifunction Gigabit Server Adapter"; -+static const char brcm_5708C[] = "Broadcom NetXtreme II BCM5708 1000Base-T"; -+static const char brcm_5708S[] = "Broadcom NetXtreme II BCM5708 1000Base-SX"; -+static const char brcm_5709C[] = "Broadcom NetXtreme II BCM5709 1000Base-T"; -+static const char brcm_5709S[] = "Broadcom NetXtreme II BCM5709 1000Base-SX"; -+static const char brcm_5716C[] = "Broadcom NetXtreme II BCM5716 1000Base-T"; -+static const char brcm_5716S[] = "Broadcom NetXtreme II BCM5716 1000Base-SX"; -+ -+/******************************************************************************* -+ * PCI ID constants -+ ******************************************************************************/ -+#define PCI_VENDOR_ID_BROADCOM 0x14e4 -+#define PCI_DEVICE_ID_NX2_5709 0x1639 -+#define PCI_DEVICE_ID_NX2_5709S 0x163a -+#define PCI_DEVICE_ID_NX2_5706 0x164a -+#define PCI_DEVICE_ID_NX2_5708 0x164c -+#define PCI_DEVICE_ID_NX2_5706S 0x16aa -+#define PCI_DEVICE_ID_NX2_5708S 0x16ac -+ -+#define PCI_VENDOR_ID_HP 0x103c -+ -+#define PCI_ANY_ID (~0) -+ -+/* This is the table used to match PCI vendor and device ID's to the -+ * human readable string names of the devices */ -+static const struct pci_device_id bnx2_pci_tbl[] = { -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, -+ PCI_VENDOR_ID_HP, 0x3101, hp_NC370T}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, -+ PCI_VENDOR_ID_HP, 0x3106, hp_NC370I}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5706S}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5708C}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S, -+ PCI_VENDOR_ID_HP, 0x3102, hp_NC370F}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5706S}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5708S}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5709C}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709S, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5709S}, -+ {PCI_VENDOR_ID_BROADCOM, 0x163b, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5716C}, -+ {PCI_VENDOR_ID_BROADCOM, 0x163c, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_5716S}, -+}; -+ -+/******************************************************************************* -+ * bnx2 Library Functions -+ ******************************************************************************/ -+/** -+ * bnx2_get_library_name() - Used to get the name of this NIC libary -+ * @param name - This function will return the pointer to this NIC -+ * library name -+ * @param name_size -+ */ -+static void bnx2_get_library_name(char **name, size_t *name_size) -+{ -+ *name = (char *)library_name; -+ *name_size = sizeof(library_name); -+} -+ -+/** -+ * bnx2_get_library_version() - Used to get the version string of this -+ * NIC libary -+ * @param version - This function will return the pointer to this NIC -+ * library version string -+ * @param version_size - This will be set with the version size -+ */ -+static void bnx2_get_library_version(char **version, size_t *version_size) -+{ -+ *version = (char *)library_version; -+ *version_size = sizeof(library_version); -+} -+ -+/** -+ * bnx2_get_build_date() - Used to get the build date string of this library -+ * @param version - This function will return the pointer to this NIC -+ * library build date string -+ * @param version_size - This will be set with the build date string size -+ */ -+static void bnx2_get_build_date(char **build, size_t *build_size) -+{ -+ *build = (char *)build_date; -+ *build_size = sizeof(build_date); -+} -+ -+/** -+ * bnx2_get_transport_name() - Used to get the transport name associated -+ * with this this NIC libary -+ * @param transport_name - This function will return the pointer to this NIC -+ * library's associated transport string -+ * @param transport_name_size - This will be set with the transport name size -+ */ -+static void bnx2_get_transport_name(char **transport_name, -+ size_t *transport_name_size) -+{ -+ *transport_name = (char *)bnx2i_library_transport_name; -+ *transport_name_size = bnx2i_library_transport_name_size; -+} -+ -+/** -+ * bnx2_get_uio_name() - Used to get the uio name associated with this this -+ * NIC libary -+ * @param uio_name - This function will return the pointer to this NIC -+ * library's associated uio string -+ * @param transport_name_size - This will be set with the uio name size -+ */ -+static void bnx2_get_uio_name(char **uio_name, size_t *uio_name_size) -+{ -+ *uio_name = (char *)library_uio_name; -+ *uio_name_size = sizeof(library_uio_name); -+} -+ -+/** -+ * bnx2_get_pci_table() - Used to get the PCI table for this NIC libary -+ * to determine which NIC's based off of PCI ID's -+ * are supported -+ * @param table - This function will return the pointer to the PCI table -+ * @param entries - This function will return the number of entries in the NIC -+ * library's PCI table -+ */ -+static void bnx2_get_pci_table(struct pci_device_id **table, uint32_t *entries) -+{ -+ *table = (struct pci_device_id *)bnx2_pci_tbl; -+ *entries = (uint32_t) (sizeof(bnx2_pci_tbl) / sizeof(bnx2_pci_tbl[0])); -+} -+ -+/** -+ * bnx2_get_ops() - Used to get the NIC library op table -+ * @param op - The op table of this NIC library -+ */ -+struct nic_ops *bnx2_get_ops() -+{ -+ return &bnx2_op; -+} -+ -+/******************************************************************************* -+ * bnx2 Utility Functions -+ ******************************************************************************/ -+/******************************************************************************* -+ * Utility Functions Used to read register from the bnx2 device -+ ******************************************************************************/ -+static void bnx2_wr32(bnx2_t *bp, __u32 off, __u32 val) -+{ -+ *((volatile __u32 *)(bp->reg + off)) = val; -+} -+ -+static void bnx2_wr16(bnx2_t *bp, __u32 off, __u16 val) -+{ -+ *((volatile __u16 *)(bp->reg + off)) = val; -+} -+ -+static __u32 bnx2_rd32(bnx2_t *bp, __u32 off) -+{ -+ return *((volatile __u32 *)(bp->reg + off)); -+} -+ -+static int bnx2_reg_sync(bnx2_t *bp, __u32 off, __u16 length) -+{ -+ return msync(bp->reg + off, length, MS_SYNC); -+} -+ -+/** -+ * bnx2_get_chip_id() - Used to retrive the chip ID from the nic -+ * @param dev - Device used to determin NIC type -+ * @return Chip ID read from the MISC ID register -+ */ -+static int bnx2_get_chip_id(bnx2_t *bp) -+{ -+ return bnx2_rd32(bp, BNX2_MISC_ID); -+} -+ -+/** -+ * bnx2_uio_verify() -+ * -+ */ -+static int bnx2_uio_verify(nic_t *nic) -+{ -+ char *raw = NULL, *raw_tmp; -+ uint32_t raw_size = 0; -+ char temp_path[sizeof(cnic_uio_sysfs_name_tempate) + 8]; -+ int rc = 0; -+ -+ /* Build the path to determine uio name */ -+ snprintf(temp_path, sizeof(temp_path), -+ cnic_uio_sysfs_name_tempate, nic->uio_minor); -+ -+ rc = capture_file(&raw, &raw_size, temp_path); -+ if (rc != 0) -+ goto error; -+ -+ /* sanitize name string by replacing newline with null termination */ -+ raw_tmp = raw; -+ while (*raw_tmp != '\n') -+ raw_tmp++; -+ *raw_tmp = '\0'; -+ -+ if (strncmp(raw, cnic_uio_sysfs_name, sizeof(cnic_uio_sysfs_name)) != -+ 0) { -+ LOG_ERR(PFX "%s: uio names not equal: " -+ "expecting %s got %s from %s", -+ nic->log_name, cnic_uio_sysfs_name, raw, temp_path); -+ rc = -EIO; -+ } -+ -+ free(raw); -+ -+ LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); -+ -+error: -+ return rc; -+} -+ -+/******************************************************************************* -+ * bnx2 Utility Functions to get to the hardware consumer indexes -+ ******************************************************************************/ -+static __u16 bnx2_get_rx_msix(bnx2_t *bp) -+{ -+ struct status_block_msix *sblk = bp->status_blk.msix; -+ __u16 rx_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ rx_cons = sblk->status_rx_quick_consumer_index; -+ barrier(); -+ if ((rx_cons & (MAX_RX_DESC_CNT)) == (MAX_RX_DESC_CNT)) -+ rx_cons++; -+ -+ return rx_cons; -+} -+ -+static __u16 bnx2_get_rx_msi(bnx2_t *bp) -+{ -+ struct status_block *sblk = bp->status_blk.msi; -+ __u16 rx_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ rx_cons = BNX2_SBLK_EVEN_IDX(sblk->rx2); -+ barrier(); -+ if ((rx_cons & (MAX_RX_DESC_CNT)) == (MAX_RX_DESC_CNT)) -+ rx_cons++; -+ -+ return rx_cons; -+} -+ -+static __u16 bnx2_get_tx_msix(bnx2_t *bp) -+{ -+ struct status_block_msix *sblk = bp->status_blk.msix; -+ __u16 tx_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ tx_cons = sblk->status_tx_quick_consumer_index; -+ barrier(); -+ if ((tx_cons & (MAX_TX_DESC_CNT)) == (MAX_TX_DESC_CNT)) -+ tx_cons++; -+ -+ return tx_cons; -+} -+ -+static __u16 bnx2_get_tx_msi(bnx2_t *bp) -+{ -+ struct status_block *sblk = bp->status_blk.msi; -+ __u16 tx_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ tx_cons = BNX2_SBLK_EVEN_IDX(sblk->tx2); -+ barrier(); -+ if ((tx_cons & (MAX_TX_DESC_CNT)) == (MAX_TX_DESC_CNT)) -+ tx_cons++; -+ -+ return tx_cons; -+} -+ -+typedef enum { -+ CNIC_VLAN_STRIPPING_ENABLED = 1, -+ CNIC_VLAN_STRIPPING_DISABLED = 2, -+} CNIC_VLAN_STRIPPING_MODE; -+ -+/** -+ * bnx2_strip_vlan_enabled() - This will query the device to determine whether -+ * VLAN tag stripping is enabled or not -+ * @param dev - device to check stripping or not -+ * @ return CNIC_VLAN_STRIPPING_ENABLED stripping is enabled -+ * CNIC_VLAN_STRIPPING_DISABLED stripping is not enabled -+ */ -+static CNIC_VLAN_STRIPPING_MODE bnx2_strip_vlan_enabled(bnx2_t *bp) -+{ -+ uint32_t val; -+ -+ val = bnx2_rd32(bp, BNX2_EMAC_RX_MODE); -+ -+ if (val & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG) -+ return CNIC_VLAN_STRIPPING_DISABLED; -+ else -+ return CNIC_VLAN_STRIPPING_ENABLED; -+} -+ -+/** -+ * bnx2_free() - Used to free a bnx2 structure -+ */ -+static void bnx2_free(nic_t *nic) -+{ -+ if (nic->priv) -+ free(nic->priv); -+ nic->priv = NULL; -+} -+ -+ -+/** -+ * bnx2_alloc() - Used to allocate a bnx2 structure -+ */ -+static bnx2_t *bnx2_alloc(nic_t *nic) -+{ -+ bnx2_t *bp = malloc(sizeof(*bp)); -+ if (bp == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate bnx2 space", nic->log_name); -+ return NULL; -+ } -+ -+ /* Clear out the bnx2 contents */ -+ memset(bp, 0, sizeof(*bp)); -+ -+ bp->bar0_fd = INVALID_FD; -+ bp->flags = BNX2_UIO_TX_HAS_SENT; -+ -+ bp->parent = nic; -+ nic->priv = (void *)bp; -+ -+ return bp; -+} -+ -+/** -+ * bnx2_open() - This will initialize all the hardware resources -+ * @param dev - The struct nic device to open -+ * @return 0 on success, on failure a errno will be returned -+ */ -+static int bnx2_open(nic_t *nic) -+{ -+ bnx2_t *bp; -+ struct stat uio_stat; -+ int i, rc; -+ __u32 val; -+ uint32_t tx_cid; -+ __u32 msix_vector = 0; -+ char sysfs_resc_path[80]; -+ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL) { -+ LOG_ERR(PFX "bnx2_open(): nic == NULL"); -+ return -EINVAL; -+ } -+ -+ if ((nic->priv) != NULL && -+ (((bnx2_t *) (nic->priv))->flags & BNX2_OPENED)) { -+ return 0; -+ } -+ -+ bp = bnx2_alloc(nic); -+ if (bp == NULL) { -+ LOG_ERR(PFX "bnx2_open(): Couldn't allocate bp priv struct", -+ nic->log_name); -+ return -ENOMEM; -+ } -+ -+ while (nic->fd < 0) { -+ nic->fd = open(nic->uio_device_name, O_RDWR | O_NONBLOCK); -+ if (nic->fd != INVALID_FD) { -+ LOG_ERR(PFX -+ "%s: uio device has been brought up via pid: " -+ "%d on fd: %d", -+ nic->uio_device_name, getpid(), nic->fd); -+ -+ rc = bnx2_uio_verify(nic); -+ if (rc != 0) -+ continue; -+ -+ break; -+ } else { -+ LOG_WARN(PFX "%s: Could not open device: %s, [%s]", -+ nic->log_name, nic->uio_device_name, -+ strerror(errno)); -+ manually_trigger_uio_event(nic, nic->uio_minor); -+ -+ /* udev might not have created the file yet */ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ sleep(1); -+ pthread_mutex_lock(&nic->nic_mutex); -+ } -+ } -+ if (fstat(nic->fd, &uio_stat) < 0) { -+ LOG_ERR(PFX "%s: Could not fstat device", nic->log_name); -+ errno = -ENODEV; -+ goto error_alloc_rx_ring; -+ } -+ nic->uio_minor = minor(uio_stat.st_rdev); -+ -+ cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80); -+ bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC); -+ if (bp->bar0_fd < 0) { -+ LOG_ERR(PFX "%s: Could not open %s", nic->log_name, -+ sysfs_resc_path); -+ errno = -ENODEV; -+ goto error_alloc_rx_ring; -+ } -+ -+ /* TODO: hardcoded with the cnic driver */ -+ bp->rx_ring_size = 3; -+ bp->rx_buffer_size = 0x400; -+ -+ LOG_DEBUG(PFX "%s: using rx ring size: %d, rx buffer size: %d", -+ nic->log_name, bp->rx_ring_size, bp->rx_buffer_size); -+ -+ /* Determine the number of UIO events that have already occured */ -+ rc = detemine_initial_uio_events(nic, &nic->intr_count); -+ if (rc != 0) { -+ LOG_ERR("Could not determine the number ofinitial UIO events"); -+ nic->intr_count = 0; -+ } -+ -+ /* Allocate space for rx ring pointer */ -+ bp->rx_ring = malloc(sizeof(struct l2_fhdr *) * bp->rx_ring_size); -+ if (bp->rx_ring == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate space for rx_ring", -+ nic->log_name); -+ errno = -ENOMEM; -+ goto error_alloc_rx_ring; -+ } -+ mlock(bp->rx_ring, sizeof(struct l2_fhdr *) * bp->rx_ring_size); -+ -+ /* Allocate space for rx pkt ring */ -+ bp->rx_pkt_ring = malloc(sizeof(void *) * bp->rx_ring_size); -+ if (bp->rx_pkt_ring == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate space for rx_pkt_ring", -+ nic->log_name); -+ errno = -ENOMEM; -+ goto error_alloc_rx_pkt_ring; -+ } -+ mlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size); -+ -+ bp->reg = mmap(NULL, 0x12800, PROT_READ | PROT_WRITE, MAP_SHARED, -+ bp->bar0_fd, (off_t) 0); -+ if (bp->reg == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Couldn't mmap registers: %s", -+ nic->log_name, strerror(errno)); -+ bp->reg = NULL; -+ goto error_regs; -+ } -+ -+ msync(bp->reg, 0x12800, MS_SYNC); -+ LOG_DEBUG(PFX "Chip ID: %x", bnx2_get_chip_id(bp)); -+ -+ /* on a 5709 when using MSI-X the status block is at an offset */ -+ if (BNX2_CHIP_NUM(bnx2_get_chip_id(bp)) == CHIP_NUM_5709) { -+ /* determine if we are using MSI-X */ -+ val = bnx2_rd32(bp, BNX2_TSCH_TSS_CFG); -+ if (val) { -+ /* We are in MSI-X mode */ -+ uint32_t base_cid = ((val >> 10) & 0x7ff) << 3; -+ msix_vector = (val >> 24) & 0xf; -+ -+ bp->status_blk_size = (128 * 9); -+ -+ tx_cid = base_cid + msix_vector - 1; -+ bp->flags |= BNX2_UIO_MSIX_ENABLED; -+ -+ bp->get_tx_cons = bnx2_get_tx_msix; -+ bp->get_rx_cons = bnx2_get_rx_msix; -+ -+ LOG_DEBUG(PFX "%s: tss_cfg: 0x%x tx cid: %d", -+ nic->log_name, val, tx_cid); -+ -+ LOG_INFO(PFX "%s: detected using MSI-X vector: %d", -+ nic->log_name, msix_vector); -+ } else { -+ /* We are not in MSI-X mode */ -+ bp->status_blk_size = 64; -+ tx_cid = 20; -+ -+ bp->get_tx_cons = bnx2_get_tx_msi; -+ bp->get_rx_cons = bnx2_get_rx_msi; -+ } -+ } else { -+ bp->status_blk_size = 64; -+ tx_cid = 20; -+ -+ bp->get_tx_cons = bnx2_get_tx_msi; -+ bp->get_rx_cons = bnx2_get_rx_msi; -+ } -+ -+ bp->sblk_map = mmap(NULL, bp->status_blk_size, -+ PROT_READ | PROT_WRITE, MAP_SHARED, -+ nic->fd, (off_t) getpagesize()); -+ if (bp->sblk_map == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Could not mmap status block: %s", -+ nic->log_name, strerror(errno)); -+ goto error_sblk; -+ } -+ -+ if (bp->flags & BNX2_UIO_MSIX_ENABLED) { -+ uint8_t *status_blk = (uint8_t *) bp->sblk_map; -+ status_blk += (msix_vector * 128); -+ -+ bp->status_blk.msix = (struct status_block_msix *)status_blk; -+ -+ LOG_DEBUG(PFX "%s: msix initial cons: tx:%d rx:%d", -+ nic->log_name, -+ bp->status_blk.msix->status_tx_quick_consumer_index, -+ bp->status_blk.msix->status_rx_quick_consumer_index); -+ } else { -+ bp->status_blk.msi = (struct status_block *)bp->sblk_map; -+ -+ LOG_DEBUG(PFX "%s: msi initial tx:%d rx:%d", -+ nic->log_name, -+ BNX2_SBLK_EVEN_IDX(bp->status_blk.msi->tx2), -+ BNX2_SBLK_EVEN_IDX(bp->status_blk.msi->rx2)); -+ } -+ -+ bp->tx_ring = mmap(NULL, 2 * getpagesize(), -+ PROT_READ | PROT_WRITE, MAP_SHARED, nic->fd, -+ (off_t) 2 * getpagesize()); -+ if (bp->tx_ring == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Could not mmap tx ring: %s", -+ nic->log_name, strerror(errno)); -+ bp->tx_ring = NULL; -+ goto error_tx_ring; -+ } -+ -+ bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size, -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED, nic->fd, (off_t) 3 * getpagesize()); -+ if (bp->bufs == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Could not mmap buffers: %s", -+ nic->log_name, strerror(errno)); -+ bp->bufs = NULL; -+ goto error_bufs; -+ } -+ -+ bp->tx_bidx_io = MB_GET_CID_ADDR(tx_cid) + BNX2_L2CTX_TX_HOST_BIDX; -+ bp->tx_bseq_io = MB_GET_CID_ADDR(tx_cid) + BNX2_L2CTX_TX_HOST_BSEQ; -+ LOG_INFO(PFX "%s: tx_bidx_io: 0x%x tx_bseq_io: 0x%x", -+ nic->log_name, bp->tx_bidx_io, bp->tx_bseq_io); -+ -+ bp->rx_bidx_io = MB_GET_CID_ADDR(2) + BNX2_L2CTX_HOST_BDIDX; -+ bp->rx_bseq_io = MB_GET_CID_ADDR(2) + BNX2_L2CTX_HOST_BSEQ; -+ -+ bp->tx_cons = 0; -+ bp->tx_prod = 0; -+ bp->tx_pkt = bp->bufs; -+ -+ bp->rx_index = 0; -+ bp->rx_cons = 0; -+ bp->rx_prod = bp->rx_ring_size; -+ bp->rx_bseq = bp->rx_prod * bp->rx_buffer_size; -+ bnx2_wr16(bp, bp->rx_bidx_io, bp->rx_prod); -+ bnx2_wr32(bp, bp->rx_bseq_io, bp->rx_bseq); -+ -+ bnx2_reg_sync(bp, bp->rx_bidx_io, sizeof(__u16)); -+ bnx2_reg_sync(bp, bp->rx_bseq_io, sizeof(__u32)); -+ -+ for (i = 0; i < bp->rx_ring_size; i++) { -+ void *ptr = bp->bufs + (bp->rx_buffer_size * (i + 1)); -+ -+ bp->rx_ring[i] = (struct l2_fhdr *)ptr; -+ bp->rx_pkt_ring[i] = ptr + sizeof(struct l2_fhdr) + 2; -+ } -+ -+ /* Read the MAC address used for the iSCSI interface */ -+ val = bnx2_rd32(bp, BNX2_EMAC_MAC_MATCH4); -+ nic->mac_addr[0] = (__u8) (val >> 8); -+ nic->mac_addr[1] = (__u8) val; -+ -+ val = bnx2_rd32(bp, BNX2_EMAC_MAC_MATCH5); -+ nic->mac_addr[2] = (__u8) (val >> 24); -+ nic->mac_addr[3] = (__u8) (val >> 16); -+ nic->mac_addr[4] = (__u8) (val >> 8); -+ nic->mac_addr[5] = (__u8) val; -+ -+ LOG_INFO(PFX "%s: Using mac address: %2x:%2x:%2x:%2x:%2x:%2x", -+ nic->log_name, -+ nic->mac_addr[0], nic->mac_addr[1], nic->mac_addr[2], -+ nic->mac_addr[3], nic->mac_addr[4], nic->mac_addr[5]); -+ -+ /* Determine if Hardware VLAN tag stripping is enabled or not */ -+ if (CNIC_VLAN_STRIPPING_ENABLED == bnx2_strip_vlan_enabled(bp)) -+ nic->flags |= NIC_VLAN_STRIP_ENABLED; -+ -+ /* Prepare the multicast addresses */ -+ val = 4 | BNX2_RPM_SORT_USER2_BC_EN | BNX2_RPM_SORT_USER2_MC_EN; -+ if (BNX2_CHIP_NUM(bnx2_get_chip_id(bp)) != CHIP_NUM_5709) -+ val |= BNX2_RPM_SORT_USER2_PROM_VLAN; -+ -+ bnx2_wr32(bp, BNX2_RPM_SORT_USER2, 0x0); -+ bnx2_wr32(bp, BNX2_RPM_SORT_USER2, val); -+ bnx2_wr32(bp, BNX2_RPM_SORT_USER2, val | BNX2_RPM_SORT_USER2_ENA); -+ -+ rc = enable_multicast(nic); -+ if (rc != 0) { -+ errno = rc; -+ goto error_bufs; -+ } -+ msync(bp->reg, 0x12800, MS_SYNC); -+ LOG_INFO("%s: bnx2 uio initialized", nic->log_name); -+ -+ bp->flags |= BNX2_OPENED; -+ -+ return 0; -+ -+error_bufs: -+ munmap(bp->tx_ring, 2 * getpagesize()); -+ -+error_tx_ring: -+ munmap(bp->status_blk.msi, bp->status_blk_size); -+ -+error_sblk: -+ munmap(bp->reg, 0x12800); -+ -+error_regs: -+ munlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size); -+ free(bp->rx_pkt_ring); -+ bp->rx_pkt_ring = NULL; -+ -+error_alloc_rx_pkt_ring: -+ munlock(bp->rx_ring, sizeof(struct l2_fhdr *) * bp->rx_ring_size); -+ free(bp->rx_ring); -+ bp->rx_ring = NULL; -+ -+error_alloc_rx_ring: -+ if (nic->fd != INVALID_FD) { -+ close(nic->fd); -+ nic->fd = INVALID_FD; -+ } -+ bnx2_free(nic); -+ -+ return errno; -+} -+ -+/** -+ * bnx2_uio_close_resources() - Used to free resource for the bnx2 NIC -+ * @param nic - NIC device to free resource -+ * @param graceful - whether to wait to close gracefully -+ * @return 0 on success, <0 on failure -+ */ -+static int bnx2_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful) -+{ -+ bnx2_t *bp = (bnx2_t *) nic->priv; -+ int rc = 0; -+ -+ /* Remove the multicast addresses if added */ -+ if ((nic->flags & NIC_ADDED_MULICAST) && -+ (graceful == ALLOW_GRACEFUL_SHUTDOWN)) -+ disable_multicast(nic); -+ -+ /* Check if there is an assoicated bnx2 device */ -+ if (bp == NULL) { -+ LOG_WARN(PFX "%s: when closing resources there is " -+ "no assoicated bnx2", nic->log_name); -+ return -EIO; -+ } -+ -+ /* Clean up allocated memory */ -+ if (bp->rx_ring != NULL) { -+ free(bp->rx_ring); -+ bp->rx_ring = NULL; -+ } -+ -+ if (bp->rx_pkt_ring != NULL) { -+ free(bp->rx_pkt_ring); -+ bp->rx_pkt_ring = NULL; -+ } -+ -+ /* Clean up mapped registers */ -+ if (bp->bufs != NULL) { -+ rc = munmap(bp->bufs, -+ (bp->rx_ring_size + 1) * bp->rx_buffer_size); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap bufs", nic->log_name); -+ bp->bufs = NULL; -+ } -+ -+ if (bp->tx_ring != NULL) { -+ rc = munmap(bp->tx_ring, 2 * getpagesize()); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap tx_rings", -+ nic->log_name); -+ bp->tx_ring = NULL; -+ } -+ -+ if (bp->status_blk.msix != NULL || bp->status_blk.msi != NULL) { -+ rc = munmap(bp->sblk_map, bp->status_blk_size); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap status block", -+ nic->log_name); -+ bp->sblk_map = NULL; -+ -+ bp->status_blk.msix = NULL; -+ bp->status_blk.msi = NULL; -+ } -+ -+ if (bp->reg != NULL) { -+ rc = munmap(bp->reg, 0x12800); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name); -+ bp->reg = NULL; -+ } -+ -+ if (bp->bar0_fd != INVALID_FD) { -+ close(bp->bar0_fd); -+ bp->bar0_fd = INVALID_FD; -+ } -+ -+ if (nic->fd != INVALID_FD) { -+ rc = close(nic->fd); -+ if (rc != 0) { -+ LOG_WARN(PFX -+ "%s: Couldn't close uio file descriptor: %d", -+ nic->log_name, nic->fd); -+ } else { -+ LOG_DEBUG(PFX "%s: Closed uio file descriptor: %d", -+ nic->log_name, nic->fd); -+ } -+ -+ nic->fd = INVALID_FD; -+ } else { -+ LOG_WARN(PFX "%s: Invalid uio file descriptor: %d", -+ nic->log_name, nic->fd); -+ } -+ -+ LOG_INFO(PFX "%s: Closed all resources", nic->log_name); -+ -+ return 0; -+} -+ -+/** -+ * bnx2_close() - Used to close the NIC device -+ * @param nic - NIC device to close -+ * @param graceful - whether to wait to close gracefully -+ * @return 0 if successful, <0 if there is an error -+ */ -+static int bnx2_close(nic_t *nic, NIC_SHUTDOWN_T graceful) -+{ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL) { -+ LOG_ERR(PFX "bnx2_close(): nic == NULL"); -+ return -EINVAL; -+ } -+ -+ LOG_INFO(PFX "Closing NIC device: %s", nic->log_name); -+ -+ bnx2_uio_close_resources(nic, graceful); -+ bnx2_free(nic); -+ -+ return 0; -+} -+ -+static void bnx2_prepare_xmit_packet(nic_t *nic, -+ nic_interface_t *nic_iface, -+ struct packet *pkt) -+{ -+ bnx2_t *bp = (bnx2_t *) nic->priv; -+ struct uip_vlan_eth_hdr *eth_vlan = (struct uip_vlan_eth_hdr *)pkt->buf; -+ struct uip_eth_hdr *eth = (struct uip_eth_hdr *)bp->tx_pkt; -+ -+ if (eth_vlan->tpid == htons(UIP_ETHTYPE_8021Q)) { -+ memcpy(bp->tx_pkt, pkt->buf, sizeof(struct uip_eth_hdr)); -+ eth->type = eth_vlan->type; -+ pkt->buf_size -= (sizeof(struct uip_vlan_eth_hdr) - -+ sizeof(struct uip_eth_hdr)); -+ memcpy(bp->tx_pkt + sizeof(struct uip_eth_hdr), -+ pkt->buf + sizeof(struct uip_vlan_eth_hdr), -+ pkt->buf_size - sizeof(struct uip_eth_hdr)); -+ } else -+ memcpy(bp->tx_pkt, pkt->buf, pkt->buf_size); -+ -+ msync(bp->tx_pkt, pkt->buf_size, MS_SYNC); -+} -+ -+/** -+ * bnx2_get_tx_pkt() - This function is used to a TX packet from the NIC -+ * @param nic - The NIC device to send the packet -+ * -+ */ -+void *bnx2_get_tx_pkt(nic_t *nic) -+{ -+ bnx2_t *bp = (bnx2_t *) nic->priv; -+ return bp->tx_pkt; -+} -+ -+/** -+ * bnx2_start_xmit() - This function is used to send a packet of data -+ * @param nic - The NIC device to send the packet -+ * @param len - the length of the TX packet -+ * -+ */ -+void bnx2_start_xmit(nic_t *nic, size_t len, u16_t vlan_id) -+{ -+ bnx2_t *bp = (bnx2_t *) nic->priv; -+ uint16_t ring_prod; -+ struct tx_bd *txbd; -+ struct rx_bd *rxbd; -+ rxbd = (struct rx_bd *)(((__u8 *) bp->tx_ring) + getpagesize()); -+ -+ if ((rxbd->rx_bd_haddr_hi == 0) && (rxbd->rx_bd_haddr_lo == 0)) { -+ LOG_PACKET(PFX "%s: trying to transmit when device is closed", -+ nic->log_name); -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ return; -+ } -+ -+ ring_prod = TX_RING_IDX(bp->tx_prod); -+ txbd = &bp->tx_ring[ring_prod]; -+ -+ txbd->tx_bd_mss_nbytes = len; -+ -+ if (vlan_id) { -+ txbd->tx_bd_vlan_tag_flags = (vlan_id << 16) | -+ TX_BD_FLAGS_VLAN_TAG | TX_BD_FLAGS_END | TX_BD_FLAGS_START; -+ } else -+ txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_END | -+ TX_BD_FLAGS_START; -+ -+ bp->tx_bseq += len; -+ bp->tx_prod = NEXT_TX_BD(bp->tx_prod); -+ -+ bnx2_wr16(bp, bp->tx_bidx_io, bp->tx_prod); -+ bnx2_wr32(bp, bp->tx_bseq_io, bp->tx_bseq); -+ -+ bnx2_reg_sync(bp, bp->tx_bidx_io, sizeof(__u16)); -+ bnx2_reg_sync(bp, bp->tx_bseq_io, sizeof(__u32)); -+ -+ LOG_PACKET(PFX "%s: sent %d bytes using dev->tx_prod: %d", -+ nic->log_name, len, bp->tx_prod); -+} -+ -+/** -+ * bnx2_write() - Used to write the data to the hardware -+ * @param nic - NIC hardware to read from -+ * @param pkt - The packet which will hold the data to be sent on the wire -+ * @return 0 if successful, <0 if failed -+ */ -+int bnx2_write(nic_t *nic, nic_interface_t *nic_iface, packet_t *pkt) -+{ -+ bnx2_t *bp; -+ struct uip_stack *uip; -+ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL || nic_iface == NULL || pkt == NULL) { -+ LOG_ERR(PFX "%s: bnx2_write() nic == 0x%p || " -+ " nic_iface == 0x%p || " -+ " pkt == 0x%x", nic, nic_iface, pkt); -+ return -EINVAL; -+ } -+ bp = (bnx2_t *)nic->priv; -+ uip = &nic_iface->ustack; -+ -+ if (pkt->buf_size == 0) { -+ LOG_ERR(PFX "%s: Trying to transmitted 0 sized packet", -+ nic->log_name); -+ return -EINVAL; -+ } -+ -+ if (pthread_mutex_trylock(&nic->xmit_mutex) != 0) { -+ LOG_PACKET(PFX "%s: Dropped previous transmitted packet", -+ nic->log_name); -+ return -EINVAL; -+ } -+ -+ bnx2_prepare_xmit_packet(nic, nic_iface, pkt); -+ bnx2_start_xmit(nic, pkt->buf_size, -+ (nic_iface->vlan_priority << 12) | -+ nic_iface->vlan_id); -+ -+ /* bump the bnx2 dev send statistics */ -+ nic->stats.tx.packets++; -+ nic->stats.tx.bytes += uip->uip_len; -+ -+ LOG_PACKET(PFX "%s: transmitted %d bytes " -+ "dev->tx_cons: %d, dev->tx_prod: %d, dev->tx_bseq:%d", -+ nic->log_name, pkt->buf_size, -+ bp->tx_cons, bp->tx_prod, bp->tx_bseq); -+ -+ return 0; -+} -+ -+/** -+ * bnx2_read() - Used to read the data from the hardware -+ * @param nic - NIC hardware to read from -+ * @param pkt - The packet which will hold the data -+ * @return 0 if successful, <0 if failed -+ */ -+static int bnx2_read(nic_t *nic, packet_t *pkt) -+{ -+ bnx2_t *bp; -+ int rc = 0; -+ uint16_t hw_cons, sw_cons; -+ -+ /* Sanity Check: validate the parameters */ -+ if (unlikely(nic == NULL || pkt == NULL)) { -+ LOG_ERR(PFX "%s: bnx2_write() nic == 0x%p || " -+ " pkt == 0x%x", nic, pkt); -+ return -EINVAL; -+ } -+ bp = (bnx2_t *)nic->priv; -+ -+ hw_cons = bp->get_rx_cons(bp); -+ sw_cons = bp->rx_cons; -+ -+ if (sw_cons != hw_cons) { -+ uint8_t rx_index = bp->rx_index % 3; -+ struct l2_fhdr *rx_hdr = bp->rx_ring[rx_index]; -+ void *rx_pkt = bp->rx_pkt_ring[rx_index]; -+ int len; -+ uint16_t errors; -+ -+ LOG_PACKET(PFX "%s: clearing rx interrupt: %d %d %d", -+ nic->log_name, sw_cons, hw_cons, rx_index); -+ -+ msync(rx_hdr, sizeof(struct l2_fhdr), MS_SYNC); -+ errors = ((rx_hdr->l2_fhdr_status & 0xffff0000) >> 16); -+ len = ((rx_hdr->l2_fhdr_vtag_len & 0xffff0000) >> 16) - 4; -+ -+ if (unlikely((errors & (L2_FHDR_ERRORS_BAD_CRC | -+ L2_FHDR_ERRORS_PHY_DECODE | -+ L2_FHDR_ERRORS_ALIGNMENT | -+ L2_FHDR_ERRORS_TOO_SHORT | -+ L2_FHDR_ERRORS_GIANT_FRAME)) || -+ (len <= 0) || -+ (len > (bp->rx_buffer_size - -+ (sizeof(struct l2_fhdr) + 2))) || -+ (len > pkt->max_buf_size))) { -+ /* One of the fields in the BD is bad */ -+ uint16_t status = ((rx_hdr->l2_fhdr_status & -+ 0x0000ffff)); -+ -+ LOG_ERR(PFX "%s: Recv error: 0x%x status: 0x%x " -+ "len: %d", nic->log_name, errors, status, len); -+ -+ if ((len < (bp->rx_buffer_size - -+ (sizeof(struct l2_fhdr) + 2))) && -+ (len < pkt->max_buf_size)) -+ dump_packet_to_log(pkt->nic_iface, rx_pkt, len); -+ } else { -+ if (len < (bp->rx_buffer_size - -+ (sizeof(struct l2_fhdr) + 2))) { -+ msync(rx_pkt, len, MS_SYNC); -+ /* Copy the data */ -+ memcpy(pkt->buf, rx_pkt, len); -+ pkt->buf_size = len; -+ -+ /* Properly set the packet flags */ -+ /* check if there is VLAN tagging on the -+ * packet */ -+ if (rx_hdr->l2_fhdr_status & -+ L2_FHDR_STATUS_VLAN_TAG) { -+ pkt->vlan_tag = -+ rx_hdr->l2_fhdr_vtag_len & 0x0FFF; -+ pkt->flags |= VLAN_TAGGED; -+ } else { -+ pkt->vlan_tag = 0; -+ } -+ -+ rc = 1; -+ -+ LOG_PACKET(PFX "%s: processing packet " -+ "length: %d", nic->log_name, len); -+ } else { -+ /* If the NIC passes up a packet bigger -+ * then the RX buffer, flag it */ -+ LOG_ERR(PFX "%s: invalid packet length %d " -+ "recieve ", nic->log_name, len); -+ } -+ } -+ -+ bp->rx_index++; -+ sw_cons = NEXT_RX_BD(sw_cons); -+ bp->rx_prod = NEXT_RX_BD(bp->rx_prod); -+ bp->rx_bseq += 0x400; -+ -+ bp->rx_cons = sw_cons; -+ bnx2_wr16(bp, bp->rx_bidx_io, bp->rx_prod); -+ bnx2_wr32(bp, bp->rx_bseq_io, bp->rx_bseq); -+ -+ bnx2_reg_sync(bp, bp->rx_bidx_io, sizeof(__u16)); -+ bnx2_reg_sync(bp, bp->rx_bseq_io, sizeof(__u32)); -+ -+ /* bump the bnx2 dev recv statistics */ -+ nic->stats.rx.packets++; -+ nic->stats.rx.bytes += pkt->buf_size; -+ } -+ -+ return rc; -+} -+ -+/******************************************************************************* -+ * Clearing TX interrupts -+ ******************************************************************************/ -+/** -+ * bnx2_clear_tx_intr() - This routine is called when a TX interrupt occurs -+ * @param nic - the nic the interrupt occured on -+ * @return 0 on success -+ */ -+static int bnx2_clear_tx_intr(nic_t *nic) -+{ -+ bnx2_t *bp; -+ uint16_t hw_cons; -+ -+ /* Sanity check: ensure the parameters passed in are valid */ -+ if (unlikely(nic == NULL)) { -+ LOG_ERR(PFX "bnx2_read() nic == NULL"); -+ return -EINVAL; -+ } -+ bp = (bnx2_t *) nic->priv; -+ hw_cons = bp->get_tx_cons(bp); -+ -+ if (bp->flags & BNX2_UIO_TX_HAS_SENT) -+ bp->flags &= ~BNX2_UIO_TX_HAS_SENT; -+ -+ LOG_PACKET(PFX "%s: clearing tx interrupt [%d %d]", -+ nic->log_name, bp->tx_cons, hw_cons); -+ -+ bp->tx_cons = hw_cons; -+ -+ /* There is a queued TX packet that needs to be sent out. The usual -+ * case is when stack will send an ARP packet out before sending the -+ * intended packet */ -+ if (nic->tx_packet_queue != NULL) { -+ packet_t *pkt; -+ -+ LOG_PACKET(PFX "%s: sending queued tx packet", nic->log_name); -+ pkt = nic_dequeue_tx_packet(nic); -+ -+ /* Got a TX packet buffer of the TX queue and put it onto -+ * the hardware */ -+ if (pkt != NULL) { -+ bnx2_prepare_xmit_packet(nic, pkt->nic_iface, pkt); -+ -+ bnx2_start_xmit(nic, pkt->buf_size, -+ (pkt->nic_iface->vlan_priority << 12) | -+ pkt->nic_iface->vlan_id); -+ -+ LOG_PACKET(PFX "%s: transmitted queued packet %d bytes " -+ "dev->tx_cons: %d, dev->tx_prod: %d, " -+ "dev->tx_bseq:%d", -+ nic->log_name, pkt->buf_size, -+ bp->tx_cons, bp->tx_prod, bp->tx_bseq); -+ -+ return -EAGAIN; -+ } -+ } -+ -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ -+ return 0; -+} -+ -+/******************************************************************************* -+ * bnx2 NIC op's table -+ ******************************************************************************/ -+struct nic_ops bnx2_op = { -+ .description = "bnx2", -+ .open = bnx2_open, -+ .close = bnx2_close, -+ .write = bnx2_write, -+ .get_tx_pkt = bnx2_get_tx_pkt, -+ .start_xmit = bnx2_start_xmit, -+ .read = bnx2_read, -+ .clear_tx_intr = bnx2_clear_tx_intr, -+ .handle_iscsi_path_req = cnic_handle_iscsi_path_req, -+ -+ .lib_ops = { -+ .get_library_name = bnx2_get_library_name, -+ .get_pci_table = bnx2_get_pci_table, -+ .get_library_version = bnx2_get_library_version, -+ .get_build_date = bnx2_get_build_date, -+ .get_transport_name = bnx2_get_transport_name, -+ .get_uio_name = bnx2_get_uio_name, -+ }, -+}; -diff --git a/iscsiuio/src/unix/libs/bnx2.h b/iscsiuio/src/unix/libs/bnx2.h -new file mode 100644 -index 0000000..c025542 ---- /dev/null -+++ b/iscsiuio/src/unix/libs/bnx2.h -@@ -0,0 +1,303 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * bnx2.h - bnx2 user space driver -+ * -+ */ -+#ifndef __BNX2_H__ -+#define __BNX2_H__ -+ -+#include "nic.h" -+ -+/****************************************************************************** -+ * Default BNX2 values -+ ******************************************************************************/ -+#define DEFAULT_NUM_RXBD 3 -+#define DEFAULT_RX_LEN 0x400 -+ -+/****************************************************************************** -+ * BNX2 Hardware structures -+ ******************************************************************************/ -+/* status_block definition for MSI */ -+struct status_block { -+ volatile __u32 status_attn_bits; -+ volatile __u32 status_attn_bits_ack; -+ volatile __u32 tx0; -+ volatile __u32 tx2; -+ volatile __u32 rx0; -+ volatile __u32 rx2; -+ volatile __u32 rx4; -+ volatile __u32 rx6; -+ volatile __u32 rx8; -+ volatile __u32 rx10; -+ volatile __u32 rx12; -+ volatile __u32 rx14; -+ volatile __u32 cmd; -+ volatile __u32 idx; -+}; -+ -+/* status_block definition for MSI-X */ -+struct status_block_msix { -+#if 0 -+#if defined(__BIG_ENDIAN) -+ __u16 status_tx_quick_consumer_index; -+ __u16 status_rx_quick_consumer_index; -+ __u16 status_completion_producer_index; -+ __u16 status_cmd_consumer_index; -+ __u32 status_unused; -+ __u16 status_idx; -+ __u8 status_unused2; -+ __u8 status_blk_num; -+#elif defined(__LITTLE_ENDIAN) -+ __u16 status_rx_quick_consumer_index; -+ __u16 status_tx_quick_consumer_index; -+ __u16 status_cmd_consumer_index; -+ __u16 status_completion_producer_index; -+ __u32 status_unused; -+ __u8 status_blk_num; -+ __u8 status_unused2; -+ __u16 status_idx; -+#endif -+#endif -+ __u16 status_rx_quick_consumer_index; -+ __u16 status_tx_quick_consumer_index; -+ __u16 status_cmd_consumer_index; -+ __u16 status_completion_producer_index; -+ __u32 status_unused; -+ __u8 status_blk_num; -+ __u8 status_unused2; -+ __u16 status_idx; -+}; -+ -+/* TX Buffer descriptor */ -+struct tx_bd { -+ __u32 tx_bd_haddr_hi; -+ __u32 tx_bd_haddr_lo; -+ __u32 tx_bd_mss_nbytes; -+ __u32 tx_bd_vlan_tag_flags; -+#define TX_BD_FLAGS_VLAN_TAG (1<<3) -+#define TX_BD_FLAGS_END (1<<6) -+#define TX_BD_FLAGS_START (1<<7) -+}; -+ -+/* RX Buffer descriptor */ -+struct rx_bd { -+ __u32 rx_bd_haddr_hi; -+ __u32 rx_bd_haddr_lo; -+ -+ __u32 rx_bd_len; -+ __u32 rx_bd_flags; -+#define RX_BD_FLAGS_END (1<<2) -+#define RX_BD_FLAGS_START (1<<3) -+ -+}; -+ -+/* This is the RX L2 Frame header */ -+struct l2_fhdr { -+ __u32 l2_fhdr_status; -+#define L2_FHDR_ERRORS_BAD_CRC (1<<17) -+#define L2_FHDR_ERRORS_PHY_DECODE (1<<18) -+#define L2_FHDR_ERRORS_ALIGNMENT (1<<19) -+#define L2_FHDR_ERRORS_TOO_SHORT (1<<20) -+#define L2_FHDR_ERRORS_GIANT_FRAME (1<<21) -+#define L2_FHDR_ERRORS_TCP_XSUM (1<<28) -+#define L2_FHDR_ERRORS_UDP_XSUM (1<<31) -+ -+#define L2_FHDR_STATUS_UDP_DATAGRAM (1<<15) -+#define L2_FHDR_STATUS_TCP_DATAGRAM (1<<14) -+#define L2_FHDR_STATUS_IP_DATAGRAM (1<<13) -+#define L2_FHDR_STATUS_LLC_SNAP (1<<7) -+#define L2_FHDR_STATUS_VLAN_TAG (1<<6) -+ -+ __u32 l2_fhdr_hash; -+ -+ __u32 l2_fhdr_vtag_len; -+ __u32 l2_fhdr_xsum; -+}; -+ -+/****************************************************************************** -+ * BNX2 Registers Defitions/Values -+ ******************************************************************************/ -+#define BNX2_MISC_ID 0x00000808 -+#define BNX2_EMAC_MAC_MATCH4 0x00001420 -+#define BNX2_EMAC_MAC_MATCH5 0x00001424 -+ -+#define BNX2_EMAC_RX_MODE 0x000014c8 -+#define BNX2_EMAC_RX_MODE_RESET (1L<<0) -+#define BNX2_EMAC_RX_MODE_FLOW_EN (1L<<2) -+#define BNX2_EMAC_RX_MODE_KEEP_MAC_CONTROL (1L<<3) -+#define BNX2_EMAC_RX_MODE_KEEP_PAUSE (1L<<4) -+#define BNX2_EMAC_RX_MODE_ACCEPT_OVERSIZE (1L<<5) -+#define BNX2_EMAC_RX_MODE_ACCEPT_RUNTS (1L<<6) -+#define BNX2_EMAC_RX_MODE_LLC_CHK (1L<<7) -+#define BNX2_EMAC_RX_MODE_PROMISCUOUS (1L<<8) -+#define BNX2_EMAC_RX_MODE_NO_CRC_CHK (1L<<9) -+#define BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG (1L<<10) -+#define BNX2_EMAC_RX_MODE_FILT_BROADCAST (1L<<11) -+#define BNX2_EMAC_RX_MODE_SORT_MODE (1L<<12) -+ -+#define BNX2_RPM_SORT_USER2 0x00001828 -+#define BNX2_RPM_SORT_USER2_PM_EN (0xffffL<<0) -+#define BNX2_RPM_SORT_USER2_BC_EN (1L<<16) -+#define BNX2_RPM_SORT_USER2_MC_EN (1L<<17) -+#define BNX2_RPM_SORT_USER2_MC_HSH_EN (1L<<18) -+#define BNX2_RPM_SORT_USER2_PROM_EN (1L<<19) -+#define BNX2_RPM_SORT_USER2_VLAN_EN (0xfL<<20) -+#define BNX2_RPM_SORT_USER2_PROM_VLAN (1L<<24) -+#define BNX2_RPM_SORT_USER2_ENA (1L<<31) -+ -+/* -+ * tsch_reg definition -+ * offset: 0x4c00 -+ */ -+#define BNX2_TSCH_TSS_CFG 0x00004c1c -+#define BNX2_TSCH_TSS_CFG_TSS_START_CID (0x7ffL<<8) -+#define BNX2_TSCH_TSS_CFG_NUM_OF_TSS_CON (0xfL<<24) -+#define CNIC_UIO_INVALID_FD -1 -+ -+#define BNX2_L2CTX_TX_HOST_BIDX 0x00000088 -+#define BNX2_L2CTX_TX_HOST_BSEQ 0x00000090 -+ -+#define BNX2_L2CTX_HOST_BDIDX 0x00000004 -+#define BNX2_L2CTX_HOST_BSEQ 0x00000008 -+ -+/* Used to determin the CHIP ID */ -+/* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ -+#define BNX2_CHIP_NUM(bp) ((bp) & 0xffff0000) -+#define CHIP_NUM_5706 0x57060000 -+#define CHIP_NUM_5708 0x57080000 -+#define CHIP_NUM_5709 0x57090000 -+ -+#define CHIP_REV(bp) ((bp) & 0x0000f000) -+#define CHIP_REV_Ax 0x00000000 -+#define CHIP_REV_Bx 0x00001000 -+#define CHIP_REV_Cx 0x00002000 -+ -+#define CHIP_METAL(bp) ((bp) & 0x00000ff0) -+#define CHIP_BONDING(bp) ((bp) & 0x0000000f) -+ -+#define CHIP_ID(bp) ((bp) & 0xfffffff0) -+#define CHIP_ID_5706_A0 0x57060000 -+#define CHIP_ID_5706_A1 0x57060010 -+#define CHIP_ID_5706_A2 0x57060020 -+#define CHIP_ID_5708_A0 0x57080000 -+#define CHIP_ID_5708_B0 0x57081000 -+#define CHIP_ID_5708_B1 0x57081010 -+#define CHIP_ID_5709_A0 0x57090000 -+#define CHIP_ID_5709_A1 0x57090010 -+ -+#define CHIP_BOND_ID(bp) ((bp) & 0xf) -+ -+#define BNX2_SBLK_EVEN_IDX(x) (((x) & 0xffff0000) >> 16) -+ -+#define TX_DESC_CNT (4096 / sizeof(struct tx_bd)) -+#define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) -+ -+#define NEXT_TX_BD(x) ((((x) & (MAX_TX_DESC_CNT - 1)) == \ -+ (MAX_TX_DESC_CNT - 1)) ? \ -+ (x) + 2 : (x) + 1) -+ -+#define TX_RING_IDX(x) ((x) & MAX_TX_DESC_CNT) -+ -+#define RX_DESC_CNT (4096 / sizeof(struct rx_bd)) -+#define MAX_RX_DESC_CNT (RX_DESC_CNT - 1) -+ -+#define NEXT_RX_BD(x) ((((x) & (MAX_RX_DESC_CNT - 1)) == \ -+ (MAX_RX_DESC_CNT - 1)) ? \ -+ (x) + 2 : (x) + 1) -+ -+#define MB_KERNEL_CTX_SHIFT 8 -+#define MB_KERNEL_CTX_SIZE (1 << MB_KERNEL_CTX_SHIFT) -+#define MB_KERNEL_CTX_MASK (MB_KERNEL_CTX_SIZE - 1) -+#define MB_GET_CID_ADDR(_cid) (0x10000 + ((_cid) << MB_KERNEL_CTX_SHIFT)) -+ -+typedef struct bnx2 { -+ nic_t *parent; -+ -+ uint16_t flags; -+#define BNX2_UIO_MSIX_ENABLED 0x0001 -+#define BNX2_UIO_TX_HAS_SENT 0x0002 -+#define BNX2_OPENED 0x0004 -+ -+ int bar0_fd; -+ void *reg; /* Pointer to the mapped registers */ -+ -+ __u32 tx_bidx_io; -+ __u32 tx_bseq_io; -+ -+ __u16 tx_prod; -+ __u16 tx_cons; -+ __u32 tx_bseq; -+ -+ __u32 rx_bidx_io; -+ __u32 rx_bseq_io; -+ -+ __u16 rx_prod; -+ __u16 rx_cons; -+ __u32 rx_bseq; -+ -+ /* RX ring parameters */ -+ uint32_t rx_ring_size; -+ uint32_t rx_buffer_size; -+ -+ void *bufs; /* Pointer to the mapped buffer space */ -+ -+ /* Hardware Status Block locations */ -+ void *sblk_map; -+ union { -+ struct status_block *msi; -+ struct status_block_msix *msix; -+ } status_blk; -+ size_t status_blk_size; -+ -+ __u16(*get_rx_cons) (struct bnx2 *); -+ __u16(*get_tx_cons) (struct bnx2 *); -+ -+ uint16_t rx_index; -+ struct l2_fhdr **rx_ring; -+ void **rx_pkt_ring; -+ -+ struct tx_bd *tx_ring; -+ void *tx_pkt; -+ -+ struct l2_fhdr rcv_l2_fhdr; -+ __u8 rcv_buf[1500 + 2]; -+ __u32 rcv_size; -+} bnx2_t; -+ -+/****************************************************************************** -+ * bnx2 Function Declarations -+ ******************************************************************************/ -+struct nic_ops *bnx2_get_ops(); -+#endif /* __BNX2_H__ */ -diff --git a/iscsiuio/src/unix/libs/bnx2x.c b/iscsiuio/src/unix/libs/bnx2x.c -new file mode 100644 -index 0000000..c6e92cf ---- /dev/null -+++ b/iscsiuio/src/unix/libs/bnx2x.c -@@ -0,0 +1,1625 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * bnx2x.c - bnx2x user space driver -+ * -+ */ -+#include -+#include -+#include -+#include -+#include /* Needed for linux/ethtool.h on RHEL 5.x */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "config.h" -+ -+#include "build_date.h" -+#include "bnx2x.h" -+#include "cnic.h" -+#include "logger.h" -+#include "nic.h" -+#include "nic_id.h" -+#include "nic_utils.h" -+#include "options.h" -+ -+#define PFX "bnx2x " -+ -+/* Foward struct declarations */ -+struct nic_ops bnx2x_op; -+ -+/******************************************************************************* -+ * NIC Library Strings -+ ******************************************************************************/ -+static const char library_name[] = "bnx2x"; -+static const char library_version[] = PACKAGE_VERSION; -+static const char library_uio_name[] = "bnx2x_cnic"; -+ -+/* The name that should be returned from /sys/class/uio/uio0/name */ -+static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; -+static const char bnx2x_uio_sysfs_name[] = "bnx2x_cnic"; -+ -+/******************************************************************************* -+ * String constants used to display human readable adapter name -+ ******************************************************************************/ -+static const char brcm_57710[] = "Broadcom NetXtreme II BCM57710 10-Gigabit"; -+static const char brcm_57711[] = "Broadcom NetXtreme II BCM57711 10-Gigabit"; -+static const char brcm_57711e[] = "Broadcom NetXtreme II BCM57711E 10-Gigabit"; -+static const char brcm_57712[] = "Broadcom NetXtreme II BCM57712 10-Gigabit"; -+static const char brcm_57712_MF[] = "Broadcom NetXtreme II BCM57712 MF " -+ "10-Gigabit"; -+static const char brcm_57712_VF[] = "Broadcom NetXtreme II BCM57712 VF " -+ "10-Gigabit"; -+static const char brcm_57713[] = "Broadcom NetXtreme II BCM57713 10-Gigabit"; -+static const char brcm_57713e[] = "Broadcom NetXtreme II BCM57713E 10-Gigabit"; -+static const char brcm_57800[] = "Broadcom NetXtreme II BCM57800 10-Gigabit"; -+static const char brcm_57800_MF[] = "Broadcom NetXtreme II BCM57800 MF " -+ "10-Gigabit"; -+static const char brcm_57800_VF[] = "Broadcom NetXtreme II BCM57800 VF " -+ "10-Gigabit"; -+static const char brcm_57810[] = "Broadcom NetXtreme II BCM57810 10-Gigabit"; -+static const char brcm_57810_MF[] = "Broadcom NetXtreme II BCM57810 MF " -+ "10-Gigabit"; -+static const char brcm_57810_VF[] = "Broadcom NetXtreme II BCM57810 VF " -+ "10-Gigabit"; -+static const char brcm_57811[] = "Broadcom NetXtreme II BCM57811 10-Gigabit"; -+static const char brcm_57811_MF[] = "Broadcom NetXtreme II BCM57811 MF " -+ "10-Gigabit"; -+static const char brcm_57811_VF[] = "Broadcom NetXtreme II BCM57811 VF " -+ "10-Gigabit"; -+static const char brcm_57840[] = "Broadcom NetXtreme II BCM57840 10-Gigabit"; -+static const char brcm_57840_MF[] = "Broadcom NetXtreme II BCM57840 MF " -+ "10-Gigabit"; -+static const char brcm_57840_VF[] = "Broadcom NetXtreme II BCM57840 VF " -+ "10-Gigabit"; -+static const char brcm_57840_4_10[] = "Broadcom NetXtreme II BCM57840 4x" -+ "10-Gigabit"; -+static const char brcm_57840_2_20[] = "Broadcom NetXtreme II BCM57840 2x" -+ "20-Gigabit"; -+ -+/******************************************************************************* -+ * PCI ID constants -+ ******************************************************************************/ -+#define PCI_VENDOR_ID_BROADCOM 0x14e4 -+#define PCI_DEVICE_ID_NX2_57710 0x164e -+#define PCI_DEVICE_ID_NX2_57711 0x164f -+#define PCI_DEVICE_ID_NX2_57711E 0x1650 -+#define PCI_DEVICE_ID_NX2_57712 0x1662 -+#define PCI_DEVICE_ID_NX2_57712_MF 0x1663 -+#define PCI_DEVICE_ID_NX2_57712_VF 0x166f -+#define PCI_DEVICE_ID_NX2_57713 0x1651 -+#define PCI_DEVICE_ID_NX2_57713E 0x1652 -+#define PCI_DEVICE_ID_NX2_57800 0x168a -+#define PCI_DEVICE_ID_NX2_57800_MF 0x16a5 -+#define PCI_DEVICE_ID_NX2_57800_VF 0x16a9 -+#define PCI_DEVICE_ID_NX2_57810 0x168e -+#define PCI_DEVICE_ID_NX2_57810_MF 0x16ae -+#define PCI_DEVICE_ID_NX2_57810_VF 0x16af -+#define PCI_DEVICE_ID_NX2_57811 0x163d -+#define PCI_DEVICE_ID_NX2_57811_MF 0x163e -+#define PCI_DEVICE_ID_NX2_57811_VF 0x163f -+#define PCI_DEVICE_ID_NX2_57840_OBSOLETE 0x168d -+#define PCI_DEVICE_ID_NX2_57840_MF_OBSOLETE 0x16ab -+#define PCI_DEVICE_ID_NX2_57840_4_10 0x16a1 -+#define PCI_DEVICE_ID_NX2_57840_2_20 0x16a2 -+#define PCI_DEVICE_ID_NX2_57840_MF 0x16a4 -+#define PCI_DEVICE_ID_NX2_57840_VF 0x16ad -+#define PCI_ANY_ID (~0) -+ -+/* This is the table used to match PCI vendor and device ID's to the -+ * human readable string names of the devices */ -+static const struct pci_device_id bnx2x_pci_tbl[] = { -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57710, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57710}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57711, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57711}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57711E, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57711e}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57712}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712_MF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57712_MF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712_VF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57712_VF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57713, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57713}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57713E, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57713e}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57800}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800_MF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57800_MF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800_VF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57800_VF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57810}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810_MF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57810_MF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810_VF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57810_VF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57811}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811_MF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57811_MF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811_VF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57811_VF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_OBSOLETE, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57840}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_MF_OBSOLETE, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_4_10, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_4_10}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_2_20, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_2_20}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_MF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF}, -+ {PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_VF, -+ PCI_ANY_ID, PCI_ANY_ID, brcm_57840_VF}, -+}; -+ -+static struct iro e1_iro[2] = { -+ {0x45a0, 0x90, 0x8, 0x0, 0x8}, /* T6.0 */ -+ {0x50c8, 0x90, 0x8, 0x0, 0x8}, /* T6.4 */ -+}; -+ -+static struct iro e1h_iro[2] = { -+ {0x1c40, 0xe0, 0x8, 0x0, 0x8}, /* T6.0 */ -+ {0x1e00, 0xe0, 0x8, 0x0, 0x8}, /* T6.4 */ -+}; -+ -+static struct iro e2_iro[2] = { -+ {0x6000, 0x20, 0x0, 0x0, 0x8}, /* T6.0 */ -+ {0x6000, 0x20, 0x0, 0x0, 0x8}, /* T6.4 */ -+}; -+ -+struct bnx2x_driver_version bnx2x_version = { -+ BNX2X_UNKNOWN_MAJOR_VERSION, -+ BNX2X_UNKNOWN_MINOR_VERSION, -+ BNX2X_UNKNOWN_SUB_MINOR_VERSION, -+}; -+ -+static int bnx2x_clear_tx_intr(nic_t *nic); -+ -+/******************************************************************************* -+ * BNX2X Library Functions -+ ******************************************************************************/ -+/** -+ * bnx2x_get_library_name() - Used to get the name of this NIC libary -+ * @param name - This function will return the pointer to this NIC -+ * library name -+ * @param name_size -+ */ -+static void bnx2x_get_library_name(char **name, size_t *name_size) -+{ -+ *name = (char *)library_name; -+ *name_size = sizeof(library_name); -+} -+ -+/** -+ * bnx2x_get_library_version() - Used to get the version string of this -+ * NIC libary -+ * @param version - This function will return the pointer to this NIC -+ * library version string -+ * @param version_size - This will be set with the version size -+ */ -+static void bnx2x_get_library_version(char **version, size_t *version_size) -+{ -+ *version = (char *)library_version; -+ *version_size = sizeof(library_version); -+} -+ -+/** -+ * bnx2x_get_build_date() - Used to get the build date string of this library -+ * @param version - This function will return the pointer to this NIC -+ * library build date string -+ * @param version_size - This will be set with the build date string size -+ */ -+static void bnx2x_get_build_date(char **build, size_t *build_size) -+{ -+ *build = (char *)build_date; -+ *build_size = sizeof(build_date); -+} -+ -+/** -+ * bnx2x_get_transport_name() - Used to get the transport name associated -+ * with this this NIC libary -+ * @param transport_name - This function will return the pointer to this NIC -+ * library's associated transport string -+ * @param transport_name_size - This will be set with the transport name size -+ */ -+static void bnx2x_get_transport_name(char **transport_name, -+ size_t *transport_name_size) -+{ -+ *transport_name = (char *)bnx2i_library_transport_name; -+ *transport_name_size = bnx2i_library_transport_name_size; -+} -+ -+/** -+ * bnx2x_get_uio_name() - Used to get the uio name associated with this this -+ * NIC libary -+ * @param uio_name - This function will return the pointer to this NIC -+ * library's associated uio string -+ * @param transport_name_size - This will be set with the uio name size -+ */ -+static void bnx2x_get_uio_name(char **uio_name, size_t *uio_name_size) -+{ -+ *uio_name = (char *)library_uio_name; -+ *uio_name_size = sizeof(library_uio_name); -+} -+ -+/** -+ * bnx2x_get_pci_table() - Used to get the PCI table for this NIC libary to -+ * determine which NIC's based off of PCI ID's are -+ * supported -+ * @param table - This function will return the pointer to the PCI table -+ * @param entries - This function will return the number of entries in the NIC -+ * library's PCI table -+ */ -+static void bnx2x_get_pci_table(struct pci_device_id **table, -+ uint32_t *entries) -+{ -+ *table = (struct pci_device_id *)bnx2x_pci_tbl; -+ *entries = -+ (uint32_t) (sizeof(bnx2x_pci_tbl) / sizeof(bnx2x_pci_tbl[0])); -+} -+ -+/** -+ * bnx2x_get_ops() - Used to get the NIC library op table -+ * @param op - The op table of this NIC library -+ */ -+struct nic_ops *bnx2x_get_ops() -+{ -+ return &bnx2x_op; -+} -+ -+/******************************************************************************* -+ * bnx2x Utility Functions -+ ******************************************************************************/ -+/******************************************************************************* -+ * Utility Functions Used to read register from the bnx2x device -+ ******************************************************************************/ -+static void bnx2x_set_drv_version_unknown(bnx2x_t *bp) -+{ -+ bp->version.major = BNX2X_UNKNOWN_MAJOR_VERSION; -+ bp->version.minor = BNX2X_UNKNOWN_MINOR_VERSION; -+ bp->version.sub_minor = BNX2X_UNKNOWN_SUB_MINOR_VERSION; -+} -+ -+/* Return: 1 = Unknown, 0 = Known */ -+static int bnx2x_is_drv_version_unknown(struct bnx2x_driver_version *version) -+{ -+ if ((version->major == (uint16_t)BNX2X_UNKNOWN_MAJOR_VERSION) && -+ (version->minor == (uint16_t)BNX2X_UNKNOWN_MINOR_VERSION) && -+ (version->sub_minor == (uint16_t)BNX2X_UNKNOWN_SUB_MINOR_VERSION)) { -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/** -+ * bnx2x_get_drv_version() - Used to determine the driver version -+ * @param bp - Device used to determine bnx2x driver version -+ */ -+static int bnx2x_get_drv_version(bnx2x_t *bp) -+{ -+ nic_t *nic = bp->parent; -+ int fd, rc; -+ struct ifreq ifr; -+ struct ethtool_drvinfo drvinfo; -+ char *tok, *save_ptr = NULL; -+ -+ /* Setup our control structures. */ -+ memset(&ifr, 0, sizeof(ifr)); -+ strcpy(ifr.ifr_name, nic->eth_device_name); -+ -+ /* Open control socket. */ -+ fd = socket(AF_INET, SOCK_DGRAM, 0); -+ if (fd < 0) { -+ LOG_ERR(PFX "%s: Cannot get socket to determine version " -+ "[0x%x %s]", nic->log_name, errno, strerror(errno)); -+ return -EIO; -+ } -+ -+ drvinfo.cmd = ETHTOOL_GDRVINFO; -+ ifr.ifr_data = (caddr_t) &drvinfo; -+ rc = ioctl(fd, SIOCETHTOOL, &ifr); -+ if (rc < 0) { -+ LOG_ERR(PFX "%s: call to ethool IOCTL failed [0x%x %s]", -+ nic->log_name, errno, strerror(errno)); -+ goto error; -+ } -+ -+ tok = strtok_r(drvinfo.version, ".", &save_ptr); -+ if (tok == NULL) { -+ rc = -EIO; -+ goto error; -+ } -+ bp->version.major = atoi(tok); -+ -+ tok = strtok_r(NULL, ".", &save_ptr); -+ if (tok == NULL) { -+ rc = -EIO; -+ goto error; -+ } -+ bp->version.minor = atoi(tok); -+ -+ tok = strtok_r(NULL, ".", &save_ptr); -+ if (tok == NULL) { -+ rc = -EIO; -+ goto error; -+ } -+ bp->version.sub_minor = atoi(tok); -+ -+ LOG_INFO(PFX "%s: bnx2x driver using version %d.%d.%d", -+ nic->log_name, -+ bp->version.major, bp->version.minor, bp->version.sub_minor); -+ -+ close(fd); -+ -+ return 0; -+ -+error: -+ close(fd); -+ bnx2x_set_drv_version_unknown(bp); -+ -+ LOG_ERR(PFX "%s: error parsing driver string: '%s'", -+ nic->log_name, drvinfo.version); -+ -+ return rc; -+ -+} -+ -+static inline int bnx2x_is_ver70(bnx2x_t *bp) -+{ -+ return (bp->version.major == 1 && bp->version.minor >= 70); -+} -+ -+static inline int bnx2x_is_ver60(bnx2x_t *bp) -+{ -+ return (bp->version.major == 1 && (bp->version.minor == 60 || -+ bp->version.minor == 62 || -+ bp->version.minor == 64)); -+} -+ -+static inline int bnx2x_is_ver60_plus(bnx2x_t *bp) -+{ -+ return bnx2x_is_ver60(bp) || bnx2x_is_ver70(bp); -+} -+ -+static inline int bnx2x_is_ver52(bnx2x_t *bp) -+{ -+ return (bp->version.major == 1 && bp->version.minor == 52); -+} -+ -+static void bnx2x_wr32(bnx2x_t *bp, __u32 off, __u32 val) -+{ -+ *((volatile __u32 *)(bp->reg + off)) = val; -+} -+ -+static void bnx2x_doorbell(bnx2x_t *bp, __u32 off, __u32 val) -+{ -+ *((volatile __u32 *)(bp->reg2 + off)) = val; -+} -+ -+static void bnx2x_flush_doorbell(bnx2x_t *bp, __u32 off) -+{ -+ volatile __u32 tmp; -+ -+ barrier(); -+ tmp = *((volatile __u32 *)(bp->reg2 + off)); -+} -+ -+static __u32 bnx2x_rd32(bnx2x_t *bp, __u32 off) -+{ -+ return *((volatile __u32 *)(bp->reg + off)); -+} -+ -+static int bnx2x_reg_sync(bnx2x_t *bp, __u32 off, __u16 length) -+{ -+ return msync(bp->reg + off, length, MS_SYNC); -+} -+ -+static void bnx2x_update_rx_prod(bnx2x_t *bp) -+{ -+ struct ustorm_eth_rx_producers rx_prods = { 0 }; -+ int i; -+ -+ rx_prods.bd_prod = bp->rx_bd_prod; -+ rx_prods.cqe_prod = bp->rx_prod; -+ -+ barrier(); -+ -+ for (i = 0; i < sizeof(struct ustorm_eth_rx_producers) / 4; i++) -+ bnx2x_wr32(bp, bp->rx_prod_io + i * 4, -+ ((__u32 *)&rx_prods)[i]); -+ -+ barrier(); -+ -+ bnx2x_reg_sync(bp, bp->rx_prod_io, -+ sizeof(struct ustorm_eth_rx_producers)); -+} -+ -+/** -+ * bnx2x_get_chip_id() - Used to retrive the chip ID from the nic -+ * @param dev - Device used to determin NIC type -+ * @return Chip ID read from the MISC ID register -+ */ -+static int bnx2x_get_chip_id(bnx2x_t *bp) -+{ -+ int val, id; -+ -+ /* Get the chip revision id and number. */ -+ /* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ -+ val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_NUM); -+ id = ((val & 0xffff) << 16); -+ val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_REV); -+ id |= ((val & 0xf) << 12); -+ val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_METAL); -+ id |= ((val & 0xff) << 4); -+ val = bnx2x_rd32(bp, BNX2X_MISC_REG_BOND_ID); -+ id |= (val & 0xf); -+ -+ return id; -+} -+ -+/** -+ * bnx2x_uio_verify() -+ * -+ */ -+static int bnx2x_uio_verify(nic_t *nic) -+{ -+ char *raw = NULL, *raw_tmp; -+ uint32_t raw_size = 0; -+ char temp_path[sizeof(cnic_uio_sysfs_name_tempate) + 8]; -+ int rc = 0; -+ -+ /* Build the path to determine uio name */ -+ snprintf(temp_path, sizeof(temp_path), -+ cnic_uio_sysfs_name_tempate, nic->uio_minor); -+ -+ rc = capture_file(&raw, &raw_size, temp_path); -+ if (rc != 0) -+ goto error; -+ -+ /* sanitize name string by replacing newline with null termination */ -+ raw_tmp = raw; -+ while (*raw_tmp != '\n') -+ raw_tmp++; -+ *raw_tmp = '\0'; -+ -+ if (strncmp(raw, bnx2x_uio_sysfs_name, -+ sizeof(bnx2x_uio_sysfs_name)) != 0) { -+ LOG_ERR(PFX "%s: uio names not equal: " -+ "expecting %s got %s from %s", -+ nic->log_name, bnx2x_uio_sysfs_name, raw, temp_path); -+ rc = -EIO; -+ } -+ -+ free(raw); -+ -+ LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); -+ -+error: -+ return rc; -+} -+ -+/******************************************************************************* -+ * bnx2x Utility Functions to get to the hardware consumer indexes -+ ******************************************************************************/ -+static __u16 bnx2x_get_rx(bnx2x_t *bp) -+{ -+ struct host_def_status_block *sblk = bp->status_blk.def; -+ __u16 rx_comp_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ rx_comp_cons = -+ sblk->u_def_status_block. -+ index_values[HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS]; -+ if ((rx_comp_cons & BNX2X_MAX_RCQ_DESC_CNT(bp)) == -+ BNX2X_MAX_RCQ_DESC_CNT(bp)) -+ rx_comp_cons++; -+ -+ return rx_comp_cons; -+} -+ -+static __u16 bnx2x_get_rx_60(bnx2x_t *bp) -+{ -+ struct host_sp_status_block *sblk = bp->status_blk.sp; -+ __u16 rx_comp_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ rx_comp_cons = -+ sblk->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS]; -+ if ((rx_comp_cons & BNX2X_MAX_RCQ_DESC_CNT(bp)) == -+ BNX2X_MAX_RCQ_DESC_CNT(bp)) -+ rx_comp_cons++; -+ -+ return rx_comp_cons; -+} -+ -+static __u16 bnx2x_get_tx(bnx2x_t *bp) -+{ -+ struct host_def_status_block *sblk = bp->status_blk.def; -+ __u16 tx_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ tx_cons = -+ sblk->c_def_status_block. -+ index_values[HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS]; -+ -+ return tx_cons; -+} -+ -+static __u16 bnx2x_get_tx_60(bnx2x_t *bp) -+{ -+ struct host_sp_status_block *sblk = bp->status_blk.sp; -+ __u16 tx_cons; -+ -+ msync(sblk, sizeof(*sblk), MS_SYNC); -+ tx_cons = sblk->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS]; -+ -+ return tx_cons; -+} -+ -+typedef enum { -+ CNIC_VLAN_STRIPPING_ENABLED = 1, -+ CNIC_VLAN_STRIPPING_DISABLED = 2, -+} CNIC_VLAN_STRIPPING_MODE; -+ -+/** -+ * bnx2x_strip_vlan_enabled() - This will query the device to determine whether -+ * VLAN tag stripping is enabled or not -+ * @param dev - device to check stripping or not -+ * @ return CNIC_VLAN_STRIPPING_ENABLED stripping is enabled -+ * CNIC_VLAN_STRIPPING_DISABLED stripping is not enabled -+ */ -+static CNIC_VLAN_STRIPPING_MODE bnx2x_strip_vlan_enabled(bnx2x_t *bp) -+{ -+ return CNIC_VLAN_STRIPPING_DISABLED; -+} -+ -+/** -+ * bnx2x_free() - Used to free a bnx2x structure -+ */ -+static void bnx2x_free(nic_t *nic) -+{ -+ if (nic->priv) -+ free(nic->priv); -+ nic->priv = NULL; -+} -+ -+/** -+ * bnx2x_alloc() - Used to allocate a bnx2x structure -+ */ -+static bnx2x_t *bnx2x_alloc(nic_t *nic) -+{ -+ bnx2x_t *bp = malloc(sizeof(*bp)); -+ -+ if (bp == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate BNX2X space", -+ nic->log_name); -+ return NULL; -+ } -+ -+ /* Clear out the CNIC contents */ -+ memset(bp, 0, sizeof(*bp)); -+ -+ bp->bar0_fd = INVALID_FD; -+ bp->bar2_fd = INVALID_FD; -+ -+ bp->parent = nic; -+ nic->priv = (void *)bp; -+ -+ bnx2x_set_drv_version_unknown(bp); -+ -+ return bp; -+} -+ -+/** -+ * bnx2x_open() - This will initialize all the hardware resources underneath -+ * a struct cnic_uio device -+ * @param dev - The struct cnic_uio device to attach the hardware with -+ * @return 0 on success, on failure a errno will be returned -+ */ -+static int bnx2x_open(nic_t *nic) -+{ -+ bnx2x_t *bp; -+ struct stat uio_stat; -+ int i, rc; -+ __u32 val; -+ int count; -+ char sysfs_resc_path[80]; -+ uint32_t bus; -+ uint32_t slot; -+ uint32_t func; -+ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL) { -+ LOG_ERR(PFX "nic == NULL"); -+ return -EINVAL; -+ } -+ -+ if ((nic->priv) != NULL && -+ (((bnx2x_t *) (nic->priv))->flags & BNX2X_OPENED)) { -+ return 0; -+ } -+ -+ bp = bnx2x_alloc(nic); -+ if (bp == NULL) -+ return -ENOMEM; -+ -+ if (bnx2x_is_drv_version_unknown(&bnx2x_version)) { -+ /* If version is unknown, go read from ethtool */ -+ rc = bnx2x_get_drv_version(bp); -+ if (rc) -+ goto open_error; -+ } else { -+ /* Version is not unknown, just use it */ -+ bnx2x_version.major = bp->version.major; -+ bnx2x_version.minor = bp->version.minor; -+ bnx2x_version.sub_minor = bp->version.sub_minor; -+ } -+ -+ count = 0; -+ while ((nic->fd < 0) && count < 15) { -+ /* udev might not have created the file yet */ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ sleep(1); -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ nic->fd = open(nic->uio_device_name, O_RDWR | O_NONBLOCK); -+ if (nic->fd != INVALID_FD) { -+ LOG_ERR(PFX "%s: uio device has been brought up " -+ "via pid: %d on fd: %d", -+ nic->uio_device_name, getpid(), nic->fd); -+ -+ rc = bnx2x_uio_verify(nic); -+ if (rc != 0) -+ continue; -+ -+ break; -+ } else { -+ LOG_WARN(PFX "%s: Could not open device: %s, [%s]", -+ nic->log_name, nic->uio_device_name, -+ strerror(errno)); -+ -+ manually_trigger_uio_event(nic, nic->uio_minor); -+ -+ /* udev might not have created the file yet */ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ sleep(1); -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ count++; -+ } -+ } -+ if (fstat(nic->fd, &uio_stat) < 0) { -+ LOG_ERR(PFX "%s: Could not fstat device", nic->log_name); -+ rc = -ENODEV; -+ goto open_error; -+ } -+ nic->uio_minor = minor(uio_stat.st_rdev); -+ -+ cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80); -+ bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC); -+ if (bp->bar0_fd < 0) { -+ LOG_ERR(PFX "%s: Could not open %s", nic->log_name, -+ sysfs_resc_path); -+ rc = -ENODEV; -+ goto open_error; -+ } -+ -+ bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE, -+ MAP_SHARED, bp->bar0_fd, (off_t) 0); -+ -+ if (bp->reg == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Couldn't mmap BAR registers: %s", -+ nic->log_name, strerror(errno)); -+ bp->reg = NULL; -+ rc = errno; -+ goto open_error; -+ } -+ -+ msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC); -+ -+ cnic_get_sysfs_pci_resource_path(nic, 2, sysfs_resc_path, 80); -+ bp->bar2_fd = open(sysfs_resc_path, O_RDWR | O_SYNC); -+ if (bp->bar2_fd < 0) { -+ LOG_ERR(PFX "%s: Could not open %s", nic->log_name, -+ sysfs_resc_path); -+ rc = -ENODEV; -+ goto open_error; -+ } -+ -+ bp->reg2 = mmap(NULL, BNX2X_BAR2_SIZE, PROT_READ | PROT_WRITE, -+ MAP_SHARED, bp->bar2_fd, (off_t) 0); -+ -+ if (bp->reg2 == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Couldn't mmap BAR2 registers: %s", -+ nic->log_name, strerror(errno)); -+ bp->reg2 = NULL; -+ rc = errno; -+ goto open_error; -+ } -+ -+ /* TODO: hardcoded with the cnic driver */ -+ bp->rx_ring_size = 15; -+ bp->rx_buffer_size = 0x400; -+ -+ LOG_DEBUG(PFX "%s: using rx ring size: %d, rx buffer size: %d", -+ nic->log_name, bp->rx_ring_size, bp->rx_buffer_size); -+ -+ /* Determine the number of UIO events that have already occured */ -+ rc = detemine_initial_uio_events(nic, &nic->intr_count); -+ if (rc != 0) { -+ LOG_ERR("Could not determine the number ofinitial UIO events"); -+ nic->intr_count = 0; -+ } -+ -+ /* Allocate space for rx pkt ring */ -+ bp->rx_pkt_ring = malloc(sizeof(void *) * bp->rx_ring_size); -+ if (bp->rx_pkt_ring == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate space for rx_pkt_ring", -+ nic->log_name); -+ rc = errno; -+ goto open_error; -+ } -+ -+ if (bnx2x_is_ver60_plus(bp)) -+ bp->status_blk_size = sizeof(struct host_sp_status_block); -+ else if (bnx2x_is_ver52(bp)) -+ bp->status_blk_size = sizeof(struct host_def_status_block); -+ else { -+ LOG_INFO(PFX "%s: Unsupported bnx2x driver [%d.%d]", -+ nic->log_name, bp->version.major, bp->version.minor); -+ -+ rc = -ENOTSUP; -+ goto open_error; -+ } -+ -+ bp->status_blk.def = mmap(NULL, bp->status_blk_size, -+ PROT_READ | PROT_WRITE, MAP_SHARED, -+ nic->fd, (off_t) getpagesize()); -+ if (bp->status_blk.def == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Could not mmap status block: %s", -+ nic->log_name, strerror(errno)); -+ bp->status_blk.def = NULL; -+ rc = errno; -+ goto open_error; -+ } -+ -+ bp->tx_ring = mmap(NULL, 4 * getpagesize(), -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED | MAP_LOCKED, -+ nic->fd, (off_t) 2 * getpagesize()); -+ if (bp->tx_ring == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Could not mmap tx ring: %s", -+ nic->log_name, strerror(errno)); -+ bp->tx_ring = NULL; -+ rc = errno; -+ goto open_error; -+ } -+ -+ bp->rx_comp_ring.cqe = (union eth_rx_cqe *) -+ (((__u8 *) bp->tx_ring) + 2 * getpagesize()); -+ -+ bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size, -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED | MAP_LOCKED, -+ nic->fd, (off_t) 3 * getpagesize()); -+ if (bp->bufs == MAP_FAILED) { -+ LOG_INFO(PFX "%s: Could not mmap buffers: %s", -+ nic->log_name, strerror(errno)); -+ bp->bufs = NULL; -+ rc = errno; -+ goto open_error; -+ } -+ -+ bp->chip_id = bnx2x_get_chip_id(bp); -+ LOG_DEBUG(PFX "Chip ID: %x", bp->chip_id); -+ -+ rc = get_bus_slot_func_num(nic, &bus, &slot, &func); -+ if (rc != 0) { -+ LOG_INFO(PFX "%s: Couldn't determine bus:slot.func", -+ nic->log_name); -+ goto open_error; -+ } -+ /* In E1/E1H use pci device function as read from sysfs. -+ * In E2/E3 read physical function from ME register since these chips -+ * support Physical Device Assignment where kernel BDF maybe arbitrary -+ * (depending on hypervisor). -+ */ -+ if (CHIP_IS_E2_PLUS(bp)) { -+ func = (bnx2x_rd32(bp, BAR_ME_REGISTER) & ME_REG_ABS_PF_NUM) >> -+ ME_REG_ABS_PF_NUM_SHIFT; -+ } -+ bp->func = func; -+ bp->port = bp->func % PORT_MAX; -+ -+ if (CHIP_IS_E2_PLUS(bp)) { -+ __u32 val = bnx2x_rd32(bp, MISC_REG_PORT4MODE_EN_OVWR); -+ if (!(val & 1)) -+ val = bnx2x_rd32(bp, MISC_REG_PORT4MODE_EN); -+ else -+ val = (val >> 1) & 1; -+ -+ if (val) -+ bp->pfid = func >> 1; -+ else -+ bp->pfid = func & 0x6; -+ } else { -+ bp->pfid = func; -+ } -+ -+ if (bnx2x_is_ver60_plus(bp)) -+ bp->port = bp->pfid & 1; -+ -+ bp->cid = 17; -+ bp->client_id = 17; -+ -+ if (bnx2x_is_ver60_plus(bp)) { -+ struct client_init_general_data *data = bp->bufs; -+ -+ bp->client_id = data->client_id; -+ if (data->reserved0) -+ bp->cid = data->reserved0; -+ } -+ -+ LOG_INFO(PFX "%s: func 0x%x, pfid 0x%x, client_id 0x%x, cid 0x%x", -+ nic->log_name, bp->func, bp->pfid, bp->client_id, bp->cid); -+ -+ if (CHIP_IS_E1(bp)) -+ bp->iro = e1_iro; -+ else if (CHIP_IS_E1H(bp)) -+ bp->iro = e1h_iro; -+ else if (CHIP_IS_E2_PLUS(bp)) -+ bp->iro = e2_iro; -+ -+ if (bnx2x_is_ver60_plus(bp)) { -+ __u32 cl_qzone_id = BNX2X_CL_QZONE_ID(bp, bp->client_id); -+ -+ bp->iro_idx = 0; -+ if (bp->version.minor >= 64) { -+ bp->iro_idx = 1; -+ cl_qzone_id = BNX2X_CL_QZONE_ID_64(bp, bp->client_id); -+ } -+ -+ bp->rx_prod_io = BAR_USTRORM_INTMEM + -+ (CHIP_IS_E2_PLUS(bp) ? -+ USTORM_RX_PRODS_E2_OFFSET(cl_qzone_id) : -+ USTORM_RX_PRODS_E1X_OFFSET(bp->port, bp->client_id)); -+ -+ bp->tx_doorbell = bp->cid * 0x80 + 0x40; -+ -+ bp->get_rx_cons = bnx2x_get_rx_60; -+ bp->get_tx_cons = bnx2x_get_tx_60; -+ bp->tx_vlan_tag_bit = ETH_TX_BD_FLAGS_VLAN_TAG_T6X; -+ } else { -+ bp->rx_prod_io = BAR_USTRORM_INTMEM + -+ USTORM_RX_PRODS_OFFSET(bp->port, bp->client_id); -+ -+ bp->tx_doorbell = bp->cid * getpagesize() + 0x40; -+ -+ bp->get_rx_cons = bnx2x_get_rx; -+ bp->get_tx_cons = bnx2x_get_tx; -+ bp->tx_vlan_tag_bit = ETH_TX_BD_FLAGS_VLAN_TAG_T5X; -+ } -+ -+ bp->tx_cons = 0; -+ bp->tx_prod = 0; -+ bp->tx_bd_prod = 0; -+ bp->tx_pkt = bp->bufs; -+ -+ bp->rx_index = 0; -+ bp->rx_cons = 0; -+ bp->rx_bd_cons = 0; -+ bp->rx_prod = 127; -+ bp->rx_bd_prod = bp->rx_ring_size; -+ -+ for (i = 0; i < bp->rx_ring_size; i++) { -+ void *ptr = bp->bufs + (bp->rx_buffer_size * (i + 1)); -+ -+ bp->rx_pkt_ring[i] = ptr; -+ } -+ -+ val = bnx2x_rd32(bp, MISC_REG_SHARED_MEM_ADDR); -+ -+ bp->shmem_base = val; -+ val = bnx2x_rd32(bp, bp->shmem_base + SHMEM_ISCSI_MAC_UPPER(bp)); -+ nic->mac_addr[0] = (__u8) (val >> 8); -+ nic->mac_addr[1] = (__u8) val; -+ val = bnx2x_rd32(bp, bp->shmem_base + SHMEM_ISCSI_MAC_LOWER(bp)); -+ nic->mac_addr[2] = (__u8) (val >> 24); -+ nic->mac_addr[3] = (__u8) (val >> 16); -+ nic->mac_addr[4] = (__u8) (val >> 8); -+ nic->mac_addr[5] = (__u8) val; -+ -+ if (bnx2x_is_ver60_plus(bp) && CHIP_IS_E2_PLUS(bp)) { -+ __u32 mf_cfg_addr = 0; -+ __u32 mac_offset; -+ __u8 mac[6]; -+ -+ val = bnx2x_rd32(bp, (BNX2X_PATH(bp) ? MISC_REG_GENERIC_CR_1 : -+ MISC_REG_GENERIC_CR_0)); -+ bp->shmem_base2 = val; -+ if (bp->shmem_base2) { -+ /* size */ -+ val = bnx2x_rd32(bp, bp->shmem_base2); -+ -+ if (val > 0x10) -+ mf_cfg_addr = -+ bnx2x_rd32(bp, bp->shmem_base2 + 0x10); -+ } -+ -+ if (!mf_cfg_addr) -+ mf_cfg_addr = bp->shmem_base + 0x7e4; -+ -+ /* shared_feat_cfg.config */ -+ val = bnx2x_rd32(bp, bp->shmem_base + 0x354); -+ /* SI mode */ -+ if ((val & 0x700) == 0x300) { -+ mac_offset = 0xe4 + (bp->func * 0x28) + 4; -+ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); -+ mac[0] = (__u8) (val >> 8); -+ mac[1] = (__u8) val; -+ mac_offset += 4; -+ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); -+ mac[2] = (__u8) (val >> 24); -+ mac[3] = (__u8) (val >> 16); -+ mac[4] = (__u8) (val >> 8); -+ mac[5] = (__u8) val; -+ -+ if (mac[0] != 0xff) { -+ memcpy(nic->mac_addr, mac, 6); -+ } else if (bp->func > 1) { -+ LOG_INFO(PFX "%s: Invalid mac address: " -+ "%02x:%02x:%02x:%02x:%02x:%02x, abort", -+ nic->log_name, -+ mac[0], mac[1], mac[2], -+ mac[3], mac[4], mac[5]); -+ rc = -ENOTSUP; -+ goto open_error; -+ } -+ } else if ((val & 0x700) == 0) { -+ __u32 proto_offset = 0x24 + (bp->func * 0x18); -+ __u32 ovtag_offset = proto_offset + 0xc; -+ -+ rc = -ENOTSUP; -+ val = bnx2x_rd32(bp, mf_cfg_addr + ovtag_offset); -+ val &= 0xffff; -+ /* SD mode, check for valid outer VLAN */ -+ if (val == 0xffff) { -+ LOG_ERR(PFX "%s: Invalid OV detected for SD, " -+ " fallback to SF mode!\n", -+ nic->log_name); -+ goto SF; -+ } -+ /* Check for iSCSI protocol */ -+ val = bnx2x_rd32(bp, mf_cfg_addr + proto_offset); -+ if ((val & 6) != 6) -+ goto open_error; -+ -+ mac_offset = proto_offset + 0x4; -+ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); -+ mac[0] = (__u8) (val >> 8); -+ mac[1] = (__u8) val; -+ mac_offset += 4; -+ val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset); -+ mac[2] = (__u8) (val >> 24); -+ mac[3] = (__u8) (val >> 16); -+ mac[4] = (__u8) (val >> 8); -+ mac[5] = (__u8) val; -+ memcpy(nic->mac_addr, mac, 6); -+ -+ } -+ } -+SF: -+ LOG_INFO(PFX "%s: Using mac address: %02x:%02x:%02x:%02x:%02x:%02x", -+ nic->log_name, -+ nic->mac_addr[0], nic->mac_addr[1], nic->mac_addr[2], -+ nic->mac_addr[3], nic->mac_addr[4], nic->mac_addr[5]); -+ -+ /* Determine if Hardware VLAN tag stripping is enabled or not */ -+ if (CNIC_VLAN_STRIPPING_ENABLED == bnx2x_strip_vlan_enabled(bp)) -+ nic->flags |= NIC_VLAN_STRIP_ENABLED; -+ -+ msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC); -+ -+ LOG_INFO("%s: bnx2x initialized", nic->log_name); -+ -+ bnx2x_update_rx_prod(bp); -+ bp->flags |= BNX2X_OPENED; -+ -+ return 0; -+ -+open_error: -+ if (bp->tx_ring) { -+ munmap(bp->tx_ring, 4 * getpagesize()); -+ bp->tx_ring = NULL; -+ } -+ -+ if (bp->status_blk.def) { -+ munmap(bp->status_blk.def, bp->status_blk_size); -+ bp->status_blk.def = NULL; -+ } -+ -+ if (bp->reg) { -+ munmap(bp->reg, BNX2X_BAR_SIZE); -+ bp->reg = NULL; -+ } -+ -+ if (bp->reg2) { -+ munmap(bp->reg2, BNX2X_BAR2_SIZE); -+ bp->reg2 = NULL; -+ } -+ -+ if (bp->rx_pkt_ring) { -+ free(bp->rx_pkt_ring); -+ bp->rx_pkt_ring = NULL; -+ } -+ -+ if (bp->bar2_fd != INVALID_FD) { -+ close(bp->bar2_fd); -+ bp->bar2_fd = INVALID_FD; -+ } -+ -+ if (bp->bar0_fd != INVALID_FD) { -+ close(bp->bar0_fd); -+ bp->bar0_fd = INVALID_FD; -+ } -+ if (nic->fd != INVALID_FD) { -+ close(nic->fd); -+ nic->fd = INVALID_FD; -+ } -+ bnx2x_free(nic); -+ -+ return rc; -+} -+ -+/** -+ * bnx2x_uio_close_resources() - Used to free resource for the NIC/CNIC -+ * @param nic - NIC device to free resource -+ * @param graceful - whether to wait to close gracefully -+ * @return 0 on success, <0 on failure -+ */ -+static int bnx2x_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful) -+{ -+ bnx2x_t *bp = (bnx2x_t *) nic->priv; -+ int rc = 0; -+ -+ /* Check if there is an assoicated bnx2x device */ -+ if (bp == NULL) { -+ LOG_WARN(PFX "%s: when closing resources there is " -+ "no assoicated bnx2x", nic->log_name); -+ return -EIO; -+ } -+ -+ /* Clean up allocated memory */ -+ -+ if (bp->rx_pkt_ring != NULL) { -+ free(bp->rx_pkt_ring); -+ bp->rx_pkt_ring = NULL; -+ } -+ -+ /* Clean up mapped registers */ -+ if (bp->bufs != NULL) { -+ rc = munmap(bp->bufs, -+ (bp->rx_ring_size + 1) * bp->rx_buffer_size); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap bufs", nic->log_name); -+ bp->bufs = NULL; -+ } -+ -+ if (bp->tx_ring != NULL) { -+ rc = munmap(bp->tx_ring, 4 * getpagesize()); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap tx_rings", -+ nic->log_name); -+ bp->tx_ring = NULL; -+ } -+ -+ if (bp->status_blk.def != NULL) { -+ rc = munmap(bp->status_blk.def, bp->status_blk_size); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap status block", -+ nic->log_name); -+ bp->status_blk.def = NULL; -+ } -+ -+ if (bp->reg != NULL) { -+ rc = munmap(bp->reg, BNX2X_BAR_SIZE); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name); -+ bp->reg = NULL; -+ } -+ -+ if (bp->reg2 != NULL) { -+ rc = munmap(bp->reg2, BNX2X_BAR2_SIZE); -+ if (rc != 0) -+ LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name); -+ bp->reg2 = NULL; -+ } -+ -+ if (bp->bar2_fd != INVALID_FD) { -+ close(bp->bar2_fd); -+ bp->bar2_fd = INVALID_FD; -+ } -+ -+ if (bp->bar0_fd != INVALID_FD) { -+ close(bp->bar0_fd); -+ bp->bar0_fd = INVALID_FD; -+ } -+ -+ if (nic->fd != INVALID_FD) { -+ rc = close(nic->fd); -+ if (rc != 0) { -+ LOG_WARN(PFX -+ "%s: Couldn't close uio file descriptor: %d", -+ nic->log_name, nic->fd); -+ } else { -+ LOG_DEBUG(PFX "%s: Closed uio file descriptor: %d", -+ nic->log_name, nic->fd); -+ } -+ -+ nic->fd = INVALID_FD; -+ } else { -+ LOG_WARN(PFX "%s: Invalid uio file descriptor: %d", -+ nic->log_name, nic->fd); -+ } -+ -+ bnx2x_set_drv_version_unknown(bp); -+ -+ LOG_INFO(PFX "%s: Closed all resources", nic->log_name); -+ -+ return 0; -+} -+ -+/** -+ * bnx2x_close() - Used to close the NIC device -+ * @param nic - NIC device to close -+ * @param graceful - whether to wait to close gracefully -+ * @return 0 if successful, <0 if there is an error -+ */ -+static int bnx2x_close(nic_t *nic, NIC_SHUTDOWN_T graceful) -+{ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL) { -+ LOG_ERR(PFX "bnx2x_close(): nic == NULL"); -+ return -EINVAL; -+ } -+ if (nic->priv == NULL) { -+ LOG_ERR(PFX "bnx2x_close(): nic->priv == NULL"); -+ return -EINVAL; -+ } -+ -+ LOG_INFO(PFX "Closing NIC device: %s", nic->log_name); -+ -+ bnx2x_uio_close_resources(nic, graceful); -+ bnx2x_free(nic); -+ -+ return 0; -+} -+ -+static void bnx2x_prepare_xmit_packet(nic_t *nic, -+ nic_interface_t *nic_iface, -+ struct packet *pkt) -+{ -+ bnx2x_t *bp = (bnx2x_t *) nic->priv; -+ struct uip_vlan_eth_hdr *eth_vlan = (struct uip_vlan_eth_hdr *)pkt->buf; -+ struct uip_eth_hdr *eth = (struct uip_eth_hdr *)bp->tx_pkt; -+ -+ if (eth_vlan->tpid == htons(UIP_ETHTYPE_8021Q)) { -+ memcpy(bp->tx_pkt, pkt->buf, sizeof(struct uip_eth_hdr)); -+ eth->type = eth_vlan->type; -+ pkt->buf_size -= (sizeof(struct uip_vlan_eth_hdr) - -+ sizeof(struct uip_eth_hdr)); -+ memcpy(bp->tx_pkt + sizeof(struct uip_eth_hdr), -+ pkt->buf + sizeof(struct uip_vlan_eth_hdr), -+ pkt->buf_size - sizeof(struct uip_eth_hdr)); -+ } else -+ memcpy(bp->tx_pkt, pkt->buf, pkt->buf_size); -+ -+ msync(bp->tx_pkt, pkt->buf_size, MS_SYNC); -+} -+ -+/** -+ * bnx2x_get_tx_pkt() - This function is used to a TX packet from the NIC -+ * @param nic - The NIC device to send the packet -+ */ -+void *bnx2x_get_tx_pkt(nic_t *nic) -+{ -+ bnx2x_t *bp = (bnx2x_t *) nic->priv; -+ return bp->tx_pkt; -+} -+ -+/** -+ * bnx2x_start_xmit() - This function is used to send a packet of data -+ * @param nic - The NIC device to send the packet -+ * @param len - the length of the TX packet -+ * -+ */ -+void bnx2x_start_xmit(nic_t *nic, size_t len, u16_t vlan_id) -+{ -+ bnx2x_t *bp = (bnx2x_t *) nic->priv; -+ uint16_t ring_prod; -+ struct eth_tx_start_bd *txbd; -+ struct eth_tx_bd *txbd2; -+ struct eth_rx_bd *rx_bd; -+ rx_bd = (struct eth_rx_bd *)(((__u8 *) bp->tx_ring) + getpagesize()); -+ -+ if ((rx_bd->addr_hi == 0) && (rx_bd->addr_lo == 0)) { -+ LOG_PACKET(PFX "%s: trying to transmit when device is closed", -+ nic->log_name); -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ return; -+ } -+ -+ ring_prod = BNX2X_TX_RING_IDX(bp->tx_bd_prod); -+ txbd = &bp->tx_ring[ring_prod]; -+ -+ BNX2X_SET_TX_VLAN(bp, txbd, vlan_id); -+ -+ bp->tx_prod++; -+ bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod); -+ bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod); -+ -+ ring_prod = BNX2X_TX_RING_IDX(bp->tx_bd_prod); -+ txbd2 = (struct eth_tx_bd *)&bp->tx_ring[ring_prod]; -+ -+ txbd2->nbytes = len - 0x10; -+ txbd2->total_pkt_bytes = len; -+ -+ bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod); -+ -+ barrier(); -+ if (nic->nl_process_if_down == 0) { -+ bnx2x_doorbell(bp, bp->tx_doorbell, 0x02 | -+ (bp->tx_bd_prod << 16)); -+ bnx2x_flush_doorbell(bp, bp->tx_doorbell); -+ } else { -+ /* If the doorbell is not rung, the packet will not -+ get sent. Hence, the xmit_mutex lock will not -+ get freed. -+ */ -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ } -+ LOG_PACKET(PFX "%s: sent %d bytes using bp->tx_prod: %d", -+ nic->log_name, len, bp->tx_prod); -+} -+ -+/** -+ * bnx2x_write() - Used to write the data to the hardware -+ * @param nic - NIC hardware to read from -+ * @param pkt - The packet which will hold the data to be sent on the wire -+ * @return 0 if successful, <0 if failed -+ */ -+int bnx2x_write(nic_t *nic, nic_interface_t *nic_iface, packet_t *pkt) -+{ -+ bnx2x_t *bp; -+ struct uip_stack *uip; -+ int i = 0; -+ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL || nic_iface == NULL || pkt == NULL) { -+ LOG_ERR(PFX "%s: bnx2x_write() nic == 0x%p || " -+ " nic_iface == 0x%p || " -+ " pkt == 0x%x", nic, nic_iface, pkt); -+ return -EINVAL; -+ } -+ bp = (bnx2x_t *) nic->priv; -+ uip = &nic_iface->ustack; -+ -+ if (pkt->buf_size == 0) { -+ LOG_ERR(PFX "%s: Trying to transmitted 0 sized packet", -+ nic->log_name); -+ return -EINVAL; -+ } -+ -+ /* Try to wait for a TX completion */ -+ for (i = 0; i < 15; i++) { -+ struct timespec sleep_req = {.tv_sec = 0, .tv_nsec = 5000000 }, -+ sleep_rem; -+ -+ if (bnx2x_clear_tx_intr(nic) == 0) -+ break; -+ -+ nanosleep(&sleep_req, &sleep_rem); -+ } -+ -+ if (pthread_mutex_trylock(&nic->xmit_mutex) != 0) { -+ LOG_PACKET(PFX "%s: Dropped previous transmitted packet", -+ nic->log_name); -+ return -EINVAL; -+ } -+ -+ bnx2x_prepare_xmit_packet(nic, nic_iface, pkt); -+ bnx2x_start_xmit(nic, pkt->buf_size, -+ (nic_iface->vlan_priority << 12) | -+ nic_iface->vlan_id); -+ -+ /* bump the cnic dev send statistics */ -+ nic->stats.tx.packets++; -+ nic->stats.tx.bytes += uip->uip_len; -+ -+ LOG_PACKET(PFX "%s: transmitted %d bytes " -+ "dev->tx_cons: %d, dev->tx_prod: %d, dev->tx_bd_prod:%d", -+ nic->log_name, pkt->buf_size, -+ bp->tx_cons, bp->tx_prod, bp->tx_bd_prod); -+ -+ return 0; -+} -+ -+static inline int bnx2x_get_rx_pad(bnx2x_t *bp, union eth_rx_cqe *cqe) -+{ -+ int pad = 0; -+ -+ if (bnx2x_is_ver70(bp)) -+ pad = ((union eth_rx_cqe_70 *)cqe)->fast_path_cqe_70. \ -+ placement_offset; -+ else if (bnx2x_is_ver60(bp)) { -+ if (bp->version.minor >= 64) -+ pad = cqe->fast_path_cqe_64.placement_offset; -+ else -+ pad = cqe->fast_path_cqe.placement_offset; -+ } -+ return pad; -+} -+ -+/** -+ * bnx2x_read() - Used to read the data from the hardware -+ * @param nic - NIC hardware to read from -+ * @param pkt - The packet which will hold the data -+ * @return 0 if successful, <0 if failed -+ */ -+static int bnx2x_read(nic_t *nic, packet_t *pkt) -+{ -+ bnx2x_t *bp; -+ int rc = 0; -+ uint16_t hw_cons, sw_cons, bd_cons, bd_prod; -+ -+ /* Sanity Check: validate the parameters */ -+ if (nic == NULL || pkt == NULL) { -+ LOG_ERR(PFX "%s: bnx2x_read() nic == 0x%p || " -+ " pkt == 0x%x", nic, pkt); -+ return -EINVAL; -+ } -+ bp = (bnx2x_t *) nic->priv; -+ -+ hw_cons = bp->get_rx_cons(bp); -+ sw_cons = bp->rx_cons; -+ bd_cons = BNX2X_RX_BD(bp->rx_bd_cons); -+ bd_prod = BNX2X_RX_BD(bp->rx_bd_prod); -+ -+ if (sw_cons != hw_cons) { -+ uint16_t comp_ring_index = sw_cons & BNX2X_MAX_RCQ_DESC_CNT(bp); -+ uint8_t ring_index; -+ union eth_rx_cqe *cqe; -+ __u8 cqe_fp_flags; -+ void *rx_pkt; -+ int len, pad, cqe_size, max_len; -+ rc = 1; -+ -+ if (bnx2x_is_ver70(bp)) { -+ cqe = (union eth_rx_cqe *) -+ &bp->rx_comp_ring.cqe70[comp_ring_index]; -+ cqe_size = sizeof(union eth_rx_cqe_70); -+ } else { -+ cqe = &bp->rx_comp_ring.cqe[comp_ring_index]; -+ cqe_size = sizeof(union eth_rx_cqe); -+ } -+ cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; -+ -+ LOG_PACKET(PFX "%s: clearing rx interrupt: %d %d", -+ nic->log_name, sw_cons, hw_cons); -+ -+ msync(cqe, cqe_size, MS_SYNC); -+ -+ if (!(cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE)) { -+ ring_index = bd_cons % 15; -+ len = cqe->fast_path_cqe.pkt_len; -+ pad = bnx2x_get_rx_pad(bp, cqe); -+ rx_pkt = bp->rx_pkt_ring[ring_index] + pad; -+ -+ /* Doto query MTU size of physical device */ -+ /* Ensure len is valid */ -+ max_len = pkt->max_buf_size < bp->rx_buffer_size ? -+ pkt->max_buf_size : bp->rx_buffer_size; -+ if (len + pad > max_len) { -+ LOG_DEBUG(PFX "%s: bad BD length: %d", -+ nic->log_name, len); -+ len = max_len - pad; -+ } -+ if (len > 0) { -+ msync(rx_pkt, len, MS_SYNC); -+ /* Copy the data */ -+ memcpy(pkt->buf, rx_pkt, len); -+ pkt->buf_size = len; -+ -+ /* Properly set the packet flags */ -+ /* check if there is VLAN tagging */ -+ if (cqe->fast_path_cqe.vlan_tag != 0) { -+ pkt->vlan_tag = -+ cqe->fast_path_cqe.vlan_tag; -+ pkt->flags |= VLAN_TAGGED; -+ } else { -+ pkt->vlan_tag = 0; -+ } -+ -+ LOG_PACKET(PFX -+ "%s: processing packet length: %d", -+ nic->log_name, len); -+ -+ /* bump the cnic dev recv statistics */ -+ nic->stats.rx.packets++; -+ nic->stats.rx.bytes += pkt->buf_size; -+ } -+ -+ bd_cons = BNX2X_NEXT_RX_IDX(bd_cons); -+ bd_prod = BNX2X_NEXT_RX_IDX(bd_prod); -+ -+ } -+ sw_cons = BNX2X_NEXT_RCQ_IDX(bp, sw_cons); -+ bp->rx_prod = BNX2X_NEXT_RCQ_IDX(bp, bp->rx_prod); -+ } -+ bp->rx_cons = sw_cons; -+ bp->rx_bd_cons = bd_cons; -+ bp->rx_bd_prod = bd_prod; -+ bp->rx_hw_prod = hw_cons; -+ -+ if (rc) -+ bnx2x_update_rx_prod(bp); -+ -+ return rc; -+} -+ -+/******************************************************************************* -+ * Clearing TX interrupts -+ ******************************************************************************/ -+/** -+ * bnx2x_clear_tx_intr() - This routine is called when a TX interrupt occurs -+ * @param nic - the nic the interrupt occured on -+ * @return 0 on success -+ */ -+static int bnx2x_clear_tx_intr(nic_t *nic) -+{ -+ bnx2x_t *bp; -+ uint16_t hw_cons; -+ -+ /* Sanity check: ensure the parameters passed in are valid */ -+ if (unlikely(nic == NULL)) { -+ LOG_ERR(PFX "bnx2x_read() nic == NULL"); -+ return -EINVAL; -+ } -+ bp = (bnx2x_t *) nic->priv; -+ hw_cons = bp->get_tx_cons(bp); -+ -+ if (bp->tx_cons == hw_cons) { -+ if (bp->tx_cons == bp->tx_prod) { -+ /* Make sure the xmit_mutex lock is unlock */ -+ if (pthread_mutex_trylock(&nic->xmit_mutex)) -+ LOG_ERR(PFX "bnx2x tx lock with prod == cons"); -+ -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ } -+ return -EAGAIN; -+ } -+ -+ LOG_PACKET(PFX "%s: clearing tx interrupt [%d %d]", -+ nic->log_name, bp->tx_cons, hw_cons); -+ bp->tx_cons = hw_cons; -+ -+ /* There is a queued TX packet that needs to be sent out. The usual -+ * case is when stack will send an ARP packet out before sending the -+ * intended packet */ -+ if (nic->tx_packet_queue != NULL) { -+ packet_t *pkt; -+ int i; -+ -+ LOG_PACKET(PFX "%s: sending queued tx packet", nic->log_name); -+ pkt = nic_dequeue_tx_packet(nic); -+ -+ /* Got a TX packet buffer of the TX queue and put it onto -+ * the hardware */ -+ if (pkt != NULL) { -+ bnx2x_prepare_xmit_packet(nic, pkt->nic_iface, pkt); -+ -+ bnx2x_start_xmit(nic, pkt->buf_size, -+ (pkt->nic_iface->vlan_priority << 12) | -+ pkt->nic_iface->vlan_id); -+ -+ LOG_PACKET(PFX "%s: transmitted queued packet %d bytes " -+ "dev->tx_cons: %d, dev->tx_prod: %d, " -+ "dev->tx_bd_prod:%d", -+ nic->log_name, pkt->buf_size, -+ bp->tx_cons, bp->tx_prod, bp->tx_bd_prod); -+ -+ return 0; -+ } -+ -+ /* Try to wait for a TX completion */ -+ for (i = 0; i < 15; i++) { -+ struct timespec sleep_req = {.tv_sec = 0, -+ .tv_nsec = 5000000 -+ }, sleep_rem; -+ -+ hw_cons = bp->get_tx_cons(bp); -+ if (bp->tx_cons != hw_cons) { -+ LOG_PACKET(PFX -+ "%s: clearing tx interrupt [%d %d]", -+ nic->log_name, bp->tx_cons, hw_cons); -+ bp->tx_cons = hw_cons; -+ -+ break; -+ } -+ -+ nanosleep(&sleep_req, &sleep_rem); -+ } -+ } -+ -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ -+ return 0; -+} -+ -+/******************************************************************************* -+ * bnx2x NIC op's table -+ ******************************************************************************/ -+struct nic_ops bnx2x_op = { -+ .description = "bnx2x", -+ .open = bnx2x_open, -+ .close = bnx2x_close, -+ .write = bnx2x_write, -+ .get_tx_pkt = bnx2x_get_tx_pkt, -+ .start_xmit = bnx2x_start_xmit, -+ .read = bnx2x_read, -+ .clear_tx_intr = bnx2x_clear_tx_intr, -+ .handle_iscsi_path_req = cnic_handle_iscsi_path_req, -+ -+ .lib_ops = { -+ .get_library_name = bnx2x_get_library_name, -+ .get_pci_table = bnx2x_get_pci_table, -+ .get_library_version = bnx2x_get_library_version, -+ .get_build_date = bnx2x_get_build_date, -+ .get_transport_name = bnx2x_get_transport_name, -+ .get_uio_name = bnx2x_get_uio_name, -+ }, -+}; -diff --git a/iscsiuio/src/unix/libs/bnx2x.h b/iscsiuio/src/unix/libs/bnx2x.h -new file mode 100644 -index 0000000..0b74e44 ---- /dev/null -+++ b/iscsiuio/src/unix/libs/bnx2x.h -@@ -0,0 +1,705 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * bnx2x.h - bnx2x user space driver -+ * -+ */ -+#ifndef __BNX2X_H__ -+#define __BNX2X_H__ -+ -+#include "nic.h" -+ -+/****************************************************************************** -+ * Default CNIC values -+ ******************************************************************************/ -+#define DEFAULT_BNX2X_NUM_RXBD 15 -+#define DEFAULT_BNX2X_RX_LEN 0x400 -+ -+/****************************************************************************** -+ * BNX2X Hardware structures -+ ******************************************************************************/ -+#define HC_USTORM_DEF_SB_NUM_INDICES 8 -+#define HC_CSTORM_DEF_SB_NUM_INDICES 8 -+#define HC_XSTORM_DEF_SB_NUM_INDICES 4 -+#define HC_TSTORM_DEF_SB_NUM_INDICES 4 -+ -+struct atten_def_status_block { -+ volatile __u32 attn_bits; -+ volatile __u32 attn_bits_ack; -+ volatile __u8 status_block_id; -+ volatile __u8 reserved0; -+ volatile __u16 attn_bits_index; -+ volatile __u32 reserved1; -+}; -+ -+struct cstorm_def_status_block_u { -+ volatile __u16 index_values[HC_USTORM_DEF_SB_NUM_INDICES]; -+ volatile __u16 status_block_index; -+ volatile __u8 func; -+ volatile __u8 status_block_id; -+ volatile __u32 __flags; -+}; -+ -+struct cstorm_def_status_block_c { -+ volatile __u16 index_values[HC_CSTORM_DEF_SB_NUM_INDICES]; -+ volatile __u16 status_block_index; -+ volatile __u8 func; -+ volatile __u8 status_block_id; -+ volatile __u32 __flags; -+}; -+ -+struct xstorm_def_status_block { -+ volatile __u16 index_values[HC_XSTORM_DEF_SB_NUM_INDICES]; -+ volatile __u16 status_block_index; -+ volatile __u8 func; -+ volatile __u8 status_block_id; -+ volatile __u32 __flags; -+}; -+ -+struct tstorm_def_status_block { -+ volatile __u16 index_values[HC_TSTORM_DEF_SB_NUM_INDICES]; -+ volatile __u16 status_block_index; -+ volatile __u8 func; -+ volatile __u8 status_block_id; -+ volatile __u32 __flags; -+}; -+ -+struct host_def_status_block { -+ struct atten_def_status_block atten_status_block; -+ struct cstorm_def_status_block_u u_def_status_block; -+ struct cstorm_def_status_block_c c_def_status_block; -+ struct xstorm_def_status_block x_def_status_block; -+ struct tstorm_def_status_block t_def_status_block; -+}; -+ -+#define HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS 1 -+#define HC_INDEX_DEF_U_ETH_ISCSI_RX_BD_CONS 3 -+#define HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS 5 -+ -+struct atten_sp_status_block { -+ __u32 attn_bits; -+ __u32 attn_bits_ack; -+ __u8 status_block_id; -+ __u8 reserved0; -+ __u16 attn_bits_index; -+ __u32 reserved1; -+}; -+ -+#define HC_SP_SB_MAX_INDICES 16 -+ -+struct hc_sp_status_block { -+ __u16 index_values[HC_SP_SB_MAX_INDICES]; -+ __u16 running_index; -+ __u16 rsrv; -+ __u32 rsrv1; -+}; -+ -+struct host_sp_status_block { -+ struct atten_sp_status_block atten_status_block; -+ struct hc_sp_status_block sp_sb; -+}; -+ -+#define HC_SP_INDEX_ETH_ISCSI_CQ_CONS 5 -+#define HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS 1 -+ -+/* -+ * VLAN mode on TX BDs -+ */ -+enum eth_tx_vlan_type { -+ X_ETH_NO_VLAN = 0, -+ X_ETH_OUTBAND_VLAN = 1, -+ X_ETH_INBAND_VLAN = 2, -+ X_ETH_FW_ADDED_VLAN = 3, -+ MAX_ETH_TX_VLAN_TYPE -+}; -+ -+/* TX Buffer descriptor */ -+struct eth_tx_bd_flags { -+ __u8 as_bitfield; -+/* t6.X HSI */ -+#define ETH_TX_BD_FLAGS_IP_CSUM_T6X (0x1<<0) -+#define ETH_TX_BD_FLAGS_IP_CSUM_SHIFT_T6X 0 -+#define ETH_TX_BD_FLAGS_L4_CSUM_T6X (0x1<<1) -+#define ETH_TX_BD_FLAGS_L4_CSUM_SHIFT_T6X 1 -+#define ETH_TX_BD_FLAGS_VLAN_MODE_T6X (0x3<<2) -+#define ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT_T6X 2 -+#define ETH_TX_BD_FLAGS_START_BD_T6X (0x1<<4) -+#define ETH_TX_BD_FLAGS_START_BD_SHIFT_T6X 4 -+#define ETH_TX_BD_FLAGS_IS_UDP_T6X (0x1<<5) -+#define ETH_TX_BD_FLAGS_IS_UDP_SHIFT_T6X 5 -+#define ETH_TX_BD_FLAGS_SW_LSO_T6X (0x1<<6) -+#define ETH_TX_BD_FLAGS_SW_LSO_SHIFT_T6X 6 -+#define ETH_TX_BD_FLAGS_IPV6_T6X (0x1<<7) -+#define ETH_TX_BD_FLAGS_IPV6_SHIFT_T6X 7 -+ -+/* Legacy t5.2 HSI defines */ -+#define ETH_TX_BD_FLAGS_VLAN_TAG_T5X (0x1<<0) -+#define ETH_TX_BD_FLAGS_VLAN_TAG_SHIFT_T5X 0 -+#define ETH_TX_BD_FLAGS_IP_CSUM_T5X (0x1<<1) -+#define ETH_TX_BD_FLAGS_IP_CSUM_SHIFT_T5X 1 -+#define ETH_TX_BD_FLAGS_L4_CSUM_T5X (0x1<<2) -+#define ETH_TX_BD_FLAGS_L4_CSUM_SHIFT_T5X 2 -+#define ETH_TX_BD_FLAGS_END_BD_T5X (0x1<<3) -+#define ETH_TX_BD_FLAGS_END_BD_SHIFT_T5X 3 -+#define ETH_TX_BD_FLAGS_START_BD_T5X (0x1<<4) -+#define ETH_TX_BD_FLAGS_START_BD_SHIFT_T5X 4 -+#define ETH_TX_BD_FLAGS_HDR_POOL_T5X (0x1<<5) -+#define ETH_TX_BD_FLAGS_HDR_POOL_SHIFT_T5X 5 -+#define ETH_TX_BD_FLAGS_SW_LSO_T5X (0x1<<6) -+#define ETH_TX_BD_FLAGS_SW_LSO_SHIFT_T5X 6 -+#define ETH_TX_BD_FLAGS_IPV6_T5X (0x1<<7) -+#define ETH_TX_BD_FLAGS_IPV6_SHIFT_T5X 7 -+}; -+ -+#define ETH_TX_BD_FLAGS_VLAN_TAG_T6X \ -+ (X_ETH_OUTBAND_VLAN << ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT_T6X) -+ -+#define BNX2X_SET_TX_VLAN(bp, txbd, vlan_id) \ -+ do { \ -+ if (vlan_id) { \ -+ (txbd)->vlan = vlan_id; \ -+ (txbd)->bd_flags.as_bitfield |= \ -+ (bp)->tx_vlan_tag_bit; \ -+ } else { \ -+ (txbd)->vlan = (bp)->tx_prod; \ -+ (txbd)->bd_flags.as_bitfield &= \ -+ ~(bp)->tx_vlan_tag_bit; \ -+ } \ -+ } while (0) -+ -+struct eth_tx_start_bd { -+ __u32 addr_lo; -+ __u32 addr_hi; -+ __u16 nbd; -+ __u16 nbytes; -+ __u16 vlan; -+ struct eth_tx_bd_flags bd_flags; -+ __u8 general_data; -+#define ETH_TX_START_BD_HDR_NBDS (0x3F<<0) -+#define ETH_TX_START_BD_HDR_NBDS_SHIFT 0 -+#define ETH_TX_START_BD_ETH_ADDR_TYPE (0x3<<6) -+#define ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT 6 -+}; -+ -+struct eth_tx_bd { -+ __u32 addr_lo; -+ __u32 addr_hi; -+ __u16 total_pkt_bytes; -+ __u16 nbytes; -+ __u8 reserved[4]; -+}; -+ -+/* RX Buffer descriptor */ -+struct eth_rx_bd { -+ __u32 addr_lo; -+ __u32 addr_hi; -+}; -+ -+struct ramrod_data { -+ volatile __u32 data_lo; -+ volatile __u32 data_hi; -+}; -+ -+struct common_ramrod_eth_rx_cqe { -+ volatile __u8 ramrod_type; -+#define COMMON_RAMROD_ETH_RX_CQE_TYPE (0x1<<0) -+#define COMMON_RAMROD_ETH_RX_CQE_TYPE_SHIFT 0 -+#define COMMON_RAMROD_ETH_RX_CQE_RESERVED0 (0x7F<<1) -+#define COMMON_RAMROD_ETH_RX_CQE_RESERVED0_SHIFT 1 -+ volatile __u8 conn_type; -+ volatile __u16 reserved1; -+ volatile __u32 conn_and_cmd_data; -+#define COMMON_RAMROD_ETH_RX_CQE_CID (0xFFFFFF<<0) -+#define COMMON_RAMROD_ETH_RX_CQE_CID_SHIFT 0 -+#define COMMON_RAMROD_ETH_RX_CQE_CMD_ID (0xFF<<24) -+#define COMMON_RAMROD_ETH_RX_CQE_CMD_ID_SHIFT 24 -+ struct ramrod_data protocol_data; -+ __u32 reserved2[4]; -+}; -+ -+struct common_ramrod_eth_rx_cqe_70 { -+ volatile __u8 ramrod_type; -+ volatile __u8 conn_type; -+ volatile __u16 reserved1; -+ volatile __u32 conn_and_cmd_data; -+ struct ramrod_data protocol_data; -+ __u32 echo; -+ __u32 reserved2[11]; -+}; -+ -+struct parsing_flags { -+ volatile __u16 flags; -+}; -+ -+struct eth_fast_path_rx_cqe { -+ volatile __u8 type_error_flags; -+#define ETH_FAST_PATH_RX_CQE_TYPE (0x1<<0) -+#define ETH_FAST_PATH_RX_CQE_TYPE_SHIFT 0 -+#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG (0x1<<1) -+#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_SHIFT 1 -+#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG (0x1<<2) -+#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_SHIFT 2 -+#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG (0x1<<3) -+#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_SHIFT 3 -+#define ETH_FAST_PATH_RX_CQE_START_FLG (0x1<<4) -+#define ETH_FAST_PATH_RX_CQE_START_FLG_SHIFT 4 -+#define ETH_FAST_PATH_RX_CQE_END_FLG (0x1<<5) -+#define ETH_FAST_PATH_RX_CQE_END_FLG_SHIFT 5 -+#define ETH_FAST_PATH_RX_CQE_RESERVED0 (0x3<<6) -+#define ETH_FAST_PATH_RX_CQE_RESERVED0_SHIFT 6 -+ volatile __u8 status_flags; -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE (0x7<<0) -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE_SHIFT 0 -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG (0x1<<3) -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG_SHIFT 3 -+#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG (0x1<<4) -+#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG_SHIFT 4 -+#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG (0x1<<5) -+#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG_SHIFT 5 -+#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG (0x1<<6) -+#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG_SHIFT 6 -+#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG (0x1<<7) -+#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG_SHIFT 7 -+ volatile __u8 placement_offset; -+ volatile __u8 queue_index; -+ volatile __u32 rss_hash_result; -+ volatile __u16 vlan_tag; -+ volatile __u16 pkt_len; -+ volatile __u16 len_on_bd; -+ struct parsing_flags pars_flags; -+ volatile __u16 sgl[8]; -+}; -+ -+union eth_sgl_or_raw_data { -+ volatile __u16 sgl[8]; -+ volatile __u32 raw_data[4]; -+}; -+ -+struct eth_fast_path_rx_cqe_64 { -+ volatile __u8 type_error_flags; -+#define ETH_FAST_PATH_RX_CQE_TYPE_64 (0x3<<0) -+#define ETH_FAST_PATH_RX_CQE_TYPE_SHIFT_64 0 -+#define ETH_FAST_PATH_RX_CQE_SGL_RAW_SEL (0x1<<2) -+#define ETH_FAST_PATH_RX_CQE_SGL_RAW_SEL_SHIFT 2 -+#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_64 (0x1<<3) -+#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_SHIFT_64 3 -+#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_64 (0x1<<4) -+#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_SHIFT_64 4 -+#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_64 (0x1<<5) -+#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_SHIFT_64 5 -+#define ETH_FAST_PATH_RX_CQE_RESERVED0_64 (0x3<<6) -+#define ETH_FAST_PATH_RX_CQE_RESERVED0_SHIFT_64 6 -+ volatile __u8 status_flags; -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE (0x7<<0) -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE_SHIFT 0 -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG (0x1<<3) -+#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG_SHIFT 3 -+#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG (0x1<<4) -+#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG_SHIFT 4 -+#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG (0x1<<5) -+#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG_SHIFT 5 -+#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG (0x1<<6) -+#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG_SHIFT 6 -+#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG (0x1<<7) -+#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG_SHIFT 7 -+ volatile __u8 queue_index; -+ volatile __u8 placement_offset; -+ volatile __u32 rss_hash_result; -+ volatile __u16 vlan_tag; -+ volatile __u16 pkt_len; -+ volatile __u16 len_on_bd; -+ struct parsing_flags pars_flags; -+ union eth_sgl_or_raw_data sgl_or_raw_data; -+}; -+ -+struct eth_fast_path_rx_cqe_70 { -+ volatile __u8 type_error_flags; -+ volatile __u8 status_flags; -+ volatile __u8 queue_index; -+ volatile __u8 placement_offset; -+ volatile __u32 rss_hash_result; -+ volatile __u16 vlan_tag; -+ volatile __u16 pkt_len; -+ volatile __u16 len_on_bd; -+ struct parsing_flags pars_flags; -+ union eth_sgl_or_raw_data sgl_or_raw_data; -+ __u32 reserved1[8]; -+}; -+ -+struct eth_rx_cqe_next_page { -+ __u32 addr_lo; -+ __u32 addr_hi; -+ __u32 reserved[6]; -+}; -+ -+struct eth_rx_cqe_next_page_70 { -+ __u32 addr_lo; -+ __u32 addr_hi; -+ __u32 reserved[14]; -+}; -+ -+union eth_rx_cqe { -+ struct eth_fast_path_rx_cqe fast_path_cqe; -+ struct eth_fast_path_rx_cqe_64 fast_path_cqe_64; -+ struct common_ramrod_eth_rx_cqe ramrod_cqe; -+ struct eth_rx_cqe_next_page next_page_cqe; -+}; -+ -+union eth_rx_cqe_70 { -+ struct eth_fast_path_rx_cqe_70 fast_path_cqe_70; -+ struct common_ramrod_eth_rx_cqe_70 ramrod_cqe_70; -+ struct eth_rx_cqe_next_page_70 next_page_cqe_70; -+}; -+ -+struct client_init_general_data { -+ __u8 client_id; -+ __u8 statistics_counter_id; -+ __u8 statistics_en_flg; -+ __u8 is_fcoe_flg; -+ __u8 activate_flg; -+ __u8 sp_client_id; -+ __u16 mtu; -+ __u8 statistics_zero_flg; -+ __u8 func_id; -+ __u8 cos; -+ __u8 traffic_type; -+ __u32 reserved0; -+}; -+ -+/****************************************************************************** -+ * BNX2X Registers and HSI -+ ******************************************************************************/ -+#define BNX2X_BAR_SIZE 0x500000 -+#define BNX2X_BAR2_SIZE 0x12000 -+ -+#define BNX2X_CHIP_ID(bp) (bp->chip_id & 0xfffffff0) -+ -+#define PORT_MAX 2 -+ -+/* [R 4] This field indicates the type of the device. '0' - 2 Ports; '1' - 1 -+ * Port. */ -+#define BNX2X_MISC_REG_BOND_ID 0xa400 -+/* [R 8] These bits indicate the metal revision of the chip. This value -+ * starts at 0x00 for each all-layer tape-out and increments by one for each -+ * tape-out. */ -+#define BNX2X_MISC_REG_CHIP_METAL 0xa404 -+/* [R 16] These bits indicate the part number for the chip. */ -+#define BNX2X_MISC_REG_CHIP_NUM 0xa408 -+/* [R 4] These bits indicate the base revision of the chip. This value -+ * starts at 0x0 for the A0 tape-out and increments by one for each -+ * all-layer tape-out. */ -+#define BNX2X_MISC_REG_CHIP_REV 0xa40c -+ -+/* From the bnx2x driver */ -+#define CHIP_NUM(bp) (bp->chip_id >> 16) -+#define CHIP_NUM_57710 0x164e -+#define CHIP_NUM_57711 0x164f -+#define CHIP_NUM_57711E 0x1650 -+#define CHIP_NUM_57712 0x1662 -+#define CHIP_NUM_57712_MF 0x1663 -+#define CHIP_NUM_57712_VF 0x166f -+#define CHIP_NUM_57713 0x1651 -+#define CHIP_NUM_57713E 0x1652 -+#define CHIP_NUM_57800 0x168a -+#define CHIP_NUM_57800_MF 0x16a5 -+#define CHIP_NUM_57800_VF 0x16a9 -+#define CHIP_NUM_57810 0x168e -+#define CHIP_NUM_57810_MF 0x16ae -+#define CHIP_NUM_57810_VF 0x16af -+#define CHIP_NUM_57811 0x163d -+#define CHIP_NUM_57811_MF 0x163e -+#define CHIP_NUM_57811_VF 0x163f -+#define CHIP_NUM_57840_OBSOLETE 0x168d -+#define CHIP_NUM_57840_MF_OBSOLETE 0x16ab -+#define CHIP_NUM_57840_4_10 0x16a1 -+#define CHIP_NUM_57840_2_20 0x16a2 -+#define CHIP_NUM_57840_MF 0x16a4 -+#define CHIP_NUM_57840_VF 0x16ad -+ -+#define CHIP_IS_E1(bp) (CHIP_NUM(bp) == CHIP_NUM_57710) -+#define CHIP_IS_57711(bp) (CHIP_NUM(bp) == CHIP_NUM_57711) -+#define CHIP_IS_57711E(bp) (CHIP_NUM(bp) == CHIP_NUM_57711E) -+#define CHIP_IS_57712(bp) (CHIP_NUM(bp) == CHIP_NUM_57712) -+#define CHIP_IS_57712_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57712_VF) -+#define CHIP_IS_57712_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57712_MF) -+#define CHIP_IS_57800(bp) (CHIP_NUM(bp) == CHIP_NUM_57800) -+#define CHIP_IS_57800_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57800_MF) -+#define CHIP_IS_57800_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57800_VF) -+#define CHIP_IS_57810(bp) (CHIP_NUM(bp) == CHIP_NUM_57810) -+#define CHIP_IS_57810_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57810_MF) -+#define CHIP_IS_57810_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57810_VF) -+#define CHIP_IS_57811(bp) (CHIP_NUM(bp) == CHIP_NUM_57811) -+#define CHIP_IS_57811_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57811_MF) -+#define CHIP_IS_57811_MF(bp) (CHIP_NUM(bp) == CHIP_NUM_57811_VF) -+ -+#define CHIP_IS_57840(bp) \ -+ ((CHIP_NUM(bp) == CHIP_NUM_57840_4_10) || \ -+ (CHIP_NUM(bp) == CHIP_NUM_57840_2_20) || \ -+ (CHIP_NUM(bp) == CHIP_NUM_57840_OBSOLETE)) -+#define CHIP_IS_57840_MF(bp) ((CHIP_NUM(bp) == CHIP_NUM_57840_MF) || \ -+ (CHIP_NUM(bp) == CHIP_NUM_57840_MF_OBSOLETE)) -+#define CHIP_IS_57840_VF(bp) (CHIP_NUM(bp) == CHIP_NUM_57840_VF) -+#define CHIP_IS_E1H(bp) (CHIP_IS_57711(bp) || \ -+ CHIP_IS_57711E(bp)) -+ -+#define CHIP_IS_E2(bp) (CHIP_IS_57712(bp) || \ -+ CHIP_IS_57712_MF(bp) || \ -+ CHIP_IS_57712_VF(bp)) -+#define CHIP_IS_E3(bp) (CHIP_IS_57800(bp) || \ -+ CHIP_IS_57800_MF(bp) || \ -+ CHIP_IS_57800_VF(bp) || \ -+ CHIP_IS_57810(bp) || \ -+ CHIP_IS_57810_MF(bp) || \ -+ CHIP_IS_57810_VF(bp) || \ -+ CHIP_IS_57840(bp) || \ -+ CHIP_IS_57840_MF(bp) || \ -+ CHIP_IS_57840_VF(bp) || \ -+ CHIP_IS_57811(bp) || \ -+ CHIP_IS_57811_MF(bp) || \ -+ CHIP_IS_57811_VF(bp)) -+ -+#define CHIP_IS_E1x(bp) (CHIP_IS_E1((bp)) || CHIP_IS_E1H((bp))) -+#define USES_WARPCORE(bp) (CHIP_IS_E3(bp)) -+#define IS_E1H_OFFSET (!CHIP_IS_E1H(bp)) -+/* End of From the bnx2x driver */ -+ -+#define CHIP_IS_E2_PLUS(bp) (CHIP_IS_E2(bp) || CHIP_IS_E3(bp)) -+ -+#define MISC_REG_SHARED_MEM_ADDR 0xa2b4 -+ -+#define MISC_REG_BOND_ID 0xa400 -+#define MISC_REG_CHIP_METAL 0xa404 -+#define MISC_REG_CHIP_NUM 0xa408 -+#define MISC_REG_CHIP_REV 0xa40c -+ -+#define MISC_REG_PORT4MODE_EN 0xa750 -+#define MISC_REG_PORT4MODE_EN_OVWR 0xa720 -+ -+#define MISC_REG_GENERIC_CR_0 0xa460 -+#define MISC_REG_GENERIC_CR_1 0xa464 -+ -+#define BAR_USTRORM_INTMEM 0x400000 -+#define BAR_CSTRORM_INTMEM 0x410000 -+#define BAR_XSTRORM_INTMEM 0x420000 -+#define BAR_TSTRORM_INTMEM 0x430000 -+ -+#define BAR_ME_REGISTER 0x450000 -+#define ME_REG_PF_NUM_SHIFT 0 -+#define ME_REG_PF_NUM\ -+ (7L<iro[bp->iro_idx]) -+ -+#define USTORM_RX_PRODS_E1X_OFFSET(port, client_id) \ -+ (IRO_ENT.base + ((port) * IRO_ENT.m1) + ((client_id) * IRO_ENT.m2)) -+ -+#define USTORM_RX_PRODS_E2_OFFSET(qzone_id) \ -+ (IRO_ENT.base + ((qzone_id) * IRO_ENT.m1)) -+ -+#define ETH_MAX_RX_CLIENTS_E1H 28 -+#define ETH_MAX_RX_CLIENTS_E2 28 -+ -+#define BNX2X_CL_QZONE_ID(bp, cli) \ -+ (cli + (bp->port * (CHIP_IS_E2(bp) ? \ -+ ETH_MAX_RX_CLIENTS_E2 : \ -+ ETH_MAX_RX_CLIENTS_E1H))) -+ -+#define BNX2X_CL_QZONE_ID_64(bp, cli) \ -+ (CHIP_IS_E2_PLUS(bp) ? (cli) : \ -+ (cli + (bp->port * ETH_MAX_RX_CLIENTS_E1H))) -+ -+#define BNX2X_PATH(bp) (!CHIP_IS_E2_PLUS(bp) ? 0 : (bp)->func & 1) -+ -+#define SHMEM_P0_ISCSI_MAC_UPPER 0x4c -+#define SHMEM_P0_ISCSI_MAC_LOWER 0x50 -+#define SHMEM_P1_ISCSI_MAC_UPPER 0x1dc -+#define SHMEM_P1_ISCSI_MAC_LOWER 0x1e0 -+ -+#define SHMEM_ISCSI_MAC_UPPER(bp) \ -+ (((bp)->port == 0) ? \ -+ SHMEM_P0_ISCSI_MAC_UPPER : SHMEM_P1_ISCSI_MAC_UPPER) -+ -+#define SHMEM_ISCSI_MAC_LOWER(bp) \ -+ (((bp)->port == 0) ? \ -+ SHMEM_P0_ISCSI_MAC_LOWER : SHMEM_P1_ISCSI_MAC_LOWER) -+ -+#define BNX2X_RCQ_DESC_CNT (4096 / sizeof(union eth_rx_cqe)) -+#define BNX2X_RCQ_DESC_CNT_70 (4096 / sizeof(union eth_rx_cqe_70)) -+#define BNX2X_MAX_RCQ_DESC_CNT(bp) \ -+ ((bnx2x_is_ver70(bp) ? BNX2X_RCQ_DESC_CNT_70 : BNX2X_RCQ_DESC_CNT) - 1) -+ -+#define BNX2X_RX_DESC_CNT (4096 / sizeof(struct eth_rx_bd)) -+#define BNX2X_MAX_RX_DESC_CNT (BNX2X_RX_DESC_CNT - 2) -+#define BNX2X_NUM_RX_BD (BNX2X_RX_DESC_CNT * 1) -+#define BNX2X_MAX_RX_BD (BNX2X_NUM_RX_BD - 1) -+ -+#define BNX2X_TX_DESC_CNT (4096 / sizeof(struct eth_tx_start_bd)) -+#define BNX2X_MAX_TX_DESC_CNT (BNX2X_TX_DESC_CNT - 1) -+ -+#define BNX2X_NEXT_RX_IDX(x) ((((x) & (BNX2X_RX_DESC_CNT - 1)) == \ -+ (BNX2X_MAX_RX_DESC_CNT - 1)) ? \ -+ (x) + 3 : (x) + 1) -+ -+#define BNX2X_NEXT_RCQ_IDX(bp, x) \ -+ ((((x) & BNX2X_MAX_RCQ_DESC_CNT(bp)) == \ -+ (BNX2X_MAX_RCQ_DESC_CNT(bp) - 1)) ? (x) + 2 : (x) + 1) -+#define BNX2X_RX_BD(x) ((x) & BNX2X_MAX_RX_BD) -+ -+#define BNX2X_NEXT_TX_BD(x) ((((x) & (BNX2X_MAX_TX_DESC_CNT - 1)) == \ -+ (BNX2X_MAX_TX_DESC_CNT - 1)) ? \ -+ (x) + 2 : (x) + 1) -+ -+#define BNX2X_TX_RING_IDX(x) ((x) & BNX2X_MAX_TX_DESC_CNT) -+ -+struct ustorm_eth_rx_producers { -+ __u16 cqe_prod; -+ __u16 bd_prod; -+ __u16 sge_prod; -+ __u16 reserved; -+}; -+ -+#define BNX2X_UNKNOWN_MAJOR_VERSION -1 -+#define BNX2X_UNKNOWN_MINOR_VERSION -1 -+#define BNX2X_UNKNOWN_SUB_MINOR_VERSION -1 -+struct bnx2x_driver_version { -+ uint16_t major; -+ uint16_t minor; -+ uint16_t sub_minor; -+}; -+ -+typedef struct bnx2x { -+ nic_t *parent; -+ -+ struct bnx2x_driver_version version; -+ -+ uint16_t flags; -+#define CNIC_UIO_UNITIALIZED 0x0001 -+#define CNIC_UIO_INITIALIZED 0x0002 -+#define CNIC_UIO_ENABLED 0x0004 -+#define CNIC_UIO_DISABLED 0x0008 -+#define CNIC_UIO_IPv6_ENABLED 0x0010 -+#define CNIC_UIO_ADDED_MULICAST 0x0020 -+#define CNIC_UIO_MSIX_ENABLED 0x0200 -+#define CNIC_UIO_TX_HAS_SENT 0x0400 -+#define BNX2X_OPENED 0x0800 -+ -+ void *reg; /* Pointer to the BAR1 mapped registers */ -+ void *reg2; /* Pointer to the BAR2 mapped registers */ -+ -+ int bar0_fd; -+ int bar2_fd; -+ -+ __u32 chip_id; -+ __u32 shmem_base; -+ __u32 shmem_base2; -+ int func; -+ int port; -+ int pfid; -+ __u32 cid; -+ __u32 client_id; -+ -+ struct iro *iro; -+ int iro_idx; -+ -+ __u32 tx_doorbell; -+ -+ __u16 tx_prod; -+ __u16 tx_bd_prod; -+ __u16 tx_cons; -+ __u8 tx_vlan_tag_bit; -+ -+ __u32 rx_prod_io; -+ -+ __u16 rx_prod; -+ __u16 rx_bd_prod; -+ __u16 rx_cons; -+ __u16 rx_bd_cons; -+ __u16 rx_hw_prod; -+ -+ __u16(*get_rx_cons) (struct bnx2x *); -+ __u16(*get_tx_cons) (struct bnx2x *); -+ -+ /* RX ring parameters */ -+ uint32_t rx_ring_size; -+ uint32_t rx_buffer_size; -+ -+ void *bufs; /* Pointer to the mapped buffer space */ -+ -+ /* Hardware Status Block locations */ -+ void *sblk_map; -+ union { -+ struct host_def_status_block *def; -+ struct host_sp_status_block *sp; -+ } status_blk; -+ -+ int status_blk_size; -+ -+ uint16_t rx_index; -+ union { -+ union eth_rx_cqe *cqe; -+ union eth_rx_cqe_70 *cqe70; -+ } rx_comp_ring; -+ void **rx_pkt_ring; -+ -+ struct eth_tx_start_bd *tx_ring; -+ void *tx_pkt; -+ -+} bnx2x_t; -+ -+/****************************************************************************** -+ * bnx2x Function Declarations -+ ******************************************************************************/ -+void bnx2x_start_xmit(nic_t *nic, size_t len, u16_t vlan_id); -+ -+struct nic_ops *bnx2x_get_ops(); -+#endif /* __BNX2X_H__ */ -diff --git a/iscsiuio/src/unix/libs/cnic.c b/iscsiuio/src/unix/libs/cnic.c -new file mode 100644 -index 0000000..6ba8bce ---- /dev/null -+++ b/iscsiuio/src/unix/libs/cnic.c -@@ -0,0 +1,661 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * cnic.c - CNIC UIO uIP user space stack -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "uip_arp.h" -+#include "nic.h" -+#include "nic_utils.h" -+#include "logger.h" -+#include "options.h" -+ -+#include "cnic.h" -+#include "iscsi_if.h" -+#include "ipv6_ndpc.h" -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define PFX "CNIC " -+ -+static const uip_ip6addr_t all_ones_addr6 = { -+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }; -+ -+/******************************************************************************* -+ * Constants shared between the bnx2 and bnx2x modules -+ ******************************************************************************/ -+const char bnx2i_library_transport_name[] = "bnx2i"; -+const size_t bnx2i_library_transport_name_size = -+ sizeof(bnx2i_library_transport_name); -+ -+/****************************************************************************** -+ * Netlink Functions -+ ******************************************************************************/ -+ -+static int cnic_arp_send(nic_t *nic, nic_interface_t *nic_iface, int fd, -+ __u8 *mac_addr, __u32 ip_addr, char *addr_str) -+{ -+ struct ether_header *eth; -+ struct ether_arp *arp; -+ __u32 dst_ip = ip_addr; -+ int pkt_size = sizeof(*eth) + sizeof(*arp); -+ int rc; -+ struct in_addr addr; -+ static const uint8_t multicast_mac[] = { -+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -+ -+ rc = pthread_mutex_trylock(&nic->xmit_mutex); -+ if (rc != 0) { -+ LOG_DEBUG(PFX "%s: could not get xmit_mutex", nic->log_name); -+ return -EAGAIN; -+ } -+ -+ eth = (*nic->ops->get_tx_pkt) (nic); -+ if (eth == NULL) { -+ LOG_WARN(PFX "%s: couldn't get tx packet", nic->log_name); -+ return -EAGAIN; -+ } -+ -+ nic_fill_ethernet_header(nic_iface, eth, -+ nic->mac_addr, (void *)multicast_mac, -+ &pkt_size, (void *)&arp, ETHERTYPE_ARP); -+ -+ arp->arp_hrd = htons(ARPHRD_ETHER); -+ arp->arp_pro = htons(ETHERTYPE_IP); -+ arp->arp_hln = ETH_ALEN; -+ arp->arp_pln = 4; -+ arp->arp_op = htons(ARPOP_REQUEST); -+ memcpy(arp->arp_sha, nic->mac_addr, ETH_ALEN); -+ memset(arp->arp_tha, 0, ETH_ALEN); -+ -+ /* Copy the IP address's into the ARP response */ -+ memcpy(arp->arp_spa, nic_iface->ustack.hostaddr, 4); -+ memcpy(arp->arp_tpa, &dst_ip, 4); -+ -+ (*nic->nic_library->ops->start_xmit) (nic, pkt_size, -+ (nic_iface->vlan_priority << 12) | -+ nic_iface->vlan_id); -+ -+ memcpy(&addr.s_addr, &dst_ip, sizeof(addr.s_addr)); -+ LOG_DEBUG(PFX "%s: Sent cnic arp request for IP: %s", -+ nic->log_name, addr_str); -+ -+ return 0; -+} -+ -+static int cnic_neigh_soliciation_send(nic_t *nic, -+ nic_interface_t *nic_iface, int fd, -+ __u8 *mac_addr, -+ struct in6_addr *addr6_dst, -+ char *addr_str) -+{ -+ struct ether_header *eth; -+ struct ip6_hdr *ipv6_hdr; -+ int rc, pkt_size; -+ char buf[INET6_ADDRSTRLEN]; -+ struct ndpc_reqptr req_ptr; -+ -+ rc = pthread_mutex_trylock(&nic->xmit_mutex); -+ if (rc != 0) { -+ LOG_WARN(PFX "%s: could not get xmit_mutex", nic->log_name); -+ return -EAGAIN; -+ } -+ -+ /* Build the ethernet header */ -+ eth = (*nic->ops->get_tx_pkt) (nic); -+ if (eth == NULL) { -+ LOG_WARN(PFX "%s: couldn't get tx packet", nic->log_name); -+ return -EAGAIN; -+ } -+ -+ /* Copy the requested target address to the ipv6.dst */ -+ ipv6_hdr = -+ (struct ip6_hdr *)((u8_t *) eth + sizeof(struct ether_header)); -+ -+ memcpy(ipv6_hdr->ip6_dst.s6_addr, addr6_dst->s6_addr, -+ sizeof(struct in6_addr)); -+ -+ nic_fill_ethernet_header(nic_iface, eth, nic->mac_addr, nic->mac_addr, -+ &pkt_size, (void *)&ipv6_hdr, ETHERTYPE_IPV6); -+ req_ptr.eth = (void *)eth; -+ req_ptr.ipv6 = (void *)ipv6_hdr; -+ if (ndpc_request(&nic_iface->ustack, &req_ptr, &pkt_size, -+ NEIGHBOR_SOLICIT)) -+ return -EAGAIN; -+ -+ /* Debug to print out the pkt context */ -+ inet_ntop(AF_INET6, ipv6_hdr->ip6_dst.s6_addr, buf, sizeof(buf)); -+ LOG_DEBUG(PFX "%s: ipv6 dst addr: %s", nic->log_name, buf); -+ LOG_DEBUG(PFX "neighbor sol content " -+ "dst mac %02x:%02x:%02x:%02x:%02x:%02x", -+ eth->ether_dhost[0], eth->ether_dhost[1], -+ eth->ether_dhost[2], eth->ether_dhost[3], -+ eth->ether_dhost[4], eth->ether_dhost[5]); -+ LOG_DEBUG(PFX "src mac %02x:%02x:%02x:%02x:%02x:%02x", -+ eth->ether_shost[0], eth->ether_shost[1], -+ eth->ether_shost[2], eth->ether_shost[3], -+ eth->ether_shost[4], eth->ether_shost[5]); -+ (*nic->nic_library->ops->start_xmit) (nic, pkt_size, -+ (nic_iface->vlan_priority << 12) | -+ nic_iface->vlan_id); -+ -+ LOG_DEBUG(PFX "%s: Sent cnic ICMPv6 neighbor request %s", -+ nic->log_name, addr_str); -+ -+ return 0; -+} -+ -+static int cnic_nl_neigh_rsp(nic_t *nic, int fd, -+ struct iscsi_uevent *ev, -+ struct iscsi_path *path_req, -+ __u8 *mac_addr, -+ nic_interface_t *nic_iface, int status, int type) -+{ -+ int rc; -+ uint8_t *ret_buf; -+ struct iscsi_uevent *ret_ev; -+ struct iscsi_path *path_rsp; -+ struct sockaddr_nl dest_addr; -+ char addr_dst_str[INET6_ADDRSTRLEN]; -+ -+ memset(&dest_addr, 0, sizeof(dest_addr)); -+ dest_addr.nl_family = AF_NETLINK; -+ dest_addr.nl_pid = 0; -+ dest_addr.nl_groups = 0; /* unicast */ -+ -+ ret_buf = calloc(1, NLMSG_SPACE(sizeof(struct iscsi_uevent) + 256)); -+ if (ret_buf == NULL) { -+ LOG_ERR(PFX "Could not allocate memory for path req resposne"); -+ return -ENOMEM; -+ } -+ -+ memset(ret_buf, 0, NLMSG_SPACE(sizeof(struct iscsi_uevent) + 256)); -+ -+ /* prepare the iscsi_uevent buffer */ -+ ret_ev = (struct iscsi_uevent *)ret_buf; -+ ret_ev->type = ISCSI_UEVENT_PATH_UPDATE; -+ ret_ev->transport_handle = ev->transport_handle; -+ ret_ev->u.set_path.host_no = ev->r.req_path.host_no; -+ -+ /* Prepare the iscsi_path buffer */ -+ path_rsp = (struct iscsi_path *)(ret_buf + sizeof(*ret_ev)); -+ path_rsp->handle = path_req->handle; -+ if (type == AF_INET) { -+ path_rsp->ip_addr_len = 4; -+ memcpy(&path_rsp->src.v4_addr, nic_iface->ustack.hostaddr, -+ sizeof(nic_iface->ustack.hostaddr)); -+ -+ inet_ntop(AF_INET, &path_rsp->src.v4_addr, -+ addr_dst_str, sizeof(addr_dst_str)); -+ } else { -+ u8_t *src_ipv6; -+ int ret; -+ -+ /* Depending on the IPv6 address of the target we will need to -+ * determine whether we use the assigned IPv6 address or the -+ * link local IPv6 address */ -+ if (ndpc_request(&nic_iface->ustack, &path_req->dst.v6_addr, -+ &ret, CHECK_LINK_LOCAL_ADDR)) { -+ src_ipv6 = (u8_t *)all_zeroes_addr6; -+ LOG_DEBUG(PFX "RSP Check LL failed"); -+ goto src_done; -+ } -+ if (ret) { -+ /* Get link local IPv6 address */ -+ src_ipv6 = (u8_t *)&nic_iface->ustack.linklocal6; -+ } else { -+ if (ndpc_request(&nic_iface->ustack, -+ &path_req->dst.v6_addr, -+ &src_ipv6, GET_HOST_ADDR)) { -+ src_ipv6 = (u8_t *)all_zeroes_addr6; -+ LOG_DEBUG(PFX "RSP Get host addr failed"); -+ } -+ if (src_ipv6 == NULL) { -+ src_ipv6 = (u8_t *)all_zeroes_addr6; -+ LOG_DEBUG(PFX "RSP no Best matched addr found"); -+ } -+ } -+src_done: -+ path_rsp->ip_addr_len = 16; -+ memcpy(&path_rsp->src.v6_addr, src_ipv6, -+ sizeof(nic_iface->ustack.hostaddr6)); -+ -+ inet_ntop(AF_INET6, &path_rsp->src.v6_addr, -+ addr_dst_str, sizeof(addr_dst_str)); -+ } -+ memcpy(path_rsp->mac_addr, mac_addr, 6); -+ path_rsp->vlan_id = (nic_iface->vlan_priority << 12) | -+ nic_iface->vlan_id; -+ path_rsp->pmtu = nic_iface->mtu ? nic_iface->mtu : path_req->pmtu; -+ -+ rc = __kipc_call(fd, ret_ev, sizeof(*ret_ev) + sizeof(*path_rsp)); -+ if (rc > 0) { -+ LOG_DEBUG(PFX "neighbor reply sent back to kernel " -+ "%s at %02x:%02x:%02x:%02x:%02x:%02x with vlan %d", -+ addr_dst_str, -+ mac_addr[0], mac_addr[1], -+ mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], -+ nic_iface->vlan_id); -+ -+ } else { -+ LOG_ERR(PFX "send neighbor reply failed: %d", rc); -+ } -+ -+ free(ret_buf); -+ -+ return rc; -+} -+ -+static const struct timeval tp_wait = { -+ .tv_sec = 0, -+ .tv_usec = 250000, -+}; -+ -+/** -+ * cnic_handle_ipv4_iscsi_path_req() - This function will handle the IPv4 -+ * path req calls the bnx2i kernel module -+ * @param nic - The nic the message is directed towards -+ * @param fd - The file descriptor to be used to extract the private data -+ * @param ev - The iscsi_uevent -+ * @param buf - The private message buffer -+ */ -+int cnic_handle_ipv4_iscsi_path_req(nic_t *nic, int fd, -+ struct iscsi_uevent *ev, -+ struct iscsi_path *path, -+ nic_interface_t *nic_iface) -+{ -+ struct in_addr src_addr, dst_addr, -+ src_matching_addr, dst_matching_addr, netmask; -+ __u8 mac_addr[6]; -+ int rc; -+ uint16_t arp_retry; -+ int status = 0; -+#define MAX_ARP_RETRY 4 -+ -+ memset(mac_addr, 0, sizeof(mac_addr)); -+ memcpy(&dst_addr, &path->dst.v4_addr, sizeof(dst_addr)); -+ memcpy(&src_addr, nic_iface->ustack.hostaddr, sizeof(src_addr)); -+ -+ if (nic_iface->ustack.netmask[0] | nic_iface->ustack.netmask[1]) -+ memcpy(&netmask.s_addr, nic_iface->ustack.netmask, -+ sizeof(src_addr)); -+ else -+ netmask.s_addr = calculate_default_netmask(dst_addr.s_addr); -+ -+ src_matching_addr.s_addr = src_addr.s_addr & netmask.s_addr; -+ dst_matching_addr.s_addr = dst_addr.s_addr & netmask.s_addr; -+ -+ LOG_DEBUG(PFX "%s: src=%s", nic->log_name, inet_ntoa(src_addr)); -+ LOG_DEBUG(PFX "%s: dst=%s", nic->log_name, inet_ntoa(dst_addr)); -+ LOG_DEBUG(PFX "%s: nm=%s", nic->log_name, inet_ntoa(netmask)); -+ if (src_matching_addr.s_addr != dst_matching_addr.s_addr) { -+ /* If there is an assigned gateway address then use it -+ * if the source address doesn't match */ -+ if (nic_iface->ustack.default_route_addr[0] | -+ nic_iface->ustack.default_route_addr[1]) { -+ memcpy(&dst_addr, -+ &nic_iface->ustack.default_route_addr, -+ sizeof(dst_addr)); -+ } else { -+ arp_retry = MAX_ARP_RETRY; -+ LOG_DEBUG(PFX "%s: no default", nic->log_name); -+ goto done; -+ } -+ } -+ arp_retry = 0; -+ -+ rc = uip_lookup_arp_entry(dst_addr.s_addr, mac_addr); -+ if (rc != 0) { -+ while ((arp_retry < MAX_ARP_RETRY) && (event_loop_stop == 0)) { -+ char *dst_addr_str; -+ int count; -+ struct timespec ts; -+ struct timeval tp; -+ struct timeval tp_abs; -+ -+ dst_addr_str = inet_ntoa(dst_addr); -+ -+ LOG_INFO(PFX "%s: Didn't find IPv4: '%s' in ARP table", -+ nic->log_name, dst_addr_str); -+ rc = cnic_arp_send(nic, nic_iface, fd, -+ mac_addr, -+ dst_addr.s_addr, dst_addr_str); -+ if (rc != 0) { -+ status = -EIO; -+ goto done; -+ } -+ -+ for (count = 0; count < 8; count++) { -+ /* Convert from timeval to timespec */ -+ rc = gettimeofday(&tp, NULL); -+ -+ timeradd(&tp, &tp_wait, &tp_abs); -+ -+ ts.tv_sec = tp_abs.tv_sec; -+ ts.tv_nsec = tp_abs.tv_usec * 1000; -+ -+ /* Wait 1s for if_down */ -+ pthread_mutex_lock(&nic->nl_process_mutex); -+ rc = pthread_cond_timedwait -+ (&nic->nl_process_if_down_cond, -+ &nic->nl_process_mutex, &ts); -+ -+ if (rc == ETIMEDOUT) { -+ pthread_mutex_unlock -+ (&nic->nl_process_mutex); -+ -+ rc = uip_lookup_arp_entry(dst_addr. -+ s_addr, -+ mac_addr); -+ if (rc == 0) -+ goto done; -+ } else { -+ nic->nl_process_if_down = 0; -+ pthread_mutex_unlock -+ (&nic->nl_process_mutex); -+ -+ arp_retry = MAX_ARP_RETRY; -+ goto done; -+ -+ } -+ } -+ -+ arp_retry++; -+ } -+ } -+ -+done: -+ -+ if (arp_retry >= MAX_ARP_RETRY) { -+ status = -EIO; -+ rc = -EIO; -+ } -+ -+ if (status != 0 || rc != 0) -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ -+ cnic_nl_neigh_rsp(nic, fd, ev, path, mac_addr, -+ nic_iface, status, AF_INET); -+ -+ return rc; -+} -+ -+/** -+ * cnic_handle_ipv6_iscsi_path_req() - This function will handle the IPv4 -+ * path req calls the bnx2i kernel module -+ * @param nic - The nic the message is directed towards -+ * @param fd - The file descriptor to be used to extract the private data -+ * @param ev - The iscsi_uevent -+ * @param buf - The private message buffer -+ */ -+int cnic_handle_ipv6_iscsi_path_req(nic_t *nic, int fd, -+ struct iscsi_uevent *ev, -+ struct iscsi_path *path, -+ nic_interface_t *nic_iface) -+{ -+ __u8 mac_addr[6]; -+ int rc, i; -+ uint16_t neighbor_retry; -+ int status = 0; -+ char addr_dst_str[INET6_ADDRSTRLEN]; -+ struct in6_addr src_addr, dst_addr, -+ src_matching_addr, dst_matching_addr, netmask; -+ struct in6_addr *addr; -+ struct ndpc_reqptr req_ptr; -+ -+ memset(mac_addr, 0, sizeof(mac_addr)); -+ -+ inet_ntop(AF_INET6, &path->dst.v6_addr, -+ addr_dst_str, sizeof(addr_dst_str)); -+ -+ /* Depending on the IPv6 address of the target we will need to -+ * determine whether we use the assigned IPv6 address or the -+ * link local IPv6 address */ -+ memcpy(&dst_addr, &path->dst.v6_addr, sizeof(struct in6_addr)); -+ if (ndpc_request(&nic_iface->ustack, &dst_addr, -+ &rc, CHECK_LINK_LOCAL_ADDR)) { -+ neighbor_retry = MAX_ARP_RETRY; -+ LOG_DEBUG(PFX "Check LL failed"); -+ goto done; -+ } -+ if (rc) { -+ LOG_DEBUG(PFX "Use LL"); -+ /* Get link local IPv6 address */ -+ addr = (struct in6_addr *)&nic_iface->ustack.linklocal6; -+ } else { -+ LOG_DEBUG(PFX "Use Best matched"); -+ if (ndpc_request(&nic_iface->ustack, -+ &dst_addr, -+ &addr, GET_HOST_ADDR)) { -+ neighbor_retry = MAX_ARP_RETRY; -+ LOG_DEBUG(PFX "Use Best matched failed"); -+ goto done; -+ } -+ if (addr == NULL) { -+ neighbor_retry = MAX_ARP_RETRY; -+ LOG_DEBUG(PFX "No Best matched found"); -+ goto done; -+ } -+ } -+ /* Got the best matched src IP address */ -+ memcpy(&src_addr, addr, sizeof(struct in6_addr)); -+ -+ if (nic_iface->ustack.netmask6[0] | nic_iface->ustack.netmask6[1] | -+ nic_iface->ustack.netmask6[2] | nic_iface->ustack.netmask6[3] | -+ nic_iface->ustack.netmask6[4] | nic_iface->ustack.netmask6[5] | -+ nic_iface->ustack.netmask6[6] | nic_iface->ustack.netmask6[7]) -+ memcpy(&netmask.s6_addr, nic_iface->ustack.netmask6, -+ sizeof(struct in6_addr)); -+ else -+ memcpy(&netmask.s6_addr, all_zeroes_addr6, -+ sizeof(struct in6_addr)); -+ -+ inet_ntop(AF_INET6, &src_addr.s6_addr16, addr_dst_str, -+ sizeof(addr_dst_str)); -+ LOG_DEBUG(PFX "src IP addr %s", addr_dst_str); -+ inet_ntop(AF_INET6, &dst_addr.s6_addr16, addr_dst_str, -+ sizeof(addr_dst_str)); -+ LOG_DEBUG(PFX "dst IP addr %s", addr_dst_str); -+ inet_ntop(AF_INET6, &netmask.s6_addr16, addr_dst_str, -+ sizeof(addr_dst_str)); -+ LOG_DEBUG(PFX "prefix mask %s", addr_dst_str); -+ -+ for (i = 0; i < 4; i++) { -+ src_matching_addr.s6_addr32[i] = src_addr.s6_addr32[i] & -+ netmask.s6_addr32[i]; -+ dst_matching_addr.s6_addr32[i] = dst_addr.s6_addr32[i] & -+ netmask.s6_addr32[i]; -+ if (src_matching_addr.s6_addr32[i] != -+ dst_matching_addr.s6_addr32[i]) { -+ /* No match with the prefix mask, use default route */ -+ if (memcmp(nic_iface->ustack.default_route_addr6, -+ all_zeroes_addr6, sizeof(*addr))) { -+ memcpy(&dst_addr, -+ nic_iface->ustack.default_route_addr6, -+ sizeof(dst_addr)); -+ inet_ntop(AF_INET6, &dst_addr.s6_addr16, -+ addr_dst_str, sizeof(addr_dst_str)); -+ LOG_DEBUG(PFX "Use default router IP addr %s", -+ addr_dst_str); -+ break; -+ } else { -+ neighbor_retry = MAX_ARP_RETRY; -+ goto done; -+ } -+ } -+ } -+ -+#define MAX_ARP_RETRY 4 -+ neighbor_retry = 0; -+ -+ req_ptr.eth = (void *)mac_addr; -+ req_ptr.ipv6 = (void *)&dst_addr; -+ if (ndpc_request(&nic_iface->ustack, &req_ptr, &rc, CHECK_ARP_TABLE)) { -+ /* ndpc request failed, skip neighbor solicit send */ -+ neighbor_retry = MAX_ARP_RETRY; -+ goto done; -+ } -+ if (!rc) { -+ inet_ntop(AF_INET6, &dst_addr.s6_addr16, -+ addr_dst_str, sizeof(addr_dst_str)); -+ LOG_DEBUG(PFX -+ "%s: Preparing to send IPv6 neighbor solicitation " -+ "to dst: '%s'", nic->log_name, addr_dst_str); -+ while ((neighbor_retry < MAX_ARP_RETRY) -+ && (event_loop_stop == 0)) { -+ int count; -+ struct timespec ts; -+ struct timeval tp; -+ struct timeval tp_abs; -+ -+ LOG_INFO(PFX "%s: Didn't find IPv6: '%s'\n", -+ nic->log_name, addr_dst_str); -+ -+ rc = cnic_neigh_soliciation_send(nic, nic_iface, fd, -+ mac_addr, -+ &dst_addr, -+ addr_dst_str); -+ if (rc != 0) { -+ status = -EIO; -+ goto done; -+ } -+ -+ for (count = 0; count < 8; count++) { -+ /* Convert from timeval to timespec */ -+ rc = gettimeofday(&tp, NULL); -+ -+ timeradd(&tp, &tp_wait, &tp_abs); -+ -+ ts.tv_sec = tp_abs.tv_sec; -+ ts.tv_nsec = tp_abs.tv_usec * 1000; -+ -+ pthread_mutex_lock(&nic->nl_process_mutex); -+ rc = pthread_cond_timedwait -+ (&nic->nl_process_if_down_cond, -+ &nic->nl_process_mutex, &ts); -+ -+ if (rc == ETIMEDOUT) { -+ pthread_mutex_unlock -+ (&nic->nl_process_mutex); -+ -+ req_ptr.eth = (void *)mac_addr; -+ req_ptr.ipv6 = (void *)&dst_addr; -+ if (ndpc_request -+ (&nic_iface->ustack, &req_ptr, &rc, -+ CHECK_ARP_TABLE)) { -+ /* ndpc request failed, -+ force retry */ -+ rc = 0; -+ } -+ if (rc) -+ goto done; -+ } else { -+ nic->nl_process_if_down = 0; -+ pthread_mutex_unlock -+ (&nic->nl_process_mutex); -+ -+ neighbor_retry = MAX_ARP_RETRY; -+ goto done; -+ } -+ } -+ neighbor_retry++; -+ } -+ } -+ -+done: -+ if (neighbor_retry >= MAX_ARP_RETRY) { -+ status = -EIO; -+ rc = -EIO; -+ } -+ -+ if (status != 0 || rc != 0) -+ pthread_mutex_unlock(&nic->xmit_mutex); -+ -+ cnic_nl_neigh_rsp(nic, fd, ev, path, mac_addr, -+ nic_iface, status, AF_INET6); -+ return rc; -+} -+ -+/** -+ * cnic_handle_iscsi_path_req() - This function will handle the path req calls -+ * the bnx2i kernel module -+ * @param nic - The nic the message is directed towards -+ * @param fd - The file descriptor to be used to extract the private data -+ * @param ev - The iscsi_uevent -+ * @param path - The private message buffer -+ * @param nic_iface - The nic_iface to use for this connection request -+ */ -+int cnic_handle_iscsi_path_req(nic_t *nic, int fd, struct iscsi_uevent *ev, -+ struct iscsi_path *path, -+ nic_interface_t *nic_iface) -+{ -+ -+ LOG_DEBUG(PFX "%s: Netlink message with VLAN ID: %d, path MTU: %d " -+ "minor: %d ip_addr_len: %d", -+ nic->log_name, path->vlan_id, path->pmtu, 0 /* TODO FIX */ , -+ path->ip_addr_len); -+ -+ if (path->ip_addr_len == 4) -+ return cnic_handle_ipv4_iscsi_path_req(nic, fd, ev, path, -+ nic_iface); -+ else if (path->ip_addr_len == 16) -+ return cnic_handle_ipv6_iscsi_path_req(nic, fd, ev, path, -+ nic_iface); -+ else { -+ LOG_DEBUG(PFX "%s: unknown ip_addr_len: %d size dropping ", -+ nic->log_name, path->ip_addr_len); -+ return -EIO; -+ } -+} -diff --git a/iscsiuio/src/unix/libs/cnic.h b/iscsiuio/src/unix/libs/cnic.h -new file mode 100644 -index 0000000..3e53307 ---- /dev/null -+++ b/iscsiuio/src/unix/libs/cnic.h -@@ -0,0 +1,54 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * cnic.h - CNIC UIO uIP user space stack -+ * -+ */ -+#ifndef __CNIC_NL_H__ -+#define __CNIC_NL_H__ -+ -+/******************************************************************************* -+ * Constants shared between the bnx2 and bnx2x modules -+ ******************************************************************************/ -+extern const char bnx2i_library_transport_name[]; -+extern const size_t bnx2i_library_transport_name_size; -+ -+int cnic_nl_open(); -+void cnic_nl_close(); -+ -+int cnic_handle_iscsi_path_req(nic_t *nic, int, struct iscsi_uevent *, -+ struct iscsi_path *path, -+ nic_interface_t *nic_iface); -+ -+#endif /* __CNIC_NL_H__ */ -diff --git a/iscsiuio/src/unix/logger.c b/iscsiuio/src/unix/logger.c -new file mode 100644 -index 0000000..1a65793 ---- /dev/null -+++ b/iscsiuio/src/unix/logger.c -@@ -0,0 +1,180 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * logger.c - Logging Utilities -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+ -+#include "options.h" -+#include "logger.h" -+ -+/****************************************************************************** -+ * Default logger values -+ ******************************************************************************/ -+static const char default_logger_filename[] = "/var/log/iscsiuio.log"; -+ -+struct logger main_log = { -+ .enabled = LOGGER_ENABLED, -+ .fp = NULL, -+ .log_file = (char *)default_logger_filename, -+ .level = LOG_LEVEL_INFO, -+ .lock = PTHREAD_MUTEX_INITIALIZER, -+ -+ .stats = { -+ .debug = 0, -+ .info = 0, -+ .warn = 0, -+ .error = 0, -+ -+ .last_log_time = 0, -+ }, -+}; -+ -+/****************************************************************************** -+ * Logger Functions -+ ******************************************************************************/ -+/** -+ * log_uip() - Main logging function -+ * @param level_str - log level string -+ * @param fmt - log format -+ */ -+void log_uip(char *level_str, char *fmt, ...) -+{ -+ char time_buf[32]; -+ va_list ap, ap2; -+ -+ pthread_mutex_lock(&main_log.lock); -+ va_start(ap, fmt); -+ -+ if (main_log.fp == NULL) -+ goto end; -+ -+ main_log.stats.last_log_time = time(NULL); -+ strftime(time_buf, 26, "%a %b %d %T %Y", -+ localtime(&main_log.stats.last_log_time)); -+ va_copy(ap2, ap); -+ -+ if (main_log.enabled == LOGGER_ENABLED) { -+ fprintf(main_log.fp, "%s [%s]", level_str, time_buf); -+ vfprintf(main_log.fp, fmt, ap); -+ fprintf(main_log.fp, "\n"); -+ } -+ -+ if (opt.debug == DEBUG_ON) { -+ fprintf(stdout, "%s [%s]", level_str, time_buf); -+ vfprintf(stdout, fmt, ap2); -+ fprintf(stdout, "\n"); -+ -+ /* Force the printing of the log file */ -+ fflush(main_log.fp); -+ -+ /* Force the printing of the log out to standard output */ -+ fflush(stdout); -+ } -+ -+end: -+ va_end(ap2); -+ va_end(ap); -+ pthread_mutex_unlock(&main_log.lock); -+} -+ -+/****************************************************************************** -+ * Initialize/Clean up routines -+ ******************************************************************************/ -+/** -+ * init_logger() - Prepare the logger -+ * @param filename - path to where the log will be written to -+ * @return 0 on success, <0 on failure -+ */ -+int init_logger(char *filename) -+{ -+ int rc = 0; -+ -+ pthread_mutex_lock(&main_log.lock); -+ -+ if (opt.debug != DEBUG_ON) { -+ rc = -EIO; -+ goto disable; -+ } -+ main_log.fp = fopen(filename, "a"); -+ if (main_log.fp == NULL) { -+ printf("Could not create log file: %s <%s>\n", -+ filename, strerror(errno)); -+ rc = -EIO; -+ } -+disable: -+ if (rc) -+ main_log.enabled = LOGGER_DISABLED; -+ else -+ main_log.enabled = LOGGER_ENABLED; -+ -+ pthread_mutex_unlock(&main_log.lock); -+ -+ if (!rc) -+ LOG_INFO("Initialize logger using log file: %s", filename); -+ -+ return rc; -+} -+ -+void fini_logger(int type) -+{ -+ pthread_mutex_lock(&main_log.lock); -+ -+ if (main_log.fp != NULL) { -+ fclose(main_log.fp); -+ main_log.fp = NULL; -+ -+ if (opt.debug == DEBUG_ON) { -+ printf("Closed logger\n"); -+ fflush(stdout); -+ } -+ } -+ -+ if (type == SHUTDOWN_LOGGER) { -+ if ((main_log.log_file != NULL) && -+ (main_log.log_file != default_logger_filename)) { -+ free(main_log.log_file); -+ main_log.log_file = NULL; -+ } -+ } -+ -+ main_log.enabled = LOGGER_DISABLED; -+ -+ pthread_mutex_unlock(&main_log.lock); -+} -diff --git a/iscsiuio/src/unix/logger.h b/iscsiuio/src/unix/logger.h -new file mode 100644 -index 0000000..edf85ae ---- /dev/null -+++ b/iscsiuio/src/unix/logger.h -@@ -0,0 +1,128 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * logger.h - Logging Utilities -+ * -+ */ -+#ifndef __LOGGER_H__ -+#define __LOGGER_H__ -+ -+#include -+#include -+#include -+#include -+#include -+ -+/******************************************************************************* -+ * Logger Levels -+ ******************************************************************************/ -+#define LOG_LEVEL_PACKET 5 -+#define LOG_LEVEL_DEBUG 4 -+#define LOG_LEVEL_INFO 3 -+#define LOG_LEVEL_WARN 2 -+#define LOG_LEVEL_ERR 1 -+#define LOG_LEVEL_UNKNOWN 0 -+ -+#define LOG_LEVEL_PACKET_STR "PKT " -+#define LOG_LEVEL_DEBUG_STR "DBG " -+#define LOG_LEVEL_INFO_STR "INFO " -+#define LOG_LEVEL_WARN_STR "WARN " -+#define LOG_LEVEL_ERR_STR "ERR " -+#define LOG_LEVEL_UNKNOWN_STR "? " -+ -+/******************************************************************************* -+ * Logging Macro's -+ ******************************************************************************/ -+#define LOG_PACKET(fmt, args...) { if (LOG_LEVEL_PACKET <= \ -+ main_log.level) { \ -+ log_uip(LOG_LEVEL_PACKET_STR, fmt,\ -+ ##args);\ -+ } } -+#define LOG_DEBUG(fmt, args...) { if (LOG_LEVEL_DEBUG <= main_log.level) { \ -+ log_uip(LOG_LEVEL_DEBUG_STR, fmt,\ -+ ##args);\ -+ } } -+ -+#define LOG_INFO(fmt, args...) { if (LOG_LEVEL_INFO <= main_log.level) { \ -+ log_uip(LOG_LEVEL_INFO_STR, fmt,\ -+ ##args); \ -+ } } -+#define LOG_WARN(fmt, args...) { if (LOG_LEVEL_WARN <= main_log.level) { \ -+ log_uip(LOG_LEVEL_WARN_STR, fmt,\ -+ ##args); \ -+ } } -+#define LOG_ERR(fmt, args...) { if (LOG_LEVEL_ERR <= main_log.level) { \ -+ log_uip(LOG_LEVEL_ERR_STR, fmt,\ -+ ##args); \ -+ } } -+ -+/******************************************************************************* -+ * Logging Statistics -+ ******************************************************************************/ -+struct logger_stats { -+ uint64_t debug; -+ uint64_t info; -+ uint64_t warn; -+ uint64_t error; -+ -+ time_t last_log_time; -+}; -+ -+/******************************************************************************* -+ * Logger Structure -+ ******************************************************************************/ -+struct logger { -+ FILE *fp; -+ char *log_file; -+ int8_t level; -+ -+#define LOGGER_ENABLED 0x01 -+#define LOGGER_DISABLED 0x02 -+ int8_t enabled; -+ -+ pthread_mutex_t lock; -+ -+ struct logger_stats stats; -+}; -+ -+extern struct logger main_log; -+ -+int init_logger(char *); -+void log_uip(char *level_str, char *fmt, ...); -+void fini_logger(int); -+ -+#define CLOSE_LOGGER 0x01 -+#define SHUTDOWN_LOGGER 0x02 -+ -+#endif -diff --git a/iscsiuio/src/unix/main.c b/iscsiuio/src/unix/main.c -new file mode 100644 -index 0000000..340e275 ---- /dev/null -+++ b/iscsiuio/src/unix/main.c -@@ -0,0 +1,397 @@ -+/* -+ * Copyright (c) 2001, Adam Dunkels. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * This file is part of the uIP TCP/IP stack. -+ * -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "uip.h" -+#include "uip_arp.h" -+#include "uip_eth.h" -+ -+#include "timer.h" -+ -+#include "build_date.h" -+#include "config.h" -+#include "iscsid_ipc.h" -+#include "logger.h" -+#include "nic.h" -+#include "nic_id.h" -+#include "nic_nl.h" -+#include "nic_utils.h" -+#include "options.h" -+#include "packet.h" -+ -+#include "dhcpc.h" -+ -+#include "iscsid_ipc.h" -+#include "brcm_iscsi.h" -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define PFX "main " -+ -+static const char default_pid_filepath[] = "/var/run/iscsiuio.pid"; -+ -+/******************************************************************************* -+ * Global Variables -+ ******************************************************************************/ -+static const struct option long_options[] = { -+ {"debug", 0, 0, 0}, -+ {"version", 0, 0, 0}, -+ {"help", 0, 0, 0}, -+ {0, 0, 0, 0} -+}; -+ -+struct options opt = { -+ .debug = DEBUG_OFF, -+}; -+ -+int event_loop_stop; -+extern nic_t *nic_list; -+ -+struct utsname cur_utsname; -+ -+/** -+ * cleanup() - This function is called when this program is to be closed -+ * This function will clean up all the cnic uio interfaces and -+ * flush/close the logger -+ */ -+static void cleanup() -+{ -+ iscsid_cleanup(); -+ -+ nic_remove_all(); -+ -+ unload_all_nic_libraries(); -+ -+ LOG_INFO("Done waiting for cnic's/stacks to gracefully close"); -+ -+ fini_logger(SHUTDOWN_LOGGER); -+} -+ -+/** -+ * signal_handle_thread() - This is the signal handling thread of this program -+ * This is the only thread which will handle signals. -+ * All signals are routed here and handled here to -+ * provide consistant handling. -+ */ -+static pthread_t signal_thread; -+static void *signal_handle_thread(void *arg) -+{ -+ sigset_t set; -+ int rc; -+ int signal; -+ -+ sigfillset(&set); -+ -+ LOG_INFO("signal handling thread ready"); -+ -+signal_wait: -+ rc = sigwait(&set, &signal); -+ -+ switch (signal) { -+ case SIGINT: -+ LOG_INFO("Caught SIGINT signal"); -+ break; -+ case SIGUSR1: -+ LOG_INFO("Caught SIGUSR1 signal, rotate log"); -+ fini_logger(SHUTDOWN_LOGGER); -+ rc = init_logger(main_log.log_file); -+ if (rc != 0) -+ printf("Could not initialize the logger in " -+ "signal!\n"); -+ goto signal_wait; -+ default: -+ break; -+ } -+ event_loop_stop = 1; -+ -+ LOG_INFO("terminating..."); -+ -+ cleanup(); -+ exit(EXIT_SUCCESS); -+} -+ -+static void show_version() -+{ -+ printf("%s: Version '%s', Build Date: '%s'\n", -+ APP_NAME, PACKAGE_VERSION, build_date); -+} -+ -+static void main_usage() -+{ -+ show_version(); -+ -+ printf("\nUsage: %s [OPTION]\n", APP_NAME); -+ printf("iscsiuio daemon.\n" -+ "-f, --foreground make the program run in the foreground\n" -+ "-d, --debug debuglevel print debugging information\n" -+ "-p, --pid=pidfile use pid file (default %s).\n" -+ "-h, --help display this help and exit\n" -+ "-v, --version display version and exit\n", -+ default_pid_filepath); -+} -+ -+static void daemon_init() -+{ -+ int fd; -+ int rc; -+ -+ fd = open("/dev/null", O_RDWR); -+ if (fd == -1) -+ exit(-1); -+ -+ dup2(fd, 0); -+ dup2(fd, 1); -+ dup2(fd, 2); -+ setsid(); -+ rc = chdir("/"); -+} -+ -+#define ISCSI_OOM_PATH_LEN 48 -+ -+int oom_adjust(void) -+{ -+ int fd; -+ char path[ISCSI_OOM_PATH_LEN]; -+ struct stat statb; -+ -+ if (nice(-10) < 0) -+ LOG_DEBUG("Could not increase process priority: %s", -+ strerror(errno)); -+ -+ snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_score_adj", getpid()); -+ if (stat(path, &statb)) { -+ /* older kernel so use old oom_adj file */ -+ snprintf(path, ISCSI_OOM_PATH_LEN, "/proc/%d/oom_adj", -+ getpid()); -+ } -+ fd = open(path, O_WRONLY); -+ if (fd < 0) -+ return -1; -+ if (write(fd, "-16", 3) < 0) /* for 2.6.11 */ -+ LOG_DEBUG("Could not set oom score to -16: %s", -+ strerror(errno)); -+ if (write(fd, "-17", 3) < 0) /* for Andrea's patch */ -+ LOG_DEBUG("Could not set oom score to -17: %s", -+ strerror(errno)); -+ close(fd); -+ return 0; -+} -+ -+ -+/******************************************************************************* -+ * Main routine -+ ******************************************************************************/ -+int main(int argc, char *argv[]) -+{ -+ int rc; -+ sigset_t set; -+ char *pid_file = default_pid_filepath; -+ int fd; -+ int foreground = 0; -+ pid_t pid; -+ -+ /* Record the start time for the user space daemon */ -+ opt.start_time = time(NULL); -+ -+ /* parse the parameters */ -+ while (1) { -+ int c, option_index; -+ -+ c = getopt_long(argc, argv, "fd:p:vh", -+ long_options, &option_index); -+ -+ if (c == -1) -+ break; -+ -+ switch (c) { -+ -+ case 'f': -+ foreground = 1; -+ break; -+ -+ /* Enable debugging mode */ -+ case 'd': -+ main_log.level = atoi(optarg); -+ opt.debug = DEBUG_ON; -+ break; -+ case 'p': -+ pid_file = optarg; -+ break; -+ case 'v': -+ show_version(); -+ exit(EXIT_SUCCESS); -+ case 'h': -+ default: -+ main_usage(); -+ exit(EXIT_SUCCESS); -+ } -+ } -+ -+ if (main_log.enabled == LOGGER_ENABLED) { -+ /* initialize the logger */ -+ rc = init_logger(main_log.log_file); -+ if (rc != 0 && opt.debug == DEBUG_ON) -+ printf("WARN: Could not initialize the logger\n"); -+ } -+ -+ LOG_INFO("Started iSCSI uio stack: Ver " PACKAGE_VERSION); -+ LOG_INFO("Build date: %s", build_date); -+ -+ if (opt.debug == DEBUG_ON) -+ LOG_INFO("Debug mode enabled"); -+ -+ event_loop_stop = 0; -+ nic_list = NULL; -+ -+ /* Determine the current kernel version */ -+ memset(&cur_utsname, 0, sizeof(cur_utsname)); -+ -+ rc = uname(&cur_utsname); -+ if (rc == 0) { -+ LOG_INFO("Running on sysname: '%s', release: '%s', " -+ "version '%s' machine: '%s'", -+ cur_utsname.sysname, cur_utsname.release, -+ cur_utsname.version, cur_utsname.machine); -+ } else -+ LOG_WARN("Could not determine kernel version"); -+ -+ /* Initialze the iscsid listener */ -+ rc = iscsid_init(); -+ if (rc != 0) -+ goto error; -+ -+ if (!foreground) { -+ char buf[64]; -+ ssize_t written_bytes; -+ -+ fd = open(pid_file, O_WRONLY | O_CREAT, 0644); -+ if (fd < 0) { -+ printf("Unable to create pid file: %s", pid_file); -+ exit(1); -+ } -+ -+ pid = fork(); -+ if (pid < 0) { -+ printf("Starting daemon failed"); -+ exit(1); -+ } else if (pid) { -+ exit(0); -+ } -+ -+ rc = chdir("/"); -+ if (rc == -1) -+ printf("Unable to chdir(\") [%s]", strerror(errno)); -+ -+ if (lockf(fd, F_TLOCK, 0) < 0) { -+ printf("Unable to lock pid file: %s [%s]", -+ pid_file, strerror(errno)); -+ exit(1); -+ } -+ -+ rc = ftruncate(fd, 0); -+ if (rc == -1) -+ printf("ftruncate(%d, 0) failed [%s]", -+ fd, strerror(errno)); -+ -+ sprintf(buf, "%d\n", getpid()); -+ written_bytes = write(fd, buf, strlen(buf)); -+ if (written_bytes == -1) -+ printf("Could not write lock file [%s]", -+ strerror(errno)); -+ -+ daemon_init(); -+ } -+ -+ /* Load the NIC libraries */ -+ rc = load_all_nic_libraries(); -+ if (rc != 0) -+ goto error; -+ -+ brcm_iscsi_init(); -+ -+ /* ensure we don't see any signals */ -+ sigemptyset(&set); -+ sigaddset(&set, SIGINT); -+ sigaddset(&set, SIGQUIT); -+ sigaddset(&set, SIGTERM); -+ sigaddset(&set, SIGUSR1); -+ rc = pthread_sigmask(SIG_SETMASK, &set, NULL); -+ -+ /* Spin off the signal handling thread */ -+ rc = pthread_create(&signal_thread, NULL, signal_handle_thread, NULL); -+ if (rc != 0) -+ LOG_ERR("Could not create signal handling thread"); -+ -+ /* Using sysfs to discover iSCSI hosts */ -+ nic_discover_iscsi_hosts(); -+ -+ /* oom-killer will not kill us at the night... */ -+ if (oom_adjust()) -+ LOG_DEBUG("Can not adjust oom-killer's pardon"); -+ -+ /* we don't want our active sessions to be paged out... */ -+ if (mlockall(MCL_CURRENT | MCL_FUTURE)) { -+ LOG_ERR("failed to mlockall, exiting..."); -+ goto error; -+ } -+ -+ /* Start the iscsid listener */ -+ rc = iscsid_start(); -+ if (rc != 0) -+ goto error; -+ -+ /* NetLink connection to listen to NETLINK_ISCSI private messages */ -+ nic_nl_open(); -+ -+error: -+ cleanup(); -+ exit(EXIT_FAILURE); -+} -diff --git a/iscsiuio/src/unix/nic.c b/iscsiuio/src/unix/nic.c -new file mode 100644 -index 0000000..457797d ---- /dev/null -+++ b/iscsiuio/src/unix/nic.c -@@ -0,0 +1,1551 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic.c - Generic NIC management/utility functions -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "dhcpc.h" -+#include "ipv6_ndpc.h" -+ -+#include "logger.h" -+#include "nic.h" -+#include "nic_utils.h" -+#include "options.h" -+ -+#include "uip.h" -+#include "uip_arp.h" -+#include "uip_eth.h" -+#include "uip-neighbor.h" -+ -+#include "bnx2.h" -+#include "bnx2x.h" -+#include "ipv6.h" -+ -+/****************************************************************************** -+ * Constants -+ *****************************************************************************/ -+#define PFX "nic " -+#define PCI_ANY_ID (~0) -+ -+/****************************************************************************** -+ * Global variables -+ *****************************************************************************/ -+/* Used to store a list of NIC libraries */ -+pthread_mutex_t nic_lib_list_mutex = PTHREAD_MUTEX_INITIALIZER; -+nic_lib_handle_t *nic_lib_list; -+ -+/* Used to store a list of active cnic devices */ -+pthread_mutex_t nic_list_mutex = PTHREAD_MUTEX_INITIALIZER; -+nic_t *nic_list; -+ -+/****************************************************************************** -+ * Functions to handle NIC libraries -+ *****************************************************************************/ -+/** -+ * alloc_nic_library_handle() - Used to allocate a NIC library handle -+ * @return NULL if memory couldn't be allocated, pointer to the handle -+ * to the NIC library handle -+ */ -+static nic_lib_handle_t *alloc_nic_library_handle() -+{ -+ nic_lib_handle_t *handle; -+ -+ handle = malloc(sizeof(*handle)); -+ if (handle == NULL) { -+ LOG_ERR("Could not allocate memory for library handle"); -+ return NULL; -+ } -+ -+ memset(handle, 0, sizeof(*handle)); -+ handle->ops = NULL; -+ -+ pthread_mutex_init(&handle->mutex, NULL); -+ -+ return handle; -+} -+ -+static void free_nic_library_handle(nic_lib_handle_t *handle) -+{ -+ free(handle); -+} -+ -+/** -+ * load_nic_library() - This function is used to load a NIC library -+ * @param handle - This is the library handle to load -+ * @return 0 = Success; <0 = failure -+ */ -+static int load_nic_library(nic_lib_handle_t *handle) -+{ -+ int rc; -+ char *library_name; -+ size_t library_name_size; -+ char *library_version; -+ size_t library_version_size; -+ char *build_date_str; -+ size_t build_date_str_size; -+ -+ pthread_mutex_lock(&handle->mutex); -+ -+ /* Validate the NIC ops table ensure that all the fields are not NULL */ -+ if ((handle->ops->open) == NULL || -+ (handle->ops->close) == NULL || -+ (handle->ops->read) == NULL || -+ (handle->ops->write) == NULL || -+ (handle->ops->clear_tx_intr == NULL)) { -+ LOG_ERR("Invalid NIC ops table: open: 0x%x, close: 0x%x," -+ "read: 0x%x, write: 0x%x clear_tx_intr: 0x%x " -+ "lib_ops: 0x%x", -+ handle->ops->open, handle->ops->close, -+ handle->ops->read, handle->ops->write, -+ handle->ops->clear_tx_intr, handle->ops->lib_ops); -+ rc = -EINVAL; -+ handle->ops = NULL; -+ goto error; -+ } -+ -+ /* Validate the NIC library ops table to ensure that all the proper -+ * fields are filled */ -+ if ((handle->ops->lib_ops.get_library_name == NULL) || -+ (handle->ops->lib_ops.get_pci_table == NULL) || -+ (handle->ops->lib_ops.get_library_version == NULL) || -+ (handle->ops->lib_ops.get_build_date == NULL) || -+ (handle->ops->lib_ops.get_transport_name == NULL)) { -+ rc = -EINVAL; -+ goto error; -+ } -+ -+ (*handle->ops->lib_ops.get_library_name) (&library_name, -+ &library_name_size); -+ (*handle->ops->lib_ops.get_library_version) (&library_version, -+ &library_version_size); -+ (*handle->ops->lib_ops.get_build_date) (&build_date_str, -+ &build_date_str_size); -+ -+ LOG_DEBUG("Loaded nic library '%s' Version: '%s' build on %s'", -+ library_name, library_version, build_date_str); -+ -+ pthread_mutex_unlock(&handle->mutex); -+ -+ return 0; -+ -+error: -+ pthread_mutex_unlock(&handle->mutex); -+ -+ return rc; -+} -+ -+static struct nic_ops *(*nic_get_ops[]) () = { -+bnx2_get_ops, bnx2x_get_ops,}; -+ -+int load_all_nic_libraries() -+{ -+ int rc, i = 0; -+ nic_lib_handle_t *handle; -+ -+ for (i = 0; i < sizeof(nic_get_ops) / sizeof(nic_get_ops[0]); i++) { -+ /* Add the CNIC library */ -+ handle = alloc_nic_library_handle(); -+ if (handle == NULL) { -+ LOG_ERR("Could not allocate memory for CNIC nic lib"); -+ return -ENOMEM; -+ } -+ -+ handle->ops = (*nic_get_ops[i]) (); -+ -+ rc = load_nic_library(handle); -+ if (rc != 0) { -+ free_nic_library_handle(handle); -+ return rc; -+ } -+ /* Add the CNIC library to the list of library handles */ -+ pthread_mutex_lock(&nic_lib_list_mutex); -+ -+ /* Add this library to the list of nic libraries we -+ * know about */ -+ if (nic_lib_list == NULL) { -+ nic_lib_list = handle; -+ } else { -+ nic_lib_handle_t *current = nic_lib_list; -+ -+ while (current->next != NULL) -+ current = current->next; -+ -+ current->next = handle; -+ } -+ pthread_mutex_unlock(&nic_lib_list_mutex); -+ -+ LOG_DEBUG("Added '%s' nic library", handle->ops->description); -+ } -+ -+ return rc; -+} -+ -+int unload_all_nic_libraries() -+{ -+ nic_lib_handle_t *current, *next; -+ -+ pthread_mutex_lock(&nic_lib_list_mutex); -+ current = nic_lib_list; -+ -+ while (current != NULL) { -+ next = current->next; -+ free_nic_library_handle(current); -+ -+ current = next; -+ } -+ -+ pthread_mutex_unlock(&nic_lib_list_mutex); -+ -+ nic_lib_list = NULL; -+ -+ return 0; -+} -+ -+NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name) -+{ -+ NIC_LIBRARY_EXIST_T rc; -+ nic_lib_handle_t *current; -+ -+ pthread_mutex_lock(&nic_lib_list_mutex); -+ current = nic_lib_list; -+ -+ while (current != NULL) { -+ char *uio_name; -+ size_t uio_name_size; -+ -+ (*current->ops->lib_ops.get_uio_name) (&uio_name, -+ &uio_name_size); -+ -+ if (strncmp(name, uio_name, uio_name_size) == 0) { -+ rc = NIC_LIBRARY_EXSITS; -+ goto done; -+ } -+ -+ current = current->next; -+ } -+ -+ rc = NIC_LIBRARY_DOESNT_EXIST; -+ -+done: -+ pthread_mutex_unlock(&nic_lib_list_mutex); -+ return rc; -+} -+ -+NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name) -+{ -+ NIC_LIBRARY_EXIST_T rc; -+ nic_lib_handle_t *current; -+ -+ pthread_mutex_lock(&nic_lib_list_mutex); -+ current = nic_lib_list; -+ -+ while (current != NULL) { -+ char *library_name; -+ size_t library_name_size; -+ -+ (*current->ops->lib_ops.get_library_name) (&library_name, -+ &library_name_size); -+ -+ if (strncmp(name, library_name, library_name_size) == 0) { -+ rc = NIC_LIBRARY_EXSITS; -+ goto done; -+ } -+ -+ current = current->next; -+ } -+ -+ rc = NIC_LIBRARY_DOESNT_EXIST; -+ -+done: -+ pthread_mutex_unlock(&nic_lib_list_mutex); -+ return rc; -+} -+ -+/** -+ * find_nic_lib_using_pci_id() - Find the proper NIC library using the -+ * PCI ID's -+ * @param vendor - PCI vendor ID to search on -+ * @param device - PCI device ID to search on -+ * @param subvendor - PCI subvendor ID to search on -+ * @param subdevice - PCI subdevice ID to search on -+ * @param handle - This function will return the nic lib handle if found -+ * @return 0 if found, <0 not found -+ */ -+int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device, -+ uint32_t subvendor, uint32_t subdevice, -+ nic_lib_handle_t **handle, -+ struct pci_device_id **pci_entry) -+{ -+ int rc; -+ nic_lib_handle_t *current; -+ -+ pthread_mutex_lock(&nic_lib_list_mutex); -+ current = nic_lib_list; -+ -+ while (current != NULL) { -+ struct pci_device_id *pci_table; -+ uint32_t entries; -+ int i; -+ -+ current->ops->lib_ops.get_pci_table(&pci_table, &entries); -+ -+ /* Sanity check the the pci table coming from the -+ * hardware library */ -+ if (entries > MAX_PCI_DEVICE_ENTRIES) { -+ LOG_WARN(PFX "Too many pci_table entries(%d) skipping", -+ entries); -+ continue; -+ } -+ -+ for (i = 0; i < entries; i++) { -+ LOG_DEBUG(PFX "Checking against: " -+ "vendor: 0x%x device:0x%x " -+ "subvendor:0x%x subdevice:0x%x", -+ pci_table[i].vendor, pci_table[i].device, -+ pci_table[i].subvendor, -+ pci_table[i].subdevice); -+ -+ if ((pci_table[i].vendor == vendor) && -+ (pci_table[i].device == device) && -+ (pci_table[i].subvendor == PCI_ANY_ID || -+ pci_table[i].subvendor == subvendor) && -+ (pci_table[i].subdevice == PCI_ANY_ID || -+ pci_table[i].subdevice == subdevice)) { -+ *handle = current; -+ *pci_entry = &pci_table[i]; -+ rc = 0; -+ goto done; -+ } -+ } -+ -+ current = current->next; -+ } -+ rc = -EINVAL; -+ -+done: -+ pthread_mutex_unlock(&nic_lib_list_mutex); -+ -+ return rc; -+} -+ -+/** -+ * nic_init() - This will properly initialize a struct cnic_uio device -+ * @return NULL is there is a failure and pointer to an allocated/initialized -+ * struct cnic_uio on success -+ */ -+nic_t *nic_init() -+{ -+ nic_t *nic; -+ -+ nic = malloc(sizeof(*nic)); -+ if (nic == NULL) { -+ LOG_ERR("Couldn't malloc space for nic"); -+ return NULL; -+ } -+ -+ memset(nic, 0, sizeof(*nic)); -+ nic->uio_minor = -1; -+ nic->fd = INVALID_FD; -+ nic->next = NULL; -+ nic->thread = INVALID_THREAD; -+ nic->enable_thread = INVALID_THREAD; -+ nic->flags |= NIC_DISABLED; -+ nic->state = NIC_STOPPED; -+ nic->free_packet_queue = NULL; -+ nic->tx_packet_queue = NULL; -+ nic->nic_library = NULL; -+ nic->pci_id = NULL; -+ -+ /* nic_mutex is used to protect nic ops */ -+ pthread_mutex_init(&nic->nic_mutex, NULL); -+ pthread_mutex_init(&nic->xmit_mutex, NULL); -+ pthread_mutex_init(&nic->free_packet_queue_mutex, NULL); -+ -+ pthread_cond_init(&nic->enable_wait_cond, NULL); -+ pthread_cond_init(&nic->enable_done_cond, NULL); -+ pthread_cond_init(&nic->nic_loop_started_cond, NULL); -+ pthread_cond_init(&nic->disable_wait_cond, NULL); -+ -+ nic->rx_poll_usec = DEFAULT_RX_POLL_USEC; -+ -+ pthread_mutex_init(&nic->nl_process_mutex, NULL); -+ pthread_cond_init(&nic->nl_process_if_down_cond, NULL); -+ pthread_cond_init(&nic->nl_process_cond, NULL); -+ nic->nl_process_thread = INVALID_THREAD; -+ nic->nl_process_if_down = 0; -+ nic->nl_process_head = 0; -+ nic->nl_process_tail = 0; -+ memset(&nic->nl_process_ring, 0, sizeof(nic->nl_process_ring)); -+ -+ return nic; -+} -+ -+void nic_add(nic_t *nic) -+{ -+ /* Add this device to our list of nics */ -+ if (nic_list == NULL) { -+ nic_list = nic; -+ } else { -+ nic_t *current = nic_list; -+ -+ while (current->next != NULL) -+ current = current->next; -+ -+ current->next = nic; -+ } -+} -+ -+/** -+ * nic_remove() - Used to remove the NIC for the nic list -+ * @param nic - the nic to remove -+ */ -+int nic_remove(nic_t *nic) -+{ -+ int rc; -+ nic_t *prev, *current; -+ struct stat file_stat; -+ void *res; -+ nic_interface_t *nic_iface, *next_nic_iface, *vlan_iface; -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ /* Check if the file node exists before closing */ -+ rc = stat(nic->uio_device_name, &file_stat); -+ if ((rc == 0) && (nic->ops)) -+ nic->ops->close(nic, 0); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ nic->state = NIC_EXIT; -+ -+ if (nic->enable_thread != INVALID_THREAD) { -+ LOG_DEBUG(PFX "%s: Canceling nic enable thread", nic->log_name); -+ -+ rc = pthread_cancel(nic->enable_thread); -+ if (rc != 0) -+ LOG_DEBUG(PFX "%s: Couldn't send cancel to nic enable " -+ "thread", nic->log_name); -+ -+ LOG_DEBUG(PFX "%s: Waiting to join nic enable thread", -+ nic->log_name); -+ rc = pthread_join(nic->enable_thread, &res); -+ if (rc != 0) -+ LOG_DEBUG(PFX "%s: Couldn't join to canceled enable " -+ "nic thread", nic->log_name); -+ nic->enable_thread = INVALID_THREAD; -+ LOG_DEBUG(PFX "%s: nic enable thread cleaned", nic->log_name); -+ } else { -+ LOG_DEBUG(PFX "%s: NIC enable thread already canceled", -+ nic->log_name); -+ } -+ -+ if (nic->thread != INVALID_THREAD) { -+ LOG_DEBUG(PFX "%s: Canceling nic thread", nic->log_name); -+ -+ rc = pthread_cancel(nic->thread); -+ if (rc != 0) -+ LOG_DEBUG(PFX "%s: Couldn't send cancel to nic", -+ nic->log_name); -+ -+ LOG_DEBUG(PFX "%s: Waiting to join nic thread", nic->log_name); -+ rc = pthread_join(nic->thread, &res); -+ if (rc != 0) -+ LOG_DEBUG(PFX "%s: Couldn't join to canceled nic " -+ "thread", nic->log_name); -+ nic->thread = INVALID_THREAD; -+ LOG_DEBUG(PFX "%s: nic thread cleaned", nic->log_name); -+ } else { -+ LOG_DEBUG(PFX "%s: NIC thread already canceled", nic->log_name); -+ } -+ -+ if (nic->nl_process_thread != INVALID_THREAD) { -+ LOG_DEBUG(PFX "%s: Canceling nic nl thread", nic->log_name); -+ -+ rc = pthread_cancel(nic->nl_process_thread); -+ if (rc != 0) -+ LOG_DEBUG(PFX "%s: Couldn't send cancel to nic nl " -+ "thread", nic->log_name); -+ -+ LOG_DEBUG(PFX "%s: Waiting to join nic nl thread", -+ nic->log_name); -+ rc = pthread_join(nic->nl_process_thread, &res); -+ if (rc != 0) -+ LOG_DEBUG(PFX "%s: Couldn't join to canceled nic nl " -+ "thread", nic->log_name); -+ nic->nl_process_thread = INVALID_THREAD; -+ LOG_DEBUG(PFX "%s: nic nl thread cleaned", nic->log_name); -+ } else { -+ LOG_DEBUG(PFX "%s: NIC nl thread already canceled", -+ nic->log_name); -+ } -+ -+ current = prev = nic_list; -+ while (current != NULL) { -+ if (current == nic) -+ break; -+ -+ prev = current; -+ current = current->next; -+ } -+ -+ if (current != NULL) { -+ if (current == nic_list) -+ nic_list = current->next; -+ else -+ prev->next = current->next; -+ -+ /* Before freeing the nic, must free all the associated -+ nic_iface */ -+ nic_iface = current->nic_iface; -+ while (nic_iface != NULL) { -+ vlan_iface = nic_iface->vlan_next; -+ while (vlan_iface != NULL) { -+ next_nic_iface = vlan_iface->vlan_next; -+ free(vlan_iface); -+ vlan_iface = next_nic_iface; -+ } -+ next_nic_iface = nic_iface->next; -+ free(nic_iface); -+ nic_iface = next_nic_iface; -+ } -+ free(nic); -+ } else { -+ LOG_ERR(PFX "%s: Couldn't find nic to remove", nic->log_name); -+ } -+ -+ return 0; -+} -+ -+/** -+ * nic_close() - Used to indicate to a NIC that it should close -+ * Must be called with nic->nic_mutex -+ * @param nic - the nic to close -+ * @param graceful - ALLOW_GRACEFUL_SHUTDOWN will check the nic state -+ * before proceeding to close() -+ * FORCE_SHUTDOWN will force the nic to close() -+ * reguardless of the state -+ * @param clean - this will free the proper strings assoicated -+ * with the NIC -+ * -+ */ -+void nic_close(nic_t *nic, NIC_SHUTDOWN_T graceful, int clean) -+{ -+ int rc; -+ nic_interface_t *nic_iface, *vlan_iface; -+ struct stat file_stat; -+ -+ /* The NIC could be configured by the uIP config file -+ * but not assoicated with a hardware library just yet -+ * we will need to check for this */ -+ if (nic->ops == NULL) { -+ LOG_WARN(PFX "%s: when closing nic->ops == NULL", -+ nic->log_name); -+ goto error; -+ } -+ -+ /* Check if the file node exists */ -+ rc = stat(nic->uio_device_name, &file_stat); -+ if ((rc == 0) && (nic->ops)) -+ rc = (*nic->ops->close) (nic, graceful); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not close nic", nic->log_name); -+ } else { -+ nic->state = NIC_STOPPED; -+ nic->flags &= ~NIC_ENABLED; -+ nic->flags |= NIC_DISABLED; -+ } -+ -+ nic_iface = nic->nic_iface; -+ while (nic_iface != NULL) { -+ if (!((nic_iface->flags & NIC_IFACE_PERSIST) == -+ NIC_IFACE_PERSIST)) { -+ uip_reset(&nic_iface->ustack); -+ vlan_iface = nic_iface->vlan_next; -+ while (vlan_iface != NULL) { -+ uip_reset(&vlan_iface->ustack); -+ vlan_iface = vlan_iface->vlan_next; -+ } -+ } -+ nic_iface = nic_iface->next; -+ } -+ -+ /* The NIC must be destroyed and init'ed once again, -+ * POSIX defines that the mutex will be undefined it -+ * init'ed twice without a destroy */ -+ pthread_mutex_destroy(&nic->xmit_mutex); -+ pthread_mutex_init(&nic->xmit_mutex, NULL); -+ -+ if (clean & FREE_CONFIG_NAME) { -+ /* Free any named strings we might be holding onto */ -+ if (nic->flags & NIC_CONFIG_NAME_MALLOC) { -+ free(nic->config_device_name); -+ nic->flags &= ~NIC_CONFIG_NAME_MALLOC; -+ } -+ nic->config_device_name = NULL; -+ } -+ -+ if (clean & FREE_UIO_NAME) { -+ if (nic->flags & NIC_UIO_NAME_MALLOC) { -+ free(nic->uio_device_name); -+ nic->uio_device_name = NULL; -+ -+ nic->flags &= ~NIC_UIO_NAME_MALLOC; -+ } -+ } -+ -+ LOG_ERR(PFX "%s: nic closed", nic->log_name); -+error: -+ return; -+} -+ -+/** -+ * nic_iface_init() - This function is used to add an interface to the -+ * structure cnic_uio -+ * @return 0 on success, <0 on failure -+ */ -+nic_interface_t *nic_iface_init() -+{ -+ nic_interface_t *nic_iface = malloc(sizeof(*nic_iface)); -+ if (nic_iface == NULL) { -+ LOG_ERR("Could not allocate space for nic iface"); -+ return NULL; -+ } -+ -+ memset(nic_iface, 0, sizeof(*nic_iface)); -+ nic_iface->next = NULL; -+ nic_iface->vlan_next = NULL; -+ nic_iface->iface_num = IFACE_NUM_INVALID; -+ nic_iface->request_type = IP_CONFIG_OFF; -+ -+ return nic_iface; -+} -+ -+/** -+ * nic_add_nic_iface() - This function is used to add an interface to the -+ * nic structure -+ * Called with nic_mutex held -+ * @param nic - struct nic device to add the interface to -+ * @param nic_iface - network interface used to add to the nic -+ * @return 0 on success, <0 on failure -+ */ -+int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface) -+{ -+ nic_interface_t *current, *prev; -+ -+ /* Make sure it doesn't already exist */ -+ current = nic_find_nic_iface(nic, nic_iface->protocol, -+ nic_iface->vlan_id, nic_iface->iface_num, -+ nic_iface->request_type); -+ if (current) { -+ LOG_DEBUG(PFX "%s: nic interface for VLAN: %d, protocol: %d" -+ " already exist", nic->log_name, nic_iface->vlan_id, -+ nic_iface->protocol); -+ return 0; -+ } -+ -+ prev = NULL; -+ current = nic->nic_iface; -+ while (current != NULL) { -+ if (current->protocol == nic_iface->protocol) { -+ /* Replace parent */ -+ nic_iface->vlan_next = current; -+ nic_iface->next = current->next; -+ current->next = NULL; -+ if (prev) -+ prev->next = nic_iface; -+ else -+ nic->nic_iface = nic_iface; -+ goto done; -+ } -+ prev = current; -+ current = current->next; -+ } -+ nic_iface->next = nic->nic_iface; -+ nic->nic_iface = nic_iface; -+done: -+ /* Set nic_interface common fields */ -+ nic_iface->parent = nic; -+ memcpy(&nic_iface->ustack.uip_ethaddr.addr, nic->mac_addr, ETH_ALEN); -+ nic->num_of_nic_iface++; -+ -+ LOG_INFO(PFX "%s: Added nic interface for VLAN: %d, protocol: %d", -+ nic->log_name, nic_iface->vlan_id, nic_iface->protocol); -+ -+ return 0; -+} -+ -+/****************************************************************************** -+ * Routine to process interrupts from the NIC device -+ ******************************************************************************/ -+/** -+ * nic_process_intr() - Routine used to process interrupts from the hardware -+ * @param nic - NIC hardware to process the interrupt on -+ * @return 0 on success, <0 on failure -+ */ -+int nic_process_intr(nic_t *nic, int discard_check) -+{ -+ fd_set fdset; -+ int ret; -+ int count; -+ struct timeval tv; -+ -+ /* Simple sanity checks */ -+ if (discard_check != 1 && nic->state != NIC_RUNNING) { -+ LOG_ERR(PFX "%s: Couldn't process interupt NIC not running", -+ nic->log_name); -+ return -EBUSY; -+ } -+ -+ if (discard_check != 1 && nic->fd == INVALID_FD) { -+ LOG_ERR(PFX "%s: NIC fd not valid", nic->log_name); -+ return -EIO; -+ } -+ -+ FD_ZERO(&fdset); -+ FD_SET(nic->fd, &fdset); -+ -+ tv.tv_sec = 0; -+ pthread_mutex_lock(&nic->nic_mutex); -+ if (nic->flags & NIC_LONG_SLEEP) -+ tv.tv_usec = 1000; -+ else -+ tv.tv_usec = nic->rx_poll_usec; -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ /* Wait for an interrupt to come in or timeout */ -+ ret = select(nic->fd + 1, &fdset, NULL, NULL, &tv); -+ switch (ret) { -+ case 1: -+ /* Usually there should only be one file descriptor ready -+ * to read */ -+ break; -+ case 0: -+ return ret; -+ case -1: -+ LOG_ERR(PFX "%s: error waiting for interrupt: %s", -+ nic->log_name, strerror(errno)); -+ return 0; -+ default: -+ LOG_ERR(PFX "%s: unknown number of FD's, ignoring: %d ret", -+ nic->log_name, ret); -+ return 0; -+ } -+ -+ ret = read(nic->fd, &count, sizeof(count)); -+ pthread_mutex_lock(&nic->nic_mutex); -+ if (ret > 0) { -+ nic->stats.interrupts++; -+ LOG_PACKET(PFX "%s: interrupt count: %d prev: %d", -+ nic->log_name, count, nic->intr_count); -+ -+ if (count == nic->intr_count) { -+ LOG_PACKET(PFX "%s: got interrupt but count still the " -+ "same", nic->log_name, count); -+ } -+ -+ /* Check if we missed an interrupt. With UIO, -+ * the count should be incremental */ -+ if (count != nic->intr_count + 1) { -+ nic->stats.missed_interrupts++; -+ LOG_PACKET(PFX "%s: Missed interrupt! on %d not %d", -+ nic->log_name, count, nic->intr_count); -+ } -+ -+ nic->intr_count = count; -+ -+ (*nic->ops->clear_tx_intr) (nic); -+ ret = 1; -+ } -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ return ret; -+} -+ -+static void prepare_ipv4_packet(nic_t *nic, -+ nic_interface_t *nic_iface, -+ struct uip_stack *ustack, packet_t *pkt) -+{ -+ u16_t ipaddr[2]; -+ arp_table_query_t arp_query; -+ dest_ipv4_addr_t dest_ipv4_addr; -+ struct arp_entry *tabptr; -+ int queue_rc; -+ int vlan_id = 0; -+ -+ /* If the rx vlan tag is not stripped and vlan is present in the pkt, -+ manual stripping is required because tx is using hw vlan tag! */ -+ if (pkt->network_layer == pkt->data_link_layer + -+ sizeof(struct uip_vlan_eth_hdr)) { -+ /* VLAN is detected in the pkt buf */ -+ memcpy(pkt->data_link_layer + 12, pkt->network_layer - 2, -+ pkt->buf_size - sizeof(struct uip_vlan_eth_hdr) + 2); -+ } -+ dest_ipv4_addr = uip_determine_dest_ipv4_addr(ustack, ipaddr); -+ if (dest_ipv4_addr == LOCAL_BROADCAST) { -+ uip_build_eth_header(ustack, ipaddr, NULL, pkt, vlan_id); -+ return; -+ } -+ -+ arp_query = is_in_arp_table(ipaddr, &tabptr); -+ -+ switch (arp_query) { -+ case IS_IN_ARP_TABLE: -+ uip_build_eth_header(ustack, -+ ipaddr, tabptr, pkt, vlan_id); -+ break; -+ case NOT_IN_ARP_TABLE: -+ queue_rc = nic_queue_tx_packet(nic, nic_iface, pkt); -+ uip_build_arp_request(ustack, ipaddr); -+ break; -+ default: -+ LOG_ERR("Unknown arp state"); -+ break; -+ } -+} -+ -+static void prepare_ipv6_packet(nic_t *nic, -+ nic_interface_t *nic_iface, -+ struct uip_stack *ustack, packet_t *pkt) -+{ -+ struct uip_eth_hdr *eth; -+ struct uip_vlan_eth_hdr *eth_vlan; -+ int vlan_id = 0; -+ -+ if (pkt->network_layer == pkt->data_link_layer + -+ sizeof(struct uip_vlan_eth_hdr)) { -+ /* VLAN is detected in the pkt buf */ -+ memcpy(pkt->data_link_layer + 12, pkt->network_layer - 2, -+ pkt->buf_size - sizeof(struct uip_vlan_eth_hdr) + 2); -+ } -+ eth = (struct uip_eth_hdr *)ustack->data_link_layer; -+ eth_vlan = (struct uip_vlan_eth_hdr *)ustack->data_link_layer; -+ if (vlan_id == 0) { -+ eth->type = htons(UIP_ETHTYPE_IPv6); -+ } else { -+ eth_vlan->tpid = htons(UIP_ETHTYPE_8021Q); -+ eth_vlan->vid = htons(vlan_id); -+ eth_vlan->type = htons(UIP_ETHTYPE_IPv6); -+ } -+} -+ -+static void prepare_ustack(nic_t *nic, -+ nic_interface_t *nic_iface, -+ struct uip_stack *ustack, struct packet *pkt) -+{ -+ struct ether_header *eth = NULL; -+ ustack->uip_buf = pkt->buf; -+ ustack->uip_len = pkt->buf_size; -+ -+ pkt->nic = nic; -+ pkt->nic_iface = nic_iface; -+ -+ ustack->data_link_layer = pkt->buf; -+ /* Adjust the network layer pointer depending if -+ * there is a VLAN tag or not, or if the hardware -+ * has stripped out the -+ * VLAN tag */ -+ ustack->network_layer = ustack->data_link_layer + -+ sizeof(struct uip_eth_hdr); -+ /* Init buffer to be IPv6 */ -+ if (nic_iface->ustack.ip_config == IPV6_CONFIG_DHCP || -+ nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) { -+ eth = (struct ether_header *)ustack->data_link_layer; -+ eth->ether_type = htons(UIP_ETHTYPE_IPv6); -+ } -+} -+ -+int do_timers_per_nic_iface(nic_t *nic, nic_interface_t *nic_iface, -+ struct timer *arp_timer) -+{ -+ packet_t *pkt; -+ struct uip_stack *ustack = &nic_iface->ustack; -+ int i; -+ -+ pkt = get_next_free_packet(nic); -+ if (pkt == NULL) -+ return -EIO; -+ -+ if (nic_iface->protocol == AF_INET) { -+ for (i = 0; i < UIP_UDP_CONNS; i++) { -+ prepare_ustack(nic, nic_iface, ustack, pkt); -+ -+ uip_udp_periodic(ustack, i); -+ /* If the above function invocation resulted -+ * in data that should be sent out on the -+ * network, the global variable uip_len is -+ * set to a value > 0. */ -+ if (ustack->uip_len > 0) { -+ pkt->buf_size = ustack->uip_len; -+ -+ prepare_ipv4_packet(nic, nic_iface, ustack, -+ pkt); -+ -+ (*nic->ops->write) (nic, nic_iface, pkt); -+ ustack->uip_len = 0; -+ } -+ } -+ } else { -+ /* Added periodic poll for IPv6 NDP engine */ -+ if (ustack->ndpc != NULL) { /* If engine is active */ -+ prepare_ustack(nic, nic_iface, ustack, pkt); -+ -+ uip_ndp_periodic(ustack); -+ /* If the above function invocation resulted -+ * in data that should be sent out on the -+ * network, the global variable uip_len is -+ * set to a value > 0. */ -+ if (ustack->uip_len > 0) { -+ pkt->buf_size = ustack->uip_len; -+ prepare_ipv6_packet(nic, nic_iface, ustack, -+ pkt); -+ (*nic->ops->write) (nic, nic_iface, pkt); -+ ustack->uip_len = 0; -+ } -+ } -+ } -+ /* Call the ARP timer function every 10 seconds. */ -+ if (timer_expired(arp_timer)) { -+ timer_reset(arp_timer); -+ uip_arp_timer(); -+ } -+ put_packet_in_free_queue(pkt, nic); -+ return 0; -+} -+ -+static int check_timers(nic_t *nic, -+ struct timer *periodic_timer, struct timer *arp_timer) -+{ -+ if (timer_expired(periodic_timer)) { -+ nic_interface_t *nic_iface, *vlan_iface; -+ -+ timer_reset(periodic_timer); -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ nic_iface = nic->nic_iface; -+ while (nic_iface != NULL) { -+ do_timers_per_nic_iface(nic, nic_iface, arp_timer); -+ vlan_iface = nic_iface->vlan_next; -+ while (vlan_iface != NULL) { -+ do_timers_per_nic_iface(nic, vlan_iface, -+ arp_timer); -+ vlan_iface = vlan_iface->vlan_next; -+ } -+ nic_iface = nic_iface->next; -+ } -+ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ } -+ return 0; -+} -+ -+int process_packets(nic_t *nic, -+ struct timer *periodic_timer, -+ struct timer *arp_timer, nic_interface_t *nic_iface) -+{ -+ int rc; -+ packet_t *pkt; -+ -+ pkt = get_next_free_packet(nic); -+ if (pkt == NULL) { -+ LOG_DEBUG(PFX "%s: Couldn't get buffer for processing packet", -+ nic->log_name); -+ return -ENOMEM; -+ } -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ rc = (*nic->ops->read) (nic, pkt); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ if ((rc != 0) && (pkt->buf_size > 0)) { -+ uint16_t type = 0; -+ int af_type = 0; -+ struct uip_stack *ustack; -+ struct ip_hdr *ip; -+ struct ipv6_hdr *ip6; -+ void *dst_ip; -+ uint16_t vlan_id; -+ -+ pkt->data_link_layer = pkt->buf; -+ -+ vlan_id = pkt->vlan_tag & 0xFFF; -+ if ((vlan_id == 0) || -+ (NIC_VLAN_STRIP_ENABLED & nic->flags)) { -+ type = ntohs(ETH_BUF(pkt->buf)->type); -+ pkt->network_layer = pkt->data_link_layer + -+ sizeof(struct uip_eth_hdr); -+ } else { -+ type = ntohs(VLAN_ETH_BUF(pkt->buf)->type); -+ pkt->network_layer = pkt->data_link_layer + -+ sizeof(struct uip_vlan_eth_hdr); -+ } -+ -+ switch (type) { -+ case UIP_ETHTYPE_IPv6: -+ af_type = AF_INET6; -+ ip6 = (struct ipv6_hdr *) pkt->network_layer; -+ dst_ip = (void *)&ip6->ipv6_dst; -+ break; -+ case UIP_ETHTYPE_IPv4: -+ case UIP_ETHTYPE_ARP: -+ af_type = AF_INET; -+ ip = (struct ip_hdr *) pkt->network_layer; -+ dst_ip = (void *)&ip->destipaddr; -+ break; -+ default: -+ LOG_PACKET(PFX "%s: Ignoring vlan:0x%x ethertype:0x%x", -+ nic->log_name, vlan_id, type); -+ goto done; -+ } -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ /* check if we have the given VLAN interface */ -+ if (nic_iface != NULL) { -+ if (vlan_id != nic_iface->vlan_id) { -+ /* Matching nic_iface not found, drop */ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ rc = EINVAL; /* Return the +error code */ -+ goto done; -+ } -+ goto nic_iface_present; -+ } -+ -+ /* Best effort to find the correct instance -+ Input: protocol and vlan_tag */ -+ nic_iface = nic_find_nic_iface(nic, af_type, vlan_id, -+ IFACE_NUM_INVALID, -+ IP_CONFIG_OFF); -+ if (nic_iface == NULL) { -+ /* Matching nic_iface not found */ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ LOG_PACKET(PFX "%s: Couldn't find interface for " -+ "VLAN: %d af_type %d", -+ nic->log_name, vlan_id, af_type); -+ rc = EINVAL; /* Return the +error code */ -+ goto done; -+ } -+nic_iface_present: -+ pkt->nic_iface = nic_iface; -+ -+ ustack = &nic_iface->ustack; -+ -+ ustack->uip_buf = pkt->buf; -+ ustack->uip_len = pkt->buf_size; -+ ustack->data_link_layer = pkt->buf; -+ -+ /* Adjust the network layer pointer depending if there is a -+ * VLAN tag or not, or if the hardware has stripped out the -+ * VLAN tag */ -+ if ((vlan_id == 0) || -+ (NIC_VLAN_STRIP_ENABLED & nic->flags)) -+ ustack->network_layer = ustack->data_link_layer + -+ sizeof(struct uip_eth_hdr); -+ else -+ ustack->network_layer = ustack->data_link_layer + -+ sizeof(struct uip_vlan_eth_hdr); -+ -+ /* determine how we should process this packet based on the -+ * ethernet type */ -+ switch (type) { -+ case UIP_ETHTYPE_IPv6: -+ uip_input(ustack); -+ if (ustack->uip_len > 0) { -+ /* The pkt generated has already consulted -+ the IPv6 ARP table */ -+ pkt->buf_size = ustack->uip_len; -+ prepare_ipv6_packet(nic, nic_iface, -+ ustack, pkt); -+ -+ (*nic->ops->write) (nic, nic_iface, pkt); -+ } -+ break; -+ case UIP_ETHTYPE_IPv4: -+ uip_arp_ipin(ustack, pkt); -+ uip_input(ustack); -+ /* If the above function invocation resulted -+ * in data that should be sent out on the -+ * network, the global variable uip_len is -+ * set to a value > 0. */ -+ if (ustack->uip_len > 0) { -+ prepare_ipv4_packet(nic, nic_iface, -+ ustack, pkt); -+ -+ (*nic->ops->write) (nic, nic_iface, pkt); -+ } -+ -+ break; -+ case UIP_ETHTYPE_ARP: -+ uip_arp_arpin(nic_iface, ustack, pkt); -+ -+ /* If the above function invocation resulted -+ * in data that should be sent out on the -+ * network, the global variable uip_len -+ * is set to a value > 0. */ -+ if (pkt->buf_size > 0) -+ (*nic->ops->write) (nic, nic_iface, pkt); -+ break; -+ } -+ ustack->uip_len = 0; -+ pthread_mutex_unlock(&nic->nic_mutex); -+ } -+ -+done: -+ put_packet_in_free_queue(pkt, nic); -+ -+ return rc; -+} -+ -+static int process_dhcp_loop(nic_t *nic, -+ nic_interface_t *nic_iface, -+ struct timer *periodic_timer, -+ struct timer *arp_timer) -+{ -+ struct dhcpc_state *s; -+ struct ndpc_state *n; -+ int rc; -+ struct timeval start_time; -+ struct timeval current_time; -+ struct timeval wait_time; -+ struct timeval total_time; -+ -+ /* 10s loop time to wait for DHCP */ -+ switch (nic_iface->ustack.ip_config) { -+ case IPV4_CONFIG_DHCP: -+ wait_time.tv_sec = 10; -+ break; -+ case IPV6_CONFIG_DHCP: -+ wait_time.tv_sec = 15; -+ break; -+ case IPV6_CONFIG_STATIC: -+ wait_time.tv_sec = 4; -+ break; -+ default: -+ wait_time.tv_sec = 2; -+ } -+ wait_time.tv_usec = 0; -+ -+ s = nic_iface->ustack.dhcpc; -+ n = nic_iface->ustack.ndpc; -+ -+ if (gettimeofday(&start_time, NULL)) { -+ LOG_ERR(PFX "%s: Couldn't get time of day to start DHCP timer", -+ nic->log_name); -+ return -EIO; -+ } -+ -+ timeradd(&start_time, &wait_time, &total_time); -+ -+ periodic_timer->start = periodic_timer->start - -+ periodic_timer->interval; -+ -+ while ((event_loop_stop == 0) && -+ (nic->flags & NIC_ENABLED) && !(nic->flags & NIC_GOING_DOWN)) { -+ -+ if (nic_iface->ustack.ip_config == IPV4_CONFIG_DHCP) { -+ if (s->state == STATE_CONFIG_RECEIVED) -+ break; -+ } -+ if (nic_iface->ustack.ip_config == IPV6_CONFIG_DHCP || -+ nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) { -+ if (n->state == NDPC_STATE_BACKGROUND_LOOP) -+ break; -+ } -+ -+ /* Check the periodic and ARP timer */ -+ check_timers(nic, periodic_timer, arp_timer); -+ -+ rc = nic_process_intr(nic, 1); -+ -+ while ((rc > 0) && (!(nic->flags & NIC_GOING_DOWN))) { -+ rc = process_packets(nic, -+ periodic_timer, -+ arp_timer, nic_iface); -+ } -+ -+ if (gettimeofday(¤t_time, NULL)) { -+ LOG_ERR(PFX "%s: Couldn't get current time for " -+ "DHCP start", nic->log_name); -+ return -EIO; -+ } -+ -+ if (timercmp(&total_time, ¤t_time, <)) { -+ LOG_ERR(PFX "%s: timeout waiting for DHCP/NDP", -+ nic->log_name); -+ if (nic_iface->ustack.ip_config == IPV6_CONFIG_DHCP || -+ nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) -+ n->retry_count = IPV6_MAX_ROUTER_SOL_RETRY; -+ return -EIO; -+ } -+ } -+ -+ if (nic->flags & NIC_GOING_DOWN) -+ return -EIO; -+ else if (nic->flags & NIC_DISABLED) -+ return -EINVAL; -+ else -+ return 0; -+} -+ -+/* Called with nic_mutex locked */ -+static int do_acquisition(nic_t *nic, nic_interface_t *nic_iface, -+ struct timer *periodic_timer, struct timer *arp_timer) -+{ -+ struct in_addr addr; -+ struct in6_addr addr6; -+ void *res; -+ char buf[INET6_ADDRSTRLEN]; -+ int rc = -1; -+ -+ /* New acquisition */ -+ uip_init(&nic_iface->ustack, nic->flags & NIC_IPv6_ENABLED); -+ memcpy(&nic_iface->ustack.uip_ethaddr.addr, nic->mac_addr, ETH_ALEN); -+ -+ LOG_INFO(PFX "%s: Initialized ip stack: VLAN: %d", -+ nic->log_name, nic_iface->vlan_id); -+ -+ LOG_INFO(PFX "%s: mac: %02x:%02x:%02x:%02x:%02x:%02x", -+ nic->log_name, -+ nic_iface->mac_addr[0], -+ nic_iface->mac_addr[1], -+ nic_iface->mac_addr[2], -+ nic_iface->mac_addr[3], -+ nic_iface->mac_addr[4], -+ nic_iface->mac_addr[5]); -+ -+ switch (nic_iface->ustack.ip_config) { -+ case IPV4_CONFIG_STATIC: -+ memcpy(&addr.s_addr, nic_iface->ustack.hostaddr, -+ sizeof(addr.s_addr)); -+ -+ LOG_INFO(PFX "%s: Using IP address: %s", -+ nic->log_name, inet_ntoa(addr)); -+ -+ memcpy(&addr.s_addr, nic_iface->ustack.netmask, -+ sizeof(addr.s_addr)); -+ -+ LOG_INFO(PFX "%s: Using netmask: %s", -+ nic->log_name, inet_ntoa(addr)); -+ -+ set_uip_stack(&nic_iface->ustack, -+ &nic_iface->ustack.hostaddr, -+ &nic_iface->ustack.netmask, -+ &nic_iface->ustack.default_route_addr, -+ nic_iface->mac_addr); -+ break; -+ -+ case IPV4_CONFIG_DHCP: -+ set_uip_stack(&nic_iface->ustack, -+ &nic_iface->ustack.hostaddr, -+ &nic_iface->ustack.netmask, -+ &nic_iface->ustack.default_route_addr, -+ nic_iface->mac_addr); -+ if (dhcpc_init(nic, &nic_iface->ustack, -+ nic_iface->mac_addr, ETH_ALEN)) { -+ if (nic_iface->ustack.dhcpc) { -+ LOG_DEBUG(PFX "%s: DHCPv4 engine already " -+ "initialized!", nic->log_name); -+ goto skip; -+ } else { -+ LOG_DEBUG(PFX "%s: DHCPv4 engine failed " -+ "initialization!", nic->log_name); -+ goto error; -+ } -+ } -+ pthread_mutex_unlock(&nic->nic_mutex); -+ rc = process_dhcp_loop(nic, nic_iface, periodic_timer, -+ arp_timer); -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ if (rc) { -+ LOG_ERR(PFX "%s: DHCP failed", nic->log_name); -+ /* For DHCPv4 failure, the ustack must be cleaned so -+ it can re-acquire on the next iscsid request */ -+ uip_reset(&nic_iface->ustack); -+ -+ /* Signal that the device enable is -+ done */ -+ pthread_cond_broadcast(&nic->enable_done_cond); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ if (nic->enable_thread == INVALID_THREAD) -+ goto dhcp_err; -+ -+ rc = pthread_join(nic->enable_thread, &res); -+ if (rc != 0) -+ LOG_ERR(PFX "%s: Couldn't join to canceled " -+ "enable nic thread", nic->log_name); -+dhcp_err: -+ pthread_mutex_lock(&nic->nic_mutex); -+ goto error; -+ } -+ -+ if (nic->flags & NIC_DISABLED) { -+ /* Break out of this loop */ -+ break; -+ } -+ -+ LOG_INFO(PFX "%s: Initialized dhcp client", nic->log_name); -+ break; -+ -+ case IPV6_CONFIG_DHCP: -+ case IPV6_CONFIG_STATIC: -+ if (ndpc_init(nic, &nic_iface->ustack, nic_iface->mac_addr, -+ ETH_ALEN)) { -+ LOG_DEBUG(PFX "%s: IPv6 engine already initialized!", -+ nic->log_name); -+ goto skip; -+ } -+ pthread_mutex_unlock(&nic->nic_mutex); -+ rc = process_dhcp_loop(nic, nic_iface, periodic_timer, -+ arp_timer); -+ pthread_mutex_lock(&nic->nic_mutex); -+ if (rc) { -+ /* Don't reset and allow to use RA and LL */ -+ LOG_ERR(PFX "%s: IPv6 DHCP/NDP failed", nic->log_name); -+ } -+ if (nic_iface->ustack.ip_config == IPV6_CONFIG_STATIC) { -+ memcpy(&addr6.s6_addr, nic_iface->ustack.hostaddr6, -+ sizeof(addr6.s6_addr)); -+ inet_ntop(AF_INET6, addr6.s6_addr, buf, sizeof(buf)); -+ LOG_INFO(PFX "%s: hostaddr IP: %s", nic->log_name, buf); -+ memcpy(&addr6.s6_addr, nic_iface->ustack.netmask6, -+ sizeof(addr6.s6_addr)); -+ inet_ntop(AF_INET6, addr6.s6_addr, buf, sizeof(buf)); -+ LOG_INFO(PFX "%s: netmask IP: %s", nic->log_name, buf); -+ } -+ break; -+ -+ default: -+ LOG_INFO(PFX "%s: ipconfig = %d?", nic->log_name, -+ nic_iface->ustack.ip_config); -+ } -+skip: -+ /* Mark acquisition done for this nic iface */ -+ nic_iface->flags &= ~NIC_IFACE_ACQUIRE; -+ -+ LOG_INFO(PFX "%s: enabled vlan %d protocol: %d", nic->log_name, -+ nic_iface->vlan_id, nic_iface->protocol); -+ return 0; -+ -+error: -+ return -EIO; -+} -+ -+ -+void *nic_loop(void *arg) -+{ -+ nic_t *nic = (nic_t *) arg; -+ int rc = -1; -+ sigset_t set; -+ struct timer periodic_timer, arp_timer; -+ -+ sigfillset(&set); -+ rc = pthread_sigmask(SIG_BLOCK, &set, NULL); -+ if (rc != 0) { -+ /* TODO: determine if we need to exit this thread if we fail -+ * to set the signal mask */ -+ LOG_ERR(PFX "%s: Couldn't set signal mask", nic->log_name); -+ } -+ -+ /* Signal the device to enable itself */ -+ pthread_mutex_lock(&nic->nic_mutex); -+ pthread_cond_signal(&nic->nic_loop_started_cond); -+ -+ /* nic_mutex must be locked */ -+ while ((event_loop_stop == 0) && -+ !(nic->flags & NIC_EXIT_MAIN_LOOP) && -+ !(nic->flags & NIC_GOING_DOWN)) { -+ nic_interface_t *nic_iface, *vlan_iface; -+ -+ if (nic->flags & NIC_DISABLED) { -+ LOG_DEBUG(PFX "%s: Waiting to be enabled", -+ nic->log_name); -+ -+ /* Wait for the device to be enabled */ -+ /* nic_mutex is already locked */ -+ pthread_cond_wait(&nic->enable_wait_cond, -+ &nic->nic_mutex); -+ -+ if (nic->state == NIC_EXIT) { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ pthread_exit(NULL); -+ } -+ LOG_DEBUG(PFX "%s: is now enabled", nic->log_name); -+ } -+ /* initialize the device to send/rec data */ -+ rc = (*nic->ops->open) (nic); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not initialize CNIC UIO device", -+ nic->log_name); -+ -+ if (rc == -ENOTSUP) -+ nic->flags |= NIC_EXIT_MAIN_LOOP; -+ else -+ nic->flags &= ~NIC_ENABLED; -+ -+ /* Signal that the device enable is done */ -+ pthread_cond_broadcast(&nic->enable_done_cond); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ goto dev_close; -+ } -+ nic_set_all_nic_iface_mac_to_parent(nic); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ rc = alloc_free_queue(nic, 5); -+ if (rc != 5) { -+ if (rc != 0) { -+ LOG_WARN(PFX "%s: Allocated %d packets " -+ "instead of %d", nic->log_name, rc, 5); -+ } else { -+ LOG_ERR(PFX "%s: No packets allocated " -+ "instead of %d", nic->log_name, 5); -+ /* Signal that the device enable is done */ -+ pthread_cond_broadcast(&nic->enable_done_cond); -+ goto dev_close; -+ } -+ } -+ /* Indication for the nic_disable routine that the nic -+ has started running */ -+ nic->state = NIC_STARTED_RUNNING; -+ -+ /* Initialize the system clocks */ -+ timer_set(&periodic_timer, CLOCK_SECOND / 2); -+ timer_set(&arp_timer, CLOCK_SECOND * 10); -+ -+ /* Prepare the stack for each of the VLAN interfaces */ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ /* If DHCP fails, exit loop and restart the engine */ -+ nic_iface = nic->nic_iface; -+ while (nic_iface != NULL) { -+ if (nic_iface->flags & NIC_IFACE_ACQUIRE) { -+ do_acquisition(nic, nic_iface, -+ &periodic_timer, -+ &arp_timer); -+ } -+ vlan_iface = nic_iface->vlan_next; -+ while (vlan_iface != NULL) { -+ if (vlan_iface->flags & NIC_IFACE_ACQUIRE) { -+ do_acquisition(nic, vlan_iface, -+ &periodic_timer, -+ &arp_timer); -+ } -+ vlan_iface = vlan_iface->next; -+ } -+ nic_iface = nic_iface->next; -+ } -+ if (nic->flags & NIC_DISABLED) { -+ LOG_WARN(PFX "%s: nic was disabled during nic loop, " -+ "closing flag 0x%x", -+ nic->log_name, nic->flags); -+ /* Signal that the device enable is done */ -+ pthread_cond_broadcast(&nic->enable_done_cond); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ goto dev_close_free; -+ } -+ -+ /* This is when we start the processing of packets */ -+ nic->start_time = time(NULL); -+ nic->state = NIC_RUNNING; -+ -+ nic->flags &= ~NIC_ENABLED_PENDING; -+ -+ /* Signal that the device enable is done */ -+ pthread_cond_broadcast(&nic->enable_done_cond); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ LOG_INFO(PFX "%s: entering main nic loop", nic->log_name); -+ -+ while ((nic->state == NIC_RUNNING) && -+ (event_loop_stop == 0) && -+ !(nic->flags & NIC_GOING_DOWN)) { -+ /* Check the periodic and ARP timer */ -+ check_timers(nic, &periodic_timer, &arp_timer); -+ rc = nic_process_intr(nic, 0); -+ while ((rc > 0) && -+ (nic->state == NIC_RUNNING) && -+ !(nic->flags & NIC_GOING_DOWN)) { -+ rc = process_packets(nic, -+ &periodic_timer, -+ &arp_timer, NULL); -+ } -+ } -+ -+ LOG_INFO(PFX "%s: exited main processing loop", nic->log_name); -+ -+dev_close_free: -+ free_free_queue(nic); -+dev_close: -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ if (nic->flags & NIC_GOING_DOWN) { -+ nic_close(nic, 1, FREE_NO_STRINGS); -+ -+ nic->flags &= ~NIC_GOING_DOWN; -+ } else { -+ pthread_mutex_destroy(&nic->xmit_mutex); -+ pthread_mutex_init(&nic->xmit_mutex, NULL); -+ } -+ nic->pending_count = 0; -+ -+ if (!(nic->flags & NIC_EXIT_MAIN_LOOP)) { -+ /* Signal we are done closing CNIC/UIO device */ -+ pthread_cond_broadcast(&nic->disable_wait_cond); -+ } -+ } -+ /* clean up the nic flags */ -+ nic->flags &= ~NIC_ENABLED_PENDING; -+ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ LOG_INFO(PFX "%s: nic loop thread exited", nic->log_name); -+ -+ nic->thread = INVALID_THREAD; -+ -+ pthread_exit(NULL); -+} -diff --git a/iscsiuio/src/unix/nic.h b/iscsiuio/src/unix/nic.h -new file mode 100644 -index 0000000..7d2d078 ---- /dev/null -+++ b/iscsiuio/src/unix/nic.h -@@ -0,0 +1,379 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic.h - NIC header file -+ * -+ */ -+ -+#include -+ -+#ifndef __NIC_H__ -+#define __NIC_H__ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "nic_nl.h" -+#include "packet.h" -+#include "uip.h" -+ -+#include "iscsi_if.h" -+ -+/* Foward declarations */ -+struct nic_ops; -+struct nic_lib_handle; -+struct packet; -+struct nic_op; -+ -+extern pthread_mutex_t nic_lib_list_mutex; -+extern struct nic_lib_handle *nic_lib_list; -+ -+/* Used to store a list of active cnic devices */ -+extern pthread_mutex_t nic_list_mutex; -+extern struct nic *nic_list; -+ -+extern void *nl_process_handle_thread(void *arg); -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define MAX_PCI_DEVICE_ENTRIES 64 /* Maxium number of pci_device_id -+ entries a hw library may contain */ -+ -+#define FREE_CONFIG_NAME 0x0001 -+#define FREE_UIO_NAME 0x0002 -+#define FREE_ALL_STRINGS (FREE_CONFIG_NAME | FREE_UIO_NAME) -+#define FREE_NO_STRINGS 0x0000 -+ -+/****************************************************************************** -+ * Enumerations -+ ******************************************************************************/ -+typedef enum { -+ ALLOW_GRACEFUL_SHUTDOWN = 1, -+ FORCE_SHUTDOWN = 2, -+} NIC_SHUTDOWN_T; -+ -+/******************************************************************************* -+ * Structure used to hold PCI vendor, device, subvendor and subdevice ID's -+ ******************************************************************************/ -+struct pci_device_id { -+ const uint32_t vendor, device; /* Vendor and device ID or PCI_ANY_ID */ -+ const uint32_t subvendor, subdevice; /* Subsystem ID's/PCI_ANY_ID */ -+ const char *device_name; /* Data private to the driver */ -+}; -+ -+/****************************************************************************** -+ * NIC statistics structure -+ ******************************************************************************/ -+struct nic_stats { -+ uint64_t interrupts; -+ uint64_t missed_interrupts; -+ -+ struct { -+ uint64_t packets; -+ uint64_t bytes; -+ } tx; -+ -+ struct { -+ uint64_t packets; -+ uint64_t bytes; -+ } rx; -+}; -+ -+/****************************************************************************** -+ * NIC interface structure -+ ******************************************************************************/ -+typedef struct nic_interface { -+ struct nic_interface *vlan_next; -+ struct nic_interface *next; -+ struct nic *parent; -+ -+ uint16_t protocol; -+ uint16_t flags; -+#define NIC_IFACE_PERSIST (1<<0) -+#define NIC_IFACE_ACQUIRE (1<<1) -+#define NIC_IFACE_PATHREQ_WAIT1 (1<<2) -+#define NIC_IFACE_PATHREQ_WAIT2 (1<<3) -+#define NIC_IFACE_PATHREQ_WAIT (NIC_IFACE_PATHREQ_WAIT1 | \ -+ NIC_IFACE_PATHREQ_WAIT2) -+ uint8_t mac_addr[ETH_ALEN]; -+ uint8_t vlan_priority; -+ uint16_t vlan_id; -+#define NO_VLAN 0x8000 -+ -+ uint16_t mtu; -+ time_t start_time; -+ -+ struct uip_stack ustack; -+#define IFACE_NUM_INVALID -1 -+ int iface_num; -+ int request_type; -+} nic_interface_t; -+ -+/****************************************************************************** -+ * NIC lib operations structure -+ ******************************************************************************/ -+struct nic_lib_ops { -+ /* Used to get the NIC library name */ -+ void (*get_library_name) (char **library_name, -+ size_t *library_name_size); -+ -+ /* Used to get to the PCI table supported by the NIC library */ -+ void (*get_pci_table) (struct pci_device_id **table, -+ uint32_t *entries); -+ -+ /* Used to get the version of this NIC library */ -+ void (*get_library_version) (char **version_string, -+ size_t *version_string_size); -+ -+ /* Used to get the NIC library build date */ -+ void (*get_build_date) (char **build_date_string, -+ size_t *build_date_string_size); -+ -+ /* Used to get the transport name assoicated with this library */ -+ void (*get_transport_name) (char **transport_name, -+ size_t *transport_name_size); -+ -+ /* Used to get the uio name assoicated with this library */ -+ void (*get_uio_name) (char **uio_name, size_t *uio_name_size); -+ -+}; -+ -+/******************************************************************************* -+ * NIC op table definition -+ ******************************************************************************/ -+typedef struct nic_ops { -+ struct nic_lib_ops lib_ops; -+ -+ char *description; -+ int (*open) (struct nic *); -+ int (*close) (struct nic *, NIC_SHUTDOWN_T); -+ int (*read) (struct nic *, struct packet *); -+ int (*write) (struct nic *, nic_interface_t *, struct packet *); -+ void *(*get_tx_pkt) (struct nic *); -+ void (*start_xmit) (struct nic *, size_t, u16_t vlan_id); -+ int (*clear_tx_intr) (struct nic *); -+ int (*handle_iscsi_path_req) (struct nic *, -+ int, -+ struct iscsi_uevent *ev, -+ struct iscsi_path *path, -+ nic_interface_t *nic_iface); -+} net_ops_t; -+ -+typedef struct nic_lib_handle { -+ struct nic_lib_handle *next; -+ -+ pthread_mutex_t mutex; -+ struct nic_ops *ops; -+} nic_lib_handle_t; -+ -+typedef struct nic { -+ struct nic *next; -+ -+ uint32_t flags; -+#define NIC_UNITIALIZED 0x0001 -+#define NIC_INITIALIZED 0x0002 -+#define NIC_ENABLED 0x0004 -+#define NIC_DISABLED 0x0008 -+#define NIC_IPv6_ENABLED 0x0010 -+#define NIC_ADDED_MULICAST 0x0020 -+#define NIC_LONG_SLEEP 0x0040 -+#define NIC_PATHREQ_WAIT 0x0080 -+ -+#define NIC_VLAN_STRIP_ENABLED 0x0100 -+#define NIC_MSIX_ENABLED 0x0200 -+#define NIC_TX_HAS_SENT 0x0400 -+#define NIC_ENABLED_PENDING 0x0800 -+ -+#define NIC_UIO_NAME_MALLOC 0x1000 -+#define NIC_CONFIG_NAME_MALLOC 0x2000 -+#define NIC_EXIT_MAIN_LOOP 0x4000 -+#define NIC_GOING_DOWN 0x8000 -+#define NIC_RESET_UIP 0x10000 -+ -+ uint16_t state; -+#define NIC_STOPPED 0x0001 -+#define NIC_STARTED_RUNNING 0x0002 -+#define NIC_RUNNING 0x0004 -+#define NIC_EXIT 0x0010 -+ -+ int fd; /* Holds the file descriptor to UIO */ -+ uint16_t uio_minor; /* Holds the UIO minor number */ -+ -+ uint32_t host_no; /* Holds the associated host number */ -+ -+ char *library_name; /* Name of the library to assoicate with */ -+ char *log_name; /* Human friendly name used in the log -+ file */ -+ char *config_device_name; /* Name read from the XML configuration -+ file */ -+ char eth_device_name[IFNAMSIZ]; /* Network interface name */ -+ char *uio_device_name; /* UIO device name */ -+ -+ uint32_t intr_count; /* Total UIO interrupt count */ -+ -+ /* Held for nic ops manipulation */ -+ pthread_mutex_t nic_mutex; -+ -+ /* iSCSI ring ethernet MAC address */ -+ __u8 mac_addr[ETH_ALEN]; -+ -+ /* Used to manage the network interfaces of this device */ -+ __u32 num_of_nic_iface; -+ nic_interface_t *nic_iface; -+ -+ /* Wait for the device to be enabled */ -+ pthread_cond_t enable_wait_cond; -+ -+ /* Wait for the device to be finished enabled */ -+ pthread_cond_t enable_done_cond; -+ -+ /* Wait for the nic loop to start */ -+ pthread_cond_t nic_loop_started_cond; -+ -+ /* Wait for the device to be disabled */ -+ pthread_cond_t disable_wait_cond; -+ -+ /* Held when transmitting */ -+ pthread_mutex_t xmit_mutex; -+ -+ /* The thread this device is running on */ -+ pthread_t thread; -+ -+ /* The thread used to enable the device */ -+ pthread_t enable_thread; -+ -+ /* Statistical Information on this device */ -+ time_t start_time; -+ struct nic_stats stats; -+ -+ /* Number of retrys from iscsid */ -+ uint32_t pending_count; -+ uint32_t pathreq_pending_count; -+ -+#define DEFAULT_RX_POLL_USEC 100 /* usec */ -+ /* options enabled by the user */ -+ uint32_t rx_poll_usec; -+ -+ /* Used to hold hardware specific data */ -+ void *priv; -+ -+ /* Used to hold the TX packets that are needed to be sent */ -+ struct packet *tx_packet_queue; -+ -+ /* Mutex to protect the list of free packets */ -+ pthread_mutex_t free_packet_queue_mutex; -+ -+ /* Used to hold the free packets that are needed to be sent */ -+ struct packet *free_packet_queue; -+ -+ /* Points to the NIC library */ -+ nic_lib_handle_t *nic_library; -+ -+ /* Points to the PCI table entry */ -+ struct pci_device_id *pci_id; -+ -+ /* Used to process the interrupt */ -+ int (*process_intr) (struct nic *nic); -+ -+ struct nic_ops *ops; -+ -+ /* NL processing parameters */ -+ pthread_t nl_process_thread; -+ pthread_cond_t nl_process_cond; -+ pthread_cond_t nl_process_if_down_cond; -+ pthread_mutex_t nl_process_mutex; -+ int nl_process_if_down; -+ int nl_process_head; -+ int nl_process_tail; -+#define NIC_NL_PROCESS_MAX_RING_SIZE 128 -+#define NIC_NL_PROCESS_LAST_ENTRY (NIC_NL_PROCESS_MAX_RING_SIZE - 1) -+#define NIC_NL_PROCESS_NEXT_ENTRY(x) ((x + 1) & NIC_NL_PROCESS_MAX_RING_SIZE) -+ void *nl_process_ring[NIC_NL_PROCESS_MAX_RING_SIZE]; -+} nic_t; -+ -+/****************************************************************************** -+ * Function Prototypes -+ *****************************************************************************/ -+int load_all_nic_libraries(); -+ -+nic_t *nic_init(); -+void nic_add(nic_t *nic); -+int nic_remove(nic_t *nic); -+ -+int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface); -+int nic_process_intr(nic_t *nic, int discard_check); -+ -+nic_interface_t *nic_iface_init(); -+ -+typedef enum { -+ NIC_LIBRARY_EXSITS = 1, -+ NIC_LIBRARY_DOESNT_EXIST = 2, -+} NIC_LIBRARY_EXIST_T; -+ -+NIC_LIBRARY_EXIST_T does_nic_uio_name_exist(char *name); -+NIC_LIBRARY_EXIST_T does_nic_library_exist(char *name); -+ -+/******************************************************************************* -+ * Packet management utility functions -+ ******************************************************************************/ -+struct packet *get_next_tx_packet(nic_t *nic); -+struct packet *get_next_free_packet(nic_t *nic); -+void put_packet_in_tx_queue(struct packet *pkt, nic_t *nic); -+void put_packet_in_free_queue(struct packet *pkt, nic_t *nic); -+ -+int unload_all_nic_libraries(); -+void nic_close(nic_t *nic, NIC_SHUTDOWN_T graceful, int clean); -+ -+/* Use this function to fill in minor number and uio, and eth names */ -+int nic_fill_name(nic_t *nic); -+ -+int enable_multicast(nic_t *nic); -+int disable_multicast(nic_t *nic); -+ -+void nic_set_all_nic_iface_mac_to_parent(nic_t *nic); -+int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device, -+ uint32_t subvendor, uint32_t subdevice, -+ nic_lib_handle_t **handle, -+ struct pci_device_id **pci_entry); -+ -+void *nic_loop(void *arg); -+ -+int nic_packet_capture(struct nic *, struct packet *pkt); -+ -+#endif /* __NIC_H__ */ -diff --git a/iscsiuio/src/unix/nic_id.c b/iscsiuio/src/unix/nic_id.c -new file mode 100644 -index 0000000..8f21ba9 ---- /dev/null -+++ b/iscsiuio/src/unix/nic_id.c -@@ -0,0 +1,361 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_id.c - Using sysfs to determine the PCI vendor, device, subvendor and -+ * subdevice ID's -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "logger.h" -+#include "nic.h" -+ -+#define PFX "nic_id " -+ -+/******************************************************************************* -+ * Sysfs constant strings used to get PCI vendor, and device ID's -+ ******************************************************************************/ -+const char uio_vendor_id_template[] = "/sys/class/uio/uio%d/device/vendor"; -+const char uio_subvendor_id_template[] = -+ "/sys/class/uio/uio%d/device/subsystem_vendor"; -+const char uio_device_id_template[] = "/sys/class/uio/uio%d/device/device"; -+const char uio_subdevice_id_template[] = -+ "/sys/class/uio/uio%d/device/subsystem_device"; -+const char uio_device_symlink_template[] = "/sys/class/uio/uio%d/device"; -+ -+/** -+ * get_id() - Utility function to read hex values from sysfs -+ * @param nic - NIC device to use -+ * @param sysfs_template - sysfs path template to use -+ * @param sysfs_template_size - sysfs path template size in bytes -+ * @parm id - this is the value returned from the sysfs entry -+ * @return 0 on success <0 on failure -+ */ -+static int get_id(nic_t *nic, -+ const char *sysfs_template, -+ const size_t sysfs_template_size, uint32_t *id) -+{ -+ int rc = 0; -+ FILE *fp; -+ size_t chars_read; -+ char buf[7]; -+ char *path; -+ size_t path_size; -+ -+ path_size = sysfs_template_size + 4; -+ path = malloc(path_size); -+ if (path == NULL) { -+ LOG_ERR("Could not allocate memory for %s", sysfs_template); -+ return -ENOMEM; -+ } -+ -+ snprintf(path, path_size, sysfs_template, nic->uio_minor); -+ -+ fp = fopen(path, "r"); -+ if (fp == NULL) { -+ LOG_ERR(PFX "%s: Could not open path: %s [%s]", -+ nic->log_name, path, strerror(errno)); -+ rc = -EIO; -+ goto error_fopen; -+ } -+ -+ chars_read = fread(buf, sizeof(buf), 1, fp); -+ if (chars_read != 1) { -+ LOG_ERR(PFX "%s: Could not read from: %s [%s]", -+ nic->log_name, path, strerror(ferror(fp))); -+ rc = -EIO; -+ goto error; -+ } -+ -+ chars_read = sscanf(buf, "%x", id); -+ if (chars_read != 1) { -+ LOG_ERR(PFX "%s: Could interpret value: %s from: %s [%s]", -+ nic->log_name, buf, path, strerror(errno)); -+ rc = -EIO; -+ goto error; -+ } -+ -+error: -+ fclose(fp); -+ -+error_fopen: -+ free(path); -+ -+ return rc; -+} -+ -+static int get_vendor(nic_t *nic, uint32_t *id) -+{ -+ return get_id(nic, -+ uio_vendor_id_template, sizeof(uio_vendor_id_template), -+ id); -+} -+ -+static int get_subvendor(nic_t *nic, uint32_t *id) -+{ -+ return get_id(nic, -+ uio_subvendor_id_template, -+ sizeof(uio_subvendor_id_template), id); -+} -+ -+static int get_device(nic_t *nic, uint32_t *id) -+{ -+ return get_id(nic, -+ uio_device_id_template, -+ sizeof(uio_device_id_template), id); -+} -+ -+static int get_subdevice(nic_t *nic, uint32_t *id) -+{ -+ return get_id(nic, -+ uio_subdevice_id_template, -+ sizeof(uio_subdevice_id_template), id); -+} -+ -+int get_bus_slot_func_num(nic_t *nic, -+ uint32_t *bus, uint32_t *slot, uint32_t *func) -+{ -+ size_t size; -+ char *path, *tok, *tok2; -+ int path_tokens, i; -+ size_t path_size; -+ char *read_pci_bus_slot_func_str; -+ char pci_bus_slot_func_str[32]; -+ int rc; -+ char *saveptr; -+ -+ path_size = sizeof(uio_device_symlink_template) + 4; -+ path = malloc(path_size); -+ if (path == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate path memory for %s", -+ nic->log_name, uio_device_symlink_template); -+ rc = -ENOMEM; -+ goto error_alloc_path; -+ } -+ -+ read_pci_bus_slot_func_str = malloc(128); -+ if (read_pci_bus_slot_func_str == NULL) { -+ LOG_ERR(PFX "%s: Could not allocate read pci bus memory for %s", -+ nic->log_name, uio_device_symlink_template); -+ rc = -ENOMEM; -+ goto error_alloc_read_pci_bus; -+ } -+ -+ snprintf(path, path_size, uio_device_symlink_template, nic->uio_minor); -+ -+ size = readlink(path, read_pci_bus_slot_func_str, 128); -+ if (size == -1) { -+ LOG_ERR(PFX "%s: Error with %s: %s", -+ nic->log_name, path, strerror(errno)); -+ rc = errno; -+ goto error; -+ } -+ -+ if (size > ((128) - 1)) { -+ read_pci_bus_slot_func_str[128 - 1] = '\0'; -+ LOG_ERR(PFX "%s: not enough space (%d) for reading PCI " -+ "slot:bus.func %s: %s", -+ nic->log_name, size, path, strerror(errno)); -+ rc = -EIO; -+ goto error; -+ } -+ -+ /* readlink() doesn't NULL terminate the string */ -+ read_pci_bus_slot_func_str[size] = '\0'; -+ -+ path_tokens = 0; -+ tok = strtok_r(read_pci_bus_slot_func_str, "/", &saveptr); -+ while (tok != NULL) { -+ path_tokens++; -+ tok = strtok_r(NULL, "/", &saveptr); -+ } -+ -+ size = readlink(path, read_pci_bus_slot_func_str, 128); -+ if (size == -1) { -+ LOG_ERR(PFX "%s: Error with %s: %s", -+ nic->log_name, path, strerror(errno)); -+ rc = errno; -+ goto error; -+ } -+ -+ if (size > ((128) - 1)) { -+ read_pci_bus_slot_func_str[128 - 1] = '\0'; -+ LOG_ERR(PFX "%s: not enough space for reading PCI " -+ "slot:bus.func %s: %s", -+ nic->log_name, path, strerror(errno)); -+ rc = -EIO; -+ goto error; -+ } -+ -+ /* readlink() doesn't NULL terminate the string */ -+ read_pci_bus_slot_func_str[size] = '\0'; -+ -+ tok = strtok_r(read_pci_bus_slot_func_str, "/", &saveptr); -+ for (i = 0; i < path_tokens - 1; i++) -+ tok = strtok_r(NULL, "/", &saveptr); -+ strcpy(pci_bus_slot_func_str, tok); -+ -+ tok = strtok_r(pci_bus_slot_func_str, ":", &saveptr); -+ if (tok == NULL) { -+ LOG_ERR(PFX "%s: Error with slot string: %s", -+ nic->log_name, pci_bus_slot_func_str); -+ rc = -EIO; -+ goto error; -+ } -+ -+ tok = strtok_r(NULL, ":", &saveptr); -+ if (tok == NULL) { -+ LOG_ERR(PFX "%s: Error parsing slot: %s", -+ nic->log_name, pci_bus_slot_func_str); -+ rc = -EIO; -+ goto error; -+ } -+ -+ sscanf(tok, "%x", bus); -+ -+ /* Need to extract the next token "xx.x" */ -+ tok = strtok_r(NULL, ":", &saveptr); -+ if (tok == NULL) { -+ LOG_ERR(PFX "%s: Error extracing bus.func: %s", -+ nic->log_name, pci_bus_slot_func_str); -+ rc = -EIO; -+ goto error; -+ } -+ -+ tok2 = strtok_r(tok, ".", &saveptr); -+ if (tok2 == NULL) { -+ LOG_ERR(PFX "%s: Error parsing bus: %s", -+ nic->log_name, pci_bus_slot_func_str); -+ rc = -EIO; -+ goto error; -+ } -+ -+ sscanf(tok2, "%x", slot); -+ -+ tok2 = strtok_r(NULL, ".", &saveptr); -+ if (tok2 == NULL) { -+ LOG_ERR(PFX "%s: Error parsing func: %s", -+ nic->log_name, pci_bus_slot_func_str); -+ rc = -EIO; -+ goto error; -+ } -+ -+ sscanf(tok2, "%x", func); -+ LOG_INFO(PFX "%s: is found at %02x:%02x.%02x", nic->log_name, -+ *bus, *slot, *func); -+ rc = 0; -+error: -+ free(read_pci_bus_slot_func_str); -+error_alloc_read_pci_bus: -+ free(path); -+error_alloc_path: -+ return rc; -+} -+ -+/** -+ * find_set_nic_lib() - Match the NIC library to the NIC -+ * @param nic - NIC device to determine which NIC library to use -+ * @return 0 on success <0 on failure -+ */ -+int find_set_nic_lib(nic_t *nic) -+{ -+ uint32_t vendor; -+ uint32_t subvendor; -+ uint32_t device; -+ uint32_t subdevice; -+ -+ uint32_t pci_bus; -+ uint32_t pci_slot; -+ uint32_t pci_func; -+ int rc = 0; -+ -+ nic_lib_handle_t *handle; -+ struct pci_device_id *pci_entry; -+ -+ rc = get_vendor(nic, &vendor); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not get vendor id [0x%x]", -+ nic->log_name, rc); -+ return rc; -+ } -+ -+ rc = get_subvendor(nic, &subvendor); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not get subvendor id [0x%x]", -+ nic->log_name, rc); -+ return rc; -+ } -+ -+ rc = get_device(nic, &device); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not get device id [0x%x]", -+ nic->log_name, rc); -+ return rc; -+ } -+ -+ rc = get_subdevice(nic, &subdevice); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Could not get subdevice id [0x%x]", -+ nic->log_name, rc); -+ return rc; -+ } -+ -+ get_bus_slot_func_num(nic, &pci_bus, &pci_slot, &pci_func); -+ -+ LOG_DEBUG(PFX "%s: Looking for device vendor: " -+ "0x%x subvendor: 0x%x device: 0x%x subdevice: 0x%x", -+ nic->log_name, vendor, subvendor, device, subdevice); -+ -+ rc = find_nic_lib_using_pci_id(vendor, device, subvendor, subdevice, -+ &handle, &pci_entry); -+ -+ if (rc != 0) { -+ LOG_WARN(PFX "%s: Couldn't find proper NIC library", -+ nic->log_name); -+ return rc; -+ } -+ -+ nic->nic_library = handle; -+ nic->pci_id = pci_entry; -+ -+ /* Prepare the NIC library op table */ -+ nic->ops = handle->ops; -+ -+ return 0; -+} -diff --git a/iscsiuio/src/unix/nic_id.h b/iscsiuio/src/unix/nic_id.h -new file mode 100644 -index 0000000..8d1e1db ---- /dev/null -+++ b/iscsiuio/src/unix/nic_id.h -@@ -0,0 +1,46 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_id.h - NIC uIP NetLink user space stack -+ * -+ */ -+#ifndef __NIC_ID_H__ -+#define __NIC_ID_H__ -+ -+int find_set_nic_lib(nic_t *nic); -+ -+int get_bus_slot_func_num(nic_t *nic, -+ uint32_t *bus, uint32_t *slot, uint32_t *func); -+ -+#endif /* __NIC_ID_H__ */ -diff --git a/iscsiuio/src/unix/nic_nl.c b/iscsiuio/src/unix/nic_nl.c -new file mode 100644 -index 0000000..3ab4eb9 ---- /dev/null -+++ b/iscsiuio/src/unix/nic_nl.c -@@ -0,0 +1,677 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_nl.c - NIC uIP NetLink user space stack -+ * -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "uip_arp.h" -+#include "logger.h" -+#include "options.h" -+ -+#include "nic.h" -+#include "nic_nl.h" -+#include "nic_utils.h" -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define PFX "NIC_NL " -+ -+static u8_t nlm_sendbuf[NLM_BUF_DEFAULT_MAX]; -+ -+static struct sockaddr_nl src_addr; -+ -+static const struct sockaddr_nl dest_addr = { -+ .nl_family = AF_NETLINK, -+ .nl_pid = 0, /* kernel */ -+ .nl_groups = 0, /* unicast */ -+}; -+ -+#define POLL_NL 0 -+#define POLL_MAX 1 -+ -+/* Netlink */ -+int nl_sock = INVALID_FD; -+ -+static int nl_read(int ctrl_fd, char *data, int size, int flags) -+{ -+ int rc; -+ struct iovec iov; -+ struct msghdr msg; -+ -+ iov.iov_base = data; -+ iov.iov_len = size; -+ -+ memset(&src_addr, 0, sizeof(src_addr)); -+ src_addr.nl_family = AF_NETLINK; -+ src_addr.nl_pid = getpid(); -+ src_addr.nl_groups = 1; -+ -+ memset(&msg, 0, sizeof(msg)); -+ msg.msg_name = (void *)&src_addr; -+ msg.msg_namelen = sizeof(src_addr); -+ msg.msg_iov = &iov; -+ msg.msg_iovlen = 1; -+ -+ rc = recvmsg(ctrl_fd, &msg, flags); -+ -+ return rc; -+} -+ -+static int -+kwritev(int fd, enum iscsi_uevent_e type, struct iovec *iovp, int count) -+{ -+ int i, rc; -+ struct nlmsghdr *nlh; -+ struct msghdr msg; -+ struct iovec iov; -+ int datalen = 0; -+ -+ for (i = 0; i < count; i++) -+ datalen += iovp[i].iov_len; -+ -+ nlh = (struct nlmsghdr *)nlm_sendbuf; -+ memset(nlh, 0, NLMSG_SPACE(datalen)); -+ -+ nlh->nlmsg_len = NLMSG_SPACE(datalen); -+ nlh->nlmsg_pid = getpid(); -+ nlh->nlmsg_flags = 0; -+ nlh->nlmsg_type = type; -+ -+ datalen = 0; -+ for (i = 0; i < count; i++) { -+ memcpy(NLMSG_DATA(nlh) + datalen, iovp[i].iov_base, -+ iovp[i].iov_len); -+ datalen += iovp[i].iov_len; -+ } -+ iov.iov_base = (void *)nlh; -+ iov.iov_len = nlh->nlmsg_len; -+ -+ memset(&msg, 0, sizeof(msg)); -+ msg.msg_name = (void *)&dest_addr; -+ msg.msg_namelen = sizeof(dest_addr); -+ msg.msg_iov = &iov; -+ msg.msg_iovlen = 1; -+ -+ do { -+ rc = sendmsg(fd, &msg, 0); -+ if (rc == -ENOMEM) { -+ LOG_ERR(PFX "sendmsg: alloc_skb() failed"); -+ sleep(1); -+ } else if (rc < 0) { -+ LOG_ERR(PFX "sendmsg: bug?: on %d %s[0x%x]", -+ fd, strerror(errno), errno); -+ sleep(1); -+ } -+ } while ((rc < 0) && (event_loop_stop == 0)); -+ -+ return rc; -+} -+ -+/* -+ * __kipc_call() should never block. Therefore -+ * Netlink's xmit logic is serialized. This means we do not allocate on -+ * xmit path. Instead we reuse nlm_sendbuf buffer. -+ * -+ * Transport must assure non-blocking operations for: -+ * -+ * - session_create() -+ * - conn_create() -+ * - conn_bind() -+ * _ set_param() -+ * - conn_start() -+ * - conn_stop() -+ * -+ * Its OK to block for cleanup for short period of time in operatations for: -+ * -+ * - conn_destroy() -+ * - session_destroy() -+ * -+ * FIXME: interface needs to be extended to allow longer blocking on -+ * cleanup. (Dima) -+ */ -+int __kipc_call(int fd, void *iov_base, int iov_len) -+{ -+ int rc; -+ struct iovec iov; -+ struct iscsi_uevent *ev = iov_base; -+ enum iscsi_uevent_e type = ev->type; -+ -+ /* Sanity check */ -+ if (iov_base == NULL) -+ return -EINVAL; -+ -+ iov.iov_base = iov_base; -+ iov.iov_len = iov_len; -+ -+ rc = kwritev(fd, type, &iov, 1); -+ -+ return rc; -+} -+ -+static int pull_from_nl(char **buf) -+{ -+ int rc; -+ size_t ev_size, payload_size, alloc_size; -+ char nlm_ev[NLMSG_SPACE(sizeof(struct iscsi_uevent))]; -+ struct nlmsghdr *nlh; -+ char *data = NULL; -+ struct iscsi_uevent *ev; -+ -+ /* Take a quick peek at what how much uIP will need to read */ -+ rc = nl_read(nl_sock, nlm_ev, -+ NLMSG_SPACE(sizeof(struct iscsi_uevent)), -+ MSG_PEEK | MSG_WAITALL); -+ if (rc <= 0) { -+ LOG_ERR("can not read nlm_ev, error %s[%d]", -+ strerror(errno), rc); -+ if (rc == 0) -+ return -EIO; -+ else -+ return errno; -+ } -+ nlh = (struct nlmsghdr *)nlm_ev; -+ -+ if (unlikely(nlh->nlmsg_len < NLMSG_ALIGN(sizeof(struct nlmsghdr)))) { -+ LOG_ERR(PFX "Invalid nlh->nlmsg_len length: " -+ "nlh->nlmsg_len(%d) < " -+ "NLMSG_ALIGN(sizeof(struct nlmsghdr))(%d)", -+ nlh->nlmsg_len, NLMSG_ALIGN(sizeof(struct nlmsghdr))); -+ return -EINVAL; -+ } -+ -+ ev = (struct iscsi_uevent *)NLMSG_DATA(nlh); -+ if (ev->type == ISCSI_KEVENT_PATH_REQ) { -+ ev_size = nlh->nlmsg_len - NLMSG_ALIGN(sizeof(struct nlmsghdr)); -+ payload_size = ev_size - sizeof(struct iscsi_uevent); -+ if (payload_size < sizeof(struct iscsi_path)) -+ alloc_size = nlh->nlmsg_len + (payload_size - -+ sizeof(struct iscsi_path)); -+ else -+ alloc_size = nlh->nlmsg_len; -+ } else { -+ alloc_size = nlh->nlmsg_len; -+ } -+ data = (char *)malloc(alloc_size); -+ if (unlikely(data == NULL)) { -+ LOG_ERR(PFX "Couldn't allocate %d bytes for Netlink " -+ "iSCSI message", alloc_size); -+ return -ENOMEM; -+ } -+ -+ memset(data, 0, alloc_size); -+ rc = nl_read(nl_sock, data, (int)nlh->nlmsg_len, MSG_WAITALL); -+ if (rc <= 0) { -+ LOG_ERR("can not read nlm_ev, error %s[%d]", -+ strerror(errno), rc); -+ if (rc == 0) -+ rc = -EIO; -+ else -+ rc = errno; -+ -+ goto error; -+ } -+ *buf = data; -+ return 0; -+error: -+ if (data != NULL) -+ free(data); -+ -+ return rc; -+} -+ -+static const struct timespec ctldev_sleep_req = { -+ .tv_sec = 0, -+ .tv_nsec = 250000000, -+}; -+ -+static int ctldev_handle(char *data, nic_t *nic) -+{ -+ int rc; -+ struct iscsi_uevent *ev; -+ uint8_t *payload; -+ struct iscsi_path *path; -+ char *msg_type_str; -+ int i; -+ nic_interface_t *nic_iface = NULL; -+ -+ ev = (struct iscsi_uevent *)NLMSG_DATA(data); -+ switch (ev->type) { -+ case ISCSI_KEVENT_PATH_REQ: -+ msg_type_str = "path_req"; -+ break; -+ default: -+ /* We don't care about other iSCSI Netlink messages */ -+ LOG_DEBUG(PFX "Received ev->type: 0x%x", ev->type); -+ rc = 0; -+ goto error; -+ } -+ -+ /* This is a message that drivers should be interested in */ -+ LOG_INFO(PFX "%s: Processing '%s'", nic->log_name, msg_type_str); -+ -+ payload = (uint8_t *) ((uint8_t *) ev) + sizeof(*ev); -+ path = (struct iscsi_path *)payload; -+ -+ if (ev->type == ISCSI_KEVENT_PATH_REQ) { -+ struct timespec sleep_rem; -+ nic_interface_t *vlan_iface; -+ uint16_t ip_type; -+ int iface_num, vlan_id; -+ -+ if (path->ip_addr_len == 4) -+ ip_type = AF_INET; -+ else if (path->ip_addr_len == 16) -+ ip_type = AF_INET6; -+ else -+ ip_type = 0; -+#ifdef REQ_PATH_IFACE_NUM -+ /* Find the nic_iface to use */ -+ iface_num = ev->r.req_path.iface_num ? -+ ev->r.req_path.iface_num : IFACE_NUM_INVALID; -+#else -+ iface_num = IFACE_NUM_INVALID; -+#endif -+ vlan_id = path->vlan_id ? path->vlan_id : NO_VLAN; -+ -+ LOG_DEBUG(PFX "%s: PATH_REQ with iface_num %d VLAN %d", -+ nic->log_name, iface_num, vlan_id); -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ nic_iface = nic_find_nic_iface(nic, ip_type, vlan_id, -+ iface_num, IP_CONFIG_OFF); -+ if (nic_iface == NULL) { -+ nic_iface = nic_find_nic_iface(nic, ip_type, -+ NO_VLAN, -+ IFACE_NUM_INVALID, -+ IP_CONFIG_OFF); -+ if (nic_iface == NULL) { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ LOG_ERR(PFX "%s: Couldn't find nic iface parent" -+ " vlan: %d ip_type: %d " -+ "ip_addr_len: %d to clone", -+ nic->log_name, path->vlan_id, ip_type, -+ path->ip_addr_len); -+ goto error; -+ } -+ if (nic_iface->iface_num != IFACE_NUM_INVALID) { -+ /* New VLAN support: -+ Use the nic_iface found from the top -+ of the protocol family and ignore -+ the VLAN id from the path_req */ -+ if (!(nic_iface->iface_num == 0 && -+ nic_iface->vlan_id == 0 && -+ path->vlan_id)) { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ goto nic_iface_done; -+ } -+ /* If iface_num == 0 and vlan_id == 0 but -+ the vlan_id from path_req is > 0, -+ then fallthru to the legacy support since -+ this is most likely from an older iscsid -+ (RHEL6.2/6.3 but has iface_num support) -+ */ -+ } -+ /* Legacy VLAN support: -+ This newly created nic_iface must inherit the -+ network parameters from the parent nic_iface -+ */ -+ LOG_DEBUG(PFX "%s: Created the nic_iface for vlan: %d " -+ "ip_type: %d", nic->log_name, path->vlan_id, -+ ip_type); -+ vlan_iface = nic_iface_init(); -+ if (vlan_iface == NULL) { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ LOG_ERR(PFX "%s: Couldn't allocate " -+ "space for vlan: %d ip_type: " -+ "%d", nic->log_name, path->vlan_id, -+ ip_type); -+ goto error; -+ } -+ vlan_iface->protocol = ip_type; -+ vlan_iface->vlan_id = path->vlan_id; -+ nic_add_nic_iface(nic, vlan_iface); -+ -+ vlan_iface->ustack.ip_config = -+ nic_iface->ustack.ip_config; -+ memcpy(vlan_iface->ustack.hostaddr, -+ nic_iface->ustack.hostaddr, -+ sizeof(nic_iface->ustack.hostaddr)); -+ memcpy(vlan_iface->ustack.netmask, -+ nic_iface->ustack.netmask, -+ sizeof(nic_iface->ustack.netmask)); -+ memcpy(vlan_iface->ustack.netmask6, -+ nic_iface->ustack.netmask6, -+ sizeof(nic_iface->ustack.netmask6)); -+ memcpy(vlan_iface->ustack.hostaddr6, -+ nic_iface->ustack.hostaddr6, -+ sizeof(nic_iface->ustack.hostaddr6)); -+ -+ /* Persist so when nic_close won't call uip_reset -+ to nullify nic_iface->ustack */ -+ persist_all_nic_iface(nic); -+ -+ nic_iface = vlan_iface; -+ nic_iface->flags |= NIC_IFACE_ACQUIRE; -+ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ /* nic_disable but not going down */ -+ nic_disable(nic, 0); -+ } else { -+ pthread_mutex_unlock(&nic->nic_mutex); -+ } -+nic_iface_done: -+ /* Force enable the NIC */ -+ if (nic->state == NIC_STOPPED) -+ nic_enable(nic); -+ -+ /* Ensure that the NIC is RUNNING */ -+ rc = -EIO; -+ for (i = 0; i < 10; i++) { -+ if (nic->state == NIC_RUNNING) { -+ rc = 0; -+ break; -+ } -+ -+ nanosleep(&ctldev_sleep_req, &sleep_rem); -+ } -+ -+ if (rc != 0) { -+ LOG_WARN(PFX "%s[vlan: %d protocol: %d]: not running, " -+ "cmd: 0x%x nic state: 0x%x flags: 0x%x", -+ nic->log_name, -+ nic_iface->vlan_id, nic_iface->protocol, -+ ev->type, nic->state, nic->flags); -+ goto error; -+ } -+ } -+ -+ if (nic->ops) { -+ switch (ev->type) { -+ case ISCSI_KEVENT_PATH_REQ: -+ /* pass the request up to the user space -+ * library driver */ -+ nic_iface->flags |= NIC_IFACE_PATHREQ_WAIT2; -+ nic_iface->flags &= ~NIC_IFACE_PATHREQ_WAIT1; -+ if (nic->ops->handle_iscsi_path_req) -+ nic->ops->handle_iscsi_path_req(nic, -+ nl_sock, ev, -+ path, -+ nic_iface); -+ nic_iface->flags &= ~NIC_IFACE_PATHREQ_WAIT; -+ pthread_mutex_lock(&nic->nic_mutex); -+ nic->flags &= ~NIC_PATHREQ_WAIT; -+ pthread_mutex_unlock(&nic->nic_mutex); -+ LOG_INFO(PFX "%s: 'path_req' operation finished", -+ nic->log_name); -+ -+ rc = 0; -+ break; -+ default: -+ rc = -EAGAIN; -+ break; -+ } -+ } -+ -+error: -+ -+ return rc; -+} -+ -+/* NIC specific nl processing thread */ -+void *nl_process_handle_thread(void *arg) -+{ -+ int rc; -+ nic_t *nic = (nic_t *)arg; -+ -+ if (nic == NULL) -+ goto error; -+ -+ while (!event_loop_stop) { -+ char *data = NULL; -+ -+ rc = pthread_cond_wait(&nic->nl_process_cond, -+ &nic->nl_process_mutex); -+ if (rc != 0) { -+ LOG_ERR("Fatal error in NL processing thread " -+ "during wait[%s]", strerror(rc)); -+ break; -+ } -+ -+ data = nic->nl_process_ring[nic->nl_process_head]; -+ nic->nl_process_ring[nic->nl_process_head] = NULL; -+ nic->nl_process_tail = -+ NIC_NL_PROCESS_NEXT_ENTRY(nic->nl_process_tail); -+ -+ pthread_mutex_unlock(&nic->nl_process_mutex); -+ -+ if (data) { -+ ctldev_handle(data, nic); -+ free(data); -+ } -+ } -+error: -+ return NULL; -+} -+ -+static void flush_nic_nl_process_ring(nic_t *nic) -+{ -+ int i; -+ -+ for (i = 0; i < NIC_NL_PROCESS_MAX_RING_SIZE; i++) { -+ if (nic->nl_process_ring[i] != NULL) { -+ free(nic->nl_process_ring[i]); -+ nic->nl_process_ring[i] = NULL; -+ } -+ } -+ -+ nic->nl_process_head = 0; -+ nic->nl_process_tail = 0; -+ -+ LOG_DEBUG(PFX "%s: Flushed NIC NL ring", nic->log_name); -+} -+ -+/** -+ * nic_nl_open() - This is called when opening/creating the Netlink listening -+ * thread -+ * @param dev - CNIC UIO device to create a NetLink listener on -+ * @return 0 on success, <0 on failure -+ */ -+int nic_nl_open() -+{ -+ int rc; -+ char *msg_type_str; -+ -+ /* Prepare the thread to issue the ARP's */ -+ nl_sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ISCSI); -+ if (nl_sock < 0) { -+ LOG_ERR(PFX "can not create NETLINK_ISCSI socket [%s]", -+ strerror(errno)); -+ rc = -ENOMEM; -+ goto error; -+ } -+ -+ memset(&src_addr, 0, sizeof(src_addr)); -+ src_addr.nl_family = AF_NETLINK; -+ src_addr.nl_pid = getpid(); -+ src_addr.nl_groups = ISCSI_NL_GRP_UIP; -+ -+ while ((!event_loop_stop)) { -+ rc = bind(nl_sock, -+ (struct sockaddr *)&src_addr, sizeof(src_addr)); -+ if (rc == 0) -+ break; -+ -+ LOG_ERR(PFX "waiting binding to NETLINK_ISCSI socket"); -+ -+ sleep(1); -+ } -+ -+ if (event_loop_stop) { -+ rc = -EINVAL; -+ goto error; -+ } -+ -+ LOG_INFO(PFX "Netlink to CNIC on pid %d is ready", src_addr.nl_pid); -+ -+ while (!event_loop_stop) { -+ struct iscsi_uevent *ev; -+ char *buf = NULL; -+ uint32_t host_no; -+ nic_t *nic; -+ -+ rc = pull_from_nl(&buf); -+ if (rc != 0) -+ continue; -+ -+ /* Try to abort ARP'ing if a if_down was received */ -+ ev = (struct iscsi_uevent *)NLMSG_DATA(buf); -+ switch (ev->type) { -+ case ISCSI_KEVENT_IF_DOWN: -+ host_no = ev->r.notify_if_down.host_no; -+ msg_type_str = "if_down"; -+ break; -+ case ISCSI_KEVENT_PATH_REQ: -+ host_no = ev->r.req_path.host_no; -+ msg_type_str = "path_req"; -+ break; -+ default: -+ /* We don't care about other iSCSI Netlink messages */ -+ continue; -+ } -+ LOG_INFO(PFX "Received %s for host %d", msg_type_str, host_no); -+ -+ /* Make sure the nic list doesn't get yanked */ -+ pthread_mutex_lock(&nic_list_mutex); -+ -+ rc = from_host_no_find_associated_eth_device(host_no, &nic); -+ if (rc != 0) { -+ pthread_mutex_unlock(&nic_list_mutex); -+ LOG_ERR(PFX "Dropping msg, couldn't find nic with host " -+ "no: %d", host_no); -+ continue; -+ } -+ -+ /* Found the nic */ -+ if (nic->nl_process_thread == INVALID_THREAD) { -+ /* If thread is not valid, just drop it */ -+ pthread_mutex_unlock(&nic_list_mutex); -+ LOG_ERR(PFX "Dropping msg, nic nl process thread " -+ "not ready for host no: %d", host_no); -+ continue; -+ } -+ -+ if (ev->type == ISCSI_KEVENT_IF_DOWN) { -+ char eth_device_name[IFNAMSIZ]; -+ -+ pthread_mutex_lock(&nic->nl_process_mutex); -+ nic->nl_process_if_down = 1; -+ flush_nic_nl_process_ring(nic); -+ pthread_cond_broadcast(&nic->nl_process_if_down_cond); -+ pthread_mutex_unlock(&nic->nl_process_mutex); -+ -+ memcpy(eth_device_name, nic->eth_device_name, -+ sizeof(eth_device_name)); -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ nic->flags &= ~NIC_PATHREQ_WAIT; -+ nic->flags |= NIC_EXIT_MAIN_LOOP; -+ pthread_cond_broadcast(&nic->enable_done_cond); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ pthread_mutex_lock(&nic->nl_process_mutex); -+ nic->nl_process_if_down = 0; -+ pthread_mutex_unlock(&nic->nl_process_mutex); -+ -+ nic_disable(nic, 1); -+ -+ nic_remove(nic); -+ pthread_mutex_unlock(&nic_list_mutex); -+ -+ LOG_INFO(PFX "%s: 'if_down' operation finished", -+ eth_device_name); -+ continue; -+ } -+ -+ /* Place msg into the nic specific queue */ -+ pthread_mutex_lock(&nic->nl_process_mutex); -+ if ((nic->nl_process_head + 1 == nic->nl_process_tail) || -+ (nic->nl_process_tail == 0 && -+ nic->nl_process_head == NIC_NL_PROCESS_LAST_ENTRY)) { -+ pthread_mutex_unlock(&nic->nl_process_mutex); -+ pthread_mutex_unlock(&nic_list_mutex); -+ LOG_WARN(PFX "%s: No space on Netlink ring", -+ nic->log_name); -+ continue; -+ } -+ -+ nic->nl_process_ring[nic->nl_process_head] = buf; -+ nic->nl_process_head = -+ NIC_NL_PROCESS_NEXT_ENTRY(nic->nl_process_head); -+ pthread_cond_signal(&nic->nl_process_cond); -+ -+ pthread_mutex_unlock(&nic->nl_process_mutex); -+ -+ pthread_mutex_unlock(&nic_list_mutex); -+ -+ LOG_DEBUG(PFX "Pulled nl event"); -+ } -+ -+ LOG_INFO(PFX "Netlink thread exit'ing"); -+ rc = 0; -+ -+error: -+ return 0; -+} -diff --git a/iscsiuio/src/unix/nic_nl.h b/iscsiuio/src/unix/nic_nl.h -new file mode 100644 -index 0000000..90f76be ---- /dev/null -+++ b/iscsiuio/src/unix/nic_nl.h -@@ -0,0 +1,53 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_nl.h - NIC uIP NetLink user space stack -+ * -+ */ -+ -+#ifndef __NIC_NL_H__ -+#define __NIC_NL_H__ -+ -+#include -+ -+int nic_nl_open(); -+void nic_nl_close(); -+ -+int __kipc_call(int fd, void *iov_base, int iov_len); -+ -+extern pthread_cond_t nl_process_if_down_cond; -+extern pthread_mutex_t nl_process_mutex; -+extern int nl_process_if_down; -+ -+#endif /* __NIC_NL_H__ */ -diff --git a/iscsiuio/src/unix/nic_utils.c b/iscsiuio/src/unix/nic_utils.c -new file mode 100644 -index 0000000..2acd3c2 ---- /dev/null -+++ b/iscsiuio/src/unix/nic_utils.c -@@ -0,0 +1,1628 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_util.c - shared NIC utility functions -+ * -+ */ -+#include -+#include -+#include -+#define _GNU_SOURCE -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "logger.h" -+#include "nic.h" -+#include "nic_id.h" -+#include "nic_vlan.h" -+#include "nic_utils.h" -+#include "options.h" -+ -+#define PFX "nic_utils " -+ -+/****************************************************************************** -+ * String constants -+ *****************************************************************************/ -+static const char nic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; -+static const char cnic_sysfs_uio_event_template[] = -+ "/sys/class/uio/uio%d/event"; -+static const char base_uio_sysfs_name[] = "/sys/class/uio/"; -+static const char uio_name[] = "uio"; -+ -+static const char uio_base_dir[] = "/dev/uio"; -+static const char uio_udev_path_template[] = "/dev/uio%hd"; -+static const char uio_uevent_path_template[] = "/sys/class/uio/uio%d/uevent"; -+ -+static const char base_iscsi_host_name[] = "/sys/class/iscsi_host/"; -+static const char host_template[] = "host%d"; -+static const char iscsi_host_path_template[] = "/sys/class/iscsi_host/host%d"; -+static const char iscsi_host_path_netdev_template[] = -+ "/sys/class/iscsi_host/host%d/netdev"; -+static const char cnic_uio_sysfs_resc_template[] = -+ "/sys/class/uio/uio%i/device/resource%i"; -+ -+/** -+ * manually_trigger_uio_event() - If the uio file node doesn't exist then -+ * try to retrigger udev to create the file -+ * node by touch the uevent file in sysfs -+ * @param nic - the nic to trigger on -+ * @param uio_minor - UIO the minor number to use -+ * @return 0 on success -+ */ -+int manually_trigger_uio_event(nic_t *nic, int uio_minor) -+{ -+ int fd; -+ char uio_uevent_path[sizeof(uio_uevent_path_template) + 10]; -+ char enable_str[] = "online"; -+ int rc; -+ size_t bytes_wrote; -+ -+ rc = sprintf(uio_uevent_path, uio_uevent_path_template, uio_minor); -+ if (rc < 0) { -+ LOG_ERR(PFX "%s: Could not build uio uevent path", -+ nic->log_name); -+ return -EIO; -+ } -+ -+ LOG_DEBUG(PFX "%s: triggering UIO uevent path: %s", -+ nic->log_name, uio_uevent_path); -+ -+ fd = open(uio_uevent_path, O_WRONLY); -+ if (fd == -1) { -+ LOG_ERR(PFX "%s: Could not open uio uevent path: %s [%s]", -+ nic->log_name, uio_uevent_path, strerror(errno)); -+ return -EIO; -+ } -+ -+ bytes_wrote = write(fd, enable_str, sizeof(enable_str)); -+ if (bytes_wrote != sizeof(enable_str)) { -+ LOG_ERR(PFX "%s: Could write to uio uevent path: %s [%s]", -+ nic->log_name, uio_uevent_path, strerror(errno)); -+ rc = -EIO; -+ } else -+ rc = 0; -+ -+ close(fd); -+ return rc; -+} -+ -+static int wait_for_file_node_timed(nic_t *nic, char *filepath, int seconds) -+{ -+ struct timeval start_time; -+ struct timeval wait_time; -+ struct timeval total_time; -+ struct timespec sleep_req, sleep_rem; -+ -+ sleep_req.tv_sec = 0; -+ sleep_req.tv_nsec = 250000000; -+ -+ wait_time.tv_sec = seconds; -+ wait_time.tv_usec = 0; -+ -+ if (gettimeofday(&start_time, NULL)) { -+ LOG_ERR(PFX "%s: Couldn't gettimeofday() during watch file: %s" -+ "[%s]", nic->log_name, filepath, strerror(errno)); -+ return -EIO; -+ } -+ -+ timeradd(&start_time, &wait_time, &total_time); -+ -+ while (1) { -+ struct timeval current_time; -+ struct stat file_stat; -+ -+ /* Check if the file node exists */ -+ if (stat(filepath, &file_stat) == 0) -+ return 0; -+ -+ if (gettimeofday(¤t_time, NULL)) { -+ LOG_ERR(PFX "%s: Couldn't get current time for " -+ "watching file: %s [%s]", -+ nic->log_name, filepath, strerror(errno)); -+ return -EIO; -+ } -+ -+ /* Timeout has excceded return -ETIME */ -+ if (timercmp(&total_time, ¤t_time, <)) { -+ LOG_ERR(PFX "%s: timeout waiting %d secs for file: %s", -+ nic->log_name, seconds, filepath); -+ return -ETIME; -+ } -+ -+ nanosleep(&sleep_req, &sleep_rem); -+ } -+} -+ -+/****************************************************************************** -+ * Autodiscovery of iscsi_hosts -+ *****************************************************************************/ -+static int filter_host_name(const struct dirent *entry) -+{ -+ if ((memcmp(entry->d_name, "host", 4) == 0)) -+ return 1; -+ else -+ return 0; -+} -+ -+int nic_discover_iscsi_hosts() -+{ -+ struct dirent **files; -+ int count; -+ int i; -+ int rc; -+ -+ count = scandir(base_iscsi_host_name, &files, filter_host_name, -+ alphasort); -+ -+ switch (count) { -+ case 0: -+ /* Currently there are no iSCSI hosts */ -+ rc = 0; -+ break; -+ -+ case -1: -+ LOG_WARN(PFX "Error when scanning path: %s[%s]", -+ base_iscsi_host_name, strerror(errno)); -+ rc = -EINVAL; -+ break; -+ -+ default: -+ /* There are iSCSI hosts */ -+ pthread_mutex_lock(&nic_list_mutex); -+ for (i = 0; i < count; i++) { -+ int host_no; -+ char *raw = NULL; -+ uint32_t raw_size = 0; -+ char temp_path[sizeof(iscsi_host_path_netdev_template) + -+ 8]; -+ rc = sscanf(files[i]->d_name, host_template, &host_no); -+ nic_t *nic; -+ -+ LOG_INFO(PFX "Found host[%d]: %s", -+ host_no, files[i]->d_name); -+ -+ /* Build the path to determine netdev name */ -+ snprintf(temp_path, sizeof(temp_path), -+ iscsi_host_path_netdev_template, host_no); -+ -+ rc = capture_file(&raw, &raw_size, temp_path); -+ if (rc != 0) -+ continue; -+ -+ rc = from_host_no_find_associated_eth_device(host_no, -+ &nic); -+ if (rc != 0) { -+ /* Normalize the string */ -+ if (raw[raw_size - 1] == '\n') -+ raw[raw_size - 1] = '\0'; -+ -+ nic = nic_init(); -+ if (nic == NULL) { -+ LOG_ERR(PFX "Couldn't allocate " -+ "space for NIC %s " -+ "during scan", raw); -+ -+ rc = -ENOMEM; -+ break; -+ } -+ -+ strncpy(nic->eth_device_name, raw, raw_size); -+ nic->config_device_name = nic->eth_device_name; -+ nic->log_name = nic->eth_device_name; -+ -+ if (nic_fill_name(nic) != 0) { -+ free(nic); -+ free(raw); -+ rc = -EIO; -+ continue; -+ } -+ -+ nic_add(nic); -+ -+ LOG_INFO(PFX "NIC not found creating an " -+ "instance for host_no: %d %s", -+ host_no, nic->eth_device_name); -+ } else -+ LOG_INFO(PFX "%s: NIC found host_no: %d", -+ nic->log_name, host_no); -+ -+ free(raw); -+ } -+ pthread_mutex_unlock(&nic_list_mutex); -+ -+ /* Cleanup the scandir() call */ -+ for (i = 0; i < count; i++) -+ free(files[i]); -+ free(files); -+ -+ rc = 0; -+ break; -+ } -+ -+ return rc; -+} -+ -+/****************************************************************************** -+ * Enable/Disable Multicast on physical interface -+ *****************************************************************************/ -+static int nic_util_enable_disable_multicast(nic_t *nic, uint32_t cmd) -+{ -+ int rc = 0; -+ struct uip_eth_addr multicast_addr; -+ int fd; -+ struct ifreq ifr; -+ -+ /* adding ethernet multicast address for IPv6 */ -+ memcpy(&multicast_addr, nic->mac_addr, ETH_ALEN); -+ multicast_addr.addr[0] = 0x33; -+ multicast_addr.addr[1] = 0x33; -+ multicast_addr.addr[2] = 0xff; -+ -+ /* Prepare the request */ -+ memset(&ifr, 0, sizeof(ifr)); -+ strncpy(ifr.ifr_name, nic->eth_device_name, -+ sizeof(nic->eth_device_name)); -+ memcpy(ifr.ifr_hwaddr.sa_data, multicast_addr.addr, ETH_ALEN); -+ -+ fd = socket(AF_INET, SOCK_DGRAM, 0); -+ if (fd < 0) { -+ LOG_ERR(PFX "%s: Couldn't create socket to %s " -+ "multicast address: %s", -+ nic->log_name, -+ cmd == SIOCADDMULTI ? "added" : "delete", -+ strerror(errno)); -+ return errno; -+ } -+ -+ rc = fcntl(fd, F_SETFL, O_NONBLOCK); -+ if (rc != 0) { -+ LOG_WARN("%s: Couldn't set to ethtool IOCTL to " -+ "non-blocking [%s]", nic->log_name, strerror(errno)); -+ } -+ -+ if (ioctl(fd, cmd, (char *)&ifr) != 0) { -+ LOG_ERR("%s: Couldn't issue ioctl socket to %s " -+ "multicast address: %s", -+ nic->log_name, -+ cmd == SIOCADDMULTI ? "add" : "delete", -+ strerror(errno)); -+ rc = errno; -+ goto error; -+ } -+ -+ LOG_INFO(PFX "%s: %s address %02x:%02x:%02x:%02x:%02x:%02x " -+ "to multicast list", -+ nic->log_name, -+ cmd == SIOCADDMULTI ? "Added" : "Deleted", -+ multicast_addr.addr[0], multicast_addr.addr[1], -+ multicast_addr.addr[2], multicast_addr.addr[3], -+ multicast_addr.addr[4], multicast_addr.addr[5]); -+ -+ if (cmd == SIOCADDMULTI) -+ nic->flags |= NIC_ADDED_MULICAST; -+ else -+ nic->flags &= ~NIC_ADDED_MULICAST; -+ -+error: -+ close(fd); -+ -+ return rc; -+} -+ -+/** -+ * enable_multicast() - This fuction is used to enable -+ * the listening of multicast addresses for a given network interface -+ * @param nic - NIC device to enable multicast on -+ * @return 0 for success or <0 for failure -+ */ -+int enable_multicast(nic_t *nic) -+{ -+ return nic_util_enable_disable_multicast(nic, SIOCADDMULTI); -+} -+ -+/** -+ * disable_multicast() - This fuction is used to disable -+ * the listening of multicast addresses for a given network interface -+ * @param dev - NIC device to disable multicast on -+ * @return 0 for success or <0 for failure -+ */ -+int disable_multicast(nic_t *nic) -+{ -+ return nic_util_enable_disable_multicast(nic, SIOCDELMULTI); -+} -+ -+/******************************************************************************* -+ * Finding associated UIO/physical network interfaces -+ ******************************************************************************/ -+static int filter_net_name(const struct dirent *entry) -+{ -+ if ((memcmp(entry->d_name, "net:", 4) == 0)) -+ return 1; -+ else -+ return 0; -+} -+ -+static char *extract_net_name(struct dirent **files) -+{ -+ return strstr(files[0]->d_name, ":"); -+} -+ -+static int filter_dot_out(const struct dirent *entry) -+{ -+ if ((memcmp(entry->d_name, ".", 1) == 0)) -+ return 0; -+ else -+ return 1; -+} -+ -+static char *extract_none(struct dirent **files) -+{ -+ return files[0]->d_name; -+} -+ -+/** -+ * from_host_no_find_nic() - Given the host number -+ * this function will try to find the assoicated nic interface -+ * Must be called with nic_list_mutex lock -+ * @param host_no - minor number of the UIO device -+ * @param nic - pointer to the NIC will set if successful -+ * @return 0 on success, <0 on error -+ */ -+int from_host_no_find_associated_eth_device(int host_no, nic_t **nic) -+{ -+ nic_t *current_nic = nic_list; -+ char *raw = NULL, *raw_tmp; -+ uint32_t raw_size = 0; -+ -+ char temp_path[sizeof(iscsi_host_path_netdev_template) + 8]; -+ int rc = -EIO; -+ -+ /* Build the path to determine uio name */ -+ snprintf(temp_path, sizeof(temp_path), -+ iscsi_host_path_netdev_template, host_no); -+ -+ rc = capture_file(&raw, &raw_size, temp_path); -+ if (rc != 0) -+ goto error; -+ -+ /* sanitize name string by replacing newline with null termination */ -+ raw_tmp = raw; -+ while (*raw_tmp != '\n' && raw_size--) -+ raw_tmp++; -+ *raw_tmp = '\0'; -+ -+ rc = -EIO; -+ -+ current_nic = nic_list; -+ while (current_nic != NULL) { -+ if (strcmp(raw, current_nic->eth_device_name) == 0) { -+ *nic = current_nic; -+ rc = 0; -+ break; -+ } -+ -+ current_nic = current_nic->next; -+ } -+ -+ free(raw); -+ -+error: -+ return rc; -+} -+ -+/******************************************************************************* -+ * NIC packet handling functions -+ ******************************************************************************/ -+/** -+ * from_uio_find_associated_eth_device() - Given the uio minor number -+ * this function will try to find the assoicated phyisical network -+ * interface -+ * @param uio_minor - minor number of the UIO device -+ * @param name - char buffer which will be filled if successful -+ * @param name_size - size of the name buffer -+ * @return >0 minor number <0 an error -+ */ -+static int from_uio_find_associated_eth_device(nic_t *nic, -+ int uio_minor, -+ char *name, size_t name_size) -+{ -+ char *path; -+ int rc; -+ int count; -+ struct dirent **files; -+ char *parsed_name; -+ int i; -+ int path_iterator; -+ char *search_paths[] = { "/sys/class/uio/uio%i/device/", -+ "/sys/class/uio/uio%i/device/net" -+ }; -+ int path_to[] = { 5, 1 }; -+ int (*search_filters[]) (const struct dirent *) = { -+ filter_net_name, filter_dot_out,}; -+ char *(*extract_name[]) (struct dirent **files) = { -+ extract_net_name, extract_none,}; -+ int extract_name_offset[] = { 1, 0 }; -+ -+ path = malloc(PATH_MAX); -+ if (path == NULL) { -+ LOG_ERR(PFX "Could not allocate memory for path"); -+ rc = -ENOMEM; -+ goto error; -+ } -+ -+ for (path_iterator = 0; -+ path_iterator < sizeof(search_paths) / sizeof(search_paths[0]); -+ path_iterator++) { -+ /* Build the path to determine uio name */ -+ rc = sprintf(path, search_paths[path_iterator], uio_minor); -+ -+ wait_for_file_node_timed(nic, path, path_to[path_iterator]); -+ -+ count = scandir(path, &files, -+ search_filters[path_iterator], alphasort); -+ -+ switch (count) { -+ case 1: -+ parsed_name = (*extract_name[path_iterator]) (files); -+ if (parsed_name == NULL) { -+ LOG_WARN(PFX "Couldn't find delimiter in: %s", -+ files[0]->d_name); -+ -+ break; -+ } -+ -+ strncpy(name, -+ parsed_name + -+ extract_name_offset[path_iterator], name_size); -+ -+ free(files[0]); -+ free(files); -+ -+ rc = 0; -+ break; -+ -+ case 0: -+ rc = -EINVAL; -+ break; -+ -+ case -1: -+ LOG_WARN(PFX "Error when scanning path: %s[%s]", -+ path, strerror(errno)); -+ rc = -EINVAL; -+ break; -+ -+ default: -+ LOG_WARN(PFX -+ "Too many entries when looking for device: %s", -+ path); -+ -+ /* Cleanup the scandir() call */ -+ for (i = 0; i < count; i++) -+ free(files[i]); -+ free(files); -+ -+ rc = -EINVAL; -+ break; -+ } -+ -+ if (rc == 0) -+ break; -+ } -+ -+error: -+ free(path); -+ -+ return rc; -+} -+ -+/** -+ * filter_uio_name() - This is the callback used by scandir when looking for -+ * the number of uio entries -+ */ -+static int filter_uio_name(const struct dirent *entry) -+{ -+ /* Only return if the name of the file begins with 'uio' */ -+ if ((memcmp(entry->d_name, uio_name, sizeof(uio_name) - 1) == 0)) -+ return 1; -+ else -+ return 0; -+} -+ -+/** -+ * from_netdev_name_find_nic() - This is used to find the NIC device given -+ * the netdev name -+ * @param interface_name - name of the interface to search on -+ * @param nic - pointer of the pointer to the NIC -+ * @return 0 on success, <0 on failure -+ */ -+int from_netdev_name_find_nic(char *interface_name, nic_t **nic) -+{ -+ nic_t *current_nic; -+ -+ current_nic = nic_list; -+ while (current_nic != NULL) { -+ if (strcmp(interface_name, current_nic->eth_device_name) == 0) -+ break; -+ -+ current_nic = current_nic->next; -+ } -+ -+ if (current_nic == NULL) -+ return -EINVAL; -+ -+ *nic = current_nic; -+ return 0; -+} -+ -+/** -+ * from_phys_name_find_assoicated_uio_device() - This is used to find the -+ * uio minor -+ * when given a network interface name -+ * @param interface_name - network interface name to search for -+ * @return >0 minor number <0 an error -+ */ -+int from_phys_name_find_assoicated_uio_device(nic_t *nic) -+{ -+ char *path = NULL; -+ int count; -+ struct dirent **files; -+ int i; -+ int rc; -+ char *interface_name = nic->config_device_name; -+ -+ if (interface_name == NULL) -+ interface_name = nic->eth_device_name; -+ -+ /* Wait at least 10 seconds for uio sysfs entries to appear */ -+ rc = wait_for_file_node_timed(nic, (char *)base_uio_sysfs_name, 10); -+ if (rc != 0) -+ return rc; -+ -+ count = scandir(base_uio_sysfs_name, -+ &files, filter_uio_name, alphasort); -+ -+ switch (count) { -+ case 0: -+ LOG_WARN(PFX "Couldn't find %s to determine uio minor", -+ interface_name); -+ return -EINVAL; -+ -+ case -1: -+ LOG_WARN(PFX "Error when scanning for %s in path: %s [%s]", -+ interface_name, base_uio_sysfs_name, strerror(errno)); -+ return -EINVAL; -+ } -+ -+ path = malloc(PATH_MAX); -+ if (path == NULL) { -+ LOG_ERR(PFX "Could not allocate memory for path"); -+ return -ENOMEM; -+ } -+ -+ /* Run through the contents of the filtered files to see if the -+ * network interface name matches that of the uio device */ -+ for (i = 0; i < count; i++) { -+ int uio_minor; -+ char eth_name[IFNAMSIZ]; -+ -+ rc = sscanf(files[i]->d_name, "uio%d", &uio_minor); -+ if (rc != 1) { -+ LOG_WARN("Could not parse: %s", files[i]->d_name); -+ continue; -+ } -+ -+ rc = from_uio_find_associated_eth_device(nic, -+ uio_minor, -+ eth_name, -+ sizeof(eth_name)); -+ if (rc != 0) { -+ LOG_WARN("uio minor: %d not valid [%D]", uio_minor, rc); -+ continue; -+ } -+ -+ if (strncmp(eth_name, interface_name, sizeof(eth_name)) == 0) { -+ memcpy(nic->eth_device_name, -+ eth_name, sizeof(nic->eth_device_name)); -+ -+ LOG_INFO(PFX "%s associated with uio%d", -+ nic->eth_device_name, uio_minor); -+ -+ rc = uio_minor; -+ goto done; -+ } -+ } -+ -+ LOG_WARN("Could not find assoicate uio device with %s", interface_name); -+ -+ rc = -EINVAL; -+done: -+ if (path != NULL) -+ free(path); -+ -+ for (i = 0; i < count; i++) -+ free(files[i]); -+ free(files); -+ -+ return rc; -+ -+} -+ -+/** -+ * nic_verify_uio_sysfs_name() - Using the name entry in sysfs it will try to -+ * match the NIC library name -+ * @param nic - The NIC hardware to check -+ * -+ */ -+int nic_verify_uio_sysfs_name(nic_t *nic) -+{ -+ char *raw = NULL, *raw_tmp; -+ uint32_t raw_size = 0; -+ char temp_path[sizeof(nic_uio_sysfs_name_tempate) + 8]; -+ int rc = 0; -+ -+ /* Build the path to determine uio name */ -+ snprintf(temp_path, sizeof(temp_path), -+ nic_uio_sysfs_name_tempate, nic->uio_minor); -+ -+ rc = capture_file(&raw, &raw_size, temp_path); -+ if (rc != 0) -+ goto error; -+ -+ /* sanitize name string by replacing newline with null termination */ -+ raw_tmp = raw; -+ while (*raw_tmp != '\n' && raw_size--) -+ raw_tmp++; -+ *raw_tmp = '\0'; -+ -+ /* If the nic library is not set then check if there is a library -+ * which matches the library name */ -+ if (nic->nic_library == NULL) { -+ NIC_LIBRARY_EXIST_T exist; -+ -+ exist = does_nic_uio_name_exist(raw); -+ if (exist == NIC_LIBRARY_DOESNT_EXIST) { -+ LOG_ERR(PFX "%s: could not find library: %s ", -+ nic->log_name, raw); -+ rc = -EIO; -+ } -+ } else { -+ char *library_name; -+ size_t library_name_size; -+ -+ /* Get the string name from the NIC library */ -+ (*nic->ops->lib_ops.get_library_name) (&library_name, -+ &library_name_size); -+ -+ if (strcmp(raw, library_name) != 0) { -+ LOG_ERR(PFX "%s: uio names not equal: " -+ "expecting %s got %s from %s", -+ nic->log_name, library_name, raw, temp_path); -+ rc = -EIO; -+ } -+ } -+ -+ free(raw); -+ -+ LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); -+ -+error: -+ return rc; -+} -+ -+/** -+ * nic_fill_name() - This will initialize all the hardware resources underneath -+ * a struct cnic_uio device -+ * @param nic - The nic device to attach the hardware with -+ * @return 0 on success, on failure a errno will be returned -+ */ -+int nic_fill_name(nic_t *nic) -+{ -+ int rc; -+ -+ if ((nic->config_device_name != NULL) && -+ (memcmp(uio_base_dir, nic->config_device_name, -+ sizeof(uio_base_dir) - 1) == 0)) { -+ uint16_t uio_minor; -+ char eth_name[sizeof(nic->eth_device_name)]; -+ -+ wait_for_file_node_timed(nic, nic->config_device_name, 5); -+ -+ /* Determine the minor number for the UIO device */ -+ rc = sscanf(nic->config_device_name, uio_udev_path_template, -+ &uio_minor); -+ if (rc != 1) { -+ LOG_WARN(PFX "%s: Could not parse for minor number", -+ nic->uio_device_name); -+ return -EINVAL; -+ } else -+ nic->uio_minor = uio_minor; -+ -+ nic->uio_device_name = nic->config_device_name; -+ -+ /* Determine the assoicated physical network interface */ -+ rc = from_uio_find_associated_eth_device(nic, -+ nic->uio_minor, -+ eth_name, -+ sizeof(eth_name)); -+ if (rc != 0) { -+ LOG_WARN(PFX "%s: Couldn't find associated eth device", -+ nic->uio_device_name); -+ } else { -+ memcpy(nic->eth_device_name, -+ eth_name, sizeof(eth_name)); -+ } -+ -+ LOG_INFO(PFX "%s: configured for uio device for %s", -+ nic->log_name, nic->uio_device_name); -+ -+ } else { -+ LOG_INFO(PFX "looking for uio device for %s", -+ nic->config_device_name); -+ -+ rc = from_phys_name_find_assoicated_uio_device(nic); -+ if (rc < 0) { -+ LOG_ERR(PFX "Could not determine UIO name for %s", -+ nic->config_device_name); -+ -+ return -rc; -+ } -+ -+ nic->uio_minor = rc; -+ -+ if (nic->flags & NIC_UIO_NAME_MALLOC) -+ free(nic->uio_device_name); -+ -+ nic->uio_device_name = -+ malloc(sizeof(uio_udev_path_template) + 8); -+ if (nic->uio_device_name == NULL) { -+ LOG_INFO(PFX "%s: Couldn't malloc space for uio name", -+ nic->log_name); -+ return -ENOMEM; -+ } -+ -+ snprintf(nic->uio_device_name, -+ sizeof(uio_udev_path_template) + 8, -+ uio_udev_path_template, nic->uio_minor); -+ -+ nic->flags |= NIC_UIO_NAME_MALLOC; -+ } -+ -+ return 0; -+} -+ -+void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no, -+ char *sys_path, size_t size) -+{ -+ /* Build the path to sysfs pci resource */ -+ snprintf(sys_path, size, -+ cnic_uio_sysfs_resc_template, nic->uio_minor, resc_no); -+ -+} -+ -+void prepare_library(nic_t *nic) -+{ -+ int rc; -+ NIC_LIBRARY_EXIST_T exist; -+ -+ nic_fill_name(nic); -+ -+ /* No assoicated library, we can skip it */ -+ if (nic->library_name != NULL) { -+ /* Check that we have the proper NIC library loaded */ -+ exist = does_nic_library_exist(nic->library_name); -+ if (exist == NIC_LIBRARY_DOESNT_EXIST) { -+ LOG_ERR(PFX "NIC library doesn't exists: %s", -+ nic->library_name); -+ goto error; -+ } -+ } -+ -+ /* Determine the NIC library to use based on the PCI Id */ -+ rc = find_set_nic_lib(nic); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Couldn't find NIC library", nic->log_name); -+ goto error; -+ } -+ -+ LOG_INFO("%s: found NIC '%s'", nic->log_name, nic->pci_id->device_name); -+error: -+ return; -+} -+ -+void prepare_nic_thread(nic_t *nic) -+{ -+ int rc; -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ if (nic->thread == INVALID_THREAD) { -+ struct timespec ts; -+ struct timeval tp; -+ -+ LOG_INFO(PFX "%s: spinning up thread for nic", nic->log_name); -+ -+ /* Try to spin up the nic thread */ -+ rc = pthread_create(&nic->thread, NULL, nic_loop, nic); -+ if (rc != 0) { -+ LOG_ERR(PFX "%s: Couldn't create thread for nic", -+ nic->log_name); -+ goto error; -+ } -+ -+ /* Convert from timeval to timespec */ -+ rc = gettimeofday(&tp, NULL); -+ ts.tv_sec = tp.tv_sec; -+ ts.tv_nsec = tp.tv_usec * 1000; -+ ts.tv_sec += 5; /* TODO: hardcoded wait for 5 seconds */ -+ -+ /* Wait for the nic loop thread to to running */ -+ rc = pthread_cond_timedwait(&nic->nic_loop_started_cond, -+ &nic->nic_mutex, &ts); -+ -+ LOG_INFO("Created nic thread: %s", nic->log_name); -+ } -+ -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+error: -+ return; -+} -+ -+/******************************************************************************* -+ * Functions used to enable/disable the NIC -+ ******************************************************************************/ -+/** -+ * nic_enable() - Function used to enable the NIC -+ * @param nic - NIC to enable -+ * @return 0 on success, <0 on failure -+ */ -+int nic_enable(nic_t *nic) -+{ -+ if (nic->flags & NIC_GOING_DOWN) { -+ LOG_INFO(PFX "%s: NIC device is going down, " -+ "flag: 0x%x state: 0x%x", -+ nic->log_name, nic->flags, nic->state); -+ return -EINVAL; -+ } -+ if (nic->state == NIC_STOPPED) { -+ struct timespec ts; -+ struct timeval tp; -+ int rc; -+ -+ pthread_mutex_lock(&nic->nic_mutex); -+ /* Signal the device to enable itself */ -+ pthread_cond_broadcast(&nic->enable_wait_cond); -+ -+ nic->flags &= ~NIC_DISABLED; -+ nic->flags |= NIC_ENABLED; -+ nic->flags |= NIC_ENABLED_PENDING; -+ -+ /* Convert from timeval to timespec */ -+ rc = gettimeofday(&tp, NULL); -+ ts.tv_sec = tp.tv_sec; -+ ts.tv_nsec = tp.tv_usec * 1000; -+ ts.tv_sec += 100; -+ -+ /* Wait for the device to be enabled */ -+ rc = pthread_cond_timedwait(&nic->enable_done_cond, -+ &nic->nic_mutex, &ts); -+ if (rc == 0 && nic->flags & NIC_ENABLED) { -+ LOG_DEBUG(PFX "%s: device enabled", nic->log_name); -+ } else { -+ nic->flags &= ~NIC_ENABLED; -+ nic->flags |= NIC_DISABLED; -+ nic->flags &= ~NIC_ENABLED_PENDING; -+ -+ LOG_ERR(PFX "%s: waiting to finish nic_enable err: %s", -+ nic->log_name, strerror(rc)); -+ } -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ return rc; -+ } else { -+ LOG_INFO(PFX "%s: device already enabled: " -+ "flag: 0x%x state: 0x%x", -+ nic->log_name, nic->flags, nic->state); -+ return -EALREADY; -+ } -+} -+ -+/** -+ * nic_disable() - Function used to disable the NIC -+ * @param nic - NIC to disble -+ * @return 0 on success, <0 on failure -+ */ -+int nic_disable(nic_t *nic, int going_down) -+{ -+ if (nic->state == NIC_STARTED_RUNNING || -+ nic->state == NIC_RUNNING) { -+ struct timespec ts; -+ struct timeval tp; -+ int rc; -+ -+ /* Wait for the device to be disabled */ -+ pthread_mutex_lock(&nic->nic_mutex); -+ -+ nic->flags &= ~NIC_ENABLED; -+ nic->flags |= NIC_DISABLED; -+ nic->flags &= ~NIC_STARTED_RUNNING; -+ nic->state = NIC_STOPPED; -+ -+ if (going_down) -+ nic->flags |= NIC_GOING_DOWN; -+ -+ /* Convert from timeval to timespec */ -+ rc = gettimeofday(&tp, NULL); -+ ts.tv_sec = tp.tv_sec; -+ ts.tv_nsec = tp.tv_usec * 1000; -+ ts.tv_sec += 5; /* TODO: hardcoded wait for 5 seconds */ -+ -+ /* Wait for the device to be disabled */ -+ rc = pthread_cond_timedwait(&nic->disable_wait_cond, -+ &nic->nic_mutex, &ts); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ LOG_DEBUG(PFX "%s: device disabled", nic->log_name); -+ -+ return 0; -+ } else { -+ LOG_WARN(PFX "%s: device already disabled: " -+ "flag: 0x%x state: 0x%x", -+ nic->log_name, nic->flags, nic->state); -+ return -EALREADY; -+ } -+} -+ -+void nic_close_all() -+{ -+ nic_t *nic; -+ -+ pthread_mutex_lock(&nic_list_mutex); -+ -+ /* Start the shutdown process */ -+ nic = nic_list; -+ while (nic != NULL) { -+ pthread_mutex_lock(&nic->nic_mutex); -+ nic_close(nic, 1, FREE_ALL_STRINGS); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ -+ nic = nic->next; -+ } -+ pthread_mutex_unlock(&nic_list_mutex); -+ -+ LOG_INFO(PFX "All NICs closed"); -+} -+ -+void nic_remove_all() -+{ -+ nic_t *nic, *nic_next; -+ -+ pthread_mutex_lock(&nic_list_mutex); -+ -+ /* Start the shutdown process */ -+ nic = nic_list; -+ while (nic != NULL) { -+ nic_next = nic->next; -+ pthread_mutex_lock(&nic->nic_mutex); -+ nic_close(nic, 1, FREE_ALL_STRINGS); -+ pthread_mutex_unlock(&nic->nic_mutex); -+ nic_remove(nic); -+ nic = nic_next; -+ } -+ pthread_mutex_unlock(&nic_list_mutex); -+ -+ LOG_INFO(PFX "All NICs removed"); -+} -+ -+ -+/****************************************************************************** -+ * Routines to read initialized UIO values from sysfs -+ *****************************************************************************/ -+/** -+ * determine_initial_uio_events() - This utility function will -+ * determine the number of uio events that have occured on the -+ * given device. This value is read from the UIO sysfs entry -+ * @param dev - device to read from -+ * @param num_of_event - number of UIO events -+ * @return 0 is success, <0 failure -+ */ -+int detemine_initial_uio_events(nic_t *nic, uint32_t *num_of_events) -+{ -+ char *raw = NULL; -+ uint32_t raw_size = 0; -+ ssize_t elements_read; -+ char temp_path[sizeof(cnic_sysfs_uio_event_template) + 8]; -+ int rc; -+ -+ /* Capture RX buffer size */ -+ snprintf(temp_path, sizeof(temp_path), -+ cnic_sysfs_uio_event_template, nic->uio_minor); -+ -+ rc = capture_file(&raw, &raw_size, temp_path); -+ if (rc != 0) -+ goto error; -+ -+ elements_read = sscanf(raw, "%d", num_of_events); -+ if (elements_read != 1) { -+ LOG_ERR(PFX "%s: Couldn't parse UIO events size from %s", -+ nic->log_name, temp_path); -+ rc = -EIO; -+ goto error; -+ } -+ -+ rc = 0; -+error: -+ if (raw != NULL) -+ free(raw); -+ -+ return rc; -+} -+ -+/** -+ * nic_set_all_nic_iface_mac_to_parent() - This is a utility function used to -+ * intialize all the MAC addresses of the network interfaces for a given -+ * CNIC UIO device -+ * Call with nic mutex held -+ * @param dev - CNIC UIO device to initialize -+ */ -+void nic_set_all_nic_iface_mac_to_parent(nic_t *nic) -+{ -+ nic_interface_t *current, *vlan_current; -+ -+ current = nic->nic_iface; -+ while (current != NULL) { -+ /* Set the initial MAC address of this interface to the parent -+ * adapter */ -+ memcpy(current->mac_addr, nic->mac_addr, 6); -+ -+ vlan_current = current->vlan_next; -+ while (vlan_current != NULL) { -+ memcpy(vlan_current->mac_addr, nic->mac_addr, 6); -+ vlan_current = vlan_current->vlan_next; -+ } -+ current = current->next; -+ } -+} -+ -+/******************************************************************************* -+ * NIC packet handling functions -+ ******************************************************************************/ -+/** -+ * nic_alloc_packet_buffer() - Used to allocate a packet buffer used to -+ * send a TX packet later -+ * @param nic - nic device to send the packet on -+ * @param nic_iface - nic interface to send out on -+ * @param buf - pointer to the buffer to send -+ * @param buf_size - size in bytes of the buffer to send -+ * @return pointer to the allocated packet buffer -+ * NULL if memory could not be allocated -+ */ -+static packet_t *nic_alloc_packet_buffer(nic_t *nic, -+ nic_interface_t *nic_iface, -+ uint8_t *buf, size_t buf_size) -+{ -+ packet_t *pkt; -+ -+ pkt = malloc(sizeof(*pkt) + buf_size); -+ if (pkt == NULL) { -+ LOG_ERR(PFX "%s: Couldn't allocate space for packet buffer", -+ nic->log_name); -+ return NULL; -+ } -+ -+ pkt->next = NULL; -+ pkt->nic = nic; -+ pkt->nic_iface = nic_iface; -+ pkt->buf_size = buf_size; -+ memcpy(pkt->buf, buf, buf_size); -+ -+ return pkt; -+} -+ -+/** -+ * nic_queue_tx_packet() - Used to queue a TX packet buffer to send later -+ * @param nic - NIC device to send the packet on -+ * @param nic_iface - NIC interface to send on the packet on -+ * @param pkt - packet to queue -+ * @return 0 if successful or <0 if unsuccessful -+ */ -+int nic_queue_tx_packet(nic_t *nic, -+ nic_interface_t *nic_iface, packet_t *pkt) -+{ -+ packet_t *queued_pkt; -+ -+ queued_pkt = nic_alloc_packet_buffer(nic, nic_iface, -+ pkt->buf, pkt->buf_size); -+ if (queued_pkt == NULL) { -+ LOG_ERR(PFX "%s: Couldn't allocate tx packet to queue", -+ nic->log_name); -+ return -ENOMEM; -+ } -+ -+ if (nic->tx_packet_queue == NULL) { -+ nic->tx_packet_queue = queued_pkt; -+ } else { -+ packet_t *current_pkt; -+ -+ current_pkt = nic->tx_packet_queue; -+ while (current_pkt->next != NULL) -+ current_pkt = current_pkt->next; -+ -+ current_pkt->next = queued_pkt; -+ } -+ -+ LOG_DEBUG(PFX "%s: tx packet queued", nic->log_name); -+ -+ return 0; -+} -+ -+/** -+ * nic_dequeue_tx_packet() - Used pop a TX packet buffer of the TX -+ * @param dev - cnic_uio device to send the packet on -+ * @param buf - pointer to the buffer to send -+ * @param buf_size - size in bytes of the buffer to send -+ * @return NULL if there are no more TX packet buffers to send -+ * pointer to the packet buffer which is detached from the device -+ */ -+packet_t *nic_dequeue_tx_packet(nic_t *nic) -+{ -+ packet_t *pkt; -+ -+ pkt = nic->tx_packet_queue; -+ -+ /* There is a packet buffer to send, time to detach it from the -+ * cnic_uio device */ -+ if (pkt != NULL) { -+ nic->tx_packet_queue = pkt->next; -+ pkt->next = NULL; -+ } -+ -+ return pkt; -+} -+ -+void nic_fill_ethernet_header(nic_interface_t *nic_iface, -+ void *data, -+ void *src_addr, void *dest_addr, -+ int *pkt_size, void **start_addr, -+ uint16_t ether_type) -+{ -+ struct ether_header *eth; -+ uint16_t *vlan_hdr; -+ -+ eth = data; -+ -+ memcpy(eth->ether_shost, src_addr, ETH_ALEN); -+ memcpy(eth->ether_dhost, dest_addr, ETH_ALEN); -+ -+ vlan_hdr = (uint16_t *) (eth + 1); -+ eth->ether_type = htons(ether_type); -+ -+ *start_addr = vlan_hdr; -+} -+ -+/******************************************************************************* -+ * NIC interface management utility functions -+ ******************************************************************************/ -+/** -+ * nic_find_nic_iface() - This function is used to find an interface -+ * from the NIC -+ * @param nic - NIC to look for network interfaces -+ * @param vlan_id - VLAN id to look for -+ * @param protocol - either AF_INET or AF_INET6 -+ * @param iface_num - iface num to use if present -+ * @param request_type - IPV4/6 DHCP/STATIC -+ * @return nic_iface - if found network interface with the given VLAN ID -+ * if not found a NULL is returned -+ */ -+nic_interface_t *nic_find_nic_iface(nic_t *nic, -+ uint16_t protocol, -+ uint16_t vlan_id, -+ int iface_num, -+ int request_type) -+{ -+ nic_interface_t *current = nic->nic_iface; -+ nic_interface_t *current_vlan = NULL; -+ -+ while (current != NULL) { -+ if (current->protocol != protocol) -+ goto next; -+ -+ /* Check for iface_num first */ -+ if (iface_num != IFACE_NUM_INVALID) { -+ if (current->iface_num == iface_num) { -+ /* Exception is when iface_num == 0, need to -+ check for request_type also if != -+ IP_CONFIG_OFF */ -+ if (!iface_num && request_type != -+ IP_CONFIG_OFF) { -+ if (current->request_type == -+ request_type) -+ goto found; -+ } else { -+ goto found; -+ } -+ } -+ } else if (vlan_id == NO_VLAN) { -+ /* Just return the top of the family */ -+ goto found; -+ } else { -+ if ((current->vlan_id == vlan_id) && -+ ((request_type == IP_CONFIG_OFF) || -+ (current->request_type == request_type))) -+ goto found; -+ } -+ /* vlan_next loop */ -+ current_vlan = current->vlan_next; -+ while (current_vlan != NULL) { -+ if (iface_num != IFACE_NUM_INVALID) { -+ if (current_vlan->iface_num == iface_num) { -+ if (!iface_num && request_type != -+ IP_CONFIG_OFF) { -+ if (current_vlan->request_type -+ == request_type) -+ goto vlan_found; -+ } else { -+ goto vlan_found; -+ } -+ } -+ } -+ if ((current_vlan->vlan_id == vlan_id) && -+ ((request_type == IP_CONFIG_OFF) || -+ (current_vlan->request_type == request_type))) -+ goto vlan_found; -+ -+ current_vlan = current_vlan->vlan_next; -+ } -+next: -+ current = current->next; -+ } -+vlan_found: -+ current = current_vlan; -+found: -+ return current; -+} -+ -+/* Called with nic mutex held */ -+void persist_all_nic_iface(nic_t *nic) -+{ -+ nic_interface_t *current_vlan, *current; -+ -+ current = nic->nic_iface; -+ while (current != NULL) { -+ current->flags |= NIC_IFACE_PERSIST; -+ current_vlan = current->vlan_next; -+ while (current_vlan != NULL) { -+ current_vlan->flags |= NIC_IFACE_PERSIST; -+ current_vlan = current_vlan->vlan_next; -+ } -+ current = current->next; -+ } -+} -+ -+/* Sets the nic_iface to the front of the AF */ -+void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface) -+{ -+ nic_interface_t *current, *prev; -+ nic_interface_t *current_vlan, *prev_vlan; -+ -+ prev = NULL; -+ current = nic->nic_iface; -+ while (current != NULL) { -+ if (current->protocol != nic_iface->protocol) -+ goto next; -+ /* If its already on top of the list, exit */ -+ if (current == nic_iface) -+ goto done; -+ -+ prev_vlan = current; -+ current_vlan = current->vlan_next; -+ -+ while (current_vlan != NULL) { -+ if (current_vlan == nic_iface) { -+ /* Found inside the vlan list */ -+ /* For vlan == 0, place on top of -+ the AF list */ -+ prev_vlan->vlan_next = -+ current_vlan->vlan_next; -+ current_vlan->vlan_next = current; -+ if (prev) -+ prev->next = current_vlan; -+ else -+ nic->nic_iface = current_vlan; -+ goto done; -+ } -+ prev_vlan = current_vlan; -+ current_vlan = current_vlan->vlan_next; -+ } -+next: -+ prev = current; -+ current = current->next; -+ } -+done: -+ return; -+} -+ -+/******************************************************************************* -+ * Packet management utility functions -+ ******************************************************************************/ -+/** -+ * get_next_packet_in_queue() - This function will return the next packet in -+ * the queue -+ * @param queue - the queue to pull the packet from -+ * @return the packet in the queue -+ */ -+static packet_t *get_next_packet_in_queue(packet_t **queue) -+{ -+ packet_t *pkt; -+ -+ if (*queue == NULL) -+ return NULL; -+ -+ pkt = *queue; -+ *queue = pkt->next; -+ -+ return pkt; -+} -+ -+/** -+ * get_next_tx_packet() - This function will return the next packet in -+ * the TX queue -+ * @param nic - NIC to pull the TX packet from -+ * @return the packet in hte queue -+ */ -+packet_t *get_next_tx_packet(nic_t *nic) -+{ -+ return get_next_packet_in_queue(&nic->tx_packet_queue); -+} -+ -+/** -+ * get_next_free_packet() - This function will return the next packet in -+ * the free queue -+ * @param nic - NIC to pull the RX packet from -+ * @return the packet in hte queue -+ */ -+packet_t *get_next_free_packet(nic_t *nic) -+{ -+ packet_t *pkt; -+ pthread_mutex_lock(&nic->free_packet_queue_mutex); -+ pkt = get_next_packet_in_queue(&nic->free_packet_queue); -+ pthread_mutex_unlock(&nic->free_packet_queue_mutex); -+ -+ if (pkt != NULL) -+ reset_packet(pkt); -+ -+ return pkt; -+} -+ -+/** -+ * put_packet_in_queue() - This function will place the packet in the given -+ * queue -+ * @param pkt - the packet to place -+ * @param queue - the queue to place the packet -+ * @return the packet in the queue -+ */ -+static void put_packet_in_queue(packet_t *pkt, packet_t **queue) -+{ -+ if (*queue == NULL) -+ *queue = pkt; -+ else { -+ pkt->next = *queue; -+ *queue = pkt; -+ } -+} -+ -+/** -+ * put_packet_in_tx_queue() - This function will place the packet in -+ * the TX queue -+ * @param pkt - packet to place -+ * @param nic - NIC to pull the TX packet from -+ * @return the packet in hte queue -+ */ -+void put_packet_in_tx_queue(packet_t *pkt, nic_t *nic) -+{ -+ return put_packet_in_queue(pkt, &nic->tx_packet_queue); -+} -+ -+/** -+ * put_packet_in_free_queue() - This function will place the packet in -+ * the RX queue -+ * @param pkt - packet to place -+ * @param nic - NIC to pull the RX packet from -+ * @return the packet in hte queue -+ */ -+void put_packet_in_free_queue(packet_t *pkt, nic_t *nic) -+{ -+ pthread_mutex_lock(&nic->free_packet_queue_mutex); -+ put_packet_in_queue(pkt, &nic->free_packet_queue); -+ pthread_mutex_unlock(&nic->free_packet_queue_mutex); -+} -+ -+uint32_t calculate_default_netmask(uint32_t ip_addr) -+{ -+ uint32_t netmask; -+ -+ if (IN_CLASSA(ntohl(ip_addr))) -+ netmask = htonl(IN_CLASSA_NET); -+ else if (IN_CLASSB(ntohl(ip_addr))) -+ netmask = htonl(IN_CLASSB_NET); -+ else if (IN_CLASSC(ntohl(ip_addr))) -+ netmask = htonl(IN_CLASSC_NET); -+ else { -+ LOG_ERR("Unable to guess netmask for address %x\n", &ip_addr); -+ return -1; -+ } -+ -+ return netmask; -+} -+ -+void dump_packet_to_log(struct nic_interface *iface, -+ uint8_t *buf, uint16_t buf_len) -+{ -+ -+ FILE *file; -+ char str[80]; -+ int i, count; -+ -+ file = fmemopen(str, sizeof(str), "w+"); -+ if (file == NULL) { -+ LOG_ERR(PFX "Could not create logging file stream for packet " -+ "logging: [%d: %s]", errno, strerror(errno)); -+ return; -+ } -+ -+ LOG_PACKET(PFX "%s: Start packet dump len: %d", iface->parent->log_name, -+ buf_len); -+ -+ for (i = 0; i < buf_len; i++) { -+ rewind(file); -+ fprintf(file, "%03x: ", i); -+ -+ for (count = 0; (count < 8) && i < buf_len; count++, i++) -+ fprintf(file, " %02x", buf[i]); -+ fflush(file); -+ -+ LOG_PACKET(PFX "%s: %s", iface->parent->log_name, str); -+ } -+ -+ LOG_PACKET(PFX "%s: end packet dump", iface->parent->log_name); -+ -+ fclose(file); -+} -+ -+/******************************************************************************* -+ * File Management -+ ******************************************************************************/ -+ /** -+ * determine_file_size_read() - when fstat doesn't work on filepath -+ * within the /proc filesytem, we need to read/count the size of the file -+ * until we hit a EOF -+ * @parm filepath - path of the file in which to determine the filesize in -+ * bytes -+ * @return file size in bytes, <0 on failure -+ */ -+int determine_file_size_read(const char *filepath) -+{ -+ size_t total_size = 0; -+ ssize_t size = 1; -+ int fd; -+ char buf[1024]; -+ -+ fd = open(filepath, O_RDONLY); -+ if (fd == -1) { -+ LOG_ERR("Could not open file: %s [%s]", -+ filepath, strerror(errno)); -+ return -1; -+ } -+ -+ while (size > 0) { -+ size = read(fd, buf, sizeof(buf)); -+ -+ switch (size) { -+ case 0: -+ break; -+ case -1: -+ LOG_ERR("Error reading file: %s [%s]", -+ filepath, strerror(errno)); -+ total_size = -1; -+ break; -+ default: -+ total_size += size; -+ break; -+ } -+ } -+ -+ close(fd); -+ -+ return total_size; -+} -+ -+/** -+ * capture_file() - Used to capture a file into a buffer -+ * @param raw - This pointer will be set to the buffer which will hold the -+ * file contents -+ * @param raw_size - This is the size of the buffer returned -+ * @param path - The file path to capture the data from -+ * @return 0 is returned on success, <0 is returned on failure -+ */ -+int capture_file(char **raw, uint32_t *raw_size, const char *path) -+{ -+ FILE *fp; -+ size_t read_size; -+ int rc = 0; -+ int file_size; -+ -+ file_size = determine_file_size_read(path); -+ if (file_size < 0) { -+ LOG_ERR("Could not determine size %s", path); -+ return -EIO; -+ } -+ -+ fp = fopen(path, "r"); -+ if (fp == NULL) { -+ LOG_ERR("Could not open path %s [%s]", path, strerror(errno)); -+ return -EIO; -+ } -+ -+ *raw = malloc(file_size); -+ if (*raw == NULL) { -+ LOG_ERR("Could not malloc space for capture %s", path); -+ rc = -ENOMEM; -+ goto error; -+ } -+ -+ read_size = fread(*raw, file_size, 1, fp); -+ if (!read_size) { -+ LOG_ERR("Could not read capture, path: %s len: %d [%s]", -+ path, file_size, strerror(ferror(fp))); -+ free(*raw); -+ *raw = NULL; -+ rc = errno; -+ } else -+ *raw_size = file_size; -+ -+error: -+ fclose(fp); -+ -+ LOG_INFO("Done capturing %s", path); -+ -+ return rc; -+} -diff --git a/iscsiuio/src/unix/nic_utils.h b/iscsiuio/src/unix/nic_utils.h -new file mode 100644 -index 0000000..2644e43 ---- /dev/null -+++ b/iscsiuio/src/unix/nic_utils.h -@@ -0,0 +1,101 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_util.h - NIC utility functions -+ * -+ */ -+#ifndef __NIC_UTILS_H__ -+#define __NIC_UTILS_H__ -+ -+#include "nic.h" -+ -+/****************************************************************************** -+ * Function Prototype -+ ******************************************************************************/ -+int manually_trigger_uio_event(nic_t *nic, int uio_minor); -+ -+int nic_discover_iscsi_hosts(); -+ -+int enable_mutlicast(nic_t *nic); -+int disable_mutlicast(nic_t *nic); -+ -+int from_netdev_name_find_nic(char *interface_name, nic_t **nic); -+ -+int from_host_no_find_associated_eth_device(int host_no, nic_t **nic); -+ -+int from_phys_name_find_assoicated_uio_device(nic_t *nic); -+ -+int nic_queue_tx_packet(nic_t *nic, -+ nic_interface_t *nic_iface, packet_t *pkt); -+ -+packet_t *nic_dequeue_tx_packet(nic_t *nic); -+ -+void nic_fill_ethernet_header(nic_interface_t *nic_iface, -+ void *data, -+ void *src_addr, void *dest_addr, -+ int *pkt_size, void **start_addr, -+ uint16_t ether_type); -+ -+struct nic_interface *nic_find_nic_iface(nic_t *nic, uint16_t protocol, -+ uint16_t vlan_id, int iface_num, -+ int request_type); -+void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface); -+ -+void persist_all_nic_iface(nic_t *nic); -+ -+int add_vlan_interfaces(nic_t *nic); -+ -+int nic_verify_uio_sysfs_name(nic_t *nic); -+void cnic_get_sysfs_pci_resource_path(nic_t *nic, int resc_no, -+ char *sys_path, size_t size); -+void nic_close_all(); -+void nic_remove_all(); -+ -+int detemine_initial_uio_events(nic_t *nic, uint32_t *num_of_events); -+ -+uint32_t calculate_default_netmask(uint32_t ip_addr); -+ -+void prepare_nic_thread(nic_t *nic); -+void prepare_library(nic_t *nic); -+ -+int nic_enable(nic_t *nic); -+int nic_disable(nic_t *nic, int going_down); -+ -+void dump_packet_to_log(struct nic_interface *iface, -+ uint8_t *buf, uint16_t buf_len); -+ -+int determine_file_size_read(const char *filepath); -+int capture_file(char **raw, uint32_t *raw_size, const char *path); -+ -+#endif /* __NIC_UTILS_H__ */ -diff --git a/iscsiuio/src/unix/nic_vlan.c b/iscsiuio/src/unix/nic_vlan.c -new file mode 100644 -index 0000000..d371ec5 ---- /dev/null -+++ b/iscsiuio/src/unix/nic_vlan.c -@@ -0,0 +1,336 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_vlan.c - uIP user space stack VLAN utilities -+ * -+ */ -+#define _GNU_SOURCE -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#include "logger.h" -+#include "nic.h" -+#include "nic_utils.h" -+#include "nic_vlan.h" -+ -+/******************************************************************************* -+ * Constants -+ ******************************************************************************/ -+#define PFX "vlan" -+ -+static const char proc_vlan_config_path[] = "/proc/net/vlan/config"; -+ -+/******************************************************************************* -+ * Resolving Found VLAN's for CNIC -+ ******************************************************************************/ -+int init_vlan_found_handle(struct vlan_found_handle *found_handle, -+ struct vlan_handle *handle) -+{ -+ memset(found_handle, 0, sizeof(*found_handle)); -+ -+ found_handle->entries = malloc(found_handle->num_of_entries * -+ sizeof(struct vlan_found_entry)); -+ if (found_handle->entries == NULL) { -+ LOG_ERR("Could not allocate space for found entries"); -+ return -ENOMEM; -+ } -+ -+ found_handle->handle = handle; -+ found_handle->num_of_entries = handle->num_of_entries; -+ -+ memset(found_handle->entries, 0, found_handle->num_of_entries * -+ sizeof(struct vlan_found_entry)); -+ -+ handle->outstanding_found_handles++; -+ -+ return 0; -+} -+ -+void release_vlan_found_handle(struct vlan_found_handle *found_handle) -+{ -+ if (found_handle->entries != NULL) { -+ free(found_handle->entries); -+ found_handle->entries = NULL; -+ } -+ -+ found_handle->num_of_entries = 0; -+ -+ found_handle->handle->outstanding_found_handles--; -+ -+ found_handle->handle = NULL; -+ -+} -+ -+/******************************************************************************* -+ * Resolving VLAN's for CNIC -+ ******************************************************************************/ -+/** -+ * init_vlan_handle() - Used to initialize struct ipv4_route_handle so -+ * that is can be used -+ * @param handle - Pointer to struct ipv4_route_handle to initialize -+ * @return 0 on success and <0 on failure -+ */ -+void init_vlan_table(struct vlan_handle *handle) -+{ -+ handle->entries = NULL; -+ handle->num_of_entries = 0; -+} -+ -+/** -+ * parse_vlan_table() - Given the raw dump of a Linux vlan table, this -+ * function will parse the into entries held by -+ * struct vlan_handle -+ * @param handle - struct vlan_handle used to hold the parsed contents -+ * @param raw - buffer to parse the contents from -+ * @param raw_size - size of the buffer in bytes -+ * @return 0 on success, <0 on failure -+ */ -+int parse_vlan_table(struct vlan_handle *handle, char *raw, uint32_t raw_size) -+{ -+ FILE *fp; -+ int i; -+ char *token; -+ size_t size; -+ int rc; -+ -+ token = raw; -+ -+ /* determine the number of entries */ -+ while (*token != '\0') { -+ if (*token == '\n') -+ handle->num_of_entries++; -+ -+ token++; -+ } -+ -+ /* There are 2 lines which describe the vlan table -+ * This lines need to be skipped with counting */ -+ handle->num_of_entries -= 2; -+ -+ LOG_INFO("Number of vlan entries: %d", handle->num_of_entries); -+ -+ size = handle->num_of_entries * sizeof(struct vlan_entry); -+ handle->entries = malloc(size); -+ if (handle->entries == NULL) { -+ LOG_ERR -+ ("Couldn't malloc space to parse vlan table. entires: %d " -+ "size: %d", -+ handle->num_of_entries, size); -+ return -ENOMEM; -+ } -+ -+ fp = fmemopen(raw, raw_size, "r"); -+ if (fp == NULL) { -+ LOG_ERR("Could not open raw dump of vlan table"); -+ rc = errno; -+ goto fmemopen_error; -+ } -+ -+ if (fscanf(fp, "%*[^\n]\n") < 0) { /* Skip the first line. */ -+ LOG_ERR("Empty or missing line, or read error"); -+ rc = -EIO; -+ goto error; -+ } -+ -+ if (fscanf(fp, "%*[^\n]\n") < 0) { /* Skip the second line. */ -+ LOG_ERR("Empty or missing line, or read error"); -+ rc = -EIO; -+ goto error; -+ } -+ -+ i = 0; -+ /* Time to parse the routing table */ -+ while (1) { -+ struct vlan_entry *entry = &handle->entries[i]; -+ int r; -+ -+ r = fscanf(fp, "%15s |%hu |%15s", -+ entry->vlan_iface_name, -+ &entry->vlan_id, entry->phy_iface_name); -+ if (r != 3) { -+ if (feof(fp)) { /* EOF with no (nonspace) chars read. */ -+ break; -+ } -+ -+ LOG_WARN("Parsing error: parsed %d elements", r); -+ break; -+ } -+ -+ i++; -+ -+ LOG_DEBUG("Vlan %d: vlan iface:%s vlan id:%d phys iface:%s", -+ i, -+ entry->vlan_iface_name, -+ entry->vlan_id, entry->phy_iface_name); -+ } -+ -+ fclose(fp); -+ -+ return 0; -+ -+error: -+ fclose(fp); -+ -+fmemopen_error: -+ if (handle->entries != NULL) -+ free(handle->entries); -+ -+ return rc; -+} -+ -+/** -+ * capture_vlan_table() - This function will snapshot the Linux vlan -+ * routing table for further processing -+ * @param handle - struct vlan_handle used to hold the routing context -+ * @return 0 on success, <0 on failure -+ */ -+int capture_vlan_table(struct vlan_handle *handle) -+{ -+ char *raw = NULL; -+ uint32_t raw_size = 0; -+ int rc; -+ -+ rc = capture_file(&raw, &raw_size, proc_vlan_config_path); -+ if (rc != 0) -+ goto error; -+ -+ rc = parse_vlan_table(handle, raw, raw_size); -+ if (rc != 0) -+ goto error; -+ -+error: -+ if (raw != NULL) -+ free(raw); -+ -+ return rc; -+} -+ -+/** -+ * release_vlan_table() - This function will free all resources used by -+ * the handle -+ * @param handle - struct vlan_handle used to hold the routing context -+ */ -+void release_vlan_table(struct vlan_handle *handle) -+{ -+ if (handle->entries != NULL) { -+ free(handle->entries); -+ handle->entries = NULL; -+ } -+ -+ handle->num_of_entries = 0; -+} -+ -+/** -+ * find_phy_using_vlan_interface() - Given the interface name determine VLAN -+ * tag ID to match either the physical or VLAN interface name -+ * @param vlan_iface_name - VLAN interface used to find the physical -+ * interface -+ * @param phy_iface_name - returned value is the physical interface name -+ * @param vlan_id - returned value is the VLAN id -+ * @return 1 is returned if the interface is a VLAN, 0 if the interface is not -+ * <0 is returned if there is an error -+ */ -+int find_phy_using_vlan_interface(struct vlan_handle *handle, -+ char *vlan_iface_name, -+ char **phy_iface_name, uint16_t *vlan_id) -+{ -+ int i, rc = 0; -+ -+ for (i = 0; i < handle->num_of_entries; i++) { -+ struct vlan_entry *entry = &handle->entries[i]; -+ -+ /* Compare VLAN interface names to find a match */ -+ if (strcmp(entry->vlan_iface_name, vlan_iface_name) == 0) { -+ *phy_iface_name = entry->phy_iface_name; -+ *vlan_id = entry->vlan_id; -+ rc = 1; -+ break; -+ } -+ } -+ -+ return rc; -+} -+ -+/** -+ * find_vlans_using_phy_interface() - Given the physical interface name this -+ * function will determine the VLAN interface name and VLAN ID -+ * @param iface_name - physical interface used to find the vlan interface -+ * @param vlan_iface_name - returned value is the VLAN interface name -+ * @return The number of VLAN interfaces found -+ */ -+int find_vlans_using_phy_interface(struct vlan_handle *handle, -+ struct vlan_found_handle *found_handle, -+ char *phy_iface_name) -+{ -+ int i, num_found = 0; -+ -+ for (i = 0; i < handle->num_of_entries; i++) { -+ struct vlan_entry *entry = &handle->entries[i]; -+ -+ /* Compare interface names to find a match */ -+ if (strcmp(entry->phy_iface_name, phy_iface_name) == 0) { -+ found_handle->entries[i].found = VLAN_ENTRY_FOUND; -+ num_found++; -+ } -+ } -+ -+ return num_found; -+} -+ -+/** -+ * valid_vlan() - determine if the vlan value which is passed is valid -+ * @param vlan - vlan value to test -+ * @return 0 - not valid, 1 - valid -+ */ -+int valid_vlan(short int vlan) -+{ -+ /* Allow vlan 1 to connect */ -+ if (vlan > 0 && vlan < 4095) -+ return 1; -+ -+ return 0; -+} -diff --git a/iscsiuio/src/unix/nic_vlan.h b/iscsiuio/src/unix/nic_vlan.h -new file mode 100644 -index 0000000..f7293d4 ---- /dev/null -+++ b/iscsiuio/src/unix/nic_vlan.h -@@ -0,0 +1,88 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * nic_vlan.h - uIP user space stack VLAN utilities -+ * -+ */ -+#ifndef __NIC_VLAN_H__ -+#define __NIC_VLAN_H__ -+ -+#include -+ -+/* Used to hold entries in the vlan table */ -+struct vlan_entry { -+ char vlan_iface_name[16]; -+ char phy_iface_name[16]; -+ uint16_t vlan_id; -+}; -+ -+struct vlan_handle { -+ struct vlan_entry *entries; -+ uint32_t num_of_entries; -+ -+ uint32_t outstanding_found_handles; -+}; -+ -+struct vlan_found_entry { -+#define VLAN_ENTRY_FOUND 1 -+#define VLAN_ENTRY_NOT_FOUND 0 -+ uint8_t found; -+}; -+ -+struct vlan_found_handle { -+ struct vlan_handle *handle; -+ uint32_t num_of_entries; -+ struct vlan_found_entry *entries; -+}; -+ -+/******************************************************************************* -+ * Function Prototypes -+ ******************************************************************************/ -+void init_vlan_table(struct vlan_handle *handle); -+int capture_vlan_table(struct vlan_handle *handle); -+void release_vlan_table(struct vlan_handle *handle); -+ -+int find_phy_using_vlan_interface(struct vlan_handle *handle, -+ char *vlan_iface_name, -+ char **phy_iface_name, uint16_t *vlan_id); -+int find_vlans_using_phy_interface(struct vlan_handle *handle, -+ struct vlan_found_handle *found_handle, -+ char *phy_iface_name); -+ -+int init_vlan_found_handle(struct vlan_found_handle *found_handle, -+ struct vlan_handle *handle); -+void release_vlan_found_handle(struct vlan_found_handle *found_handle); -+ -+int valid_vlan(short int vlan); -+#endif /* __NIC_VLAN_H__ */ -diff --git a/iscsiuio/src/unix/options.h b/iscsiuio/src/unix/options.h -new file mode 100644 -index 0000000..9691c4e ---- /dev/null -+++ b/iscsiuio/src/unix/options.h -@@ -0,0 +1,116 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * options.h - CNIC UIO uIP user space stack -+ * -+ */ -+#ifndef __OPTIONS_H__ -+#define __OPTIONS_H__ -+ -+#include -+#include -+#include -+ -+/****************************************************************************** -+ * Constants which are tuned at compile time by the user -+ *****************************************************************************/ -+ -+/** -+ * MAX_COUNT_NIC_NL_RESP - This is the maximum number of polls uIP will -+ * try for a kernel response after a PATH_REQ -+ */ -+#define MAX_COUNT_NIC_NL_RESP 128 -+ -+/** -+ * NLM_BUF_DEFAULT_MAX - This is the buffer size allocated for the send/receive -+ * buffers used by the uIP Netlink subsystem. This -+ * value is in bytes. -+ */ -+#define NLM_BUF_DEFAULT_MAX 8192 /* bytes */ -+ -+/****************************************************************************** -+ * Non adjustable constants -+ *****************************************************************************/ -+#ifndef ETHERTYPE_IP -+#define ETHERTYPE_IP 0x0800 /* IP */ -+#endif /* ETHERTYPE_IP */ -+ -+#ifndef ETHERTYPE_IPV6 -+#define ETHERTYPE_IPV6 0x86dd /* IP protocol version 6 */ -+#endif /* ETHERTYPE_IPV6 */ -+ -+#ifndef ETHERTYPE_ARP -+#define ETHERTYPE_ARP 0x0806 /* Address resolution */ -+#endif /* ETHERTYPE_ARP */ -+ -+#ifndef ETHERTYPE_VLAN -+#define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */ -+#endif /* ETHERTYPE_VLAN */ -+ -+#define APP_NAME "iscsiuio" -+/* BUILD_DATE is automatically generated from the Makefile */ -+ -+#define DEBUG_OFF 0x1 -+#define DEBUG_ON 0x2 -+ -+#define INVALID_FD -1 -+#define INVALID_THREAD -1 -+ -+struct options { -+ char debug; -+ -+ /* Time the userspace daemon was started */ -+ time_t start_time; -+}; -+ -+extern int event_loop_stop; -+extern struct options opt; -+ -+#ifdef WORDS_BIGENDIAN -+#define ntohll(x) (x) -+#define htonll(x) (x) -+#else -+#define ntohll(x) bswap_64(x) -+#define htonll(x) bswap_64(x) -+#endif -+ -+# define likely(x) __builtin_expect(!!(x), 1) -+# define unlikely(x) __builtin_expect(!!(x), 0) -+ -+/* taken from Linux kernel, include/linux/compiler-gcc.h */ -+/* Optimization barrier */ -+/* The "volatile" is due to gcc bugs */ -+#define barrier() __asm__ __volatile__("": : :"memory") -+ -+#endif -diff --git a/iscsiuio/src/unix/packet.c b/iscsiuio/src/unix/packet.c -new file mode 100644 -index 0000000..1657d73 ---- /dev/null -+++ b/iscsiuio/src/unix/packet.c -@@ -0,0 +1,145 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * packet.c - packet management -+ * -+ */ -+#include -+#include -+ -+#include "logger.h" -+#include "packet.h" -+#include "nic.h" -+ -+/** -+ * alloc_packet() - Function used to allocate memory for a packet -+ * @param max_buf_size - max packet size -+ * @param priv_size - size of the assoicated private data -+ * @return NULL if failed, on success return a pointer to the packet -+ */ -+struct packet *alloc_packet(size_t max_buf_size, size_t priv_size) -+{ -+ struct packet *pkt; -+ void *priv; -+ -+ pkt = malloc(max_buf_size + sizeof(struct packet)); -+ if (pkt == NULL) { -+ LOG_ERR("Could not allocate any memory for packet"); -+ return NULL; -+ } -+ -+ priv = malloc(priv_size); -+ if (priv == NULL) { -+ LOG_ERR("Could not allocate any memory for private structure"); -+ goto free_pkt; -+ } -+ -+ pkt->max_buf_size = max_buf_size; -+ pkt->priv = priv; -+ -+ return pkt; -+ -+free_pkt: -+ free(pkt); -+ -+ return NULL; -+} -+ -+void free_packet(struct packet *pkt) -+{ -+ if (pkt->priv != NULL) -+ free(pkt->priv); -+ -+ free(pkt); -+} -+ -+/** -+ * reset_packet() - This will reset the packet fields to default values -+ * @param pkt - the packet to reset -+ */ -+void reset_packet(packet_t *pkt) -+{ -+ pkt->next = NULL; -+ -+ pkt->flags = 0; -+ pkt->vlan_tag = 0; -+ -+ pkt->buf_size = 0; -+ -+ pkt->data_link_layer = NULL; -+ pkt->network_layer = NULL; -+} -+ -+int alloc_free_queue(nic_t *nic, size_t num_of_packets) -+{ -+ int rc, i; -+ -+ pthread_mutex_lock(&nic->free_packet_queue_mutex); -+ for (i = 0; i < num_of_packets; i++) { -+ packet_t *pkt; -+ -+ pkt = alloc_packet(1500, 1500); -+ if (pkt == NULL) { -+ rc = i; -+ goto done; -+ } -+ -+ reset_packet(pkt); -+ -+ pkt->next = nic->free_packet_queue; -+ nic->free_packet_queue = pkt; -+ } -+ -+ rc = num_of_packets; -+ -+done: -+ pthread_mutex_unlock(&nic->free_packet_queue_mutex); -+ -+ return i; -+} -+ -+void free_free_queue(nic_t *nic) -+{ -+ packet_t *pkt, *pkt_next; -+ -+ pthread_mutex_lock(&nic->free_packet_queue_mutex); -+ pkt = nic->free_packet_queue; -+ while (pkt) { -+ pkt_next = pkt->next; -+ free_packet(pkt); -+ pkt = pkt_next; -+ } -+ nic->free_packet_queue = NULL; -+ pthread_mutex_unlock(&nic->free_packet_queue_mutex); -+} -diff --git a/iscsiuio/src/unix/packet.h b/iscsiuio/src/unix/packet.h -new file mode 100644 -index 0000000..f62b685 ---- /dev/null -+++ b/iscsiuio/src/unix/packet.h -@@ -0,0 +1,75 @@ -+/* -+ * Copyright (c) 2009-2011, Broadcom Corporation -+ * -+ * Written by: Benjamin Li (benli@broadcom.com) -+ * -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by Adam Dunkels. -+ * 4. The name of the author may not be used to endorse or promote -+ * products derived from this software without specific prior -+ * written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -+ * -+ * packet.h - packet definitions -+ * -+ */ -+#include -+ -+#ifndef __PACKET_H__ -+#define __PACKET_H__ -+ -+#include "nic.h" -+ -+struct nic; -+struct nic_interface; -+ -+typedef struct packet { -+ struct packet *next; -+ -+ uint32_t flags; -+#define VLAN_TAGGED 0x0001 -+ uint16_t vlan_tag; -+ -+ size_t max_buf_size; -+ size_t buf_size; -+ -+ uint8_t *data_link_layer; -+ uint8_t *network_layer; -+ -+ struct nic *nic; -+ struct nic_interface *nic_iface; -+ -+ void *priv; -+ uint8_t buf[]; -+} packet_t; -+ -+/****************************************************************************** -+ * Packet Function Declarations -+ *****************************************************************************/ -+int alloc_free_queue(struct nic *, size_t num_of_packets); -+void free_free_queue(struct nic *); -+void reset_packet(packet_t *pkt); -+ -+#endif /* __PACKET_H__ */ -diff --git a/iscsiuio/src/unix/uip-conf.h b/iscsiuio/src/unix/uip-conf.h -new file mode 100644 -index 0000000..e6e11a5 ---- /dev/null -+++ b/iscsiuio/src/unix/uip-conf.h -@@ -0,0 +1,160 @@ -+/** -+ * \addtogroup uipopt -+ * @{ -+ */ -+ -+/** -+ * \name Project-specific configuration options -+ * @{ -+ * -+ * uIP has a number of configuration options that can be overridden -+ * for each project. These are kept in a project-specific uip-conf.h -+ * file and all configuration names have the prefix UIP_CONF. -+ */ -+ -+/* -+ * Copyright (c) 2006, Swedish Institute of Computer Science. -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. 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. -+ * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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. -+ * -+ * This file is part of the uIP TCP/IP stack -+ * -+ */ -+ -+/** -+ * \file -+ * An example uIP configuration file -+ * \author -+ * Adam Dunkels -+ */ -+ -+#ifndef __UIP_CONF_H__ -+#define __UIP_CONF_H__ -+ -+#include -+ -+/** -+ * 8 bit datatype -+ * -+ * This typedef defines the 8-bit type used throughout uIP. -+ * -+ * \hideinitializer -+ */ -+typedef uint8_t u8_t; -+ -+/** -+ * 16 bit datatype -+ * -+ * This typedef defines the 16-bit type used throughout uIP. -+ * -+ * \hideinitializer -+ */ -+typedef uint16_t u16_t; -+ -+/** -+ * 32 bit datatype -+ * -+ * This typedef defines the 16-bit type used throughout uIP. -+ * -+ * \hideinitializer -+ */ -+typedef uint32_t u32_t; -+ -+/** -+ * Statistics datatype -+ * -+ * This typedef defines the dataype used for keeping statistics in -+ * uIP. -+ * -+ * \hideinitializer -+ */ -+typedef uint64_t uip_stats_t; -+ -+/** -+ * Maximum number of TCP connections. -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_MAX_CONNECTIONS 40 -+ -+/** -+ * Maximum number of listening TCP ports. -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_MAX_LISTENPORTS 40 -+ -+/** -+ * uIP buffer size. -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_BUFFER_SIZE 420 -+ -+/** -+ * CPU byte order. -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN -+ -+/** -+ * Logging on or off -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_LOGGING 1 -+ -+/** -+ * UDP support on or off -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_UDP 1 -+ -+/** -+ * UDP checksums on or off -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_UDP_CHECKSUMS 1 -+ -+/** -+ * uIP statistics on or off -+ * -+ * \hideinitializer -+ */ -+#define UIP_CONF_STATISTICS 1 -+ -+#define UIP_CONF_IPV6 0 -+ -+#define INET_ADDRSTRLEN 16 -+#define INET6_ADDRSTRLEN 46 -+ -+#endif /* __UIP_CONF_H__ */ -+ -+/** @} */ -+/** @} */ -diff --git a/iscsiuio/stamp-h1 b/iscsiuio/stamp-h1 -new file mode 100644 -index 0000000..4547fe1 ---- /dev/null -+++ b/iscsiuio/stamp-h1 -@@ -0,0 +1 @@ -+timestamp for config.h --- -1.8.1.4 - diff --git a/0013-disable-iscsid.startup-from-iscsiadm-prefer-systemd-.patch b/0013-disable-iscsid.startup-from-iscsiadm-prefer-systemd-.patch new file mode 100644 index 0000000..cfdef83 --- /dev/null +++ b/0013-disable-iscsid.startup-from-iscsiadm-prefer-systemd-.patch @@ -0,0 +1,26 @@ +From 5e8feef0fd14fc6247df2aaf2e514f2301c74ae0 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Thu, 21 Feb 2013 21:05:39 -0800 +Subject: [PATCH] disable iscsid.startup from iscsiadm, prefer systemd socket + activation + +--- + etc/iscsid.conf | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/etc/iscsid.conf b/etc/iscsid.conf +index cfa6844..db395df 100644 +--- a/etc/iscsid.conf ++++ b/etc/iscsid.conf +@@ -17,7 +17,7 @@ + # maintainers. + # + # Default for Fedora and RHEL. (uncomment to activate). +-iscsid.startup = /etc/rc.d/init.d/iscsid force-start ++#iscsid.startup = /bin/systemctl start iscsid.service + # + # Default for upstream open-iscsi scripts (uncomment to activate). + # iscsid.startup = /sbin/iscsid +-- +2.1.0 + diff --git a/0014-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch b/0014-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch new file mode 100644 index 0000000..84134fa --- /dev/null +++ b/0014-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch @@ -0,0 +1,30 @@ +From 63852a2853d190f9305c9c4056843fd79ab8219c Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Tue, 28 May 2013 13:12:27 -0700 +Subject: [PATCH] Don't check for autostart sessions if iscsi is not used (bug + #951951) + +Change conditional startup in iscsi.service to check for a non-empty +nodes directory, instead of initiator-name. This fits better with what +it's doing, as there's no need to scan for autostart node records if +there are no node records at all. +--- + etc/systemd/iscsi.service | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +index 0309e2f..d5712bd 100644 +--- a/etc/systemd/iscsi.service ++++ b/etc/systemd/iscsi.service +@@ -5,7 +5,7 @@ DefaultDependencies=no + Conflicts=shutdown.target + After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service + Before=remote-fs-pre.target +-ConditionPathExists=/etc/iscsi/initiatorname.iscsi ++ConditionDirectoryNotEmpty=/var/lib/iscsi/nodes + + [Service] + Type=oneshot +-- +2.1.0 + diff --git a/0014-From-Adheer-Chandravanshi-adheer.chandravanshi-qlogi.patch b/0014-From-Adheer-Chandravanshi-adheer.chandravanshi-qlogi.patch deleted file mode 100644 index b78e33f..0000000 --- a/0014-From-Adheer-Chandravanshi-adheer.chandravanshi-qlogi.patch +++ /dev/null @@ -1,2505 +0,0 @@ -From ade9aafd7cbbd3d1543ff005290e2571f56dd964 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Mon, 13 May 2013 03:15:34 -0500 -Subject: From: Adheer Chandravanshi - -This support lets the user manage the target entries in adapter flash -and -perform various operations like add, delete, login, logout, -and update the target information. - -The sysfs entries will look as cited below: - /sys/bus/iscsi_flashnode/devices/flashnode_sess-:/ - /sys/bus/iscsi_flashnode/devices/flashnode_conn-::/ - -Operations using iscsiadm: -========================= - -List all target nodes stored in the FLASH of the adapter -\# iscsiadm -m host -H hostno -C flashnode -o show - -View all parameters of one particular flash node -\# iscsiadm -m host -H hostno -C flashnode -x -o show - -Update an entry and commit to adapter FLASH -\# iscsiadm -m host -H hostno -C flashnode -x -n --v -o update - -Multiple name, value pairs can be specified in a single command for -update operation - -Delete an entry -\# iscsiadm -m host -H hostno -C flashnode -x -o delete - -Create a new entry -\# iscsiadm -m host -H hostno -C flashnode -o new -A -\# iscsiadm -m host -H hostno -C flashnode -x -n --v -o update - -Example, create new entry: -\#iscsiadm -m host -H 7 -C flashnode -o new -A ipv4 -Flashnode index: 2 - -New flashnode for host7 added - -\#iscsiadm -m host -H 7 -C flashnode -o show -qla4xxx: [0] 192.168.1.12:3260,2 -iqn.2002-03.com.compellent:5000d310004b0716 -qla4xxx: [1] 192.168.1.12:3260,2 -qla4xxx: [2] - -Here - The newly created entry is at flashnode_idx 2, use it to update -the entry - -\# iscsiadm -m host -H 7 -C flashnode -x 2 -o update -flashnode.conn[0].ipaddress -v 192.168.1.13 -\#iscsiadm -m host -H 7 -C flashnode -o show -qla4xxx: [0] 192.168.1.12:3260,2 -iqn.2002-03.com.compellent:5000d310004b0716 -qla4xxx: [1] 192.168.1.12:3260,2 -qla4xxx: [2] 192.168.1.13:3260,0 - -Login -\# iscsiadm -m host -H hostno -C flashnode -x -o login - -Logout -\# iscsiadm -m host -H hostno -C flashnode -x -o logout -\# iscsiadm -m session -r sid -u - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Manish Rangankar -Signed-off-by: Vikas Chaudhary ---- - include/iscsi_if.h | 190 ++++++++++++++++- - usr/Makefile | 2 +- - usr/flashnode.c | 609 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - usr/flashnode.h | 127 +++++++++++ - usr/idbm.c | 179 ++++++++++++++++ - usr/idbm.h | 7 + - usr/idbm_fields.h | 63 ++++++ - usr/iscsi_ipc.h | 13 ++ - usr/iscsi_sysfs.c | 234 ++++++++++++++++++++ - usr/iscsi_sysfs.h | 17 ++ - usr/iscsiadm.c | 429 ++++++++++++++++++++++++++++++++++++- - usr/netlink.c | 171 ++++++++++++++- - 12 files changed, 2031 insertions(+), 10 deletions(-) - create mode 100644 usr/flashnode.c - create mode 100644 usr/flashnode.h - -diff --git a/include/iscsi_if.h b/include/iscsi_if.h -index dad9fd8..20f2bc2 100644 ---- a/include/iscsi_if.h -+++ b/include/iscsi_if.h -@@ -68,8 +68,14 @@ enum iscsi_uevent_e { - ISCSI_UEVENT_PING = UEVENT_BASE + 22, - ISCSI_UEVENT_GET_CHAP = UEVENT_BASE + 23, - ISCSI_UEVENT_DELETE_CHAP = UEVENT_BASE + 24, -+ ISCSI_UEVENT_SET_FLASHNODE_PARAMS = UEVENT_BASE + 25, -+ ISCSI_UEVENT_NEW_FLASHNODE = UEVENT_BASE + 26, -+ ISCSI_UEVENT_DEL_FLASHNODE = UEVENT_BASE + 27, -+ ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28, -+ ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, -+ ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, - -- ISCSI_UEVENT_MAX = ISCSI_UEVENT_DELETE_CHAP, -+ ISCSI_UEVENT_MAX = ISCSI_UEVENT_LOGOUT_FLASHNODE_SID, - - /* up events */ - ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, -@@ -219,6 +225,31 @@ struct iscsi_uevent { - uint32_t host_no; - uint16_t chap_tbl_idx; - } delete_chap; -+ struct msg_set_flashnode_param { -+ uint32_t host_no; -+ uint32_t flashnode_idx; -+ uint32_t count; -+ } set_flashnode; -+ struct msg_new_flashnode { -+ uint32_t host_no; -+ uint32_t len; -+ } new_flashnode; -+ struct msg_del_flashnode { -+ uint32_t host_no; -+ uint32_t flashnode_idx; -+ } del_flashnode; -+ struct msg_login_flashnode { -+ uint32_t host_no; -+ uint32_t flashnode_idx; -+ } login_flashnode; -+ struct msg_logout_flashnode { -+ uint32_t host_no; -+ uint32_t flashnode_idx; -+ } logout_flashnode; -+ struct msg_logout_flashnode_sid { -+ uint32_t host_no; -+ uint32_t sid; -+ } logout_flashnode_sid; - } u; - union { - /* messages k -> u */ -@@ -276,6 +307,9 @@ struct iscsi_uevent { - with each ping request */ - uint32_t data_size; - } ping_comp; -+ struct msg_new_flashnode_ret { -+ uint32_t flashnode_idx; -+ } new_flashnode_ret; - } r; - } __attribute__ ((aligned (sizeof(uint64_t)))); - -@@ -283,6 +317,7 @@ enum iscsi_param_type { - ISCSI_PARAM, /* iscsi_param (session, conn, target, LU) */ - ISCSI_HOST_PARAM, /* iscsi_host_param */ - ISCSI_NET_PARAM, /* iscsi_net_param */ -+ ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ - }; - - struct iscsi_iface_param_info { -@@ -502,6 +537,159 @@ enum iscsi_param { - #define ISCSI_TGT_RESET_TMO (1ULL << ISCSI_PARAM_TGT_RESET_TMO) - #define ISCSI_TARGET_ALIAS (1ULL << ISCSI_PARAM_TARGET_ALIAS) - -+/* iSCSI Flash Target params */ -+enum iscsi_flashnode_param { -+ ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6, -+ ISCSI_FLASHNODE_PORTAL_TYPE, -+ ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE, -+ ISCSI_FLASHNODE_DISCOVERY_SESS, -+ ISCSI_FLASHNODE_ENTRY_EN, -+ ISCSI_FLASHNODE_HDR_DGST_EN, -+ ISCSI_FLASHNODE_DATA_DGST_EN, -+ ISCSI_FLASHNODE_IMM_DATA_EN, -+ ISCSI_FLASHNODE_INITIAL_R2T_EN, -+ ISCSI_FLASHNODE_DATASEQ_INORDER, -+ ISCSI_FLASHNODE_PDU_INORDER, -+ ISCSI_FLASHNODE_CHAP_AUTH_EN, -+ ISCSI_FLASHNODE_SNACK_REQ_EN, -+ ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN, -+ ISCSI_FLASHNODE_BIDI_CHAP_EN, -+ /* make authentication for discovery sessions optional */ -+ ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL, -+ ISCSI_FLASHNODE_ERL, -+ ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT, -+ ISCSI_FLASHNODE_TCP_NAGLE_DISABLE, -+ ISCSI_FLASHNODE_TCP_WSF_DISABLE, -+ ISCSI_FLASHNODE_TCP_TIMER_SCALE, -+ ISCSI_FLASHNODE_TCP_TIMESTAMP_EN, -+ ISCSI_FLASHNODE_IP_FRAG_DISABLE, -+ ISCSI_FLASHNODE_MAX_RECV_DLENGTH, -+ ISCSI_FLASHNODE_MAX_XMIT_DLENGTH, -+ ISCSI_FLASHNODE_FIRST_BURST, -+ ISCSI_FLASHNODE_DEF_TIME2WAIT, -+ ISCSI_FLASHNODE_DEF_TIME2RETAIN, -+ ISCSI_FLASHNODE_MAX_R2T, -+ ISCSI_FLASHNODE_KEEPALIVE_TMO, -+ ISCSI_FLASHNODE_ISID, -+ ISCSI_FLASHNODE_TSID, -+ ISCSI_FLASHNODE_PORT, -+ ISCSI_FLASHNODE_MAX_BURST, -+ ISCSI_FLASHNODE_DEF_TASKMGMT_TMO, -+ ISCSI_FLASHNODE_IPADDR, -+ ISCSI_FLASHNODE_ALIAS, -+ ISCSI_FLASHNODE_REDIRECT_IPADDR, -+ ISCSI_FLASHNODE_MAX_SEGMENT_SIZE, -+ ISCSI_FLASHNODE_LOCAL_PORT, -+ ISCSI_FLASHNODE_IPV4_TOS, -+ ISCSI_FLASHNODE_IPV6_TC, -+ ISCSI_FLASHNODE_IPV6_FLOW_LABEL, -+ ISCSI_FLASHNODE_NAME, -+ ISCSI_FLASHNODE_TPGT, -+ ISCSI_FLASHNODE_LINK_LOCAL_IPV6, -+ ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX, -+ ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE, -+ ISCSI_FLASHNODE_TCP_XMIT_WSF, -+ ISCSI_FLASHNODE_TCP_RECV_WSF, -+ ISCSI_FLASHNODE_CHAP_IN_IDX, -+ ISCSI_FLASHNODE_CHAP_OUT_IDX, -+ ISCSI_FLASHNODE_USERNAME, -+ ISCSI_FLASHNODE_USERNAME_IN, -+ ISCSI_FLASHNODE_PASSWORD, -+ ISCSI_FLASHNODE_PASSWORD_IN, -+ ISCSI_FLASHNODE_STATSN, -+ ISCSI_FLASHNODE_EXP_STATSN, -+ ISCSI_FLASHNODE_IS_BOOT_TGT, -+ -+ ISCSI_FLASHNODE_MAX, -+}; -+ -+#define ISCSI_FNODE_IS_FW_ASSIGNED_IPV6 \ -+ (1ULL << ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6) -+#define ISCSI_FNODE_PORTAL_TYPE (1ULL << ISCSI_FLASHNODE_PORTAL_TYPE) -+#define ISCSI_FNODE_AUTO_SND_TGT_DISABLE \ -+ (1ULL << ISCSI_FLASHNODE_OPT_AUTO_SND_TGT_DISABLE) -+#define ISCSI_FNODE_DISCOVERY_SESS \ -+ (1ULL << ISCSI_FLASHNODE_OPT_DISCOVERY_SESS) -+#define ISCSI_FNODE_ENTRY_EN (1ULL << ISCSI_FLASHNODE_ENTRY_EN) -+#define ISCSI_FNODE_HDR_DGST_EN (1ULL << ISCSI_FLASHNODE_HDR_DGST_EN) -+#define ISCSI_FNODE_DATA_DGST_EN (1ULL << ISCSI_FLASHNODE_DATA_DGST_EN) -+#define ISCSI_FNODE_IMM_DATA_EN (1ULL << ISCSI_FLASHNODE_IMM_DATA_EN) -+#define ISCSI_FNODE_INITIAL_R2T_EN (1ULL << ISCSI_FLASHNODE_INITIAL_R2T_EN) -+#define ISCSI_FNODE_DATASEQ_INORDER \ -+ (1ULL << ISCSI_FLASHNODE_DATASEQ_INORDER) -+#define ISCSI_FNODE_PDU_INORDER (1ULL << ISCSI_FLASHNODE_PDU_INORDER) -+#define ISCSI_FNODE_CHAP_AUTH_EN (1ULL << ISCSI_FLASHNODE_CHAP_AUTH_EN) -+#define ISCSI_FNODE_SNACK_REQ_EN (1ULL << ISCSI_FLASHNODE_SNACK_REQ_EN) -+#define ISCSI_FNODE_DISCOVERY_LOGOUT_EN \ -+ (1ULL << ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN) -+#define ISCSI_FNODE_BIDI_CHAP_EN (1ULL << ISCSI_FLASHNODE_BIDI_CHAP_EN) -+#define ISCSI_FNODE_DISCOVERY_AUTH_OPTIONAL \ -+ (1ULL << ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL) -+#define ISCSI_FNODE_ERL (1ULL << ISCSI_FLASHNODE_ERL) -+#define ISCSI_FNODE_TCP_TIMESTAMP_STAT \ -+ (1ULL << ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT) -+#define ISCSI_FNODE_TCP_NAGLE_DISABLE \ -+ (1ULL << ISCSI_FLASHNODE_TCP_NAGLE_DISABLE) -+#define ISCSI_FNODE_TCP_WSF_DISABLE \ -+ (1ULL << ISCSI_FLASHNODE_TCP_WSF_DISABLE) -+#define ISCSI_FNODE_TCP_TIMER_SCALE \ -+ (1ULL << ISCSI_FLASHNODE_TCP_TIMER_SCALE) -+#define ISCSI_FNODE_TCP_TIMESTAMP_ENABLE \ -+ (1ULL << ISCSI_FLASHNODE_TCP_TIMESTAMP_ENABLE) -+#define ISCSI_FNODE_IP_FRAG_DISABLE \ -+ (1ULL << ISCSI_FLASHNODE_IP_FRAG_DISABLE) -+#define ISCSI_FNODE_MAX_RECV_DLENGTH \ -+ (1ULL << ISCSI_FLASHNODE_MAX_RECV_DLENGTH) -+#define ISCSI_FNODE_MAX_XMIT_DLENGTH \ -+ (1ULL << ISCSI_FLASHNODE_MAX_XMIT_DLENGTH) -+#define ISCSI_FNODE_FIRST_BURST (1ULL << ISCSI_FLASHNODE_FIRST_BURST) -+#define ISCSI_FNODE_DEF_TIME2WAIT (1ULL << ISCSI_FLASHNODE_DEF_TIME2WAIT) -+#define ISCSI_FNODE_DEF_TIME2RETAIN \ -+ (1ULL << ISCSI_FLASHNODE_DEF_TIME2RETAIN) -+#define ISCSI_FNODE_MAX_R2T (1ULL << ISCSI_FLASHNODE_MAX_R2T) -+#define ISCSI_FNODE_KEEPALIVE_TMO (1ULL << ISCSI_FLASHNODE_KEEPALIVE_TMO) -+#define ISCSI_FNODE_ISID (1ULL << ISCSI_FLASHNODE_ISID) -+#define ISCSI_FNODE_TSID (1ULL << ISCSI_FLASHNODE_TSID) -+#define ISCSI_FNODE_PORT (1ULL << ISCSI_FLASHNODE_PORT) -+#define ISCSI_FNODE_MAX_BURST (1ULL << ISCSI_FLASHNODE_MAX_BURST) -+#define ISCSI_FNODE_DEF_TMF_TMO (1ULL << ISCSI_FLASHNODE_DEF_TMF_TMO) -+#define ISCSI_FNODE_IPADDR (1ULL << ISCSI_FLASHNODE_IPADDR) -+#define ISCSI_FNODE_ALIAS (1ULL << ISCSI_FLASHNODE_ALIAS) -+#define ISCSI_FNODE_REDIRECT_IPADDR \ -+ (1ULL << ISCSI_FLASHNODE_REDIRECT_IPADDR) -+#define ISCSI_FNODE_MAX_SEGMENT_SIZE \ -+ (1ULL << ISCSI_FLASHNODE_MAX_SEGMENT_SIZE) -+#define ISCSI_FNODE_LOCAL_PORT (1ULL << ISCSI_FLASHNODE_LOCAL_PORT) -+#define ISCSI_FNODE_IPV4_TOS (1ULL << ISCSI_FLASHNODE_IPV4_TOS) -+#define ISCSI_FNODE_IPV6_TC (1ULL << ISCSI_FLASHNODE_IPV6_TC) -+#define ISCSI_FNODE_IPV6_FLOW_LABEL \ -+ (1ULL << ISCSI_FLASHNODE_IPV6_FLOW_LABEL) -+#define ISCSI_FNODE_NAME (1ULL << ISCSI_FLASHNODE_NAME) -+#define ISCSI_FNODE_TPGT (1ULL << ISCSI_FLASHNODE_TPGT) -+#define ISCSI_FNODE_LINK_LOCAL_IPV6 \ -+ (1ULL << ISCSI_FLASHNODE_LINK_LOCAL_IPV6) -+#define ISCSI_FNODE_DISCOVERY_PARENT_IDX \ -+ (1ULL << ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX) -+#define ISCSI_FNODE_DISCOVERY_PARENT_TYPE \ -+ (1ULL << ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE) -+#define ISCSI_FNODE_TCP_XMIT_WSF (1ULL << ISCSI_FLASHNODE_TCP_XMIT_WSF) -+#define ISCSI_FNODE_TCP_RECV_WSF (1ULL << ISCSI_FLASHNODE_TCP_RECV_WSF) -+#define ISCSI_FNODE_CHAP_IN_IDX (1ULL << ISCSI_FLASHNODE_CHAP_IN_IDX) -+#define ISCSI_FNODE_CHAP_OUT_IDX (1ULL << ISCSI_FLASHNODE_CHAP_OUT_IDX) -+#define ISCSI_FNODE_USERNAME (1ULL << ISCSI_FLASHNODE_USERNAME) -+#define ISCSI_FNODE_USERNAME_IN (1ULL << ISCSI_FLASHNODE_USERNAME_IN) -+#define ISCSI_FNODE_PASSWORD (1ULL << ISCSI_FLASHNODE_PASSWORD) -+#define ISCSI_FNODE_PASSWORD_IN (1ULL << ISCSI_FLASHNODE_PASSWORD_IN) -+#define ISCSI_FNODE_STATSN (1ULL << ISCSI_FLASHNODE_STATSN) -+#define ISCSI_FNODE_EXP_STATSN (1ULL << ISCSI_FLASHNODE_EXP_STATSN) -+#define ISCSI_FNODE_IS_BOOT_TGT (1ULL << ISCSI_FLASHNODE_IS_BOOT_TGT) -+ -+struct iscsi_flashnode_param_info { -+ uint32_t len; /* Actual length of the param */ -+ uint16_t param; /* iscsi param value */ -+ uint8_t value[0]; /* length sized value follows */ -+} __attribute__((__packed__)); -+ - /* iSCSI HBA params */ - enum iscsi_host_param { - ISCSI_HOST_PARAM_HWADDRESS, -diff --git a/usr/Makefile b/usr/Makefile -index 33b517c..3d8ee22 100644 ---- a/usr/Makefile -+++ b/usr/Makefile -@@ -40,7 +40,7 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o) - ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \ - sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \ - iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \ -- initiator_common.o iscsi_err.o uip_mgmt_ipc.o \ -+ initiator_common.o iscsi_err.o flashnode.o uip_mgmt_ipc.o \ - $(IPC_OBJ) $(SYSDEPS_SRCS) - # core initiator files - INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o -diff --git a/usr/flashnode.c b/usr/flashnode.c -new file mode 100644 -index 0000000..da1392a ---- /dev/null -+++ b/usr/flashnode.c -@@ -0,0 +1,609 @@ -+/* -+ * iSCSI flashnode helpers -+ * -+ * Copyright (C) 2013 QLogic Corporation. -+ * Maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "log.h" -+#include "idbm.h" -+#include "iscsi_util.h" -+#include "transport.h" -+#include "iscsi_sysfs.h" -+#include "list.h" -+#include "sysdeps.h" -+#include "idbm_fields.h" -+#include "iscsi_err.h" -+#include "iscsi_ipc.h" -+#include "iscsi_netlink.h" -+#include "flashnode.h" -+#include "iscsi_settings.h" -+ -+char key[NAME_MAXVAL]; -+ -+char *to_key(const char *fmt) -+{ -+ int i = 0; -+ memset(key, 0, sizeof(key)); -+ sprintf(key, fmt, i); -+ return key; -+} -+ -+int flashnode_info_print_flat(void *data, struct flashnode_rec *fnode, -+ uint32_t host_no, uint32_t flashnode_idx) -+{ -+ printf("%s: [%d] ", fnode->transport_name, flashnode_idx); -+ if (!strlen((char *)fnode->conn[0].ipaddress)) -+ printf("%s:", UNKNOWN_VALUE); -+ else if (strchr((char *)fnode->conn[0].ipaddress, '.')) -+ printf("%s:", fnode->conn[0].ipaddress); -+ else -+ printf("[%s]:", fnode->conn[0].ipaddress); -+ -+ if (!fnode->conn[0].port) -+ printf("%s,", UNKNOWN_VALUE); -+ else -+ printf("%u,", fnode->conn[0].port); -+ -+ printf("%u ", fnode->sess.tpgt); -+ -+ if (!strlen(fnode->sess.targetname)) -+ printf("%s\n", UNKNOWN_VALUE); -+ else -+ printf("%s\n", fnode->sess.targetname); -+ -+ return 0; -+} -+ -+static int flashnode_fill_isid(struct flashnode_rec *fnode, struct iovec *iov) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ uint8_t isid[6]; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + 6; -+ iov->iov_base = iscsi_nla_alloc(ISCSI_FLASHNODE_ISID, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = ISCSI_FLASHNODE_ISID; -+ fnode_param->len = 6; -+ -+ sscanf(fnode->sess.isid, "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx", -+ &isid[0], &isid[1], &isid[2], &isid[3], &isid[4], &isid[5]); -+ -+ memcpy(fnode_param->value, isid, fnode_param->len); -+ return 0; -+} -+ -+static int flashnode_fill_ipv4_addr(struct flashnode_rec *fnode, -+ struct iovec *iov, int param_type) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ int rc; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + 4; -+ iov->iov_base = iscsi_nla_alloc(param_type, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = param_type; -+ fnode_param->len = 4; -+ -+ switch (param_type) { -+ case ISCSI_FLASHNODE_IPADDR: -+ rc = inet_pton(AF_INET, (char *)fnode->conn[0].ipaddress, -+ fnode_param->value); -+ break; -+ case ISCSI_FLASHNODE_REDIRECT_IPADDR: -+ rc = inet_pton(AF_INET, (char *)fnode->conn[0].redirect_ipaddr, -+ fnode_param->value); -+ break; -+ default: -+ goto free; -+ } -+ -+ if (rc <= 0) -+ goto free; -+ -+ return 0; -+ -+free: -+ free(iov->iov_base); -+ iov->iov_base = NULL; -+ iov->iov_len = 0; -+ return 1; -+} -+ -+static int flashnode_fill_ipv6_addr(struct flashnode_rec *fnode, -+ struct iovec *iov, int param_type) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ int rc; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + 16; -+ iov->iov_base = iscsi_nla_alloc(param_type, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = param_type; -+ fnode_param->len = 16; -+ -+ switch (param_type) { -+ case ISCSI_FLASHNODE_IPADDR: -+ rc = inet_pton(AF_INET6, (char *)fnode->conn[0].ipaddress, -+ fnode_param->value); -+ break; -+ case ISCSI_FLASHNODE_REDIRECT_IPADDR: -+ rc = inet_pton(AF_INET6, (char *)fnode->conn[0].redirect_ipaddr, -+ fnode_param->value); -+ break; -+ case ISCSI_FLASHNODE_LINK_LOCAL_IPV6: -+ rc = inet_pton(AF_INET6, (char *)fnode->conn[0].link_local_ipv6, -+ fnode_param->value); -+ break; -+ default: -+ goto free; -+ } -+ -+ if (rc <= 0) -+ goto free; -+ -+ return 0; -+ -+free: -+ free(iov->iov_base); -+ iov->iov_base = NULL; -+ iov->iov_len = 0; -+ return 1; -+} -+ -+static int flashnode_fill_ipaddr(struct flashnode_rec *fnode, struct iovec *iov, -+ int param_type) -+{ -+ int rc = 0; -+ -+ if (!strncmp(fnode->sess.portal_type, "ipv4", 4)) -+ rc = flashnode_fill_ipv4_addr(fnode, iov, param_type); -+ else -+ rc = flashnode_fill_ipv6_addr(fnode, iov, param_type); -+ -+ return rc; -+} -+ -+static int flashnode_fill_uint8(struct flashnode_rec *fnode, struct iovec *iov, -+ int param_type, uint8_t val) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + 1; -+ iov->iov_base = iscsi_nla_alloc(param_type, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = param_type; -+ fnode_param->len = 1; -+ fnode_param->value[0] = val; -+ return 0; -+} -+ -+static int flashnode_fill_uint16(struct flashnode_rec *fnode, struct iovec *iov, -+ int param_type, uint16_t val) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + 2; -+ iov->iov_base = iscsi_nla_alloc(param_type, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = param_type; -+ fnode_param->len = 2; -+ memcpy(fnode_param->value, &val, fnode_param->len); -+ return 0; -+} -+ -+static int flashnode_fill_uint32(struct flashnode_rec *fnode, struct iovec *iov, -+ int param_type, uint32_t val) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + 4; -+ iov->iov_base = iscsi_nla_alloc(param_type, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = param_type; -+ fnode_param->len = 4; -+ memcpy(fnode_param->value, &val, fnode_param->len); -+ return 0; -+} -+ -+static int flashnode_fill_str(struct flashnode_rec *fnode, struct iovec *iov, -+ int param_type, char *buf, int buflen) -+{ -+ struct iscsi_flashnode_param_info *fnode_param; -+ struct nlattr *attr; -+ int len; -+ -+ len = sizeof(struct iscsi_flashnode_param_info) + buflen; -+ iov->iov_base = iscsi_nla_alloc(param_type, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ fnode_param = (struct iscsi_flashnode_param_info *)ISCSI_NLA_DATA(attr); -+ fnode_param->param = param_type; -+ fnode_param->len = buflen; -+ memcpy(fnode_param->value, buf, fnode_param->len); -+ return 0; -+} -+ -+int flashnode_build_config(struct list_head *params, -+ struct flashnode_rec *fnode, struct iovec *iovs) -+{ -+ struct user_param *param; -+ struct iovec *iov = NULL; -+ int count = 0; -+ int port = 3260; -+ -+ /* start at 2, because 0 is for nlmsghdr and 1 for event */ -+ iov = iovs + 2; -+ -+ list_for_each_entry(param, params, list) { -+ if (!strcmp(param->name, FLASHNODE_SESS_AUTO_SND_TGT_DISABLE)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE, -+ fnode->sess.auto_snd_tgt_disable)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DISCOVERY_SESS)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_DISCOVERY_SESS, -+ fnode->sess.discovery_session)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_ENTRY_EN)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_ENTRY_EN, -+ fnode->sess.entry_enable)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_IMM_DATA_EN)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_IMM_DATA_EN, -+ fnode->sess.immediate_data)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_INITIAL_R2T_EN)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_INITIAL_R2T_EN, -+ fnode->sess.initial_r2t)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DATASEQ_INORDER)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_DATASEQ_INORDER, -+ fnode->sess.data_seq_in_order)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_PDU_INORDER)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_PDU_INORDER, -+ fnode->sess.data_pdu_in_order)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_CHAP_AUTH_EN)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_CHAP_AUTH_EN, -+ fnode->sess.chap_auth_en)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DISCOVERY_LOGOUT_EN)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN, -+ fnode->sess.discovery_logout_en)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_BIDI_CHAP_EN )) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_BIDI_CHAP_EN, -+ fnode->sess.bidi_chap_en)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL, -+ fnode->sess.discovery_auth_optional)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_ERL)) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_ERL, -+ fnode->sess.erl)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DEF_TIME2WAIT)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_DEF_TIME2WAIT, -+ fnode->sess.def_time2wait)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DEF_TIME2RETAIN)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_DEF_TIME2RETAIN, -+ fnode->sess.def_time2retain)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_MAX_R2T)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_MAX_R2T, -+ fnode->sess.max_outstanding_r2t)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_TSID)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_TSID, -+ fnode->sess.tsid)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_MAX_BURST)) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_MAX_BURST, -+ fnode->sess.max_burst_len)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DEF_TASKMGMT_TMO)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_DEF_TASKMGMT_TMO, -+ fnode->sess.def_taskmgmt_tmo)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_NAME)) { -+ if (!flashnode_fill_str(fnode, &iov[count], -+ ISCSI_FLASHNODE_NAME, -+ fnode->sess.targetname, -+ sizeof(fnode->sess.targetname))) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_FIRST_BURST)) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_FIRST_BURST, -+ fnode->sess.first_burst_len)) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_ISID)) { -+ if (!flashnode_fill_isid(fnode, &iov[count])) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_ALIAS)) { -+ if (!flashnode_fill_str(fnode, &iov[count], -+ ISCSI_FLASHNODE_ALIAS, -+ fnode->sess.targetalias, -+ sizeof(fnode->sess.targetalias))) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_TPGT)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_TPGT, -+ fnode->sess.tpgt)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DISCOVERY_PARENT_IDX)) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX, -+ fnode->sess.discovery_parent_idx)) -+ count++; -+ } else if (!strcmp(param->name, -+ FLASHNODE_SESS_DISCOVERY_PARENT_TYPE)) { -+ if (!flashnode_fill_str(fnode, &iov[count], -+ ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE, -+ fnode->sess.discovery_parent_type, -+ sizeof(fnode->sess.discovery_parent_type))) -+ count++; -+ } else if (!strcmp(param->name, FLASHNODE_SESS_PORTAL_TYPE)) { -+ if (!flashnode_fill_str(fnode, &iov[count], -+ ISCSI_FLASHNODE_PORTAL_TYPE, -+ fnode->sess.portal_type, -+ sizeof(fnode->sess.portal_type))) -+ count++; -+ } else if (!strcmp(param->name, to_key(FLASHNODE_CONN_PORT))) { -+ if (fnode->conn[0].port) -+ port = fnode->conn[0].port; -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_PORT, port)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_IPADDR))) { -+ if (!flashnode_fill_ipaddr(fnode, &iov[count], -+ ISCSI_FLASHNODE_IPADDR)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_MAX_RECV_DLENGTH))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_MAX_RECV_DLENGTH, -+ fnode->conn[0].max_recv_dlength)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6, -+ fnode->conn[0].is_fw_assigned_ipv6)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_HDR_DGST_EN))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_HDR_DGST_EN, -+ fnode->conn[0].header_digest_en)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_DATA_DGST_EN))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_DATA_DGST_EN, -+ fnode->conn[0].data_digest_en)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_SNACK_REQ_EN))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_SNACK_REQ_EN, -+ fnode->conn[0].snack_req_en)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_TIMESTAMP_STAT))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT, -+ fnode->conn[0].tcp_timestamp_stat)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_NAGLE_DISABLE))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_NAGLE_DISABLE, -+ fnode->conn[0].tcp_nagle_disable)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_WSF_DISABLE))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_WSF_DISABLE, -+ fnode->conn[0].tcp_wsf_disable)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_TIMER_SCALE))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_TIMER_SCALE, -+ fnode->conn[0].tcp_timer_scale)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_TIMESTAMP_EN))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_TIMESTAMP_EN, -+ fnode->conn[0].tcp_timestamp_en)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_IP_FRAG_DISABLE))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_IP_FRAG_DISABLE, -+ fnode->conn[0].fragment_disable)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_MAX_XMIT_DLENGTH))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_MAX_XMIT_DLENGTH, -+ fnode->conn[0].max_xmit_dlength)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_KEEPALIVE_TMO))) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_KEEPALIVE_TMO, -+ fnode->conn[0].keepalive_tmo)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_REDIRECT_IPADDR))) { -+ if (!flashnode_fill_ipaddr(fnode, &iov[count], -+ ISCSI_FLASHNODE_REDIRECT_IPADDR)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_MAX_SEGMENT_SIZE))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_MAX_SEGMENT_SIZE, -+ fnode->conn[0].max_segment_size)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_LOCAL_PORT))) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_LOCAL_PORT, -+ fnode->conn[0].local_port)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_IPV4_TOS))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_IPV4_TOS, -+ fnode->conn[0].ipv4_tos)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_IPV6_TC))) { -+ if (!flashnode_fill_uint8(fnode, &iov[count], -+ ISCSI_FLASHNODE_IPV6_TC, -+ fnode->conn[0].ipv6_traffic_class)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_IPV6_FLOW_LABEL))) { -+ if (!flashnode_fill_uint16(fnode, &iov[count], -+ ISCSI_FLASHNODE_IPV6_FLOW_LABEL, -+ fnode->conn[0].ipv6_flow_lbl)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_LINK_LOCAL_IPV6))) { -+ if (!flashnode_fill_ipv6_addr(fnode, &iov[count], -+ ISCSI_FLASHNODE_LINK_LOCAL_IPV6)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_XMIT_WSF))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_XMIT_WSF, -+ fnode->conn[0].tcp_xmit_wsf)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_TCP_RECV_WSF))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_TCP_RECV_WSF, -+ fnode->conn[0].tcp_recv_wsf)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_STATSN))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_STATSN, -+ fnode->conn[0].stat_sn)) -+ count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_CONN_EXP_STATSN))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_EXP_STATSN, -+ fnode->conn[0].exp_stat_sn)) -+ count++; -+ } -+ } -+ -+ return count; -+} -diff --git a/usr/flashnode.h b/usr/flashnode.h -new file mode 100644 -index 0000000..c1de9cc ---- /dev/null -+++ b/usr/flashnode.h -@@ -0,0 +1,127 @@ -+/* -+ * iSCSI flashnode helpers -+ * -+ * Copyright (C) 2013 QLogic Corporation. -+ * Maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+#ifndef FLASHNODE_H -+#define FLASHNODE_H -+#include -+#include -+#include -+ -+#include "types.h" -+#include "config.h" -+#include "auth.h" -+ -+typedef enum portal_type { -+ IPV4, -+ IPV6, -+} portal_type_e; -+ -+typedef struct flashnode_sess_rec { -+ char targetname[TARGET_NAME_MAXLEN]; -+ char targetalias[TARGET_NAME_MAXLEN]; -+ char username[AUTH_STR_MAX_LEN]; -+ char username_in[AUTH_STR_MAX_LEN]; -+ char password[AUTH_STR_MAX_LEN]; -+ char password_in[AUTH_STR_MAX_LEN]; -+ /* indicates if discovery was done through iSNS discovery service -+ * or through sendTarget */ -+ char discovery_parent_type[ISCSI_MAX_STR_LEN]; -+ char isid[16]; -+ char portal_type[5]; /* ipv4 or ipv6 */ -+ unsigned first_burst_len; -+ unsigned max_burst_len; -+ uint16_t def_time2wait; -+ uint16_t def_time2retain; -+ uint16_t max_outstanding_r2t; -+ uint16_t tsid; -+ uint16_t def_taskmgmt_tmo; -+ uint16_t tpgt; -+ uint16_t chap_out_idx; -+ uint16_t chap_in_idx; -+ /* index of iSCSI discovery session if the entry is -+ * discovered by iSCSI discovery session -+ */ -+ uint16_t discovery_parent_idx; -+ /* Firmware auto sendtarget discovery disable */ -+ uint8_t auto_snd_tgt_disable; -+ uint8_t discovery_session; -+ /* indicates if this flashnode entry is enabled or disabled */ -+ uint8_t entry_enable; -+ uint8_t immediate_data; -+ uint8_t initial_r2t; -+ uint8_t data_seq_in_order; -+ uint8_t data_pdu_in_order; -+ uint8_t chap_auth_en; -+ /* enables firmware to auto logout the discovery session on discovery -+ * completion -+ */ -+ uint8_t discovery_logout_en; -+ uint8_t bidi_chap_en; -+ /* makes authentication for discovery session optional */ -+ uint8_t discovery_auth_optional; -+ uint8_t erl; -+ uint8_t is_boot_target; -+} flashnode_sess_rec_t; -+ -+typedef struct flashnode_conn_rec { -+ char ipaddress[NI_MAXHOST]; -+ char redirect_ipaddr[NI_MAXHOST]; -+ char link_local_ipv6[NI_MAXHOST]; -+ unsigned max_recv_dlength; -+ unsigned max_xmit_dlength; -+ unsigned max_segment_size; -+ unsigned tcp_xmit_wsf; -+ unsigned tcp_recv_wsf; -+ uint32_t stat_sn; -+ uint32_t exp_stat_sn; -+ uint16_t keepalive_tmo; -+ uint16_t port; -+ uint16_t local_port; -+ uint16_t ipv6_flow_lbl; -+ /* Link local IPv6 address is assigned by firmware or driver */ -+ uint8_t is_fw_assigned_ipv6; -+ uint8_t header_digest_en; -+ uint8_t data_digest_en; -+ uint8_t snack_req_en; -+ /* tcp timestamp negotiation status */ -+ uint8_t tcp_timestamp_stat; -+ uint8_t tcp_nagle_disable; -+ /* tcp window scale factor */ -+ uint8_t tcp_wsf_disable; -+ uint8_t tcp_timer_scale; -+ uint8_t tcp_timestamp_en; -+ uint8_t fragment_disable; -+ uint8_t ipv4_tos; -+ uint8_t ipv6_traffic_class; -+} flashnode_conn_rec_t; -+ -+struct flashnode_rec { -+ struct list_head list; -+ char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; -+ flashnode_sess_rec_t sess; -+ flashnode_conn_rec_t conn[ISCSI_CONN_MAX]; -+}; -+ -+extern int flashnode_info_print_flat(void *data, struct flashnode_rec *tgt, -+ uint32_t host_no, uint32_t flashnode_idx); -+extern int iscsi_logout_flashnode_sid(struct iscsi_transport *t, -+ uint32_t host_no, uint32_t sid); -+extern int flashnode_build_config(struct list_head *params, -+ struct flashnode_rec *flashnode, -+ struct iovec *iovs); -+#endif -diff --git a/usr/idbm.c b/usr/idbm.c -index 4d30aa9..bc06058 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -94,6 +94,17 @@ static struct idbm *db; - _n++; \ - } while (0) - -+#define __recinfo_uint32(_key, _info, _rec, _name, _show, _n, _mod) do { \ -+ _info[_n].type = TYPE_UINT32; \ -+ strlcpy(_info[_n].name, _key, NAME_MAXVAL); \ -+ snprintf(_info[_n].value, VALUE_MAXVAL, "%d", _rec->_name); \ -+ _info[_n].data = &_rec->_name; \ -+ _info[_n].data_len = sizeof(_rec->_name); \ -+ _info[_n].visible = _show; \ -+ _info[_n].can_modify = _mod; \ -+ _n++; \ -+} while (0) -+ - #define __recinfo_int_o2(_key,_info,_rec,_name,_show,_op0,_op1,_n, _mod) do { \ - _info[_n].type = TYPE_INT_O; \ - strlcpy(_info[_n].name, _key, NAME_MAXVAL); \ -@@ -469,6 +480,158 @@ static void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) - } - } - -+void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri) -+{ -+ int num = 0; -+ int i; -+ -+ __recinfo_uint8(FLASHNODE_SESS_AUTO_SND_TGT_DISABLE, ri, r, -+ sess.auto_snd_tgt_disable, IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_DISCOVERY_SESS, ri, r, -+ sess.discovery_session, IDBM_SHOW, num, 1); -+ __recinfo_str(FLASHNODE_SESS_PORTAL_TYPE, ri, r, sess.portal_type, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_ENTRY_EN, ri, r, -+ sess.entry_enable, IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_IMM_DATA_EN, ri, r, sess.immediate_data, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_INITIAL_R2T_EN, ri, r, sess.initial_r2t, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_DATASEQ_INORDER, ri, r, -+ sess.data_seq_in_order, IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_PDU_INORDER, ri, r, -+ sess.data_pdu_in_order, IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_CHAP_AUTH_EN, ri, r, sess.chap_auth_en, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_DISCOVERY_LOGOUT_EN, ri, r, -+ sess.discovery_logout_en, IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_BIDI_CHAP_EN, ri, r, sess.bidi_chap_en, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL, ri, r, -+ sess.discovery_auth_optional, IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_ERL, ri, r, sess.erl, IDBM_SHOW, num, 1); -+ __recinfo_uint32(FLASHNODE_SESS_FIRST_BURST, ri, r, -+ sess.first_burst_len, IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_DEF_TIME2WAIT, ri, r, -+ sess.def_time2wait, IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_DEF_TIME2RETAIN, ri, r, -+ sess.def_time2retain, IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_MAX_R2T, ri, r, -+ sess.max_outstanding_r2t, IDBM_SHOW, num, 1); -+ __recinfo_str(FLASHNODE_SESS_ISID, ri, r, sess.isid, IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_TSID, ri, r, sess.tsid, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint32(FLASHNODE_SESS_MAX_BURST, ri, r, sess.max_burst_len, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_DEF_TASKMGMT_TMO, ri, r, -+ sess.def_taskmgmt_tmo, IDBM_SHOW, num, 1); -+ __recinfo_str(FLASHNODE_SESS_ALIAS, ri, r, sess.targetalias, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(FLASHNODE_SESS_NAME, ri, r, sess.targetname, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_DISCOVERY_PARENT_IDX, ri, r, -+ sess.discovery_parent_idx, IDBM_SHOW, num, 1); -+ __recinfo_str(FLASHNODE_SESS_DISCOVERY_PARENT_TYPE, ri, r, -+ sess.discovery_parent_type, IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_TPGT, ri, r, sess.tpgt, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_CHAP_OUT_IDX, ri, r, sess.chap_out_idx, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint16(FLASHNODE_SESS_CHAP_IN_IDX, ri, r, sess.chap_in_idx, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(FLASHNODE_SESS_USERNAME, ri, r, sess.username, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(FLASHNODE_SESS_USERNAME_IN, ri, r, sess.username_in, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(FLASHNODE_SESS_PASSWORD, ri, r, sess.password, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(FLASHNODE_SESS_PASSWORD_IN, ri, r, sess.password_in, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(FLASHNODE_SESS_IS_BOOT_TGT, ri, r, sess.is_boot_target, -+ IDBM_SHOW, num, 1); -+ -+ for (i = 0; i < ISCSI_CONN_MAX; i++) { -+ char key[NAME_MAXVAL]; -+ -+ sprintf(key, FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6, i); -+ __recinfo_uint8(key, ri, r, conn[i].is_fw_assigned_ipv6, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_HDR_DGST_EN, i); -+ __recinfo_uint8(key, ri, r, conn[i].header_digest_en, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_DATA_DGST_EN, i); -+ __recinfo_uint8(key, ri, r, conn[i].data_digest_en, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_SNACK_REQ_EN, i); -+ __recinfo_uint8(key, ri, r, conn[i].snack_req_en, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_STAT, i); -+ __recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_stat, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_NAGLE_DISABLE, i); -+ __recinfo_uint8(key, ri, r, conn[i].tcp_nagle_disable, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_WSF_DISABLE, i); -+ __recinfo_uint8(key, ri, r, conn[i].tcp_wsf_disable, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_TIMER_SCALE, i); -+ __recinfo_uint8(key, ri, r, conn[i].tcp_timer_scale, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_EN, i); -+ __recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_en, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_IP_FRAG_DISABLE, i); -+ __recinfo_uint8(key, ri, r, conn[i].fragment_disable, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_MAX_XMIT_DLENGTH, i); -+ __recinfo_uint32(key, ri, r, conn[i].max_xmit_dlength, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_MAX_RECV_DLENGTH, i); -+ __recinfo_uint32(key, ri, r, conn[i].max_recv_dlength, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_KEEPALIVE_TMO, i); -+ __recinfo_uint16(key, ri, r, conn[i].keepalive_tmo, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_PORT, i); -+ __recinfo_uint16(key, ri, r, conn[i].port, IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_IPADDR, i); -+ __recinfo_str(key, ri, r, conn[i].ipaddress, IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_REDIRECT_IPADDR, i); -+ __recinfo_str(key, ri, r, conn[i].redirect_ipaddr, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_MAX_SEGMENT_SIZE, i); -+ __recinfo_uint32(key, ri, r, conn[i].max_segment_size, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_LOCAL_PORT, i); -+ __recinfo_uint16(key, ri, r, conn[i].local_port, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_IPV4_TOS, i); -+ __recinfo_uint8(key, ri, r, conn[i].ipv4_tos, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_IPV6_TC, i); -+ __recinfo_uint8(key, ri, r, conn[i].ipv6_traffic_class, -+ IDBM_SHOW, num, 1); -+ sprintf(key, FLASHNODE_CONN_IPV6_FLOW_LABEL, i); -+ __recinfo_uint16(key, ri, r, conn[i].ipv6_flow_lbl, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_LINK_LOCAL_IPV6, i); -+ __recinfo_str(key, ri, r, conn[i].link_local_ipv6, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_XMIT_WSF, i); -+ __recinfo_uint32(key, ri, r, conn[i].tcp_xmit_wsf, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_TCP_RECV_WSF, i); -+ __recinfo_uint32(key, ri, r, conn[i].tcp_recv_wsf, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_STATSN, i); -+ __recinfo_uint32(key, ri, r, conn[i].stat_sn, IDBM_SHOW, -+ num, 1); -+ sprintf(key, FLASHNODE_CONN_EXP_STATSN, i); -+ __recinfo_uint32(key, ri, r, conn[i].exp_stat_sn, IDBM_SHOW, -+ num, 1); -+ } -+} -+ - recinfo_t *idbm_recinfo_alloc(int max_keys) - { - recinfo_t *info; -@@ -502,6 +665,9 @@ void idbm_print(int type, void *rec, int show, FILE *f) - case IDBM_PRINT_TYPE_HOST_CHAP: - idbm_recinfo_host_chap((struct iscsi_chap_rec *)rec, info); - break; -+ case IDBM_PRINT_TYPE_FLASHNODE: -+ idbm_recinfo_flashnode((struct flashnode_rec *)rec, info); -+ break; - } - - fprintf(f, "%s\n", ISCSI_BEGIN_REC); -@@ -629,6 +795,13 @@ setup_passwd_len: - *(uint16_t *)info[i].data = - strtoul(value, NULL, 10); - goto updated; -+ } else if (info[i].type == TYPE_UINT32) { -+ if (!info[i].data) -+ continue; -+ -+ *(uint32_t *)info[i].data = -+ strtoul(value, NULL, 10); -+ goto updated; - } else if (info[i].type == TYPE_STR) { - if (!info[i].data) - continue; -@@ -880,6 +1053,12 @@ int idbm_print_host_chap_info(struct iscsi_chap_rec *chap) - return 0; - } - -+int idbm_print_flashnode_info(struct flashnode_rec *fnode) -+{ -+ idbm_print(IDBM_PRINT_TYPE_FLASHNODE, fnode, 1, stdout); -+ return 0; -+} -+ - int idbm_print_node_flat(void *data, node_rec_t *rec) - { - if (strchr(rec->conn[0].address, '.')) -diff --git a/usr/idbm.h b/usr/idbm.h -index 245f046..5e4038d 100644 ---- a/usr/idbm.h -+++ b/usr/idbm.h -@@ -27,6 +27,7 @@ - #include "initiator.h" - #include "config.h" - #include "list.h" -+#include "flashnode.h" - - #define NODE_CONFIG_DIR ISCSI_CONFIG_ROOT"nodes" - #define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp" -@@ -42,6 +43,7 @@ - #define TYPE_STR 2 - #define TYPE_UINT8 3 - #define TYPE_UINT16 4 -+#define TYPE_UINT32 5 - #define MAX_KEYS 256 /* number of keys total(including CNX_MAX) */ - #define NAME_MAXVAL 128 /* the maximum length of key name */ - #define VALUE_MAXVAL 256 /* the maximum length of 223 bytes in the RFC. */ -@@ -85,6 +87,7 @@ struct user_param { - struct list_head list; - char *name; - char *value; -+ int param; - }; - - typedef int (idbm_iface_op_fn)(void *data, node_rec_t *rec); -@@ -168,6 +171,7 @@ enum { - IDBM_PRINT_TYPE_NODE, - IDBM_PRINT_TYPE_IFACE, - IDBM_PRINT_TYPE_HOST_CHAP, -+ IDBM_PRINT_TYPE_FLASHNODE - }; - - extern void idbm_print(int type, void *rec, int show, FILE *f); -@@ -182,4 +186,7 @@ idbm_create_rec_from_boot_context(struct boot_context *context); - - extern int idbm_print_host_chap_info(struct iscsi_chap_rec *chap); - -+extern int idbm_print_flashnode_info(struct flashnode_rec *target); -+extern void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri); -+ - #endif /* IDBM_H */ -diff --git a/usr/idbm_fields.h b/usr/idbm_fields.h -index 358d014..179dda8 100644 ---- a/usr/idbm_fields.h -+++ b/usr/idbm_fields.h -@@ -126,4 +126,67 @@ - #define HOST_AUTH_PASSWORD_IN "host.auth.password_in" - #define HOST_AUTH_PASSWORD_IN_LEN "host.auth.password_in_length" - -+/* flash target session fields */ -+#define FLASHNODE_SESS_AUTO_SND_TGT_DISABLE "flashnode.session.auto_snd_tgt_disable" -+#define FLASHNODE_SESS_DISCOVERY_SESS "flashnode.session.discovery_session" -+#define FLASHNODE_SESS_PORTAL_TYPE "flashnode.session.portal_type" -+#define FLASHNODE_SESS_ENTRY_EN "flashnode.session.entry_enable" -+#define FLASHNODE_SESS_IMM_DATA_EN "flashnode.session.immediate_data" -+#define FLASHNODE_SESS_INITIAL_R2T_EN "flashnode.session.initial_r2t" -+#define FLASHNODE_SESS_DATASEQ_INORDER "flashnode.session.data_seq_in_order" -+#define FLASHNODE_SESS_PDU_INORDER "flashnode.session.data_pdu_in_order" -+#define FLASHNODE_SESS_CHAP_AUTH_EN "flashnode.session.chap_auth_en" -+#define FLASHNODE_SESS_DISCOVERY_LOGOUT_EN "flashnode.session.discovery_logout_en" -+#define FLASHNODE_SESS_BIDI_CHAP_EN "flashnode.session.bidi_chap_en" -+#define FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL "flashnode.session.discovery_auth_optional" -+#define FLASHNODE_SESS_ERL "flashnode.session.erl" -+#define FLASHNODE_SESS_FIRST_BURST "flashnode.session.first_burst_len" -+#define FLASHNODE_SESS_DEF_TIME2WAIT "flashnode.session.def_time2wait" -+#define FLASHNODE_SESS_DEF_TIME2RETAIN "flashnode.session.def_time2retain" -+#define FLASHNODE_SESS_MAX_R2T "flashnode.session.max_outstanding_r2t" -+#define FLASHNODE_SESS_ISID "flashnode.session.isid" -+#define FLASHNODE_SESS_TSID "flashnode.session.tsid" -+#define FLASHNODE_SESS_MAX_BURST "flashnode.session.max_burst_len" -+#define FLASHNODE_SESS_DEF_TASKMGMT_TMO "flashnode.session.def_taskmgmt_tmo" -+#define FLASHNODE_SESS_ALIAS "flashnode.session.targetalias" -+#define FLASHNODE_SESS_NAME "flashnode.session.targetname" -+#define FLASHNODE_SESS_TPGT "flashnode.session.tpgt" -+#define FLASHNODE_SESS_DISCOVERY_PARENT_IDX "flashnode.session.discovery_parent_idx" -+#define FLASHNODE_SESS_DISCOVERY_PARENT_TYPE "flashnode.session.discovery_parent_type" -+#define FLASHNODE_SESS_CHAP_OUT_IDX "flashnode.session.chap_out_idx" -+#define FLASHNODE_SESS_CHAP_IN_IDX "flashnode.session.chap_in_idx" -+#define FLASHNODE_SESS_USERNAME "flashnode.session.username" -+#define FLASHNODE_SESS_USERNAME_IN "flashnode.session.username_in" -+#define FLASHNODE_SESS_PASSWORD "flashnode.session.password" -+#define FLASHNODE_SESS_PASSWORD_IN "flashnode.session.password_in" -+#define FLASHNODE_SESS_IS_BOOT_TGT "flashnode.session.is_boot_target" -+ -+/* flash target connection fields */ -+#define FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6 "flashnode.conn[%d].is_fw_assigned_ipv6" -+#define FLASHNODE_CONN_HDR_DGST_EN "flashnode.conn[%d].header_digest_en" -+#define FLASHNODE_CONN_DATA_DGST_EN "flashnode.conn[%d].data_digest_en" -+#define FLASHNODE_CONN_SNACK_REQ_EN "flashnode.conn[%d].snack_req_en" -+#define FLASHNODE_CONN_TCP_TIMESTAMP_STAT "flashnode.conn[%d].tcp_timestamp_stat" -+#define FLASHNODE_CONN_TCP_NAGLE_DISABLE "flashnode.conn[%d].tcp_nagle_disable" -+#define FLASHNODE_CONN_TCP_WSF_DISABLE "flashnode.conn[%d].tcp_wsf_disable" -+#define FLASHNODE_CONN_TCP_TIMER_SCALE "flashnode.conn[%d].tcp_timer_scale" -+#define FLASHNODE_CONN_TCP_TIMESTAMP_EN "flashnode.conn[%d].tcp_timestamp_en" -+#define FLASHNODE_CONN_IP_FRAG_DISABLE "flashnode.conn[%d].fragment_disable" -+#define FLASHNODE_CONN_MAX_RECV_DLENGTH "flashnode.conn[%d].max_recv_dlength" -+#define FLASHNODE_CONN_MAX_XMIT_DLENGTH "flashnode.conn[%d].max_xmit_dlength" -+#define FLASHNODE_CONN_KEEPALIVE_TMO "flashnode.conn[%d].keepalive_tmo" -+#define FLASHNODE_CONN_PORT "flashnode.conn[%d].port" -+#define FLASHNODE_CONN_IPADDR "flashnode.conn[%d].ipaddress" -+#define FLASHNODE_CONN_REDIRECT_IPADDR "flashnode.conn[%d].redirect_ipaddr" -+#define FLASHNODE_CONN_MAX_SEGMENT_SIZE "flashnode.conn[%d].max_segment_size" -+#define FLASHNODE_CONN_LOCAL_PORT "flashnode.conn[%d].local_port" -+#define FLASHNODE_CONN_IPV4_TOS "flashnode.conn[%d].ipv4_tos" -+#define FLASHNODE_CONN_IPV6_TC "flashnode.conn[%d].ipv6_traffic_class" -+#define FLASHNODE_CONN_IPV6_FLOW_LABEL "flashnode.conn[%d].ipv6_flow_label" -+#define FLASHNODE_CONN_LINK_LOCAL_IPV6 "flashnode.conn[%d].link_local_ipv6" -+#define FLASHNODE_CONN_TCP_XMIT_WSF "flashnode.conn[%d].tcp_xmit_wsf" -+#define FLASHNODE_CONN_TCP_RECV_WSF "flashnode.conn[%d].tcp_recv_wsf" -+#define FLASHNODE_CONN_STATSN "flashnode.conn[%d].statsn" -+#define FLASHNODE_CONN_EXP_STATSN "flashnode.conn[%d].exp_statsn" -+ - #endif -diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h -index db5f1f0..b6665cb 100644 ---- a/usr/iscsi_ipc.h -+++ b/usr/iscsi_ipc.h -@@ -145,6 +145,19 @@ struct iscsi_ipc { - - int (*delete_chap) (uint64_t transport_handle, uint32_t host_no, - uint16_t chap_tbl_idx); -+ int (*set_flash_node_params) (uint64_t transport_handle, -+ uint32_t host_no, uint32_t flashnode_idx, -+ struct iovec *iovs, uint32_t param_count); -+ int (*new_flash_node) (uint64_t transport_handle, uint32_t host_no, -+ void *value, uint32_t *flashnode_idx); -+ int (*del_flash_node) (uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx); -+ int (*login_flash_node) (uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx); -+ int (*logout_flash_node) (uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx); -+ int (*logout_flash_node_sid) (uint64_t transport_handle, -+ uint32_t host_no, uint32_t sid); - }; - - #endif /* ISCSI_IPC_H */ -diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c -index 4015b35..64a4ce7 100644 ---- a/usr/iscsi_sysfs.c -+++ b/usr/iscsi_sysfs.c -@@ -29,6 +29,7 @@ - #include "initiator.h" - #include "transport.h" - #include "idbm.h" -+#include "idbm_fields.h" - #include "version.h" - #include "iscsi_sysfs.h" - #include "sysdeps.h" -@@ -37,6 +38,7 @@ - #include "session_info.h" - #include "host.h" - #include "iscsi_err.h" -+#include "flashnode.h" - - /* - * TODO: remove the _DIR defines and search for subsys dirs like -@@ -45,18 +47,22 @@ - #define ISCSI_TRANSPORT_DIR "/sys/class/iscsi_transport" - #define ISCSI_SESSION_DIR "/sys/class/iscsi_session" - #define ISCSI_HOST_DIR "/sys/class/iscsi_host" -+#define ISCSI_FLASHNODE_DIR "/sys/bus/iscsi_flashnode/devices" - - #define ISCSI_SESSION_SUBSYS "iscsi_session" - #define ISCSI_CONN_SUBSYS "iscsi_connection" - #define ISCSI_HOST_SUBSYS "iscsi_host" - #define ISCSI_TRANSPORT_SUBSYS "iscsi_transport" - #define ISCSI_IFACE_SUBSYS "iscsi_iface" -+#define ISCSI_FLASHNODE_SUBSYS "iscsi_flashnode" - #define SCSI_HOST_SUBSYS "scsi_host" - #define SCSI_SUBSYS "scsi" - - #define ISCSI_SESSION_ID "session%d" - #define ISCSI_CONN_ID "connection%d:0" - #define ISCSI_HOST_ID "host%d" -+#define ISCSI_FLASHNODE_SESS "flashnode_sess-%d:%d" -+#define ISCSI_FLASHNODE_CONN "flashnode_conn-%d:%d:0" - - /* - * TODO: make this into a real API and check inputs better and add doc. -@@ -440,6 +446,234 @@ uint32_t iscsi_sysfs_get_host_no_from_hwinfo(struct iface_rec *iface, int *rc) - } - - /* -+ * Read the flash node attributes based on host and flash node index. -+ */ -+int iscsi_sysfs_get_flashnode_info(struct flashnode_rec *fnode, -+ uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ char sess_id[NAME_SIZE] = {'\0'}; -+ char conn_id[NAME_SIZE] = {'\0'}; -+ char fnode_path[PATH_SIZE] = {'\0'}; -+ struct iscsi_transport *t; -+ int ret = 0; -+ -+ t = iscsi_sysfs_get_transport_by_hba(host_no); -+ if (!t) -+ log_debug(7, "could not get transport name for host%d", -+ host_no); -+ else -+ strncpy(fnode->transport_name, t->name, -+ ISCSI_TRANSPORT_NAME_MAXLEN); -+ -+ snprintf(sess_id, sizeof(sess_id), ISCSI_FLASHNODE_SESS, host_no, -+ flashnode_idx); -+ -+ snprintf(fnode_path, sizeof(fnode_path), ISCSI_FLASHNODE_DIR"/%s", -+ sess_id); -+ if (access(fnode_path, F_OK) != 0) -+ return errno; -+ -+ snprintf(conn_id, sizeof(conn_id), ISCSI_FLASHNODE_CONN, host_no, -+ flashnode_idx); -+ -+ snprintf(fnode_path, sizeof(fnode_path), ISCSI_FLASHNODE_DIR"/%s", -+ conn_id); -+ if (access(fnode_path, F_OK) != 0) -+ return errno; -+ -+ -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "is_fw_assigned_ipv6", -+ &((fnode->conn[0]).is_fw_assigned_ipv6)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "portal_type", -+ (fnode->sess).portal_type, -+ sizeof((fnode->sess).portal_type)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "auto_snd_tgt_disable", -+ &((fnode->sess).auto_snd_tgt_disable)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "discovery_session", -+ &((fnode->sess).discovery_session)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "entry_enable", -+ &((fnode->sess).entry_enable)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "header_digest", -+ &((fnode->conn[0]).header_digest_en)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "data_digest", -+ &((fnode->conn[0]).data_digest_en)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "immediate_data", -+ &((fnode->sess).immediate_data)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "initial_r2t", -+ &((fnode->sess).initial_r2t)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "data_seq_in_order", -+ &((fnode->sess).data_seq_in_order)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "data_pdu_in_order", -+ &((fnode->sess).data_pdu_in_order)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "chap_auth", -+ &((fnode->sess).chap_auth_en)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "snack_req", -+ &((fnode->conn[0]).snack_req_en)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "discovery_logout", -+ &((fnode->sess).discovery_logout_en)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "bidi_chap", -+ &((fnode->sess).bidi_chap_en)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, -+ "discovery_auth_optional", -+ &((fnode->sess).discovery_auth_optional)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "erl", -+ &((fnode->sess).erl)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_timestamp_stat", -+ &((fnode->conn[0]).tcp_timestamp_stat)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_nagle_disable", -+ &((fnode->conn[0]).tcp_nagle_disable)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_wsf_disable", -+ &((fnode->conn[0]).tcp_wsf_disable)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_timer_scale", -+ &((fnode->conn[0]).tcp_timer_scale)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_timestamp_enable", -+ &((fnode->conn[0]).tcp_timestamp_en)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "fragment_disable", -+ &((fnode->conn[0]).fragment_disable)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "max_recv_dlength", -+ &((fnode->conn[0]).max_recv_dlength)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "max_xmit_dlength", -+ &((fnode->conn[0]).max_xmit_dlength)); -+ sysfs_get_uint(sess_id, ISCSI_FLASHNODE_SUBSYS, "first_burst_len", -+ &((fnode->sess).first_burst_len)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "def_time2wait", -+ &((fnode->sess).def_time2wait)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "def_time2retain", -+ &((fnode->sess).def_time2retain)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "max_outstanding_r2t", -+ &((fnode->sess).max_outstanding_r2t)); -+ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "keepalive_tmo", -+ &((fnode->conn[0]).keepalive_tmo)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "isid", -+ (fnode->sess).isid, sizeof((fnode->sess).isid)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "tsid", -+ &((fnode->sess).tsid)); -+ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "port", -+ &((fnode->conn[0]).port)); -+ sysfs_get_uint(sess_id, ISCSI_FLASHNODE_SUBSYS, "max_burst_len", -+ &((fnode->sess).max_burst_len)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "def_taskmgmt_tmo", -+ &((fnode->sess).def_taskmgmt_tmo)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "targetalias", -+ (fnode->sess).targetalias, -+ sizeof((fnode->sess).targetalias)); -+ sysfs_get_str(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipaddress", -+ (fnode->conn[0]).ipaddress, -+ sizeof((fnode->conn[0]).ipaddress)); -+ sysfs_get_str(conn_id, ISCSI_FLASHNODE_SUBSYS, "redirect_ipaddr", -+ (fnode->conn[0]).redirect_ipaddr, -+ sizeof((fnode->conn[0]).redirect_ipaddr)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "max_segment_size", -+ &((fnode->conn[0]).max_segment_size)); -+ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "local_port", -+ &((fnode->conn[0]).local_port)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipv4_tos", -+ &((fnode->conn[0]).ipv4_tos)); -+ sysfs_get_uint8(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipv6_traffic_class", -+ &((fnode->conn[0]).ipv6_traffic_class)); -+ sysfs_get_uint16(conn_id, ISCSI_FLASHNODE_SUBSYS, "ipv6_flow_label", -+ &((fnode->conn[0]).ipv6_flow_lbl)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "targetname", -+ (fnode->sess).targetname, -+ sizeof((fnode->sess).targetname)); -+ sysfs_get_str(conn_id, ISCSI_FLASHNODE_SUBSYS, "link_local_ipv6", -+ (fnode->conn[0]).link_local_ipv6, -+ sizeof((fnode->conn[0]).link_local_ipv6)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, -+ "discovery_parent_idx", -+ &((fnode->sess).discovery_parent_idx)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, -+ "discovery_parent_type", -+ (fnode->sess).discovery_parent_type, -+ sizeof((fnode->sess).discovery_parent_type)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "tpgt", -+ &((fnode->sess).tpgt)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_xmit_wsf", -+ &((fnode->conn[0]).tcp_xmit_wsf)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "tcp_recv_wsf", -+ &((fnode->conn[0]).tcp_recv_wsf)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "chap_out_idx", -+ &((fnode->sess).chap_out_idx)); -+ sysfs_get_uint16(sess_id, ISCSI_FLASHNODE_SUBSYS, "chap_in_idx", -+ &((fnode->sess).chap_in_idx)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "username", -+ (fnode->sess).username, sizeof((fnode->sess).username)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "username_in", -+ (fnode->sess).username, -+ sizeof((fnode->sess).username_in)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "password", -+ (fnode->sess).password, sizeof((fnode->sess).password)); -+ sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "password_in", -+ (fnode->sess).password, -+ sizeof((fnode->sess).password_in)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "statsn", -+ &((fnode->conn[0]).stat_sn)); -+ sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "exp_statsn", -+ &((fnode->conn[0]).exp_stat_sn)); -+ sysfs_get_uint8(sess_id, ISCSI_FLASHNODE_SUBSYS, "is_boot_target", -+ &((fnode->sess).is_boot_target)); -+ return ret; -+} -+ -+/* -+ * For each flash node of the given host, perform operation specified in fn. -+ */ -+int iscsi_sysfs_for_each_flashnode(void *data, uint32_t host_no, int *nr_found, -+ iscsi_sysfs_flashnode_op_fn *fn) -+{ -+ struct dirent **namelist; -+ int rc = 0, i, n; -+ struct flashnode_rec *fnode; -+ uint32_t flashnode_idx; -+ uint32_t hostno; -+ -+ fnode = malloc(sizeof(*fnode)); -+ if (!fnode) -+ return ISCSI_ERR_NOMEM; -+ -+ n = scandir(ISCSI_FLASHNODE_DIR, &namelist, trans_filter, alphasort); -+ if (n <= 0) -+ goto free_fnode; -+ -+ for (i = 0; i < n; i++) { -+ memset(fnode, 0, sizeof(*fnode)); -+ -+ if (!strncmp(namelist[i]->d_name, "flashnode_conn", -+ strlen("flashnode_conn"))) -+ continue; -+ -+ if (sscanf(namelist[i]->d_name, ISCSI_FLASHNODE_SESS, -+ &hostno, &flashnode_idx) != 2) { -+ log_error("Invalid iscsi target dir: %s", -+ namelist[i]->d_name); -+ break; -+ } -+ -+ if (host_no != hostno) -+ continue; -+ -+ rc = iscsi_sysfs_get_flashnode_info(fnode, host_no, -+ flashnode_idx); -+ if (rc) -+ break; -+ -+ rc = fn(data, fnode, host_no, flashnode_idx); -+ if (rc != 0) -+ break; -+ (*nr_found)++; -+ } -+ -+ for (i = 0; i < n; i++) -+ free(namelist[i]); -+ free(namelist); -+ -+free_fnode: -+ free(fnode); -+ return rc; -+} -+ -+/* - * Read in iface settings based on host and session values. If - * session is not passed in, then the ifacename will not be set. And - * if the session is not passed in then iname will only be set for -diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h -index 2b15d78..d130d36 100644 ---- a/usr/iscsi_sysfs.h -+++ b/usr/iscsi_sysfs.h -@@ -31,6 +31,7 @@ struct iscsi_conn; - struct iscsi_session_operational_config; - struct iscsi_conn_operational_config; - struct iscsi_auth_config; -+struct flashnode_rec; - - #define SCSI_MAX_STATE_VALUE 32 - -@@ -42,6 +43,8 @@ extern int iscsi_sysfs_session_has_leadconn(uint32_t sid); - - typedef int (iscsi_sysfs_session_op_fn)(void *, struct session_info *); - typedef int (iscsi_sysfs_host_op_fn)(void *, struct host_info *); -+typedef int (iscsi_sysfs_flashnode_op_fn)(void *, struct flashnode_rec *, -+ uint32_t, uint32_t); - typedef int (iscsi_sysfs_iface_op_fn)(void *, struct iface_rec *); - - extern int iscsi_sysfs_for_each_iface_on_host(void *data, uint32_t host_no, -@@ -56,6 +59,20 @@ extern uint32_t iscsi_sysfs_get_host_no_from_hwinfo(struct iface_rec *iface, - int *rc); - extern uint32_t iscsi_sysfs_get_host_no_from_hwaddress(char *hwaddress, int *rc); - extern int iscsi_sysfs_get_hostinfo_by_host_no(struct host_info *hinfo); -+extern int iscsi_sysfs_for_each_flashnode(void *data, uint32_t host_no, -+ int *nr_found, -+ iscsi_sysfs_flashnode_op_fn *fn); -+extern int iscsi_sysfs_get_flashnode_info(struct flashnode_rec *fnode, -+ uint32_t host_no, -+ uint32_t flashnode_id); -+extern int iscsi_sysfs_update_flashnode_param(uint32_t host_no, -+ uint32_t flashnode_id, -+ char *name, char *val); -+extern int iscsi_sysfs_create_flashnode(uint32_t host_no, char *ipver); -+extern int iscsi_sysfs_del_flashnode(uint32_t host_no, uint32_t flashnode_id); -+extern int iscsi_sysfs_login_flashnode(uint32_t host_no, uint32_t flashnode_id); -+extern int iscsi_sysfs_logout_flashnode(uint32_t host_no, -+ uint32_t flashnode_id); - extern int iscsi_sysfs_get_sid_from_path(char *session); - extern char *iscsi_sysfs_get_blockdev_from_lun(int hostno, int target, int sid); - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 8f9de05..5a18522 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -53,6 +53,7 @@ - #include "iscsi_err.h" - #include "iscsi_ipc.h" - #include "iscsi_timer.h" -+#include "flashnode.h" - - static char program_name[] = "iscsiadm"; - static char config_file[TARGET_NAME_MAXLEN]; -@@ -67,7 +68,8 @@ enum iscsiadm_mode { - MODE_IFACE, - MODE_FW, - MODE_PING, -- MODE_CHAP -+ MODE_CHAP, -+ MODE_FLASHNODE - }; - - enum iscsiadm_op { -@@ -78,7 +80,9 @@ enum iscsiadm_op { - OP_SHOW = 0x8, - OP_NONPERSISTENT = 0x10, - OP_APPLY = 0x20, -- OP_APPLY_ALL = 0x40 -+ OP_APPLY_ALL = 0x40, -+ OP_LOGIN = 0x80, -+ OP_LOGOUT = 0x100 - }; - - static struct option const long_options[] = -@@ -111,9 +115,11 @@ static struct option const long_options[] = - {"packetsize", required_argument, NULL, 'b'}, - {"count", required_argument, NULL, 'c'}, - {"interval", required_argument, NULL, 'i'}, -+ {"flashnode_idx", optional_argument, NULL, 'x'}, -+ {"portal_type", optional_argument, NULL, 'A'}, - {NULL, 0, NULL, 0}, - }; --static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:u"; -+static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:ux:A:"; - - static void usage(int status) - { -@@ -130,7 +136,7 @@ iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,au - iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ - iscsiadm -m fw [ -l ]\n\ --iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ]\n\ -+iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] ]\n\ - iscsiadm -k priority\n"); - } - exit(status); -@@ -155,6 +161,10 @@ str_to_op(char *str) - op = OP_APPLY; - else if (!strcmp("applyall", str)) - op = OP_APPLY_ALL; -+ else if (!strcmp("login", str)) -+ op = OP_LOGIN; -+ else if (!strcmp("logout", str)) -+ op = OP_LOGOUT; - else - op = OP_NOOP; - -@@ -195,6 +205,8 @@ str_to_submode(char *str) - sub_mode = MODE_PING; - else if (!strcmp("chap", str)) - sub_mode = MODE_CHAP; -+ else if (!strcmp("flashnode", str)) -+ sub_mode = MODE_FLASHNODE; - else - sub_mode = -1; - -@@ -221,6 +233,21 @@ str_to_type(char *str) - return type; - } - -+static int -+str_to_portal_type(char *str) -+{ -+ int ptype; -+ -+ if (!strcmp("ipv4", str)) -+ ptype = IPV4; -+ else if (!strcmp("ipv6", str)) -+ ptype = IPV6; -+ else -+ ptype = -1; -+ -+ return ptype; -+} -+ - static void kill_iscsid(int priority) - { - iscsiadm_req_t req; -@@ -582,6 +609,8 @@ static int iscsi_logout_matched_portal(void *data, struct list_head *list, - { - struct node_rec *pattern_rec = data; - struct iscsi_transport *t; -+ uint32_t host_no; -+ int rc = 0; - - t = iscsi_sysfs_get_transport_by_sid(info->sid); - if (!t) -@@ -590,7 +619,19 @@ static int iscsi_logout_matched_portal(void *data, struct list_head *list, - if (!iscsi_match_session(pattern_rec, info)) - return -1; - -- return iscsi_logout_portal(info, list); -+ host_no = iscsi_sysfs_get_host_no_from_sid(info->sid, &rc); -+ if (rc) { -+ log_error("could not get host_no for session%d: %s.", -+ info->sid, iscsi_err_to_str(rc)); -+ return -1; -+ } -+ -+ if (!iscsi_sysfs_session_user_created(info->sid)) -+ rc = iscsi_logout_flashnode_sid(t, host_no, info->sid); -+ else -+ rc = iscsi_logout_portal(info, list); -+ -+ return rc; - } - - static int rec_match_fn(void *data, node_rec_t *rec) -@@ -1438,6 +1479,360 @@ static int exec_host_chap_op(int op, int info_level, uint32_t host_no, - return rc; - } - -+static int get_flashnode_info(uint32_t host_no, uint32_t flashnode_idx) -+{ -+ struct flashnode_rec fnode; -+ int rc = 0; -+ -+ memset(&fnode, 0, sizeof(fnode)); -+ rc = iscsi_sysfs_get_flashnode_info(&fnode, host_no, flashnode_idx); -+ if (rc) { -+ log_error("Could not read info for flashnode %u of host %u, %s", -+ flashnode_idx, host_no, strerror(rc)); -+ return rc; -+ } -+ -+ idbm_print_flashnode_info(&fnode); -+ return rc; -+} -+ -+static int list_flashnodes(int info_level, uint32_t host_no) -+{ -+ int rc = 0; -+ int num_found = 0; -+ -+ rc = iscsi_sysfs_for_each_flashnode(NULL, host_no, &num_found, -+ flashnode_info_print_flat); -+ -+ if (!num_found) { -+ log_error("No flashnodes attached to host %u.", host_no); -+ rc = ISCSI_ERR_NO_OBJS_FOUND; -+ } -+ -+ return rc; -+} -+ -+int iscsi_set_flashnode_params(struct iscsi_transport *t, uint32_t host_no, -+ uint32_t flashnode_idx, struct list_head *params) -+{ -+ struct flashnode_rec fnode; -+ recinfo_t *flashnode_info; -+ struct user_param *param; -+ struct iovec *iovs = NULL; -+ struct iovec *iov = NULL; -+ int fd, rc = 0; -+ int param_count = 0; -+ int param_used = 0; -+ int i; -+ -+ flashnode_info = idbm_recinfo_alloc(MAX_KEYS); -+ if (!flashnode_info) { -+ log_error("Out of Memory."); -+ rc = ISCSI_ERR_NOMEM; -+ goto free_info_rec; -+ } -+ -+ memset(&fnode, 0, sizeof(fnode)); -+ rc = iscsi_sysfs_get_flashnode_info(&fnode, host_no, flashnode_idx); -+ if (rc) { -+ log_error("Could not read info for flashnode %u, %s", -+ flashnode_idx, strerror(rc)); -+ goto free_info_rec; -+ } -+ -+ idbm_recinfo_flashnode(&fnode, flashnode_info); -+ -+ i = 0; -+ list_for_each_entry(param, params, list) { -+ param_count++; -+ rc = idbm_verify_param(flashnode_info, param->name); -+ if (rc) -+ goto free_info_rec; -+ } -+ -+ list_for_each_entry(param, params, list) { -+ rc = idbm_rec_update_param(flashnode_info, param->name, -+ param->value, 0); -+ if (rc) -+ goto free_info_rec; -+ } -+ -+ /* +2 for event and nlmsghdr */ -+ param_count += 2; -+ iovs = calloc((param_count * sizeof(struct iovec)), -+ sizeof(char)); -+ if (!iovs) { -+ log_error("Out of Memory."); -+ rc = ISCSI_ERR_NOMEM; -+ goto free_info_rec; -+ } -+ -+ /* param_used gives actual number of iovecs used for flashnode */ -+ param_used = flashnode_build_config(params, &fnode, iovs); -+ if (!param_used) { -+ log_error("Build flashnode config failed."); -+ rc = ISCSI_ERR; -+ goto free_iovec; -+ } -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ log_error("Netlink open failed."); -+ rc = ISCSI_ERR_INTERNAL; -+ goto free_iovec; -+ } -+ -+ log_info("Update flashnode %u.", flashnode_idx); -+ rc = ipc->set_flash_node_params(t->handle, host_no, flashnode_idx, -+ iovs, param_count); -+ if (rc < 0) -+ rc = ISCSI_ERR; -+ -+ -+ ipc->ctldev_close(); -+ -+free_iovec: -+ /* start at 2, because 0 is for nlmsghdr and 1 for event */ -+ iov = iovs + 2; -+ for (i = 0; i < param_used; i++, iov++) { -+ if (iov->iov_base) -+ free(iov->iov_base); -+ } -+ -+ free(iovs); -+ -+free_info_rec: -+ if (flashnode_info) -+ free(flashnode_info); -+ -+ return rc; -+} -+ -+int iscsi_new_flashnode(struct iscsi_transport *t, uint32_t host_no, char *val, -+ uint32_t *flashnode_idx) -+{ -+ int fd, rc = 0; -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ log_error("Netlink open failed."); -+ rc = ISCSI_ERR_INTERNAL; -+ goto exit_new_flashnode; -+ } -+ -+ log_info("Create new flashnode for host %u.", host_no); -+ rc = ipc->new_flash_node(t->handle, host_no, val, flashnode_idx); -+ if (rc < 0) -+ rc = ISCSI_ERR; -+ -+ ipc->ctldev_close(); -+ -+exit_new_flashnode: -+ return rc; -+} -+ -+int iscsi_del_flashnode(struct iscsi_transport *t, uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ int fd, rc = 0; -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ log_error("Netlink open failed."); -+ rc = ISCSI_ERR_INTERNAL; -+ goto exit_del_flashnode; -+ } -+ -+ log_info("Delete flashnode %u.", flashnode_idx); -+ rc = ipc->del_flash_node(t->handle, host_no, flashnode_idx); -+ if (rc < 0) -+ rc = ISCSI_ERR; -+ -+ ipc->ctldev_close(); -+ -+exit_del_flashnode: -+ return rc; -+} -+ -+int iscsi_login_flashnode(struct iscsi_transport *t, uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ int fd, rc = 0; -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ log_error("Netlink open failed."); -+ rc = ISCSI_ERR_INTERNAL; -+ goto exit_login_flashnode; -+ } -+ -+ log_info("Login to flashnode %u.", flashnode_idx); -+ rc = ipc->login_flash_node(t->handle, host_no, flashnode_idx); -+ if (rc == -EPERM) -+ rc = ISCSI_ERR_SESS_EXISTS; -+ else if (rc < 0) -+ rc = ISCSI_ERR_LOGIN; -+ -+ ipc->ctldev_close(); -+ -+exit_login_flashnode: -+ return rc; -+} -+ -+int iscsi_logout_flashnode(struct iscsi_transport *t, uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ int fd, rc = 0; -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ log_error("Netlink open failed."); -+ rc = ISCSI_ERR_INTERNAL; -+ goto exit_logout; -+ } -+ -+ log_info("Logout flashnode %u.", flashnode_idx); -+ rc = ipc->logout_flash_node(t->handle, host_no, flashnode_idx); -+ if (rc == -ESRCH) -+ rc = ISCSI_ERR_SESS_NOT_FOUND; -+ else if (rc < 0) -+ rc = ISCSI_ERR_LOGOUT; -+ -+ ipc->ctldev_close(); -+ -+exit_logout: -+ return rc; -+} -+ -+int iscsi_logout_flashnode_sid(struct iscsi_transport *t, uint32_t host_no, -+ uint32_t sid) -+{ -+ int fd, rc = 0; -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ log_error("Netlink open failed."); -+ rc = ISCSI_ERR_INTERNAL; -+ goto exit_logout_sid; -+ } -+ -+ log_info("Logout sid %u.", sid); -+ rc = ipc->logout_flash_node_sid(t->handle, host_no, sid); -+ if (rc < 0) { -+ log_error("Logout of sid %u failed.", sid); -+ rc = ISCSI_ERR_LOGOUT; -+ } else { -+ log_info("Logout of sid %u successful.", sid); -+ } -+ -+ ipc->ctldev_close(); -+ -+exit_logout_sid: -+ return rc; -+} -+ -+static int exec_flashnode_op(int op, int info_level, uint32_t host_no, -+ uint32_t flashnode_idx, int type, -+ struct list_head *params) -+{ -+ struct iscsi_transport *t = NULL; -+ int rc = ISCSI_SUCCESS; -+ char *portal_type; -+ -+ if (op != OP_SHOW && op != OP_NOOP && op != OP_NEW && -+ flashnode_idx == 0xffffffff) { -+ log_error("Invalid flashnode index"); -+ rc = ISCSI_ERR_INVAL; -+ goto exit_flashnode_op; -+ } -+ -+ t = iscsi_sysfs_get_transport_by_hba(host_no); -+ if (!t) { -+ log_error("Could not match hostno %u to transport.", host_no); -+ rc = ISCSI_ERR_TRANS_NOT_FOUND; -+ goto exit_flashnode_op; -+ } -+ -+ switch (op) { -+ case OP_NOOP: -+ case OP_SHOW: -+ if (flashnode_idx == 0xffffffff) -+ rc = list_flashnodes(info_level, host_no); -+ else -+ rc = get_flashnode_info(host_no, flashnode_idx); -+ break; -+ case OP_NEW: -+ if (type == IPV4) { -+ portal_type = "ipv4"; -+ } else if (type == IPV6) { -+ portal_type = "ipv6"; -+ } else { -+ log_error("Invalid type mentioned for flashnode"); -+ rc = ISCSI_ERR_INVAL; -+ goto exit_flashnode_op; -+ } -+ rc = iscsi_new_flashnode(t, host_no, portal_type, -+ &flashnode_idx); -+ if (!rc) -+ log_info("New flashnode for host %u added at index %u.", -+ host_no, flashnode_idx); -+ else -+ log_error("Creation of flashnode for host %u failed.", -+ host_no); -+ break; -+ case OP_DELETE: -+ rc = iscsi_del_flashnode(t, host_no, flashnode_idx); -+ if (!rc) -+ log_info("Flashnode %u of host %u deleted.", -+ flashnode_idx, host_no); -+ else -+ log_error("Deletion of flashnode %u of host %u failed.", -+ flashnode_idx, host_no); -+ break; -+ case OP_UPDATE: -+ rc = iscsi_set_flashnode_params(t, host_no, flashnode_idx, -+ params); -+ if (!rc) -+ log_info("Update for flashnode %u of host %u successful.", -+ flashnode_idx, host_no); -+ else -+ log_error("Update for flashnode %u of host %u failed.", -+ flashnode_idx, host_no); -+ break; -+ case OP_LOGIN: -+ rc = iscsi_login_flashnode(t, host_no, flashnode_idx); -+ if (!rc) -+ log_info("Login to flashnode %u of host %u successful.", -+ flashnode_idx, host_no); -+ else if (rc == ISCSI_ERR_SESS_EXISTS) -+ log_info("Flashnode %u of host %u already logged in.", -+ flashnode_idx, host_no); -+ else -+ log_error("Login to flashnode %u of host %u failed.", -+ flashnode_idx, host_no); -+ break; -+ case OP_LOGOUT: -+ rc = iscsi_logout_flashnode(t, host_no, flashnode_idx); -+ if (!rc) -+ log_info("Logout of flashnode %u of host %u successful.", -+ flashnode_idx, host_no); -+ else if (rc == ISCSI_ERR_SESS_NOT_FOUND) -+ log_info("Flashnode %u of host %u not logged in.", -+ flashnode_idx, host_no); -+ else -+ log_error("Logout of flashnode %u of host %u failed.", -+ flashnode_idx, host_no); -+ break; -+ default: -+ log_error("Invalid operation"); -+ rc = ISCSI_ERR_INVAL; -+ break; -+ } -+ -+exit_flashnode_op: -+ return rc; -+} -+ - static int verify_iface_params(struct list_head *params, struct node_rec *rec) - { - struct user_param *param; -@@ -2403,6 +2798,7 @@ main(int argc, char **argv) - int tpgt = PORTAL_GROUP_TAG_UNKNOWN, killiscsid=-1, do_show=0; - int packet_size=32, ping_count=1, ping_interval=0; - int do_discover = 0, sub_mode = -1; -+ int flashnode_idx = -1, portal_type = -1; - struct sigaction sa_old; - struct sigaction sa_new; - struct list_head ifaces; -@@ -2551,11 +2947,19 @@ main(int argc, char **argv) - printf("%s version %s\n", program_name, - ISCSI_VERSION_STR); - return 0; -+ case 'x': -+ flashnode_idx = atoi(optarg); -+ break; -+ case 'A': -+ portal_type = str_to_portal_type(optarg); -+ break; - case 'h': - usage(0); - } - -- if (name && value) { -+ if ((mode == MODE_IFACE || -+ (mode == MODE_HOST && sub_mode == MODE_FLASHNODE)) && -+ name && value) { - param = idbm_alloc_user_param(name, value); - if (!param) { - log_error("Cannot allocate memory for params."); -@@ -2603,7 +3007,7 @@ main(int argc, char **argv) - - switch (mode) { - case MODE_HOST: -- if ((rc = verify_mode_params(argc, argv, "CHdmPov", 0))) { -+ if ((rc = verify_mode_params(argc, argv, "CHdmPotnvxA", 0))) { - log_error("host mode: option '-%c' is not " - "allowed/supported", rc); - rc = ISCSI_ERR_INVAL; -@@ -2621,6 +3025,17 @@ main(int argc, char **argv) - rc = exec_host_chap_op(op, info_level, host_no, - value); - break; -+ case MODE_FLASHNODE: -+ if (!host_no) { -+ log_error("FLASHNODE mode requires host no"); -+ rc = ISCSI_ERR_INVAL; -+ break; -+ } -+ -+ rc = exec_flashnode_op(op, info_level, host_no, -+ flashnode_idx, -+ portal_type, ¶ms); -+ break; - default: - log_error("Invalid Sub Mode"); - break; -diff --git a/usr/netlink.c b/usr/netlink.c -index c43f686..c07fe3c 100644 ---- a/usr/netlink.c -+++ b/usr/netlink.c -@@ -1252,6 +1252,169 @@ static int kdelete_chap(uint64_t transport_handle, uint32_t host_no, - return rc; - } - -+static int -+kset_flashnode_params(uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx, struct iovec *iovs, -+ uint32_t param_count) -+{ -+ struct iscsi_uevent ev; -+ int rc, ev_len; -+ struct iovec *iov = iovs + 1; -+ -+ log_debug(8, "in %s", __FUNCTION__); -+ -+ ev_len = sizeof(ev); -+ ev.type = ISCSI_UEVENT_SET_FLASHNODE_PARAMS; -+ ev.transport_handle = transport_handle; -+ ev.u.set_flashnode.host_no = host_no; -+ ev.u.set_flashnode.flashnode_idx = flashnode_idx; -+ /* first two iovs for nlmsg hdr and ev */ -+ ev.u.set_flashnode.count = param_count - 2; -+ -+ iov->iov_base = &ev; -+ iov->iov_len = ev_len; -+ rc = __kipc_call(iovs, param_count); -+ if (rc < 0) -+ return rc; -+ -+ return 0; -+} -+ -+static int -+knew_flashnode(uint64_t transport_handle, uint32_t host_no, void *value, -+ uint32_t *flashnode_idx) -+{ -+ struct iscsi_uevent *ev; -+ char *param_str; -+ int rc, len; -+ struct iovec iov[2]; -+ -+ log_debug(7, "in %s", __FUNCTION__); -+ -+ memset(setparam_buf, 0, NLM_SETPARAM_DEFAULT_MAX); -+ ev = (struct iscsi_uevent *)setparam_buf; -+ ev->type = ISCSI_UEVENT_NEW_FLASHNODE; -+ ev->transport_handle = transport_handle; -+ ev->u.new_flashnode.host_no = host_no; -+ -+ param_str = setparam_buf + sizeof(*ev); -+ if (!strlen(value)) -+ return 0; -+ sprintf(param_str, "%s", (char *)value); -+ len = strlen(param_str) + 1; -+ ev->u.new_flashnode.len = len; -+ -+ -+ iov[1].iov_base = ev; -+ iov[1].iov_len = sizeof(*ev) + len; -+ rc = __kipc_call(iov, 2); -+ if (rc < 0) -+ return rc; -+ -+ *flashnode_idx = ev->r.new_flashnode_ret.flashnode_idx; -+ return 0; -+} -+ -+static int -+kdel_flashnode(uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ struct iscsi_uevent ev; -+ int rc; -+ struct iovec iov[2]; -+ -+ log_debug(7, "in %s", __FUNCTION__); -+ -+ memset(&ev, 0, sizeof(struct iscsi_uevent)); -+ ev.type = ISCSI_UEVENT_DEL_FLASHNODE; -+ ev.transport_handle = transport_handle; -+ ev.u.del_flashnode.host_no = host_no; -+ ev.u.del_flashnode.flashnode_idx = flashnode_idx; -+ -+ iov[1].iov_base = &ev; -+ iov[1].iov_len = sizeof(ev); -+ rc = __kipc_call(iov, 2); -+ if (rc < 0) -+ return rc; -+ -+ return 0; -+} -+ -+static int -+klogin_flashnode(uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ struct iscsi_uevent ev; -+ int rc; -+ struct iovec iov[2]; -+ -+ log_debug(7, "in %s", __FUNCTION__); -+ -+ memset(&ev, 0, sizeof(struct iscsi_uevent)); -+ ev.type = ISCSI_UEVENT_LOGIN_FLASHNODE; -+ ev.transport_handle = transport_handle; -+ ev.u.login_flashnode.host_no = host_no; -+ ev.u.login_flashnode.flashnode_idx = flashnode_idx; -+ -+ iov[1].iov_base = &ev; -+ iov[1].iov_len = sizeof(ev); -+ rc = __kipc_call(iov, 2); -+ if (rc < 0) -+ return rc; -+ -+ return 0; -+} -+ -+static int -+klogout_flashnode(uint64_t transport_handle, uint32_t host_no, -+ uint32_t flashnode_idx) -+{ -+ struct iscsi_uevent ev; -+ int rc; -+ struct iovec iov[2]; -+ -+ log_debug(7, "in %s", __FUNCTION__); -+ -+ memset(&ev, 0, sizeof(struct iscsi_uevent)); -+ ev.type = ISCSI_UEVENT_LOGOUT_FLASHNODE; -+ ev.transport_handle = transport_handle; -+ ev.u.logout_flashnode.host_no = host_no; -+ ev.u.logout_flashnode.flashnode_idx = flashnode_idx; -+ -+ iov[1].iov_base = &ev; -+ iov[1].iov_len = sizeof(ev); -+ rc = __kipc_call(iov, 2); -+ if (rc < 0) -+ return rc; -+ -+ return 0; -+} -+ -+static int -+klogout_flashnode_sid(uint64_t transport_handle, uint32_t host_no, -+ uint32_t sid) -+{ -+ struct iscsi_uevent ev; -+ int rc; -+ struct iovec iov[2]; -+ -+ log_debug(7, "in %s", __FUNCTION__); -+ -+ memset(&ev, 0, sizeof(struct iscsi_uevent)); -+ ev.type = ISCSI_UEVENT_LOGOUT_FLASHNODE_SID; -+ ev.transport_handle = transport_handle; -+ ev.u.logout_flashnode_sid.host_no = host_no; -+ ev.u.logout_flashnode_sid.sid = sid; -+ -+ iov[1].iov_base = &ev; -+ iov[1].iov_len = sizeof(ev); -+ rc = __kipc_call(iov, 2); -+ if (rc < 0) -+ return rc; -+ -+ return 0; -+} -+ - static void drop_data(struct nlmsghdr *nlh) - { - int ev_size; -@@ -1296,10 +1459,10 @@ static int ctldev_handle(void) - ev->r.c_session_ret.sid); - return 0; - case ISCSI_KEVENT_DESTROY_SESSION: -+ drop_data(nlh); - if (!ipc_ev_clbk) - return 0; - -- drop_data(nlh); - if (ipc_ev_clbk->destroy_session) - ipc_ev_clbk->destroy_session(ev->r.d_session.host_no, - ev->r.d_session.sid); -@@ -1543,6 +1706,12 @@ struct iscsi_ipc nl_ipc = { - .exec_ping = kexec_ping, - .get_chap = kget_chap, - .delete_chap = kdelete_chap, -+ .set_flash_node_params = kset_flashnode_params, -+ .new_flash_node = knew_flashnode, -+ .del_flash_node = kdel_flashnode, -+ .login_flash_node = klogin_flashnode, -+ .logout_flash_node = klogout_flashnode, -+ .logout_flash_node_sid = klogout_flashnode_sid, - }; - struct iscsi_ipc *ipc = &nl_ipc; - --- -1.8.1.4 - diff --git a/0015-Manpage-changes-for-flashnode-submode-support-for-ho.patch b/0015-Manpage-changes-for-flashnode-submode-support-for-ho.patch deleted file mode 100644 index 700b4e8..0000000 --- a/0015-Manpage-changes-for-flashnode-submode-support-for-ho.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 28336bc000520e89670ce29360697a71a42b5e24 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 22 Mar 2013 07:35:52 -0400 -Subject: Manpage changes for flashnode submode support for host mode. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - doc/iscsiadm.8 | 35 +++++++++++++++++++++++++++++++---- - 1 file changed, 31 insertions(+), 4 deletions(-) - -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index 7c209f6..b4c7388 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -16,7 +16,7 @@ iscsiadm \- open-iscsi administration utility - - \fBiscsiadm\fR \-m fw [\-l] - --\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] -+\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-o operation ] [ \-v chap_tbl_idx ] ] | [ \-C flashnode [ \-o operation ] [ \-A portal_type ] [ \-x flashnode_idx ] [ \-n name ] [ \-v value ] ] ] - - \fBiscsiadm\fR \-k priority - -@@ -47,6 +47,12 @@ daemon (iscsid) be running. - This option is only valid for ping submode. - - .TP -+\fB\-A\fR, \fB\-\-portal_type=\fI[ipv4|ipv6]\fR -+Specify the portal type for the new flash node entry to be created. -+.IP -+This option is only valid for flashnode submode of host mode and only with \fInew\fR operation. -+ -+.TP - \fB\-b\fR, \fB\-\-packetsize=\fIpacketsize\fP - Specify the ping \fIpacketsize\fR. - -@@ -66,6 +72,12 @@ Currently iscsiadm support ping as submode for iface. For example, - - iscsiadm -m iface -I ifacename -C ping -a ipaddr -b packetsize -c count -i interval - -+For host, it supports chap and flashnode as submodes. For example, -+ -+iscsiadm -m host -H hostno -C chap -v chap_tbl_idx -o operation -+ -+iscsiadm -m host -H hostno -C flashnode -x flashnode_idx -o operation -+ - .TP - \fB\-d\fR, \fB\-\-debug=\fIdebug_level\fP - print debugging information. Valid values for debug_level are 0 to 8. -@@ -170,8 +182,9 @@ for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. - - .TP - \fB\-n\fR, \fB\-\-name=\fIname\fR --Specify a field \fIname\fR in a record. For use with the \fIupdate\fR --operator. -+In node mode, specify a field \fIname\fR in a record. In flashnode submode of host mode, specify name of the flash node parameter. -+ -+For use with the \fIupdate\fR operator. - .IP - - .TP -@@ -181,6 +194,8 @@ Specifies a database operator \fIop\fR. \fIop\fR must be one of - .IP - For iface mode, \fIapply\fR and \fIapplyall\fR are also applicable. - .IP -+For flashnode submode of host mode, \fIlogin\fR and \fIlogout\fR are also applicable. -+.IP - This option is valid for all modes except fw. Delete should not be used on a running session. If it is iscsiadm will stop the session and then delete the - record. - .IP -@@ -210,6 +225,12 @@ sid is passed in. - .IP - \fIapplyall\fR will cause the network settings to take effect on all the ifaces whose MAC address or host number matches that of the specific host. - -+.IP -+\fIlogin\fR will log into the specified flash node entry. -+ -+.IP -+\fIlogout\fR does the logout from the given flash node entry. -+ - .TP - \fB\-p\fR, \fB\-\-portal=\fIip[:port]\fR - Use target portal with ip-address \fIip\fR and \fIport\fR. If port is not passed -@@ -292,12 +313,18 @@ for session mode). - \fB\-v\fR, \fB\-\-value=\fIvalue\fR - Specify a \fIvalue\fR for use with the \fIupdate\fR operator. - .IP --This option is only valid for node mode. -+This option is only valid for node mode and flashnode submode of host mode. - - .TP - \fB\-V\fR, \fB\-\-version\fR - display version and exit - -+.TP -+\fB\-x\fR, \fB\-\-flashnode_idx=\fIindex\fR -+Specify the \fIindex\fR of the flash node to operate on. -+.IP -+This option is only valid for flashnode submode of host mode. -+ - .SH DISCOVERY TYPES - iSCSI defines 3 discovery types: SendTargets, SLP, and iSNS. - --- -1.8.1.4 - diff --git a/0015-start-socket-listeners-on-iscsiadm-command.patch b/0015-start-socket-listeners-on-iscsiadm-command.patch new file mode 100644 index 0000000..4535fae --- /dev/null +++ b/0015-start-socket-listeners-on-iscsiadm-command.patch @@ -0,0 +1,28 @@ +From c285ea2f418f0dcba8526966c68610dc1f34edbb Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 25 Nov 2013 22:28:12 -0800 +Subject: [PATCH] start socket listeners on iscsiadm command + +fix for trying to run iscsiadm commands right after installing the rpm +without manually starting the systemd units +--- + etc/iscsid.conf | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/etc/iscsid.conf b/etc/iscsid.conf +index db395df..16c00f0 100644 +--- a/etc/iscsid.conf ++++ b/etc/iscsid.conf +@@ -17,7 +17,8 @@ + # maintainers. + # + # Default for Fedora and RHEL. (uncomment to activate). +-#iscsid.startup = /bin/systemctl start iscsid.service ++# Use socket activation, but try to make sure the socket units are listening ++iscsid.startup = /bin/systemctl start iscsid.socket iscsiuio.socket + # + # Default for upstream open-iscsi scripts (uncomment to activate). + # iscsid.startup = /sbin/iscsid +-- +2.1.0 + diff --git a/0016-README-changes-for-flashnode-submode-support-for-hos.patch b/0016-README-changes-for-flashnode-submode-support-for-hos.patch deleted file mode 100644 index 237f4b8..0000000 --- a/0016-README-changes-for-flashnode-submode-support-for-hos.patch +++ /dev/null @@ -1,105 +0,0 @@ -From 65998ba3f2413069aa2242645712969d62d9c140 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 22 Mar 2013 07:35:53 -0400 -Subject: README changes for flashnode submode support for host mode. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - README | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 73 insertions(+) - -diff --git a/README b/README -index ec22098..29b00a9 100644 ---- a/README -+++ b/README -@@ -406,6 +406,29 @@ Usage: iscsiadm [OPTION] - is connected to. - 3 = Print iscsi params used. - 4 = Print SCSI info like LUNs, device state. -+ -m host --host=hostno|MAC -C flashnode -+ Display list of all the targets in adapter's -+ flash (flash node), for the specified host, -+ with ip, port, tpgt and iqn. -+ -m host --host=hostno|MAC -C flashnode --op=[NEW] --portal_type=[ipv4|ipv6] -+ Create new flash node entry for the given host of the -+ specified portal_type. This returns the index of the -+ newly created entry on success. -+ -m host --host=hostno|MAC -C flashnode --flashnode_idx=[flashnode index] \ -+ --op=[UPDATE] --name=[name] --value=[value] -+ Update the params of the speficied flash node. -+ The [name] and [value] pairs must be provided for the -+ params that need to be updated. Multiple params can -+ be updated using a single command. -+ -m host --host=hostno|MAC -C flashnode--flashnode_idx=[flashnode index] \ -+ --op=[SHOW | DELETE | LOGIN | LOGOUT] -+ op=DELETE|LOGIN|LOGOUT will perform deletion/login/ -+ logout operation on the specified flash node. -+ -+ op=SHOW will list all params with the values for the -+ specified flash node. This is the default operation. -+ -+ See the iscsiadm example section for more info. - -d, --debug debuglevel print debugging information - -V, --version display version and exit - -h, --help display this help and exit -@@ -960,6 +983,56 @@ To now log into targets it is the same as with sofware iscsi. See section - - ./iscsiadm -m session -P 1 - -+ -+ Host mode with flashnode submode: -+ -+ - Display list of flash nodes for a host -+ -+ ./iscsiadm -m host -H 6 -C flashnode -+ -+ This will print list of all the flash node entries for the given host 6 -+ along with their ip, port, tpgt and iqn values. -+ -+ - Display all parameters of a flash node entry for a host -+ -+ ./iscsiadm -m host -H 6 -C flashnode -x 0 -+ -+ This will list all the parameter name,value pairs for flash node entry at -+ index 0 of host 6. -+ -+ - Add a new flash node entry for a host -+ -+ ./iscsiadm -m host -H 6 -C flashnode -o new -A ipv4 -+ or -+ ./iscsiadm -m host -H 6 -C flashnode -o new -A ipv6 -+ -+ This will add new flash node entry for the given host 6 with portal -+ type of either ipv4 or ipv6. The new operation returns the index of -+ the newly created flash node entry. -+ -+ - Update a flashnode entry -+ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o update \ -+ -n flashnode.conn[0].ipaddress -v 192.168.1.12 \ -+ -n flashnode.session.targetname \ -+ -v iqn.2002-03.com.compellent:5000d310004b0716 -+ -+ This will update the values of ipaddress and targetname params of -+ flash node entry at index 1 of host 6. -+ -+ - Login to a flash node entry -+ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o login -+ -+ - Logout from a flash node entry -+ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o logout -+ or -+ ./iscsiadm -m session -r $sid -u -+ -+ Logout can be performed either using the flash node index or using the -+ corresponding session index. -+ -+ - Delete a flash node entry -+ ./iscsiadm -m host -H 6 -C flashnode -x 1 -o delete -+ - 6. Configuration - ================ - --- -1.8.1.4 - diff --git a/0016-Revert-iscsiadm-return-error-when-login-fails.patch b/0016-Revert-iscsiadm-return-error-when-login-fails.patch new file mode 100644 index 0000000..54734fc --- /dev/null +++ b/0016-Revert-iscsiadm-return-error-when-login-fails.patch @@ -0,0 +1,34 @@ +From 55764ecafcc1df70111cbcb9643a77182b53a8e7 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 24 Feb 2014 09:33:33 -0800 +Subject: [PATCH] Revert "iscsiadm: return error when login fails" + +This reverts commit fc2a8e9a2911bc76f961fe3e4a159fab9b8b9691. + +Done to address RHBZ #1015563 +--- + usr/session_mgmt.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/usr/session_mgmt.c b/usr/session_mgmt.c +index 87b8e00..3815b1d 100644 +--- a/usr/session_mgmt.c ++++ b/usr/session_mgmt.c +@@ -178,12 +178,12 @@ int iscsi_login_portal(void *data, struct list_head *list, struct node_rec *rec) + goto done; + } + if (session_count >= rec->session.nr_sessions) { +- log_warning("%s: %d session%s requested, but %d " ++ log_debug(1, "%s: %d session%s requested, but %d " + "already present.", + rec->iface.name, rec->session.nr_sessions, + rec->session.nr_sessions == 1 ? "" : "s", + session_count); +- rc = ISCSI_ERR_SESS_EXISTS; ++ rc = 0; + goto done; + } + +-- +2.1.0 + diff --git a/0017-PATCH-1-of-1-correctly-check-return-value-of-nice.patch b/0017-PATCH-1-of-1-correctly-check-return-value-of-nice.patch deleted file mode 100644 index 4103d95..0000000 --- a/0017-PATCH-1-of-1-correctly-check-return-value-of-nice.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 8d3e9e5c3e1813b372f84d3bcca08bbe479f7f63 Mon Sep 17 00:00:00 2001 -From: Lee Duncan -Date: Tue, 21 May 2013 14:16:38 -0700 -Subject: PATCH 1 of 1] correctly check return value of nice() - -The nice() call can return a negative value, since -it returns the previous nice value. - -Signed-off-by: Lee Duncan ---- - usr/iscsi_util.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/usr/iscsi_util.c b/usr/iscsi_util.c -index 5e3420e..ac86847 100644 ---- a/usr/iscsi_util.c -+++ b/usr/iscsi_util.c -@@ -60,7 +60,8 @@ int oom_adjust(void) - char path[ISCSI_OOM_PATH_LEN]; - struct stat statb; - -- if (nice(-10) < 0) -+ errno = 0; -+ if (nice(-10) == -1 && errno != 0) - log_debug(1, "Could not increase process priority: %s", - strerror(errno)); - --- -1.8.1.4 - diff --git a/0017-update-handling-of-boot-sessions.patch b/0017-update-handling-of-boot-sessions.patch new file mode 100644 index 0000000..1b2d381 --- /dev/null +++ b/0017-update-handling-of-boot-sessions.patch @@ -0,0 +1,55 @@ +From 6ee8a34d108d8d3663da057cad210372e80cb65c Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 26 Feb 2014 16:33:48 -0800 +Subject: [PATCH] update handling of boot sessions + +force start iscsiuio if needed, socket activation does not seem to be +working for recovery +--- + etc/systemd/iscsi-mark-root-nodes | 29 +++++++++++++++++++++++------ + 1 file changed, 23 insertions(+), 6 deletions(-) + +diff --git a/etc/systemd/iscsi-mark-root-nodes b/etc/systemd/iscsi-mark-root-nodes +index 157be62..60dcd70 100644 +--- a/etc/systemd/iscsi-mark-root-nodes ++++ b/etc/systemd/iscsi-mark-root-nodes +@@ -1,13 +1,30 @@ + #!/bin/bash + + ISCSIADM=/sbin/iscsiadm ++start_iscsid=0 ++start_iscsiuio=0 + +-$ISCSIADM -m session >/dev/null 2>&1 || exit 0 ++while read t num p target flash; do ++ # strip tag number from portal, keep "ip:port" ++ portal=${p%,*} ++ transport=${t%:} + +-$ISCSIADM -m session | while read t num i target; do +- ip=${i%:*} +- $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot +-done ++ $ISCSIADM -m node -p $portal -T $target -o update -n node.startup -v onboot + +-systemctl start iscsid.service ++ start_iscsid=1 ++ ++ if [ "$transport" = bnx2i ]; then ++ start_iscsiuio=1 ++ fi ++done < <( $ISCSIADM -m session ) ++ ++# force iscsid and iscsiuio to start if needed for ++# recovering sessions created in the initrd ++ ++if [ "$start_iscsid" -eq 1 ]; then ++ systemctl --no-block start iscsid.service ++fi ++if [ "$start_iscsiuio" -eq 1 ]; then ++ systemctl --no-block start iscsiuio.service ++fi + +-- +2.1.0 + diff --git a/0018-Allow-firmware-mode-to-use-debug-flag.patch b/0018-Allow-firmware-mode-to-use-debug-flag.patch deleted file mode 100644 index d2fa5e3..0000000 --- a/0018-Allow-firmware-mode-to-use-debug-flag.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 7a5cd01731e0eb86960cc4fa543136b7e3a86e1e Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Mon, 13 May 2013 03:19:54 -0500 -Subject: Allow firmware mode to use debug flag - -From Lee Duncan: - -When iscsiadm is called with "-m fw", the debug flag can be -useful. - -Signed-off-by: Hannes Reinecke -Signed-off-by: Lee Duncan ---- - doc/iscsiadm.8 | 2 +- - usr/iscsiadm.c | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index b4c7388..6b15fcd 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -14,7 +14,7 @@ iscsiadm \- open-iscsi administration utility - - \fBiscsiadm\fR \-m iface [ \-hV ] [ \-d debug_level ] [ \-P printlevel ] [ \-I ifacename | \-H hostno|MAC ] [ [ \-o operation ] [ \-n name ] [ \-v value ] ] [ \-C ping [ \-a ip ] [ \-b packetsize ] [ \-c count ] [ \-i interval ] ] - --\fBiscsiadm\fR \-m fw [\-l] -+\fBiscsiadm\fR \-m fw [ \-d debug_level ] [\-l] - - \fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-o operation ] [ \-v chap_tbl_idx ] ] | [ \-C flashnode [ \-o operation ] [ \-A portal_type ] [ \-x flashnode_idx ] [ \-n name ] [ \-v value ] ] ] - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 5a18522..df76df9 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -135,7 +135,7 @@ iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,au - [ [ -o operation ] [ -n name ] [ -v value ] ]\n\ - iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ --iscsiadm -m fw [ -l ]\n\ -+iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ - iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] ]\n\ - iscsiadm -k priority\n"); - } -@@ -2987,7 +2987,7 @@ main(int argc, char **argv) - usage(ISCSI_ERR_INVAL); - - if (mode == MODE_FW) { -- if ((rc = verify_mode_params(argc, argv, "ml", 0))) { -+ if ((rc = verify_mode_params(argc, argv, "dml", 0))) { - log_error("fw mode: option '-%c' is not " - "allowed/supported", rc); - rc = ISCSI_ERR_INVAL; --- -1.8.1.4 - diff --git a/0018-update-iscsi.service-for-boot-session-recovery.patch b/0018-update-iscsi.service-for-boot-session-recovery.patch new file mode 100644 index 0000000..66043d2 --- /dev/null +++ b/0018-update-iscsi.service-for-boot-session-recovery.patch @@ -0,0 +1,34 @@ +From 3e2bcef50b2b0a68f4ae9fb32a1cb67189b7a203 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Fri, 14 Mar 2014 09:22:21 -0700 +Subject: [PATCH] update iscsi.service for boot session recovery + +--- + etc/systemd/iscsi.service | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +index d5712bd..3de76c5 100644 +--- a/etc/systemd/iscsi.service ++++ b/etc/systemd/iscsi.service +@@ -5,14 +5,15 @@ DefaultDependencies=no + Conflicts=shutdown.target + After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service + Before=remote-fs-pre.target +-ConditionDirectoryNotEmpty=/var/lib/iscsi/nodes ++ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes ++ConditionDirectoryNotEmpty=|/sys/class/iscsi_session + + [Service] + Type=oneshot + RemainAfterExit=true + ExecStart=/usr/libexec/iscsi-mark-root-nodes ++SuccessExitStatus=21 + ExecStart=/sbin/iscsiadm -m node --loginall=automatic +-ExecStop=/bin/sync + ExecStop=/sbin/iscsiadm -m node --logoutall=automatic + ExecReload=/sbin/iscsiadm -m node --loginall=automatic + +-- +2.1.0 + diff --git a/0019-iscsiadm-return-error-when-login-fails.patch b/0019-iscsiadm-return-error-when-login-fails.patch deleted file mode 100644 index 75f01b9..0000000 --- a/0019-iscsiadm-return-error-when-login-fails.patch +++ /dev/null @@ -1,37 +0,0 @@ -From f1994bc91688889e4b7ffbca687739023f2a815b Mon Sep 17 00:00:00 2001 -From: Lee Duncan -Date: Fri, 8 Mar 2013 11:11:13 -0800 -Subject: iscsiadm: return error when login fails - -When login fails because there are too many sessions we should be -returning an error code so that userland is aware that something -is amiss. - -Signed-off-by: Hannes Reinecke -Signed-off-by: Lee Duncan ---- - usr/session_mgmt.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/usr/session_mgmt.c b/usr/session_mgmt.c -index ec1f43a..0b7373f 100644 ---- a/usr/session_mgmt.c -+++ b/usr/session_mgmt.c -@@ -178,12 +178,12 @@ int iscsi_login_portal(void *data, struct list_head *list, struct node_rec *rec) - goto done; - } - if (session_count >= rec->session.nr_sessions) { -- log_debug(1, "%s: %d session%s requested, but %d " -+ log_warning("%s: %d session%s requested, but %d " - "already present.", - rec->iface.name, rec->session.nr_sessions, - rec->session.nr_sessions == 1 ? "" : "s", - session_count); -- rc = 0; -+ rc = ISCSI_ERR_SESS_EXISTS; - goto done; - } - --- -1.8.1.4 - diff --git a/0019-updates-to-iscsi.service.patch b/0019-updates-to-iscsi.service.patch new file mode 100644 index 0000000..85e9e3d --- /dev/null +++ b/0019-updates-to-iscsi.service.patch @@ -0,0 +1,41 @@ +From 275312e70e0b076532af25fe93c05bbbd15a2295 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 17 Sep 2014 09:58:39 -0700 +Subject: [PATCH] updates to iscsi.service + +Resolves: #1126524 +Resolves: #1111925 +--- + etc/systemd/iscsi.service | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +index 3de76c5..ad7be34 100644 +--- a/etc/systemd/iscsi.service ++++ b/etc/systemd/iscsi.service +@@ -5,17 +5,17 @@ DefaultDependencies=no + Conflicts=shutdown.target + After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service + Before=remote-fs-pre.target ++Wants=remote-fs-pre.target + ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes + ConditionDirectoryNotEmpty=|/sys/class/iscsi_session + + [Service] + Type=oneshot + RemainAfterExit=true +-ExecStart=/usr/libexec/iscsi-mark-root-nodes +-SuccessExitStatus=21 +-ExecStart=/sbin/iscsiadm -m node --loginall=automatic +-ExecStop=/sbin/iscsiadm -m node --logoutall=automatic +-ExecReload=/sbin/iscsiadm -m node --loginall=automatic ++ExecStart=-/usr/libexec/iscsi-mark-root-nodes ++ExecStart=-/sbin/iscsiadm -m node --loginall=automatic ++ExecStop=-/sbin/iscsiadm -m node --logoutall=automatic ++ExecReload=-/sbin/iscsiadm -m node --loginall=automatic + + [Install] + WantedBy=sysinit.target +-- +2.1.0 + diff --git a/0020-iscsiadm-bind-ifaces-to-portals-found-using-isns.patch b/0020-iscsiadm-bind-ifaces-to-portals-found-using-isns.patch deleted file mode 100644 index 3b54364..0000000 --- a/0020-iscsiadm-bind-ifaces-to-portals-found-using-isns.patch +++ /dev/null @@ -1,217 +0,0 @@ -From 2991867601094b39ca1cf7e14d8eefecda14ffb7 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Tue, 22 Jan 2013 10:44:27 -0700 -Subject: iscsiadm: bind ifaces to portals found using isns - -Bug and patch from Jayamohan Kallickal at Emulex. - -This adds support to be able to use isns discovery and -bind the portals found to offload ifaces. Note that -this does not do iSNS through the offload card. It -uses a normal net connection but portals that are found -will be setup to login using the offload card. - -The problem with the previous code was that isns -discovery code was not reading in the iface info before -binding, so the resulting setup was not binding the offload -card to the record. - -[Minor cleanup of patch by Mike Christie] -Signed-off-by: Mike Christie ---- - usr/iscsiadm.c | 127 ++++++++++++++++++++++++++++++--------------------------- - 1 file changed, 66 insertions(+), 61 deletions(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index df76df9..efe6383 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -1133,17 +1133,55 @@ do_software_sendtargets(discovery_rec_t *drec, struct list_head *ifaces, - return rc; - } - -+static int do_isns(discovery_rec_t *drec, struct list_head *ifaces, -+ int info_level, int do_login, int op) -+{ -+ struct list_head rec_list; -+ struct node_rec *rec, *tmp; -+ int rc; -+ -+ INIT_LIST_HEAD(&rec_list); -+ /* -+ * compat: if the user did not pass any op then we do all -+ * ops for them -+ */ -+ if (!op) -+ op = OP_NEW | OP_DELETE | OP_UPDATE; -+ -+ -+ rc = idbm_bind_ifaces_to_nodes(discovery_isns, drec, ifaces, -+ &rec_list); -+ if (rc) { -+ log_error("Could not perform iSNS discovery: %s", -+ iscsi_err_to_str(rc)); -+ return rc; -+ } else if (list_empty(&rec_list)) { -+ log_error("No portals found"); -+ return ISCSI_ERR_NO_OBJS_FOUND; -+ } -+ -+ rc = exec_disc_op_on_recs(drec, &rec_list, info_level, do_login, op); -+ -+ list_for_each_entry_safe(rec, tmp, &rec_list, list) { -+ list_del(&rec->list); -+ free(rec); -+ } -+ -+ return rc; -+} -+ - static int --do_sendtargets(discovery_rec_t *drec, struct list_head *ifaces, -- int info_level, int do_login, int op, int sync_drec) -+do_target_discovery(discovery_rec_t *drec, struct list_head *ifaces, -+ int info_level, int do_login, int op, int sync_drec) - { -+ - struct iface_rec *tmp, *iface; - int rc, host_no; - struct iscsi_transport *t; - - if (list_empty(ifaces)) { - ifaces = NULL; -- goto sw_st; -+ goto sw_discovery; - } - - /* we allow users to mix hw and sw iscsi so we have to sort it out */ -@@ -1177,59 +1215,30 @@ do_sendtargets(discovery_rec_t *drec, struct list_head *ifaces, - continue; - } - -- if (t->caps & CAP_SENDTARGETS_OFFLOAD) { -- do_offload_sendtargets(drec, host_no, do_login); -- list_del(&iface->list); -- free(iface); -- } -+ if (drec->type == DISCOVERY_TYPE_SENDTARGETS) -+ if (t->caps & CAP_SENDTARGETS_OFFLOAD) { -+ do_offload_sendtargets(drec, host_no, do_login); -+ list_del(&iface->list); -+ free(iface); -+ } - } - - if (list_empty(ifaces)) - return ISCSI_ERR_NO_OBJS_FOUND; - --sw_st: -- return do_software_sendtargets(drec, ifaces, info_level, do_login, -- op, sync_drec); --} -- --static int do_isns(discovery_rec_t *drec, struct list_head *ifaces, -- int info_level, int do_login, int op) --{ -- struct list_head rec_list; -- struct node_rec *rec, *tmp; -- int rc; -- -- INIT_LIST_HEAD(&rec_list); -- /* -- * compat: if the user did not pass any op then we do all -- * ops for them -- */ -- if (!op) -- op = OP_NEW | OP_DELETE | OP_UPDATE; -- -- drec->type = DISCOVERY_TYPE_ISNS; -- -- rc = idbm_bind_ifaces_to_nodes(discovery_isns, drec, ifaces, -- &rec_list); -- if (rc) { -- log_error("Could not perform iSNS discovery: %s", -- iscsi_err_to_str(rc)); -- return rc; -- } else if (list_empty(&rec_list)) { -- log_error("No portals found"); -- return ISCSI_ERR_NO_OBJS_FOUND; -- } -- -- rc = exec_disc_op_on_recs(drec, &rec_list, info_level, do_login, op); -- -- list_for_each_entry_safe(rec, tmp, &rec_list, list) { -- list_del(&rec->list); -- free(rec); -+sw_discovery: -+ switch (drec->type) { -+ case DISCOVERY_TYPE_SENDTARGETS: -+ return do_software_sendtargets(drec, ifaces, info_level, -+ do_login, op, sync_drec); -+ case DISCOVERY_TYPE_ISNS: -+ return do_isns(drec, ifaces, info_level, do_login, op); -+ default: -+ log_debug(1, "Unknown Discovery Type : %d\n", drec->type); - } -- -- return rc; - } - -+ - static int - verify_mode_params(int argc, char **argv, char *allowed, int skip_m) - { -@@ -2394,15 +2403,9 @@ static int exec_discover(int disc_type, char *ip, int port, - rc = 0; - switch (disc_type) { - case DISCOVERY_TYPE_SENDTARGETS: -- /* -- * idbm_add_discovery call above handles drec syncing so -- * we always pass in 0 here. -- */ -- rc = do_sendtargets(drec, ifaces, info_level, do_login, op, -- 0); -- break; - case DISCOVERY_TYPE_ISNS: -- rc = do_isns(drec, ifaces, info_level, do_login, op); -+ rc = do_target_discovery(drec, ifaces, info_level, do_login, op, -+ 0); - break; - default: - log_error("Unsupported discovery type."); -@@ -2535,8 +2538,7 @@ static int exec_disc_op(int disc_type, char *ip, int port, - idbm_sendtargets_defaults(&drec.u.sendtargets); - strlcpy(drec.address, ip, sizeof(drec.address)); - drec.port = port; -- -- rc = do_sendtargets(&drec, ifaces, info_level, -+ rc = do_target_discovery(&drec, ifaces, info_level, - do_login, op, 1); - if (rc) - goto done; -@@ -2559,7 +2561,9 @@ static int exec_disc_op(int disc_type, char *ip, int port, - else - drec.port = port; - -- rc = do_isns(&drec, ifaces, info_level, do_login, op); -+ drec.type = DISCOVERY_TYPE_ISNS; -+ rc = do_target_discovery(&drec, ifaces, info_level, -+ do_login, op, 0); - if (rc) - goto done; - break; -@@ -2590,8 +2594,9 @@ static int exec_disc_op(int disc_type, char *ip, int port, - } - if ((do_discover || do_login) && - drec.type == DISCOVERY_TYPE_SENDTARGETS) { -- rc = do_sendtargets(&drec, ifaces, info_level, -- do_login, op, 0); -+ rc = do_target_discovery(&drec, ifaces, -+ info_level, do_login, -+ op, 0); - } else if (op == OP_NOOP || op == OP_SHOW) { - if (!idbm_print_discovery_info(&drec, - do_show)) { --- -1.8.1.4 - diff --git a/0020-make-session-shutdown-a-seperate-service.patch.patch b/0020-make-session-shutdown-a-seperate-service.patch.patch new file mode 100644 index 0000000..3f93638 --- /dev/null +++ b/0020-make-session-shutdown-a-seperate-service.patch.patch @@ -0,0 +1,55 @@ +From ed34e9b47b883f4cf9d5ea03b5e6cc12cc010f07 Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Tue, 13 Jan 2015 16:30:01 -0800 +Subject: [PATCH] make-session-shutdown-a-seperate-service.patch + +--- + etc/systemd/iscsi-shutdown.service | 14 ++++++++++++++ + etc/systemd/iscsi.service | 3 +-- + 2 files changed, 15 insertions(+), 2 deletions(-) + create mode 100644 etc/systemd/iscsi-shutdown.service + +diff --git a/etc/systemd/iscsi-shutdown.service b/etc/systemd/iscsi-shutdown.service +new file mode 100644 +index 0000000..23758e9 +--- /dev/null ++++ b/etc/systemd/iscsi-shutdown.service +@@ -0,0 +1,14 @@ ++[Unit] ++Description=Logout off all iSCSI sessions on shutdown ++Documentation=man:iscsid(8) man:iscsiadm(8) ++DefaultDependencies=no ++Conflicts=shutdown.target ++After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service ++Before=remote-fs-pre.target ++Wants=remote-fs-pre.target ++RefuseManualStop=yes ++ ++[Service] ++Type=oneshot ++RemainAfterExit=true ++ExecStop=-/sbin/iscsiadm -m node --logoutall=all +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +index ad7be34..2736956 100644 +--- a/etc/systemd/iscsi.service ++++ b/etc/systemd/iscsi.service +@@ -5,7 +5,7 @@ DefaultDependencies=no + Conflicts=shutdown.target + After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service + Before=remote-fs-pre.target +-Wants=remote-fs-pre.target ++Wants=remote-fs-pre.target iscsi-shutdown.service + ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes + ConditionDirectoryNotEmpty=|/sys/class/iscsi_session + +@@ -14,7 +14,6 @@ Type=oneshot + RemainAfterExit=true + ExecStart=-/usr/libexec/iscsi-mark-root-nodes + ExecStart=-/sbin/iscsiadm -m node --loginall=automatic +-ExecStop=-/sbin/iscsiadm -m node --logoutall=automatic + ExecReload=-/sbin/iscsiadm -m node --loginall=automatic + + [Install] +-- +2.1.0 + diff --git a/0021-iscsiadm-Check-for-mode-is-not-required-when-creatin.patch b/0021-iscsiadm-Check-for-mode-is-not-required-when-creatin.patch deleted file mode 100644 index 6b67478..0000000 --- a/0021-iscsiadm-Check-for-mode-is-not-required-when-creatin.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 71f0db9ccb46be357c9b6505d35340150795996c Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Thu, 9 May 2013 13:57:49 +0530 -Subject: iscsiadm: Check for mode is not required when creating params list - -There is no need to explicitly check for mode while creating the params -list of name/value pairs. - -Reported-by: Leeman Duncan -Signed-off-by: Adheer Chandravanshi ---- - usr/iscsiadm.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index efe6383..84d5a27 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -2962,9 +2962,7 @@ main(int argc, char **argv) - usage(0); - } - -- if ((mode == MODE_IFACE || -- (mode == MODE_HOST && sub_mode == MODE_FLASHNODE)) && -- name && value) { -+ if (name && value) { - param = idbm_alloc_user_param(name, value); - if (!param) { - log_error("Cannot allocate memory for params."); --- -1.8.1.4 - diff --git a/0022-honor-all-requested-delays-in-iscsi_sched_ev_context.patch b/0022-honor-all-requested-delays-in-iscsi_sched_ev_context.patch new file mode 100644 index 0000000..424df93 --- /dev/null +++ b/0022-honor-all-requested-delays-in-iscsi_sched_ev_context.patch @@ -0,0 +1,71 @@ +From 1f7fd558c4da3c92bdae67646504eaec16e6081f Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Thu, 12 Feb 2015 16:01:48 -0800 +Subject: [PATCH] honor all requested delays in iscsi_sched_ev_context + +The session_conn_uio_poll function reschedules itself in the same was as +session_conn_poll, by calling iscsi_sched_ev_context with a delay. That +delay needs to not be ignored. + +Actually, most all of the cases in iscsi_sched_ev_context can use +actor_timer to ensure any passed delay argument is honored (even if most +of them are passed as 0). + +Signed-off-by: Chris Leech +--- + usr/initiator.c | 20 ++++++++------------ + 1 file changed, 8 insertions(+), 12 deletions(-) + +diff --git a/usr/initiator.c b/usr/initiator.c +index 3b39c5d..93a3c27 100644 +--- a/usr/initiator.c ++++ b/usr/initiator.c +@@ -1800,9 +1800,8 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + ev_context->conn = conn; + switch (event) { + case EV_CONN_RECV_PDU: +- actor_init(&ev_context->actor, session_conn_recv_pdu, +- ev_context); +- actor_schedule(&ev_context->actor); ++ actor_timer(&ev_context->actor, tmo, ++ session_conn_recv_pdu, ev_context); + break; + case EV_CONN_ERROR: + error = *(enum iscsi_err *)ev_context->data; +@@ -1820,27 +1819,24 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + actor_schedule(&ev_context->actor); + break; + case EV_CONN_LOGIN: +- actor_init(&ev_context->actor, session_conn_process_login, +- ev_context); +- actor_schedule(&ev_context->actor); ++ actor_timer(&ev_context->actor, tmo, ++ session_conn_process_login, ev_context); + break; + case EV_CONN_POLL: + actor_timer(&ev_context->actor, tmo, + session_conn_poll, ev_context); + break; + case EV_UIO_POLL: +- actor_init(&ev_context->actor, session_conn_uio_poll, +- ev_context); +- actor_schedule(&ev_context->actor); ++ actor_timer(&ev_context->actor, tmo, ++ session_conn_uio_poll, ev_context); + break; + case EV_CONN_LOGOUT_TIMER: + actor_timer(&ev_context->actor, tmo, + iscsi_logout_timedout, ev_context); + break; + case EV_CONN_STOP: +- actor_init(&ev_context->actor, iscsi_stop, +- ev_context); +- actor_schedule(&ev_context->actor); ++ actor_timer(&ev_context->actor, tmo, ++ iscsi_stop, ev_context); + break; + default: + log_error("Invalid event type %d.", event); +-- +2.1.0 + diff --git a/0022-iscsid-iscsiadm-add-support-for-emulex-one-connect-s.patch b/0022-iscsid-iscsiadm-add-support-for-emulex-one-connect-s.patch deleted file mode 100644 index 59ff902..0000000 --- a/0022-iscsid-iscsiadm-add-support-for-emulex-one-connect-s.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 2d0a0570b4d067f0b4e100f0cbab190efcfe3c67 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Wed, 29 May 2013 12:00:40 -0500 -Subject: iscsid/iscsiadm: add support for emulex one connect storage - -From Chris Moore. - -Add support for emulex one connect storage driver. ---- - iscsiuio/config.status | 0 - usr/transport.c | 8 ++++++++ - 2 files changed, 8 insertions(+) - mode change 100644 => 100755 iscsiuio/config.status - -diff --git a/iscsiuio/config.status b/iscsiuio/config.status -old mode 100644 -new mode 100755 -diff --git a/usr/transport.c b/usr/transport.c -index 10212af..52b7674 100644 ---- a/usr/transport.c -+++ b/usr/transport.c -@@ -99,6 +99,13 @@ struct iscsi_transport_template qla4xxx = { - .ep_disconnect = ktransport_ep_disconnect, - }; - -+struct iscsi_transport_template ocs = { -+ .name = "ocs", -+ .ep_connect = ktransport_ep_connect, -+ .ep_poll = ktransport_ep_poll, -+ .ep_disconnect = ktransport_ep_disconnect, -+}; -+ - static struct iscsi_transport_template *iscsi_transport_templates[] = { - &iscsi_tcp, - &iscsi_iser, -@@ -107,6 +114,7 @@ static struct iscsi_transport_template *iscsi_transport_templates[] = { - &bnx2i, - &qla4xxx, - &be2iscsi, -+ &ocs, - NULL - }; - --- -1.8.1.4 - diff --git a/0023-Add-macros-to-release-GIL-lock.patch b/0023-Add-macros-to-release-GIL-lock.patch new file mode 100644 index 0000000..cb0b0f8 --- /dev/null +++ b/0023-Add-macros-to-release-GIL-lock.patch @@ -0,0 +1,56 @@ +From 8b7dc01508ee5a47566d2270d2e164c0435bdfe3 Mon Sep 17 00:00:00 2001 +From: Jiri Konecny +Date: Mon, 11 May 2015 13:16:26 +0200 +Subject: [PATCH] Add macros to release GIL lock + +Other threads are blocked when GIL is not released before the time consuming +functions. +--- + libiscsi/pylibiscsi.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/libiscsi/pylibiscsi.c b/libiscsi/pylibiscsi.c +index 8800853..40b5955 100644 +--- a/libiscsi/pylibiscsi.c ++++ b/libiscsi/pylibiscsi.c +@@ -364,8 +364,13 @@ static PyObject *PyIscsiNode_str(PyObject *self) + static PyObject *PyIscsiNode_login(PyObject *self) + { + PyIscsiNode *node = (PyIscsiNode *)self; ++ int ret; + +- if (libiscsi_node_login(context, &node->node)) { ++ Py_BEGIN_ALLOW_THREADS ++ ret = libiscsi_node_login(context, &node->node); ++ Py_END_ALLOW_THREADS ++ ++ if (ret) { + PyErr_SetString(PyExc_IOError, + libiscsi_get_error_string(context)); + return NULL; +@@ -551,6 +556,7 @@ static PyObject *pylibiscsi_discover_sendtargets(PyObject *self, + const struct libiscsi_auth_info *authinfo = NULL; + struct libiscsi_node *found_nodes; + PyObject* found_node_list; ++ int ret; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|iO", + kwlist, &address, &port, +@@ -570,8 +576,12 @@ static PyObject *pylibiscsi_discover_sendtargets(PyObject *self, + } + } + +- if (libiscsi_discover_sendtargets(context, address, port, authinfo, +- &nr_found, &found_nodes)) { ++ Py_BEGIN_ALLOW_THREADS ++ ret = libiscsi_discover_sendtargets(context, address, port, authinfo, ++ &nr_found, &found_nodes); ++ Py_END_ALLOW_THREADS ++ ++ if (ret) { + PyErr_SetString(PyExc_IOError, + libiscsi_get_error_string(context)); + return NULL; +-- +2.1.0 + diff --git a/0023-ISCSIUIO-Updated-iscsiuio-to-version-0.7.8.1b-for-pe.patch b/0023-ISCSIUIO-Updated-iscsiuio-to-version-0.7.8.1b-for-pe.patch deleted file mode 100644 index d41b58d..0000000 --- a/0023-ISCSIUIO-Updated-iscsiuio-to-version-0.7.8.1b-for-pe.patch +++ /dev/null @@ -1,607 +0,0 @@ -From 669d4aeb6103c236e7cba94bbbb3c3098f8b4b15 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Wed, 19 Jun 2013 14:48:27 -0700 -Subject: ISCSIUIO: Updated iscsiuio to version 0.7.8.1b for perf optimization - -uIP v0.7.8.1b (May 01, 2013) -======================================================= - Enhancements - ------------ - 1. Change: Performance optimization by caching the page size - Impact: All - - 2. Change: Fixed a bug in the tx completion interrupt handler - Impact: 10G only - -Signed-off-by: Eddie Wai ---- - iscsiuio/README | 9 ++- - iscsiuio/RELEASE.TXT | 15 ++++- - iscsiuio/configure | 124 ++++++++++++++++++++--------------------- - iscsiuio/configure.ac | 4 +- - iscsiuio/docs/iscsiuio.8 | 8 +-- - iscsiuio/src/unix/libs/bnx2.c | 14 ++--- - iscsiuio/src/unix/libs/bnx2x.c | 19 ++++--- - iscsiuio/src/unix/nic.c | 1 + - iscsiuio/src/unix/nic.h | 6 +- - 9 files changed, 108 insertions(+), 92 deletions(-) - -diff --git a/iscsiuio/README b/iscsiuio/README -index 1a6386f..e7e5fe4 100644 ---- a/iscsiuio/README -+++ b/iscsiuio/README -@@ -1,6 +1,6 @@ - Iscsiuio Userspace Tool --Version 0.7.6.1g --Jan 14, 2013 -+Version 0.7.8.1b -+May 01, 2013 - ------------------------------------------------------ - - This tool is to be used in conjunction with the Broadcom NetXtreme II Linux -@@ -189,9 +189,8 @@ To run the daemon in debug mode please pass the parameter '-d ' - - where the following debug levels are defined: - --PACKET 5 - Print all messages --DEBUG 4 - Print debug messages --INFO 3 - Print messages needed to follow the uIP code -+DEBUG 4 - Print all messages -+INFO 3 - Print messages needed to follow the uIP code (default) - WARN 2 - Print warning messages - ERROR 1 - Only print critical errors - -diff --git a/iscsiuio/RELEASE.TXT b/iscsiuio/RELEASE.TXT -index 2fa19bb..de70667 100644 ---- a/iscsiuio/RELEASE.TXT -+++ b/iscsiuio/RELEASE.TXT -@@ -1,7 +1,7 @@ - Release Notes - Broadcom uIP Linux Driver -- Version 0.7.6.1g -- 01/14/2013 -+ Version 0.7.8.1b -+ 05/01/2013 - - Broadcom Corporation - 5300 California Avenue, -@@ -10,6 +10,16 @@ - Copyright (c) 2004 - 2013 Broadcom Corporation - All rights reserved - -+uIP v0.7.8.1b (May 01, 2013) -+======================================================= -+ Enhancements -+ ------------ -+ 1. Change: Performance optimization by caching the page size -+ Impact: All -+ -+ 2. Change: Fixed a bug in the tx completion interrupt handler -+ Impact: 10G only -+ - - uIP v0.7.6.1g (Jan 14, 2013) - ======================================================= -@@ -1986,3 +1996,4 @@ uIP v0.5.0b (Nov 24, 2009) - 1. Change: Add Broadcom 10G iSCSI offload support - - Impact: Linux -+ -diff --git a/iscsiuio/configure b/iscsiuio/configure -index 1852551..2740598 100755 ---- a/iscsiuio/configure -+++ b/iscsiuio/configure -@@ -1,6 +1,6 @@ - #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. --# Generated by GNU Autoconf 2.59 for iscsiuio 0.7.6.1g. -+# Generated by GNU Autoconf 2.59 for iscsiuio 0.7.8.1b. - # - # Report bugs to . - # -@@ -72,9 +72,9 @@ $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -- /^X\/\(\/\/\)$/{ s//\1/; q; } -- /^X\/\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\/\(\/\/\)$/{ s//\1/; q; } -+ /^X\/\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - - - # PATH needs CR, and LINENO needs CR and PATH. -@@ -423,8 +423,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} - # Identity of this package. - PACKAGE_NAME='iscsiuio' - PACKAGE_TARNAME='iscsiuio' --PACKAGE_VERSION='0.7.6.1g' --PACKAGE_STRING='iscsiuio 0.7.6.1g' -+PACKAGE_VERSION='0.7.8.1b' -+PACKAGE_STRING='iscsiuio 0.7.8.1b' - PACKAGE_BUGREPORT='eddie.wai@broadcom.com' - - # Factoring default headers for most tests. -@@ -870,10 +870,10 @@ $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; 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=.. -@@ -954,7 +954,7 @@ 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 iscsiuio 0.7.6.1g to adapt to many kinds of systems. -+\`configure' configures iscsiuio 0.7.8.1b to adapt to many kinds of systems. - - Usage: $0 [OPTION]... [VAR=VALUE]... - -@@ -1020,7 +1020,7 @@ fi - - if test -n "$ac_init_help"; then - case $ac_init_help in -- short | recursive ) echo "Configuration of iscsiuio 0.7.6.1g:";; -+ short | recursive ) echo "Configuration of iscsiuio 0.7.8.1b:";; - esac - cat <<\_ACEOF - -@@ -1160,7 +1160,7 @@ fi - test -n "$ac_init_help" && exit 0 - if $ac_init_version; then - cat <<\_ACEOF --iscsiuio configure 0.7.6.1g -+iscsiuio configure 0.7.8.1b - generated by GNU Autoconf 2.59 - - Copyright (C) 2003 Free Software Foundation, Inc. -@@ -1174,7 +1174,7 @@ cat >&5 <<_ACEOF - This file contains any messages produced by compilers while - running configure, to aid debugging if configure makes a mistake. - --It was created by iscsiuio $as_me 0.7.6.1g, which was -+It was created by iscsiuio $as_me 0.7.8.1b, which was - generated by GNU Autoconf 2.59. Invocation command line was - - $ $0 $@ -@@ -11743,7 +11743,7 @@ echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 - if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 - else -- if test "$cross_compiling" = yes; then : -+ if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross - else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 -@@ -11843,7 +11843,7 @@ echo $ECHO_N "checking whether a statically linked program can dlopen itself... - if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 - else -- if test "$cross_compiling" = yes; then : -+ if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross - else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 -@@ -21519,9 +21519,9 @@ $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -- /^X\/\(\/\/\)$/{ s//\1/; q; } -- /^X\/\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\/\(\/\/\)$/{ s//\1/; q; } -+ /^X\/\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - - - # PATH needs CR, and LINENO needs CR and PATH. -@@ -21705,7 +21705,7 @@ _ASBOX - } >&5 - cat >&5 <<_CSEOF - --This file was extended by iscsiuio $as_me 0.7.6.1g, which was -+This file was extended by iscsiuio $as_me 0.7.8.1b, which was - generated by GNU Autoconf 2.59. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES -@@ -21768,7 +21768,7 @@ _ACEOF - - cat >>$CONFIG_STATUS <<_ACEOF - ac_cs_version="\\ --iscsiuio config.status 0.7.6.1g -+iscsiuio config.status 0.7.8.1b - configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" - -@@ -22113,10 +22113,10 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else -@@ -22132,10 +22132,10 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -@@ -22470,10 +22470,10 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else -@@ -22489,10 +22489,10 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -@@ -22524,10 +22524,10 @@ $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'`/stamp-h$_am_stamp_count -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'`/stamp-h$_am_stamp_count - done - _ACEOF - cat >>$CONFIG_STATUS <<\_ACEOF -@@ -22546,10 +22546,10 @@ $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else -@@ -22565,10 +22565,10 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -@@ -22662,10 +22662,10 @@ $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - else - continue - fi -@@ -22695,10 +22695,10 @@ $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else -@@ -22714,10 +22714,10 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - . : '\(.\)' 2>/dev/null || - echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ /^X\(\/\/\)[^/].*/{ s//\1/; q; } -+ /^X\(\/\/\)$/{ s//\1/; q; } -+ /^X\(\/\).*/{ s//\1/; q; } -+ s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -@@ -22762,4 +22762,4 @@ if test "$no_create" != yes; then - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } - fi --# -+ -diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac -index 34f0481..e9a5e32 100644 ---- a/iscsiuio/configure.ac -+++ b/iscsiuio/configure.ac -@@ -11,9 +11,9 @@ dnl Benjamin Li (benli@broadcom.com) - dnl - - PACKAGE=iscsiuio --VERSION=0.7.6.1g -+VERSION=0.7.8.1b - --AC_INIT(iscsiuio, 0.7.6.1g, eddie.wai@broadcom.com) -+AC_INIT(iscsiuio, 0.7.8.1b, eddie.wai@broadcom.com) - - AM_INIT_AUTOMAKE($PACKAGE, $VERSION) - AC_CONFIG_HEADER(config.h) -diff --git a/iscsiuio/docs/iscsiuio.8 b/iscsiuio/docs/iscsiuio.8 -index 2f577bc..ea21d78 100644 ---- a/iscsiuio/docs/iscsiuio.8 -+++ b/iscsiuio/docs/iscsiuio.8 -@@ -3,9 +3,9 @@ - .\" modify it under the terms of the GNU General Public License as - .\" published by the Free Software Foundation. - .\" --.\" bnx2.4,v 0.7.6.1g -+.\" bnx2.4,v 0.7.8.1b - .\" --.TH iscsiuio 8 "01/14/2013" "Broadcom Corporation" -+.TH iscsiuio 8 "05/01/2013" "Broadcom Corporation" - .\" - .\" NAME part - .\" -@@ -81,6 +81,6 @@ Display this help and exit. - .\" AUTHOR part - .\" - .SH AUTHOR --Eddie Wai \- eddie.wai@broadcom.com --.P - Benjamin Li \- benli@broadcom.com -+.P -+Eddie Wai \- eddie.wai@broadcom.com -diff --git a/iscsiuio/src/unix/libs/bnx2.c b/iscsiuio/src/unix/libs/bnx2.c -index b72b8ce..91c44e5 100644 ---- a/iscsiuio/src/unix/libs/bnx2.c -+++ b/iscsiuio/src/unix/libs/bnx2.c -@@ -576,7 +576,7 @@ static int bnx2_open(nic_t *nic) - - bp->sblk_map = mmap(NULL, bp->status_blk_size, - PROT_READ | PROT_WRITE, MAP_SHARED, -- nic->fd, (off_t) getpagesize()); -+ nic->fd, (off_t) nic->page_size); - if (bp->sblk_map == MAP_FAILED) { - LOG_INFO(PFX "%s: Could not mmap status block: %s", - nic->log_name, strerror(errno)); -@@ -602,9 +602,9 @@ static int bnx2_open(nic_t *nic) - BNX2_SBLK_EVEN_IDX(bp->status_blk.msi->rx2)); - } - -- bp->tx_ring = mmap(NULL, 2 * getpagesize(), -+ bp->tx_ring = mmap(NULL, 2 * nic->page_size, - PROT_READ | PROT_WRITE, MAP_SHARED, nic->fd, -- (off_t) 2 * getpagesize()); -+ (off_t) 2 * nic->page_size); - if (bp->tx_ring == MAP_FAILED) { - LOG_INFO(PFX "%s: Could not mmap tx ring: %s", - nic->log_name, strerror(errno)); -@@ -614,7 +614,7 @@ static int bnx2_open(nic_t *nic) - - bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size, - PROT_READ | PROT_WRITE, -- MAP_SHARED, nic->fd, (off_t) 3 * getpagesize()); -+ MAP_SHARED, nic->fd, (off_t) 3 * nic->page_size); - if (bp->bufs == MAP_FAILED) { - LOG_INFO(PFX "%s: Could not mmap buffers: %s", - nic->log_name, strerror(errno)); -@@ -693,7 +693,7 @@ static int bnx2_open(nic_t *nic) - return 0; - - error_bufs: -- munmap(bp->tx_ring, 2 * getpagesize()); -+ munmap(bp->tx_ring, 2 * nic->page_size); - - error_tx_ring: - munmap(bp->status_blk.msi, bp->status_blk_size); -@@ -765,7 +765,7 @@ static int bnx2_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful) - } - - if (bp->tx_ring != NULL) { -- rc = munmap(bp->tx_ring, 2 * getpagesize()); -+ rc = munmap(bp->tx_ring, 2 * nic->page_size); - if (rc != 0) - LOG_WARN(PFX "%s: Couldn't unmap tx_rings", - nic->log_name); -@@ -884,7 +884,7 @@ void bnx2_start_xmit(nic_t *nic, size_t len, u16_t vlan_id) - uint16_t ring_prod; - struct tx_bd *txbd; - struct rx_bd *rxbd; -- rxbd = (struct rx_bd *)(((__u8 *) bp->tx_ring) + getpagesize()); -+ rxbd = (struct rx_bd *)(((__u8 *) bp->tx_ring) + nic->page_size); - - if ((rxbd->rx_bd_haddr_hi == 0) && (rxbd->rx_bd_haddr_lo == 0)) { - LOG_PACKET(PFX "%s: trying to transmit when device is closed", -diff --git a/iscsiuio/src/unix/libs/bnx2x.c b/iscsiuio/src/unix/libs/bnx2x.c -index c6e92cf..36fc48e 100644 ---- a/iscsiuio/src/unix/libs/bnx2x.c -+++ b/iscsiuio/src/unix/libs/bnx2x.c -@@ -818,7 +818,7 @@ static int bnx2x_open(nic_t *nic) - - bp->status_blk.def = mmap(NULL, bp->status_blk_size, - PROT_READ | PROT_WRITE, MAP_SHARED, -- nic->fd, (off_t) getpagesize()); -+ nic->fd, (off_t) nic->page_size); - if (bp->status_blk.def == MAP_FAILED) { - LOG_INFO(PFX "%s: Could not mmap status block: %s", - nic->log_name, strerror(errno)); -@@ -827,10 +827,10 @@ static int bnx2x_open(nic_t *nic) - goto open_error; - } - -- bp->tx_ring = mmap(NULL, 4 * getpagesize(), -+ bp->tx_ring = mmap(NULL, 4 * nic->page_size, - PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_LOCKED, -- nic->fd, (off_t) 2 * getpagesize()); -+ nic->fd, (off_t) 2 * nic->page_size); - if (bp->tx_ring == MAP_FAILED) { - LOG_INFO(PFX "%s: Could not mmap tx ring: %s", - nic->log_name, strerror(errno)); -@@ -840,12 +840,12 @@ static int bnx2x_open(nic_t *nic) - } - - bp->rx_comp_ring.cqe = (union eth_rx_cqe *) -- (((__u8 *) bp->tx_ring) + 2 * getpagesize()); -+ (((__u8 *) bp->tx_ring) + 2 * nic->page_size); - - bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size, - PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_LOCKED, -- nic->fd, (off_t) 3 * getpagesize()); -+ nic->fd, (off_t) 3 * nic->page_size); - if (bp->bufs == MAP_FAILED) { - LOG_INFO(PFX "%s: Could not mmap buffers: %s", - nic->log_name, strerror(errno)); -@@ -937,7 +937,7 @@ static int bnx2x_open(nic_t *nic) - bp->rx_prod_io = BAR_USTRORM_INTMEM + - USTORM_RX_PRODS_OFFSET(bp->port, bp->client_id); - -- bp->tx_doorbell = bp->cid * getpagesize() + 0x40; -+ bp->tx_doorbell = bp->cid * nic->page_size + 0x40; - - bp->get_rx_cons = bnx2x_get_rx; - bp->get_tx_cons = bnx2x_get_tx; -@@ -1073,7 +1073,7 @@ SF: - - open_error: - if (bp->tx_ring) { -- munmap(bp->tx_ring, 4 * getpagesize()); -+ munmap(bp->tx_ring, 4 * nic->page_size); - bp->tx_ring = NULL; - } - -@@ -1150,7 +1150,7 @@ static int bnx2x_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful) - } - - if (bp->tx_ring != NULL) { -- rc = munmap(bp->tx_ring, 4 * getpagesize()); -+ rc = munmap(bp->tx_ring, 4 * nic->page_size); - if (rc != 0) - LOG_WARN(PFX "%s: Couldn't unmap tx_rings", - nic->log_name); -@@ -1284,7 +1284,7 @@ void bnx2x_start_xmit(nic_t *nic, size_t len, u16_t vlan_id) - struct eth_tx_start_bd *txbd; - struct eth_tx_bd *txbd2; - struct eth_rx_bd *rx_bd; -- rx_bd = (struct eth_rx_bd *)(((__u8 *) bp->tx_ring) + getpagesize()); -+ rx_bd = (struct eth_rx_bd *)(((__u8 *) bp->tx_ring) + nic->page_size); - - if ((rx_bd->addr_hi == 0) && (rx_bd->addr_lo == 0)) { - LOG_PACKET(PFX "%s: trying to transmit when device is closed", -@@ -1539,6 +1539,7 @@ static int bnx2x_clear_tx_intr(nic_t *nic) - LOG_ERR(PFX "bnx2x tx lock with prod == cons"); - - pthread_mutex_unlock(&nic->xmit_mutex); -+ return 0; - } - return -EAGAIN; - } -diff --git a/iscsiuio/src/unix/nic.c b/iscsiuio/src/unix/nic.c -index 457797d..7c3f4d5 100644 ---- a/iscsiuio/src/unix/nic.c -+++ b/iscsiuio/src/unix/nic.c -@@ -400,6 +400,7 @@ nic_t *nic_init() - nic->tx_packet_queue = NULL; - nic->nic_library = NULL; - nic->pci_id = NULL; -+ nic->page_size = getpagesize(); - - /* nic_mutex is used to protect nic ops */ - pthread_mutex_init(&nic->nic_mutex, NULL); -diff --git a/iscsiuio/src/unix/nic.h b/iscsiuio/src/unix/nic.h -index 7d2d078..7d1ae28 100644 ---- a/iscsiuio/src/unix/nic.h -+++ b/iscsiuio/src/unix/nic.h -@@ -140,7 +140,9 @@ typedef struct nic_interface { - time_t start_time; - - struct uip_stack ustack; --#define IFACE_NUM_INVALID -1 -+ -+#define IFACE_NUM_PRESENT (1<<0) -+#define IFACE_NUM_INVALID -1 - int iface_num; - int request_type; - } nic_interface_t; -@@ -247,6 +249,8 @@ typedef struct nic { - - uint32_t intr_count; /* Total UIO interrupt count */ - -+ int page_size; -+ - /* Held for nic ops manipulation */ - pthread_mutex_t nic_mutex; - --- -1.8.1.4 - diff --git a/0024-Fix-discovery-error-return-without-return-value.patch b/0024-Fix-discovery-error-return-without-return-value.patch deleted file mode 100644 index d689178..0000000 --- a/0024-Fix-discovery-error-return-without-return-value.patch +++ /dev/null @@ -1,43 +0,0 @@ -From f0d81b5ea1170274c57be7ee7989dc7bb0b64b84 Mon Sep 17 00:00:00 2001 -From: Lee Duncan -Date: Wed, 26 Jun 2013 11:57:39 -0700 -Subject: Fix discovery error return without return value - -openSUSE Build Service compiler noticed that one discovery -error path did not have a return value, so an appropriate -error is now being returned. - -Signed-of-by: Lee Duncan ---- - include/iscsi_err.h | 2 ++ - usr/iscsiadm.c | 1 + - 2 files changed, 3 insertions(+) - -diff --git a/include/iscsi_err.h b/include/iscsi_err.h -index 1139133..125f443 100644 ---- a/include/iscsi_err.h -+++ b/include/iscsi_err.h -@@ -64,6 +64,8 @@ enum { - ISCSI_ERR_BUSY = 28, - /* Operation failed, but retrying layer may succeed */ - ISCSI_ERR_AGAIN = 29, -+ /* unknown discovery type */ -+ ISCSI_ERR_UNKNOWN_DISCOVERY_TYPE = 30, - - /* Always last. Indicates end of error code space */ - ISCSI_MAX_ERR_VAL, -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 84d5a27..5030894 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -1235,6 +1235,7 @@ sw_discovery: - return do_isns(drec, ifaces, info_level, do_login, op); - default: - log_debug(1, "Unknown Discovery Type : %d\n", drec->type); -+ return ISCSI_ERR_UNKNOWN_DISCOVERY_TYPE; - } - } - --- -1.8.1.4 - diff --git a/0025-iscsid-Fix-strlen-parameter.patch b/0025-iscsid-Fix-strlen-parameter.patch deleted file mode 100644 index 8a6a96f..0000000 --- a/0025-iscsid-Fix-strlen-parameter.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 5569a3d9d0933a226860284cbad8b0c04f1ba0e5 Mon Sep 17 00:00:00 2001 -From: Jan Vesely -Date: Wed, 26 Jun 2013 14:45:57 +0200 -Subject: iscsid: Fix strlen parameter - -The target socket name is passed as parameter, don't use the hardwired -one. - -Signed-off-by: Jan Vesely ---- - usr/iscsid_req.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c -index 15f6353..715c0aa 100644 ---- a/usr/iscsid_req.c -+++ b/usr/iscsid_req.c -@@ -67,7 +67,7 @@ static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid) - return ISCSI_ERR_ISCSID_NOTCONN; - } - -- addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1; -+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(unix_sock_name) + 1; - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; --- -1.8.1.4 - diff --git a/0026-iscsiuio-Change-socket-bind-to-use-the-same-struct-s.patch b/0026-iscsiuio-Change-socket-bind-to-use-the-same-struct-s.patch deleted file mode 100644 index 80d6283..0000000 --- a/0026-iscsiuio-Change-socket-bind-to-use-the-same-struct-s.patch +++ /dev/null @@ -1,50 +0,0 @@ -From fef4db2784fac34fa99468de09c386114b228b36 Mon Sep 17 00:00:00 2001 -From: Jan Vesely -Date: Wed, 26 Jun 2013 15:55:12 +0200 -Subject: iscsiuio: Change socket bind to use the same struct size as iscsid - -Without this patch connections to iscsiuio fail, and strace prints: - -connect(8, {sa_family=AF_FILE, path=@"ISCSID_UIP_ABSTRACT_NAMESPACE"}, 32) = -1 ECONNREFUSED (Connection refused) - -Note that updating mgmt_ipc_listen and ipc_connect to use sizeof(addr) instead -of the precomputed values also fixes the issue. -Looks like "(Null bytes in the name have no special significance.)" [man 7 unix] is the culprit here. - -Signed-off-by: Jan Vesely ---- - iscsiuio/src/unix/iscsid_ipc.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/iscsiuio/src/unix/iscsid_ipc.c b/iscsiuio/src/unix/iscsid_ipc.c -index 5c097e6..e22de0d 100644 ---- a/iscsiuio/src/unix/iscsid_ipc.c -+++ b/iscsiuio/src/unix/iscsid_ipc.c -@@ -958,7 +958,7 @@ static void *iscsid_loop(void *arg) - */ - int iscsid_init() - { -- int rc; -+ int rc, addr_len; - struct sockaddr_un addr; - - iscsid_opts.fd = socket(AF_LOCAL, SOCK_STREAM, 0); -@@ -967,12 +967,14 @@ int iscsid_init() - return iscsid_opts.fd; - } - -+ addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSID_UIP_NAMESPACE) + 1; -+ - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; - memcpy((char *)&addr.sun_path + 1, ISCSID_UIP_NAMESPACE, - strlen(ISCSID_UIP_NAMESPACE)); - -- rc = bind(iscsid_opts.fd, (struct sockaddr *)&addr, sizeof(addr)); -+ rc = bind(iscsid_opts.fd, (struct sockaddr *)&addr, addr_len); - if (rc < 0) { - LOG_ERR(PFX "Can not bind IPC socket: %s", strerror(errno)); - goto error; --- -1.8.1.4 - diff --git a/0027-Make-rescan-run-in-parallel.patch b/0027-Make-rescan-run-in-parallel.patch deleted file mode 100644 index 0fe1c6e..0000000 --- a/0027-Make-rescan-run-in-parallel.patch +++ /dev/null @@ -1,299 +0,0 @@ -From 3c5ec3835d5fd57a993cb814ecd74b48419a7459 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Mon, 29 Jul 2013 14:13:36 -0500 -Subject: Make rescan run in parallel - -Patch from Saggi Mizrahi: - -This fixes a problem where a host which is inaccessible would block the -scan of other hosts in the system. - -[compilation and minor cosmetic fixes by Mike Christie] -Signed-off-by: Saggi Mizrahi ---- - usr/host.c | 2 +- - usr/initiator.c | 3 ++- - usr/iscsi_sysfs.c | 61 +++++++++++++++++++++++++++++++++++++++++++++--------- - usr/iscsi_sysfs.h | 3 ++- - usr/iscsiadm.c | 18 +++++++++------- - usr/iscsid.c | 3 ++- - usr/session_info.c | 4 ++-- - usr/session_mgmt.c | 7 ++++--- - 8 files changed, 74 insertions(+), 27 deletions(-) - -diff --git a/usr/host.c b/usr/host.c -index b03e50f..1fcb350 100644 ---- a/usr/host.c -+++ b/usr/host.c -@@ -242,7 +242,7 @@ static int host_info_print_tree(void *data, struct host_info *hinfo) - link_info.data = &hinfo->host_no; - - err = iscsi_sysfs_for_each_session(&link_info, &num_found, -- session_info_create_list); -+ session_info_create_list, 0); - if (err || !num_found) - return 0; - -diff --git a/usr/initiator.c b/usr/initiator.c -index 86df222..a3b24b7 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -1855,7 +1855,8 @@ static int session_is_running(node_rec_t *rec) - if (session_find_by_rec(rec)) - return 1; - -- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session)) -+ if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session, -+ 0)) - return 1; - - return 0; -diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c -index 64a4ce7..aed10a3 100644 ---- a/usr/iscsi_sysfs.c -+++ b/usr/iscsi_sysfs.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - - #include "log.h" - #include "initiator.h" -@@ -1167,11 +1168,13 @@ int iscsi_sysfs_get_sessioninfo_by_id(struct session_info *info, char *session) - } - - int iscsi_sysfs_for_each_session(void *data, int *nr_found, -- iscsi_sysfs_session_op_fn *fn) -+ iscsi_sysfs_session_op_fn *fn, -+ int in_parallel) - { - struct dirent **namelist; -- int rc = 0, n, i; -+ int rc = 0, n, i, chldrc = 0; - struct session_info *info; -+ pid_t pid = 0; - - info = calloc(1, sizeof(*info)); - if (!info) -@@ -1193,14 +1196,52 @@ int iscsi_sysfs_for_each_session(void *data, int *nr_found, - continue; - } - -- rc = fn(data, info); -- if (rc > 0) -- break; -- else if (rc == 0) -- (*nr_found)++; -- else -- /* if less than zero it means it was not a match */ -- rc = 0; -+ if (in_parallel) { -+ pid = fork(); -+ } -+ if (pid == 0) { -+ rc = fn(data, info); -+ if (in_parallel) { -+ exit(rc); -+ } else { -+ if (rc > 0) { -+ break; -+ } else if (rc == 0) { -+ (*nr_found)++; -+ } else { -+ /* if less than zero it means it was not a match */ -+ rc = 0; -+ } -+ } -+ } else if (pid < 0) { -+ log_error("could not fork() for session %s, err %d", -+ namelist[i]->d_name, errno); -+ } -+ } -+ -+ if (in_parallel) { -+ while (1) { -+ if (wait(&chldrc) < 0) { -+ /* -+ * ECHILD means no more children which is -+ * expected to happen sooner or later. -+ */ -+ if (errno != ECHILD) { -+ rc = errno; -+ } -+ break; -+ } -+ -+ if ((chldrc > 0) && (rc == 0)) { -+ /* -+ * The non-parallel code path returns the first -+ * error so this keeps the same semantics. -+ */ -+ rc = chldrc; -+ } else if (chldrc == 0) { -+ (*nr_found)++; -+ } -+ } - } - - for (i = 0; i < n; i++) -diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h -index d130d36..9a56105 100644 ---- a/usr/iscsi_sysfs.h -+++ b/usr/iscsi_sysfs.h -@@ -51,7 +51,8 @@ extern int iscsi_sysfs_for_each_iface_on_host(void *data, uint32_t host_no, - int *nr_found, - iscsi_sysfs_iface_op_fn *fn); - extern int iscsi_sysfs_for_each_session(void *data, int *nr_found, -- iscsi_sysfs_session_op_fn *fn); -+ iscsi_sysfs_session_op_fn *fn, -+ int in_parallel); - extern int iscsi_sysfs_for_each_host(void *data, int *nr_found, - iscsi_sysfs_host_op_fn *fn); - extern uint32_t iscsi_sysfs_get_host_no_from_sid(uint32_t sid, int *err); -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 5030894..da0a3ec 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -347,7 +347,8 @@ match_startup_mode(node_rec_t *rec, char *mode) - } - - static int --for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn) -+for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn, -+ int in_parallel) - { - int err, num_found = 0; - -@@ -355,7 +356,8 @@ for_each_session(struct node_rec *rec, iscsi_sysfs_session_op_fn *fn) - num_found = 1; - err = fn(rec, rec->session.info); - } else { -- err = iscsi_sysfs_for_each_session(rec, &num_found, fn); -+ err = iscsi_sysfs_for_each_session(rec, &num_found, fn, -+ in_parallel); - } - if (err) - log_error("Could not execute operation on all sessions: %s", -@@ -435,7 +437,7 @@ logout_by_startup(char *mode) - rc = iscsi_logout_portals(mode, &nr_found, 1, __logout_by_startup); - if (rc == ISCSI_ERR_NO_OBJS_FOUND) - log_error("No matching sessions found"); -- return rc; -+ return rc; - } - - struct startup_data { -@@ -479,7 +481,7 @@ __do_leading_login(void *data, struct list_head *list, struct node_rec *rec) - * If there is an existing session that matcthes the target, - * the leading login is complete. - */ -- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_target)) { -+ if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_target, 0)) { - log_debug(1, "Skipping %s: Already a session for that target", - rec->name); - return -1; -@@ -579,7 +581,7 @@ login_by_startup(char *mode) - list_for_each_entry_safe(rec, tmp_rec, &startup.leading_logins, - list) { - if (!iscsi_sysfs_for_each_session(rec, &nr_found, -- iscsi_match_target)) -+ iscsi_match_target, 0)) - missed_leading_login++; - /* - * Cleanup the list, since 'iscsi_login_portals_safe' -@@ -1210,7 +1212,7 @@ do_target_discovery(discovery_rec_t *drec, struct list_head *ifaces, - host_no = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc); - if (rc || host_no == -1) { - log_debug(1, "Could not match iface" iface_fmt " to " -- "host.", iface_str(iface)); -+ "host.", iface_str(iface)); - /* try software iscsi */ - continue; - } -@@ -2116,12 +2118,12 @@ static int exec_node_op(int op, int do_login, int do_logout, - } - - if (do_rescan) { -- rc = for_each_session(rec, rescan_portal); -+ rc = for_each_session(rec, rescan_portal, 1); - goto out; - } - - if (do_stats) { -- rc = for_each_session(rec, session_stats); -+ rc = for_each_session(rec, session_stats, 0); - goto out; - } - -diff --git a/usr/iscsid.c b/usr/iscsid.c -index b4bb65b..8f19220 100644 ---- a/usr/iscsid.c -+++ b/usr/iscsid.c -@@ -511,7 +511,8 @@ int main(int argc, char *argv[]) - if (pid == 0) { - int nr_found = 0; - /* child */ -- iscsi_sysfs_for_each_session(NULL, &nr_found, sync_session); -+ /* TODO - test with async support enabled */ -+ iscsi_sysfs_for_each_session(NULL, &nr_found, sync_session, 0); - exit(0); - } else if (pid < 0) { - log_error("Fork failed error %d: existing sessions" -diff --git a/usr/session_info.c b/usr/session_info.c -index 1f84c49..de156c6 100644 ---- a/usr/session_info.c -+++ b/usr/session_info.c -@@ -368,7 +368,7 @@ int session_info_print(int info_level, struct session_info *info, int do_show) - num_found = 1; - } else - err = iscsi_sysfs_for_each_session(info, &num_found, -- session_info_print_flat); -+ session_info_print_flat, 0); - break; - case 3: - version = iscsi_sysfs_get_iscsi_kernel_version(); -@@ -403,7 +403,7 @@ int session_info_print(int info_level, struct session_info *info, int do_show) - link_info.match_fn = NULL; - - err = iscsi_sysfs_for_each_session(&link_info, &num_found, -- session_info_create_list); -+ session_info_create_list, 0); - if (err || !num_found) - break; - -diff --git a/usr/session_mgmt.c b/usr/session_mgmt.c -index 0b7373f..87b8e00 100644 ---- a/usr/session_mgmt.c -+++ b/usr/session_mgmt.c -@@ -172,7 +172,7 @@ int iscsi_login_portal(void *data, struct list_head *list, struct node_rec *rec) - * that are missing. - */ - rc = iscsi_sysfs_for_each_session(rec, &session_count, -- iscsi_match_session_count); -+ iscsi_match_session_count, 0); - if (rc) { - log_error("Could not count current number of sessions"); - goto done; -@@ -421,7 +421,7 @@ int iscsi_logout_portals(void *data, int *nr_found, int wait, - *nr_found = 0; - - err = iscsi_sysfs_for_each_session(&link_info, nr_found, -- session_info_create_list); -+ session_info_create_list, 0); - if (err && !list_empty(&session_list)) - log_error("Could not read in all sessions: %s", - iscsi_err_to_str(err)); -@@ -466,7 +466,8 @@ free_list: - int iscsi_check_for_running_session(struct node_rec *rec) - { - int nr_found = 0; -- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session)) -+ if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session, -+ 0)) - return 1; - return 0; - } --- -1.8.1.4 - diff --git a/0028-iscsiadm-Correctly-check-for-invalid-hostno-and-flas.patch b/0028-iscsiadm-Correctly-check-for-invalid-hostno-and-flas.patch deleted file mode 100644 index 5d45dfd..0000000 --- a/0028-iscsiadm-Correctly-check-for-invalid-hostno-and-flas.patch +++ /dev/null @@ -1,213 +0,0 @@ -From 3256b93ee3025bf76757001ff3d24914c4c4af28 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 9 Jul 2013 08:17:14 -0400 -Subject: [PATCH] iscsiadm: Correctly check for invalid hostno and flashnode - index - -In host mode, correctly compare for invalid hostno and flashnode index. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/flashnode.h | 2 ++ - usr/host.h | 2 ++ - usr/iscsiadm.c | 48 ++++++++++++++++++++++++++++++------------------ - usr/types.h | 1 + - 4 files changed, 35 insertions(+), 18 deletions(-) - -diff --git a/usr/flashnode.h b/usr/flashnode.h -index c1de9cc..2950fb5 100644 ---- a/usr/flashnode.h -+++ b/usr/flashnode.h -@@ -26,6 +26,8 @@ - #include "config.h" - #include "auth.h" - -+#define MAX_FLASHNODE_IDX UINT_MAX -+ - typedef enum portal_type { - IPV4, - IPV6, -diff --git a/usr/host.h b/usr/host.h -index 894ab91..db44cfa 100644 ---- a/usr/host.h -+++ b/usr/host.h -@@ -5,6 +5,8 @@ - #include "types.h" - #include "config.h" - -+#define MAX_HOST_NO UINT_MAX -+ - #define MAX_CHAP_BUF_SZ 4096 - #define REQ_CHAP_BUF_SZ (MAX_CHAP_BUF_SZ + sizeof(struct iscsi_uevent)) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index da0a3ec..c7337ae 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -1744,20 +1744,22 @@ exit_logout_sid: - } - - static int exec_flashnode_op(int op, int info_level, uint32_t host_no, -- uint32_t flashnode_idx, int type, -+ uint64_t fnode_idx, int type, - struct list_head *params) - { - struct iscsi_transport *t = NULL; - int rc = ISCSI_SUCCESS; - char *portal_type; -+ uint32_t flashnode_idx; - - if (op != OP_SHOW && op != OP_NOOP && op != OP_NEW && -- flashnode_idx == 0xffffffff) { -+ fnode_idx > MAX_FLASHNODE_IDX) { - log_error("Invalid flashnode index"); - rc = ISCSI_ERR_INVAL; - goto exit_flashnode_op; - } - -+ flashnode_idx = (uint32_t)fnode_idx; - t = iscsi_sysfs_get_transport_by_hba(host_no); - if (!t) { - log_error("Could not match hostno %u to transport.", host_no); -@@ -1768,7 +1770,7 @@ static int exec_flashnode_op(int op, int info_level, uint32_t host_no, - switch (op) { - case OP_NOOP: - case OP_SHOW: -- if (flashnode_idx == 0xffffffff) -+ if (fnode_idx > MAX_FLASHNODE_IDX) - rc = list_flashnodes(info_level, host_no); - else - rc = get_flashnode_info(host_no, flashnode_idx); -@@ -1880,7 +1882,7 @@ static int verify_iface_params(struct list_head *params, struct node_rec *rec) - - /* TODO: merge iter helpers and clean them up, so we can use them here */ - static int exec_iface_op(int op, int do_show, int info_level, -- struct iface_rec *iface, uint32_t host_no, -+ struct iface_rec *iface, uint64_t host_no, - struct list_head *params) - { - struct host_info hinfo; -@@ -2001,9 +2003,9 @@ update_fail: - printf("%s applied.\n", iface->name); - break; - case OP_APPLY_ALL: -- if (host_no == -1) { -- log_error("Applyall requires a host number or MAC " -- "passed in with the --host argument."); -+ if (host_no > MAX_HOST_NO) { -+ log_error("Applyall requires a valid host number or MAC" -+ " passed in with the --host argument."); - rc = ISCSI_ERR_INVAL; - break; - } -@@ -2014,7 +2016,7 @@ update_fail: - memset(&hinfo, 0, sizeof(struct host_info)); - hinfo.host_no = host_no; - if (iscsi_sysfs_get_hostinfo_by_host_no(&hinfo)) { -- log_error("Could not match host%u to ifaces.", host_no); -+ log_error("Could not match host%lu to ifaces.", host_no); - rc = ISCSI_ERR_INVAL; - break; - } -@@ -2025,7 +2027,7 @@ update_fail: - break; - } - -- printf("Applied settings to ifaces attached to host%u.\n", -+ printf("Applied settings to ifaces attached to host%lu.\n", - host_no); - break; - default: -@@ -2637,10 +2639,10 @@ done: - return rc; - } - --static uint32_t parse_host_info(char *optarg, int *rc) -+static uint64_t parse_host_info(char *optarg, int *rc) - { - int err = 0; -- uint32_t host_no = -1; -+ uint64_t host_no; - - *rc = 0; - if (strstr(optarg, ":")) { -@@ -2653,8 +2655,11 @@ static uint32_t parse_host_info(char *optarg, int *rc) - *rc = ISCSI_ERR_INVAL; - } - } else { -- host_no = strtoul(optarg, NULL, 10); -- if (errno) { -+ host_no = strtoull(optarg, NULL, 10); -+ if (errno || (host_no > MAX_HOST_NO)) { -+ if (host_no > MAX_HOST_NO) -+ errno = ERANGE; -+ - log_error("Invalid host no %s. %s.", - optarg, strerror(errno)); - *rc = ISCSI_ERR_INVAL; -@@ -2806,13 +2811,14 @@ main(int argc, char **argv) - int tpgt = PORTAL_GROUP_TAG_UNKNOWN, killiscsid=-1, do_show=0; - int packet_size=32, ping_count=1, ping_interval=0; - int do_discover = 0, sub_mode = -1; -- int flashnode_idx = -1, portal_type = -1; -+ int portal_type = -1; - struct sigaction sa_old; - struct sigaction sa_new; - struct list_head ifaces; - struct iface_rec *iface = NULL, *tmp; - struct node_rec *rec = NULL; -- uint32_t host_no = -1; -+ uint64_t host_no = (uint64_t)MAX_HOST_NO + 1; -+ uint64_t flashnode_idx = (uint64_t)MAX_FLASHNODE_IDX + 1; - struct user_param *param; - struct list_head params; - -@@ -2956,7 +2962,13 @@ main(int argc, char **argv) - ISCSI_VERSION_STR); - return 0; - case 'x': -- flashnode_idx = atoi(optarg); -+ flashnode_idx = strtoull(optarg, NULL, 10); -+ if (errno) { -+ log_error("Invalid flashnode index %s. %s.", -+ optarg, strerror(errno)); -+ rc = ISCSI_ERR_INVAL; -+ goto free_ifaces; -+ } - break; - case 'A': - portal_type = str_to_portal_type(optarg); -@@ -3022,7 +3034,7 @@ main(int argc, char **argv) - if (sub_mode != -1) { - switch (sub_mode) { - case MODE_CHAP: -- if (!op || !host_no) { -+ if (!op || (host_no > MAX_HOST_NO)) { - log_error("CHAP mode requires host " - "no and valid operation"); - rc = ISCSI_ERR_INVAL; -@@ -3032,7 +3044,7 @@ main(int argc, char **argv) - value); - break; - case MODE_FLASHNODE: -- if (!host_no) { -+ if (host_no > MAX_HOST_NO) { - log_error("FLASHNODE mode requires host no"); - rc = ISCSI_ERR_INVAL; - break; -diff --git a/usr/types.h b/usr/types.h -index 77e3f97..9d9ba86 100644 ---- a/usr/types.h -+++ b/usr/types.h -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - - /* - * using the __be types allows stricter static --- -1.8.3.1 - diff --git a/0029-iscsi-tools-Print-additional-session-info-for-flashn.patch b/0029-iscsi-tools-Print-additional-session-info-for-flashn.patch deleted file mode 100644 index 7fb3fb3..0000000 --- a/0029-iscsi-tools-Print-additional-session-info-for-flashn.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 181af9ac81bccbf8e63a755d48babb2e65de1d4e Mon Sep 17 00:00:00 2001 -From: Vikas Chaudhary -Date: Tue, 9 Jul 2013 08:17:15 -0400 -Subject: [PATCH] iscsi tools: Print additional session info for flashnode - session - -Signed-off-by: Vikas Chaudhary -Signed-off-by: Adheer Chandravanshi ---- - usr/session_info.c | 24 +++++++++++++++++++----- - 1 file changed, 19 insertions(+), 5 deletions(-) - -diff --git a/usr/session_info.c b/usr/session_info.c -index de156c6..2f48e65 100644 ---- a/usr/session_info.c -+++ b/usr/session_info.c -@@ -64,20 +64,32 @@ void session_info_free_list(struct list_head *list) - } - } - -+static char *get_iscsi_node_type(struct session_info *info) -+{ -+ int pid = iscsi_sysfs_session_user_created(info->sid); -+ -+ if (!pid) -+ return "flash"; -+ else -+ return "non-flash"; -+} -+ - static int session_info_print_flat(void *data, struct session_info *info) - { - struct iscsi_transport *t = iscsi_sysfs_get_transport_by_sid(info->sid); - - if (strchr(info->persistent_address, '.')) -- printf("%s: [%d] %s:%d,%d %s\n", -+ printf("%s: [%d] %s:%d,%d %s (%s)\n", - t ? t->name : UNKNOWN_VALUE, - info->sid, info->persistent_address, -- info->persistent_port, info->tpgt, info->targetname); -+ info->persistent_port, info->tpgt, info->targetname, -+ get_iscsi_node_type(info)); - else -- printf("%s: [%d] [%s]:%d,%d %s\n", -+ printf("%s: [%d] [%s]:%d,%d %s (%s)\n", - t ? t->name : UNKNOWN_VALUE, - info->sid, info->persistent_address, -- info->persistent_port, info->tpgt, info->targetname); -+ info->persistent_port, info->tpgt, info->targetname, -+ get_iscsi_node_type(info)); - return 0; - } - -@@ -230,7 +242,8 @@ void session_info_print_tree(struct list_head *list, char *prefix, - - list_for_each_entry(curr, list, list) { - if (!prev || strcmp(prev->targetname, curr->targetname)) { -- printf("%sTarget: %s\n", prefix, curr->targetname); -+ printf("%sTarget: %s (%s)\n", prefix, curr->targetname, -+ get_iscsi_node_type(curr)); - prev = NULL; - } - -@@ -278,6 +291,7 @@ void session_info_print_tree(struct list_head *list, char *prefix, - printf("%s\t\tSID: %d\n", prefix, curr->sid); - print_iscsi_state(curr->sid, prefix); - } -+ - if (flags & SESSION_INFO_ISCSI_TIM) { - printf("%s\t\t*********\n", prefix); - printf("%s\t\tTimeouts:\n", prefix); --- -1.8.3.1 - diff --git a/0030-iscsi-tools-sync-iscsi_if.h-with-kernel-space.patch b/0030-iscsi-tools-sync-iscsi_if.h-with-kernel-space.patch deleted file mode 100644 index ed21d58..0000000 --- a/0030-iscsi-tools-sync-iscsi_if.h-with-kernel-space.patch +++ /dev/null @@ -1,369 +0,0 @@ -From 82c853344888c2d541d6445a08ab31cbcf1c140f Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Wed, 11 Sep 2013 17:31:39 -0700 -Subject: [PATCH] iscsi tools: sync iscsi_if.h with kernel space - -This patches syncs iscsi_if.h with upstream commit - -commit ae542edb11c79706cd74d7bd54ebd7702965a7f3 -Author: Adheer Chandravanshi -Date: Mon Jul 1 05:54:11 2013 -0400 - - [SCSI] scsi_transport_iscsi: Exporting new attrs for iscsi session -and conne ---- - include/iscsi_if.h | 204 ++++++++++++++++++------------------------------- - usr/initiator.c | 12 +-- - usr/initiator.h | 1 + - usr/initiator_common.c | 38 +++++---- - 4 files changed, 99 insertions(+), 156 deletions(-) - -diff --git a/include/iscsi_if.h b/include/iscsi_if.h -index 20f2bc2..01d38e7 100644 ---- a/include/iscsi_if.h -+++ b/include/iscsi_if.h -@@ -495,47 +495,64 @@ enum iscsi_param { - - ISCSI_PARAM_TGT_RESET_TMO, - ISCSI_PARAM_TARGET_ALIAS, -+ -+ ISCSI_PARAM_CHAP_IN_IDX, -+ ISCSI_PARAM_CHAP_OUT_IDX, -+ -+ ISCSI_PARAM_BOOT_ROOT, -+ ISCSI_PARAM_BOOT_NIC, -+ ISCSI_PARAM_BOOT_TARGET, -+ -+ ISCSI_PARAM_AUTO_SND_TGT_DISABLE, -+ ISCSI_PARAM_DISCOVERY_SESS, -+ ISCSI_PARAM_PORTAL_TYPE, -+ ISCSI_PARAM_CHAP_AUTH_EN, -+ ISCSI_PARAM_DISCOVERY_LOGOUT_EN, -+ ISCSI_PARAM_BIDI_CHAP_EN, -+ ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL, -+ -+ ISCSI_PARAM_DEF_TIME2WAIT, -+ ISCSI_PARAM_DEF_TIME2RETAIN, -+ ISCSI_PARAM_MAX_SEGMENT_SIZE, -+ ISCSI_PARAM_STATSN, -+ ISCSI_PARAM_KEEPALIVE_TMO, -+ ISCSI_PARAM_LOCAL_PORT, -+ ISCSI_PARAM_TSID, -+ ISCSI_PARAM_DEF_TASKMGMT_TMO, -+ -+ ISCSI_PARAM_TCP_TIMESTAMP_STAT, -+ ISCSI_PARAM_TCP_WSF_DISABLE, -+ ISCSI_PARAM_TCP_NAGLE_DISABLE, -+ ISCSI_PARAM_TCP_TIMER_SCALE, -+ ISCSI_PARAM_TCP_TIMESTAMP_EN, -+ ISCSI_PARAM_TCP_XMIT_WSF, -+ ISCSI_PARAM_TCP_RECV_WSF, -+ ISCSI_PARAM_IP_FRAGMENT_DISABLE, -+ ISCSI_PARAM_IPV4_TOS, -+ ISCSI_PARAM_IPV6_TC, -+ ISCSI_PARAM_IPV6_FLOW_LABEL, -+ ISCSI_PARAM_IS_FW_ASSIGNED_IPV6, -+ -+ ISCSI_PARAM_DISCOVERY_PARENT_IDX, -+ ISCSI_PARAM_DISCOVERY_PARENT_TYPE, - /* must always be last */ - ISCSI_PARAM_MAX, - }; - --#define ISCSI_MAX_RECV_DLENGTH (1ULL << ISCSI_PARAM_MAX_RECV_DLENGTH) --#define ISCSI_MAX_XMIT_DLENGTH (1ULL << ISCSI_PARAM_MAX_XMIT_DLENGTH) --#define ISCSI_HDRDGST_EN (1ULL << ISCSI_PARAM_HDRDGST_EN) --#define ISCSI_DATADGST_EN (1ULL << ISCSI_PARAM_DATADGST_EN) --#define ISCSI_INITIAL_R2T_EN (1ULL << ISCSI_PARAM_INITIAL_R2T_EN) --#define ISCSI_MAX_R2T (1ULL << ISCSI_PARAM_MAX_R2T) --#define ISCSI_IMM_DATA_EN (1ULL << ISCSI_PARAM_IMM_DATA_EN) --#define ISCSI_FIRST_BURST (1ULL << ISCSI_PARAM_FIRST_BURST) --#define ISCSI_MAX_BURST (1ULL << ISCSI_PARAM_MAX_BURST) --#define ISCSI_PDU_INORDER_EN (1ULL << ISCSI_PARAM_PDU_INORDER_EN) --#define ISCSI_DATASEQ_INORDER_EN (1ULL << ISCSI_PARAM_DATASEQ_INORDER_EN) --#define ISCSI_ERL (1ULL << ISCSI_PARAM_ERL) --#define ISCSI_IFMARKER_EN (1ULL << ISCSI_PARAM_IFMARKER_EN) --#define ISCSI_OFMARKER_EN (1ULL << ISCSI_PARAM_OFMARKER_EN) --#define ISCSI_EXP_STATSN (1ULL << ISCSI_PARAM_EXP_STATSN) --#define ISCSI_TARGET_NAME (1ULL << ISCSI_PARAM_TARGET_NAME) --#define ISCSI_TPGT (1ULL << ISCSI_PARAM_TPGT) --#define ISCSI_PERSISTENT_ADDRESS (1ULL << ISCSI_PARAM_PERSISTENT_ADDRESS) --#define ISCSI_PERSISTENT_PORT (1ULL << ISCSI_PARAM_PERSISTENT_PORT) --#define ISCSI_SESS_RECOVERY_TMO (1ULL << ISCSI_PARAM_SESS_RECOVERY_TMO) --#define ISCSI_CONN_PORT (1ULL << ISCSI_PARAM_CONN_PORT) --#define ISCSI_CONN_ADDRESS (1ULL << ISCSI_PARAM_CONN_ADDRESS) --#define ISCSI_USERNAME (1ULL << ISCSI_PARAM_USERNAME) --#define ISCSI_USERNAME_IN (1ULL << ISCSI_PARAM_USERNAME_IN) --#define ISCSI_PASSWORD (1ULL << ISCSI_PARAM_PASSWORD) --#define ISCSI_PASSWORD_IN (1ULL << ISCSI_PARAM_PASSWORD_IN) --#define ISCSI_FAST_ABORT (1ULL << ISCSI_PARAM_FAST_ABORT) --#define ISCSI_ABORT_TMO (1ULL << ISCSI_PARAM_ABORT_TMO) --#define ISCSI_LU_RESET_TMO (1ULL << ISCSI_PARAM_LU_RESET_TMO) --#define ISCSI_HOST_RESET_TMO (1ULL << ISCSI_PARAM_HOST_RESET_TMO) --#define ISCSI_PING_TMO (1ULL << ISCSI_PARAM_PING_TMO) --#define ISCSI_RECV_TMO (1ULL << ISCSI_PARAM_RECV_TMO) --#define ISCSI_IFACE_NAME (1ULL << ISCSI_PARAM_IFACE_NAME) --#define ISCSI_ISID (1ULL << ISCSI_PARAM_ISID) --#define ISCSI_INITIATOR_NAME (1ULL << ISCSI_PARAM_INITIATOR_NAME) --#define ISCSI_TGT_RESET_TMO (1ULL << ISCSI_PARAM_TGT_RESET_TMO) --#define ISCSI_TARGET_ALIAS (1ULL << ISCSI_PARAM_TARGET_ALIAS) -+/* iSCSI HBA params */ -+enum iscsi_host_param { -+ ISCSI_HOST_PARAM_HWADDRESS, -+ ISCSI_HOST_PARAM_INITIATOR_NAME, -+ ISCSI_HOST_PARAM_NETDEV_NAME, -+ ISCSI_HOST_PARAM_IPADDRESS, -+ ISCSI_HOST_PARAM_PORT_STATE, -+ ISCSI_HOST_PARAM_PORT_SPEED, -+ ISCSI_HOST_PARAM_MAX, -+}; -+ -+/* portal type */ -+#define PORTAL_TYPE_IPV4 "ipv4" -+#define PORTAL_TYPE_IPV6 "ipv6" - - /* iSCSI Flash Target params */ - enum iscsi_flashnode_param { -@@ -603,106 +620,32 @@ enum iscsi_flashnode_param { - ISCSI_FLASHNODE_MAX, - }; - --#define ISCSI_FNODE_IS_FW_ASSIGNED_IPV6 \ -- (1ULL << ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6) --#define ISCSI_FNODE_PORTAL_TYPE (1ULL << ISCSI_FLASHNODE_PORTAL_TYPE) --#define ISCSI_FNODE_AUTO_SND_TGT_DISABLE \ -- (1ULL << ISCSI_FLASHNODE_OPT_AUTO_SND_TGT_DISABLE) --#define ISCSI_FNODE_DISCOVERY_SESS \ -- (1ULL << ISCSI_FLASHNODE_OPT_DISCOVERY_SESS) --#define ISCSI_FNODE_ENTRY_EN (1ULL << ISCSI_FLASHNODE_ENTRY_EN) --#define ISCSI_FNODE_HDR_DGST_EN (1ULL << ISCSI_FLASHNODE_HDR_DGST_EN) --#define ISCSI_FNODE_DATA_DGST_EN (1ULL << ISCSI_FLASHNODE_DATA_DGST_EN) --#define ISCSI_FNODE_IMM_DATA_EN (1ULL << ISCSI_FLASHNODE_IMM_DATA_EN) --#define ISCSI_FNODE_INITIAL_R2T_EN (1ULL << ISCSI_FLASHNODE_INITIAL_R2T_EN) --#define ISCSI_FNODE_DATASEQ_INORDER \ -- (1ULL << ISCSI_FLASHNODE_DATASEQ_INORDER) --#define ISCSI_FNODE_PDU_INORDER (1ULL << ISCSI_FLASHNODE_PDU_INORDER) --#define ISCSI_FNODE_CHAP_AUTH_EN (1ULL << ISCSI_FLASHNODE_CHAP_AUTH_EN) --#define ISCSI_FNODE_SNACK_REQ_EN (1ULL << ISCSI_FLASHNODE_SNACK_REQ_EN) --#define ISCSI_FNODE_DISCOVERY_LOGOUT_EN \ -- (1ULL << ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN) --#define ISCSI_FNODE_BIDI_CHAP_EN (1ULL << ISCSI_FLASHNODE_BIDI_CHAP_EN) --#define ISCSI_FNODE_DISCOVERY_AUTH_OPTIONAL \ -- (1ULL << ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL) --#define ISCSI_FNODE_ERL (1ULL << ISCSI_FLASHNODE_ERL) --#define ISCSI_FNODE_TCP_TIMESTAMP_STAT \ -- (1ULL << ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT) --#define ISCSI_FNODE_TCP_NAGLE_DISABLE \ -- (1ULL << ISCSI_FLASHNODE_TCP_NAGLE_DISABLE) --#define ISCSI_FNODE_TCP_WSF_DISABLE \ -- (1ULL << ISCSI_FLASHNODE_TCP_WSF_DISABLE) --#define ISCSI_FNODE_TCP_TIMER_SCALE \ -- (1ULL << ISCSI_FLASHNODE_TCP_TIMER_SCALE) --#define ISCSI_FNODE_TCP_TIMESTAMP_ENABLE \ -- (1ULL << ISCSI_FLASHNODE_TCP_TIMESTAMP_ENABLE) --#define ISCSI_FNODE_IP_FRAG_DISABLE \ -- (1ULL << ISCSI_FLASHNODE_IP_FRAG_DISABLE) --#define ISCSI_FNODE_MAX_RECV_DLENGTH \ -- (1ULL << ISCSI_FLASHNODE_MAX_RECV_DLENGTH) --#define ISCSI_FNODE_MAX_XMIT_DLENGTH \ -- (1ULL << ISCSI_FLASHNODE_MAX_XMIT_DLENGTH) --#define ISCSI_FNODE_FIRST_BURST (1ULL << ISCSI_FLASHNODE_FIRST_BURST) --#define ISCSI_FNODE_DEF_TIME2WAIT (1ULL << ISCSI_FLASHNODE_DEF_TIME2WAIT) --#define ISCSI_FNODE_DEF_TIME2RETAIN \ -- (1ULL << ISCSI_FLASHNODE_DEF_TIME2RETAIN) --#define ISCSI_FNODE_MAX_R2T (1ULL << ISCSI_FLASHNODE_MAX_R2T) --#define ISCSI_FNODE_KEEPALIVE_TMO (1ULL << ISCSI_FLASHNODE_KEEPALIVE_TMO) --#define ISCSI_FNODE_ISID (1ULL << ISCSI_FLASHNODE_ISID) --#define ISCSI_FNODE_TSID (1ULL << ISCSI_FLASHNODE_TSID) --#define ISCSI_FNODE_PORT (1ULL << ISCSI_FLASHNODE_PORT) --#define ISCSI_FNODE_MAX_BURST (1ULL << ISCSI_FLASHNODE_MAX_BURST) --#define ISCSI_FNODE_DEF_TMF_TMO (1ULL << ISCSI_FLASHNODE_DEF_TMF_TMO) --#define ISCSI_FNODE_IPADDR (1ULL << ISCSI_FLASHNODE_IPADDR) --#define ISCSI_FNODE_ALIAS (1ULL << ISCSI_FLASHNODE_ALIAS) --#define ISCSI_FNODE_REDIRECT_IPADDR \ -- (1ULL << ISCSI_FLASHNODE_REDIRECT_IPADDR) --#define ISCSI_FNODE_MAX_SEGMENT_SIZE \ -- (1ULL << ISCSI_FLASHNODE_MAX_SEGMENT_SIZE) --#define ISCSI_FNODE_LOCAL_PORT (1ULL << ISCSI_FLASHNODE_LOCAL_PORT) --#define ISCSI_FNODE_IPV4_TOS (1ULL << ISCSI_FLASHNODE_IPV4_TOS) --#define ISCSI_FNODE_IPV6_TC (1ULL << ISCSI_FLASHNODE_IPV6_TC) --#define ISCSI_FNODE_IPV6_FLOW_LABEL \ -- (1ULL << ISCSI_FLASHNODE_IPV6_FLOW_LABEL) --#define ISCSI_FNODE_NAME (1ULL << ISCSI_FLASHNODE_NAME) --#define ISCSI_FNODE_TPGT (1ULL << ISCSI_FLASHNODE_TPGT) --#define ISCSI_FNODE_LINK_LOCAL_IPV6 \ -- (1ULL << ISCSI_FLASHNODE_LINK_LOCAL_IPV6) --#define ISCSI_FNODE_DISCOVERY_PARENT_IDX \ -- (1ULL << ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX) --#define ISCSI_FNODE_DISCOVERY_PARENT_TYPE \ -- (1ULL << ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE) --#define ISCSI_FNODE_TCP_XMIT_WSF (1ULL << ISCSI_FLASHNODE_TCP_XMIT_WSF) --#define ISCSI_FNODE_TCP_RECV_WSF (1ULL << ISCSI_FLASHNODE_TCP_RECV_WSF) --#define ISCSI_FNODE_CHAP_IN_IDX (1ULL << ISCSI_FLASHNODE_CHAP_IN_IDX) --#define ISCSI_FNODE_CHAP_OUT_IDX (1ULL << ISCSI_FLASHNODE_CHAP_OUT_IDX) --#define ISCSI_FNODE_USERNAME (1ULL << ISCSI_FLASHNODE_USERNAME) --#define ISCSI_FNODE_USERNAME_IN (1ULL << ISCSI_FLASHNODE_USERNAME_IN) --#define ISCSI_FNODE_PASSWORD (1ULL << ISCSI_FLASHNODE_PASSWORD) --#define ISCSI_FNODE_PASSWORD_IN (1ULL << ISCSI_FLASHNODE_PASSWORD_IN) --#define ISCSI_FNODE_STATSN (1ULL << ISCSI_FLASHNODE_STATSN) --#define ISCSI_FNODE_EXP_STATSN (1ULL << ISCSI_FLASHNODE_EXP_STATSN) --#define ISCSI_FNODE_IS_BOOT_TGT (1ULL << ISCSI_FLASHNODE_IS_BOOT_TGT) -- - struct iscsi_flashnode_param_info { - uint32_t len; /* Actual length of the param */ - uint16_t param; /* iscsi param value */ - uint8_t value[0]; /* length sized value follows */ - } __attribute__((__packed__)); - --/* iSCSI HBA params */ --enum iscsi_host_param { -- ISCSI_HOST_PARAM_HWADDRESS, -- ISCSI_HOST_PARAM_INITIATOR_NAME, -- ISCSI_HOST_PARAM_NETDEV_NAME, -- ISCSI_HOST_PARAM_IPADDRESS, -- ISCSI_HOST_PARAM_MAX, -+enum iscsi_discovery_parent_type { -+ ISCSI_DISC_PARENT_UNKNOWN = 0x1, -+ ISCSI_DISC_PARENT_SENDTGT = 0x2, -+ ISCSI_DISC_PARENT_ISNS = 0x3, - }; - --#define ISCSI_HOST_HWADDRESS (1ULL << ISCSI_HOST_PARAM_HWADDRESS) --#define ISCSI_HOST_INITIATOR_NAME (1ULL << ISCSI_HOST_PARAM_INITIATOR_NAME) --#define ISCSI_HOST_NETDEV_NAME (1ULL << ISCSI_HOST_PARAM_NETDEV_NAME) --#define ISCSI_HOST_IPADDRESS (1ULL << ISCSI_HOST_PARAM_IPADDRESS) -+/* iSCSI port Speed */ -+enum iscsi_port_speed { -+ ISCSI_PORT_SPEED_UNKNOWN = 0x1, -+ ISCSI_PORT_SPEED_10MBPS = 0x2, -+ ISCSI_PORT_SPEED_100MBPS = 0x4, -+ ISCSI_PORT_SPEED_1GBPS = 0x8, -+ ISCSI_PORT_SPEED_10GBPS = 0x10, -+}; -+ -+/* iSCSI port state */ -+enum iscsi_port_state { -+ ISCSI_PORT_STATE_DOWN = 0x1, -+ ISCSI_PORT_STATE_UP = 0x2, -+}; - - /* iSCSI PING status/error code */ - enum iscsi_ping_status_code { -@@ -739,7 +682,7 @@ enum iscsi_ping_status_code { - #define CAP_DIGEST_OFFLOAD 0x1000 /* offload hdr and data digests */ - #define CAP_PADDING_OFFLOAD 0x2000 /* offload padding insertion, removal, - and verification */ --#define CAP_LOGIN_OFFLOAD 0x4000 /* offload normal session login */ -+#define CAP_LOGIN_OFFLOAD 0x4000 /* offload session login */ - - /* - * These flags describes reason of stop_conn() call -@@ -807,7 +750,6 @@ enum chap_type_e { - - #define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256 - #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256 -- - struct iscsi_chap_rec { - uint16_t chap_tbl_idx; - enum chap_type_e chap_type; -diff --git a/usr/initiator.c b/usr/initiator.c -index a3b24b7..79d1779 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -384,17 +384,7 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t) - /* setup authentication variables for the session*/ - iscsi_setup_authentication(session, &rec->session.auth); - -- session->param_mask = ~0ULL; -- if (!(t->caps & CAP_MULTI_R2T)) -- session->param_mask &= ~ISCSI_MAX_R2T; -- if (!(t->caps & CAP_HDRDGST)) -- session->param_mask &= ~ISCSI_HDRDGST_EN; -- if (!(t->caps & CAP_DATADGST)) -- session->param_mask &= ~ISCSI_DATADGST_EN; -- if (!(t->caps & CAP_MARKERS)) { -- session->param_mask &= ~ISCSI_IFMARKER_EN; -- session->param_mask &= ~ISCSI_OFMARKER_EN; -- } -+ iscsi_session_init_params(session); - - hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, &rc); - if (!rc) { -diff --git a/usr/initiator.h b/usr/initiator.h -index d6dc02e..680640c 100644 ---- a/usr/initiator.h -+++ b/usr/initiator.h -@@ -357,5 +357,6 @@ extern int iscsi_setup_portal(struct iscsi_conn *conn, char *address, int port); - extern int iscsi_set_net_config(struct iscsi_transport *t, - iscsi_session_t *session, - struct iface_rec *iface); -+extern void iscsi_session_init_params(struct iscsi_session *session); - - #endif /* INITIATOR_H */ -diff --git a/usr/initiator_common.c b/usr/initiator_common.c -index eb72795..0fb7edc 100644 ---- a/usr/initiator_common.c -+++ b/usr/initiator_common.c -@@ -324,12 +324,32 @@ int iscsi_host_set_params(struct iscsi_session *session) - return 0; - } - -+static inline void iscsi_session_clear_param(struct iscsi_session *session, -+ int param) -+{ -+ session->param_mask &= ~(1ULL << param); -+} -+ -+void iscsi_session_init_params(struct iscsi_session *session) -+{ -+ session->param_mask = ~0ULL; -+ if (!(session->t->caps & CAP_MULTI_R2T)) -+ iscsi_session_clear_param(session, ISCSI_PARAM_MAX_R2T); -+ if (!(session->t->caps & CAP_HDRDGST)) -+ iscsi_session_clear_param(session, ISCSI_PARAM_HDRDGST_EN); -+ if (!(session->t->caps & CAP_DATADGST)) -+ iscsi_session_clear_param(session, ISCSI_PARAM_DATADGST_EN); -+ if (!(session->t->caps & CAP_MARKERS)) { -+ iscsi_session_clear_param(session, ISCSI_PARAM_IFMARKER_EN); -+ iscsi_session_clear_param(session, ISCSI_PARAM_OFMARKER_EN); -+ } -+} -+ - #define MAX_SESSION_PARAMS 32 - - int iscsi_session_set_params(struct iscsi_conn *conn) - { - struct iscsi_session *session = conn->session; -- struct iscsi_transport *t = session->t; - int i, rc; - uint32_t one = 1, zero = 0; - struct connparam { -@@ -499,22 +519,12 @@ int iscsi_session_set_params(struct iscsi_conn *conn) - }, - }; - -- session->param_mask = ~0ULL; -- if (!(t->caps & CAP_MULTI_R2T)) -- session->param_mask &= ~ISCSI_MAX_R2T; -- if (!(t->caps & CAP_HDRDGST)) -- session->param_mask &= ~ISCSI_HDRDGST_EN; -- if (!(t->caps & CAP_DATADGST)) -- session->param_mask &= ~ISCSI_DATADGST_EN; -- if (!(t->caps & CAP_MARKERS)) { -- session->param_mask &= ~ISCSI_IFMARKER_EN; -- session->param_mask &= ~ISCSI_OFMARKER_EN; -- } -+ iscsi_session_init_params(session); - - /* some llds will send nops internally */ - if (!iscsi_sysfs_session_supports_nop(session->id)) { -- session->param_mask &= ~ISCSI_PING_TMO; -- session->param_mask &= ~ISCSI_RECV_TMO; -+ iscsi_session_clear_param(session, ISCSI_PARAM_PING_TMO); -+ iscsi_session_clear_param(session, ISCSI_PARAM_RECV_TMO); - } - - /* Entered full-feature phase! */ --- -1.8.3.1 - diff --git a/0031-PATCH-v5-1-3-ISCSISTART-Saved-ibft-boot-info-to-the-.patch b/0031-PATCH-v5-1-3-ISCSISTART-Saved-ibft-boot-info-to-the-.patch deleted file mode 100644 index 6b15ca3..0000000 --- a/0031-PATCH-v5-1-3-ISCSISTART-Saved-ibft-boot-info-to-the-.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 5992173f13550d75659fec1d7e1f6e87895d560a Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Wed, 11 Sep 2013 23:59:31 -0700 -Subject: [PATCH] [PATCH v5 1/3] ISCSISTART: Saved ibft boot info to the - session - -Patch and description from Eddie Wai: - -Three new session sysfs parameters are introduced: -boot_root - holds the ibft boot root folder name -boot_nic - holds the ibft boot ethernetN name -boot_target - holds the ibft boot targetN name - -This patch copies over the /sys/firmware//ethernetN/targetN -info -from the boot context to the node_rec. - -Signed-off-by: Eddie Wai ---- - include/fw_context.h | 3 +++ - include/iscsi_proto.h | 1 + - usr/config.h | 3 +++ - usr/idbm.c | 6 ++++++ - usr/initiator_common.c | 14 +++++++++++++- - utils/fwparam_ibft/fwparam_sysfs.c | 8 ++++++++ - 6 files changed, 34 insertions(+), 1 deletion(-) - -diff --git a/include/fw_context.h b/include/fw_context.h -index 1640859..6563d68 100644 ---- a/include/fw_context.h -+++ b/include/fw_context.h -@@ -30,6 +30,9 @@ - - struct boot_context { - struct list_head list; -+ char boot_root[BOOT_NAME_MAXLEN]; -+ char boot_nic[BOOT_NAME_MAXLEN]; -+ char boot_target[BOOT_NAME_MAXLEN]; - - /* target settings */ - int target_port; -diff --git a/include/iscsi_proto.h b/include/iscsi_proto.h -index 1c69feb..56f757b 100644 ---- a/include/iscsi_proto.h -+++ b/include/iscsi_proto.h -@@ -619,6 +619,7 @@ struct iscsi_reject { - #define KEY_MAXLEN 64 - #define VALUE_MAXLEN 255 - #define TARGET_NAME_MAXLEN VALUE_MAXLEN -+#define BOOT_NAME_MAXLEN 256 - - #define ISCSI_DEF_MAX_RECV_SEG_LEN 8192 - #define ISCSI_MIN_MAX_RECV_SEG_LEN 512 -diff --git a/usr/config.h b/usr/config.h -index 998caff..d457bdd 100644 ---- a/usr/config.h -+++ b/usr/config.h -@@ -201,6 +201,9 @@ typedef struct session_rec { - * allowed to be initiated on this record - */ - unsigned char multiple; -+ char boot_root[BOOT_NAME_MAXLEN]; -+ char boot_nic[BOOT_NAME_MAXLEN]; -+ char boot_target[BOOT_NAME_MAXLEN]; - } session_rec_t; - - #define ISCSI_TRANSPORT_NAME_MAXLEN 16 -diff --git a/usr/idbm.c b/usr/idbm.c -index bc06058..1e4f8c8 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -2748,6 +2748,12 @@ struct node_rec *idbm_create_rec_from_boot_context(struct boot_context *context) - strlen((char *)context->chap_password); - rec->session.auth.password_in_length = - strlen((char *)context->chap_password_in); -+ strlcpy(rec->session.boot_root, context->boot_root, -+ sizeof(context->boot_root)); -+ strlcpy(rec->session.boot_nic, context->boot_nic, -+ sizeof(context->boot_nic)); -+ strlcpy(rec->session.boot_target, context->boot_target, -+ sizeof(context->boot_target)); - - iface_setup_from_boot_context(&rec->iface, context); - -diff --git a/usr/initiator_common.c b/usr/initiator_common.c -index 0fb7edc..e2e87a1 100644 ---- a/usr/initiator_common.c -+++ b/usr/initiator_common.c -@@ -345,7 +345,7 @@ void iscsi_session_init_params(struct iscsi_session *session) - } - } - --#define MAX_SESSION_PARAMS 32 -+#define MAX_SESSION_PARAMS 35 - - int iscsi_session_set_params(struct iscsi_conn *conn) - { -@@ -516,6 +516,18 @@ int iscsi_session_set_params(struct iscsi_conn *conn) - .param = ISCSI_PARAM_INITIATOR_NAME, - .value = session->initiator_name, - .type = ISCSI_STRING, -+ }, { -+ .param = ISCSI_PARAM_BOOT_ROOT, -+ .value = session->nrec.session.boot_root, -+ .type = ISCSI_STRING, -+ }, { -+ .param = ISCSI_PARAM_BOOT_NIC, -+ .value = session->nrec.session.boot_nic, -+ .type = ISCSI_STRING, -+ }, { -+ .param = ISCSI_PARAM_BOOT_TARGET, -+ .value = session->nrec.session.boot_target, -+ .type = ISCSI_STRING, - }, - }; - -diff --git a/utils/fwparam_ibft/fwparam_sysfs.c b/utils/fwparam_ibft/fwparam_sysfs.c -index 3997363..2f37b59 100644 ---- a/utils/fwparam_ibft/fwparam_sysfs.c -+++ b/utils/fwparam_ibft/fwparam_sysfs.c -@@ -200,6 +200,9 @@ static int fill_nic_context(char *subsys, char *id, - strlcpy(context->scsi_host_name, subsys, - sizeof(context->scsi_host_name)); - -+ memset(&context->boot_nic, 0, sizeof(context->boot_nic)); -+ snprintf(context->boot_nic, sizeof(context->boot_nic), "%s", id); -+ - sysfs_get_str(id, subsys, "ip-addr", context->ipaddr, - sizeof(context->ipaddr)); - sysfs_get_str(id, subsys, "vlan", context->vlan, -@@ -224,6 +227,8 @@ static void fill_initiator_context(char *subsys, struct boot_context *context) - sizeof(context->initiatorname)); - sysfs_get_str("initiator", subsys, "isid", context->isid, - sizeof(context->isid)); -+ -+ strlcpy(context->boot_root, subsys, sizeof(context->boot_root)); - } - static int fill_tgt_context(char *subsys, char *id, - struct boot_context *context) -@@ -240,6 +245,9 @@ static int fill_tgt_context(char *subsys, char *id, - if (rc) - return rc; - -+ memset(&context->boot_target, 0, sizeof(context->boot_target)); -+ snprintf(context->boot_target, sizeof(context->boot_target), "%s", id); -+ - /* - * We can live without the rest of they do not exist. If we - * failed to get them we will figure it out when we login. --- -1.8.3.1 - diff --git a/0032-ISCSID-Added-the-extraction-of-the-session-boot-info.patch b/0032-ISCSID-Added-the-extraction-of-the-session-boot-info.patch deleted file mode 100644 index 854127c..0000000 --- a/0032-ISCSID-Added-the-extraction-of-the-session-boot-info.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 487c312c96379e45648c782cee5b0d469cba80d0 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Fri, 23 Aug 2013 14:04:11 -0700 -Subject: [PATCH] ISCSID: Added the extraction of the session boot info - -This patch does the work to extract the corresponding -->ethernetN net params as specified from the kernel -session boot_nic sysfs entry based on the transport param -use_boot_info. - -This is only populated for iscsi_tcp and bnx2i. - -Signed-off-by: Eddie Wai ---- - usr/iscsi_sysfs.c | 40 ++++++++++++++++++++++++++++++++++++++++ - usr/transport.c | 1 + - usr/transport.h | 1 + - 3 files changed, 42 insertions(+) - -diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c -index aed10a3..56cb90c 100644 ---- a/usr/iscsi_sysfs.c -+++ b/usr/iscsi_sysfs.c -@@ -674,6 +674,43 @@ free_fnode: - return rc; - } - -+static int iscsi_sysfs_read_boot(struct iface_rec *iface, char *session) -+{ -+ char boot_root[BOOT_NAME_MAXLEN], boot_nic[BOOT_NAME_MAXLEN]; -+ char boot_name[BOOT_NAME_MAXLEN], boot_content[BOOT_NAME_MAXLEN]; -+ -+ /* Extract boot info */ -+ strlcpy(boot_name, "boot_target", sizeof(boot_name)); -+ if (sysfs_get_str(session, ISCSI_SESSION_SUBSYS, boot_name, -+ boot_content, BOOT_NAME_MAXLEN)) -+ return -1; -+ strlcpy(boot_name, "boot_nic", sizeof(boot_name)); -+ if (sysfs_get_str(session, ISCSI_SESSION_SUBSYS, boot_name, boot_nic, -+ BOOT_NAME_MAXLEN)) -+ return -1; -+ strlcpy(boot_name, "boot_root", sizeof(boot_name)); -+ if (sysfs_get_str(session, ISCSI_SESSION_SUBSYS, boot_name, boot_root, -+ BOOT_NAME_MAXLEN)) -+ return -1; -+ -+ /* If all boot_root/boot_target/boot_nic exist, then extract the -+ info from the boot nic */ -+ if (sysfs_get_str(boot_nic, boot_root, "vlan", boot_content, -+ BOOT_NAME_MAXLEN)) -+ log_debug(5, "could not read %s/%s/vlan", boot_root, boot_nic); -+ else -+ iface->vlan_id = atoi(boot_content); -+ -+ if (sysfs_get_str(boot_nic, boot_root, "subnet-mask", -+ iface->subnet_mask, NI_MAXHOST)) -+ log_debug(5, "could not read %s/%s/subnet", boot_root, -+ boot_nic); -+ -+ log_debug(5, "sysfs read boot returns %s/%s/ vlan = %d subnet = %s", -+ boot_root, boot_nic, iface->vlan_id, iface->subnet_mask); -+ return 0; -+} -+ - /* - * Read in iface settings based on host and session values. If - * session is not passed in, then the ifacename will not be set. And -@@ -802,6 +839,9 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, - } - } - -+ if (session && t->template->use_boot_info) -+ iscsi_sysfs_read_boot(iface, session); -+ - if (!iface_kern_id) - goto done; - -diff --git a/usr/transport.c b/usr/transport.c -index 52b7674..2f38519 100644 ---- a/usr/transport.c -+++ b/usr/transport.c -@@ -77,6 +77,7 @@ struct iscsi_transport_template cxgb4i = { - struct iscsi_transport_template bnx2i = { - .name = "bnx2i", - .set_host_ip = 1, -+ .use_boot_info = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -diff --git a/usr/transport.h b/usr/transport.h -index 5dcf872..388e4b1 100644 ---- a/usr/transport.h -+++ b/usr/transport.h -@@ -31,6 +31,7 @@ struct iscsi_transport_template { - * the host's ip address. - */ - uint8_t set_host_ip; -+ uint8_t use_boot_info; - int (*ep_connect) (struct iscsi_conn *conn, int non_blocking); - int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms); - void (*ep_disconnect) (struct iscsi_conn *conn); --- -1.8.3.1 - diff --git a/0033-ISCSID-Added-iface-content-override-fix.patch b/0033-ISCSID-Added-iface-content-override-fix.patch deleted file mode 100644 index 1b923ae..0000000 --- a/0033-ISCSID-Added-iface-content-override-fix.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 3b4b45001b6d8412aad76a55347de42d30d694f7 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Fri, 23 Aug 2013 14:04:12 -0700 -Subject: [PATCH] ISCSID: Added iface content override fix - -Patch provided by Mike Christie. - -This patch fixes the unconditional overwrite of the iface struct -even when the corresponding iface info from the node config was -found and extracted. - -Signed-off-by: Eddie Wai ---- - usr/iscsid.c | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -diff --git a/usr/iscsid.c b/usr/iscsid.c -index 8f19220..d1756ef 100644 ---- a/usr/iscsid.c -+++ b/usr/iscsid.c -@@ -111,9 +111,7 @@ setup_rec_from_negotiated_values(node_rec_t *rec, struct session_info *info) - strlcpy(rec->name, info->targetname, TARGET_NAME_MAXLEN); - rec->conn[0].port = info->persistent_port; - strlcpy(rec->conn[0].address, info->persistent_address, NI_MAXHOST); -- memcpy(&rec->iface, &info->iface, sizeof(struct iface_rec)); - rec->tpgt = info->tpgt; -- iface_copy(&rec->iface, &info->iface); - - iscsi_sysfs_get_negotiated_session_conf(info->sid, &session_conf); - iscsi_sysfs_get_negotiated_conn_conf(info->sid, &conn_conf); -@@ -238,6 +236,7 @@ static int sync_session(void *data, struct session_info *info) - log_warning("Could not read data from db. Using default and " - "currently negotiated values\n"); - setup_rec_from_negotiated_values(&rec, info); -+ iface_copy(&rec.iface, &info->iface); - } else { - /* - * we have a valid record and iface so lets merge -@@ -251,13 +250,12 @@ static int sync_session(void *data, struct session_info *info) - memset(&sysfsrec, 0, sizeof(node_rec_t)); - setup_rec_from_negotiated_values(&sysfsrec, info); - /* -- * target, portal and iface name values have to be the same -+ * target, portal and iface values have to be the same - * or we would not have found the record, so just copy -- * CHAP and iface settings. -+ * CHAP settings. - */ - memcpy(&rec.session.auth, &sysfsrec.session.auth, - sizeof(struct iscsi_auth_config)); -- memcpy(&rec.iface, &info->iface, sizeof(rec.iface)); - } - - /* multiple drivers could be connected to the same portal */ --- -1.8.3.1 - diff --git a/0034-iscsi-tools-Bug-fix-on-IPC-address-copy-version-2.patch b/0034-iscsi-tools-Bug-fix-on-IPC-address-copy-version-2.patch deleted file mode 100644 index 4ae64e7..0000000 --- a/0034-iscsi-tools-Bug-fix-on-IPC-address-copy-version-2.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 1fa1b51356c0ea6e1d30f2d370b3b766d4230537 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Thu, 5 Dec 2013 18:12:32 -0600 -Subject: [PATCH] iscsi tools: Bug fix on IPC address copy (version 2) - -This patch merges Yufei Ren patch -with comments from the list plus what I think is a bug in the -addr_len usage. - -For the addr_len use, it looks like we were using that as the -arg to memcpy, but that value included the length of the pathname -string and also the offset of sun_path in the sockaddr_un and so -that is too long. ---- - usr/iscsi_util.c | 12 ++++++++++++ - usr/iscsi_util.h | 3 +++ - usr/iscsid_req.c | 7 +------ - usr/mgmt_ipc.c | 6 +----- - 4 files changed, 17 insertions(+), 11 deletions(-) - -diff --git a/usr/iscsi_util.c b/usr/iscsi_util.c -index ac86847..9dbfbfd 100644 ---- a/usr/iscsi_util.c -+++ b/usr/iscsi_util.c -@@ -25,16 +25,28 @@ - #include - #include - #include -+#include -+#include - #include - #include - #include - -+#include "sysdeps.h" - #include "log.h" - #include "iscsi_settings.h" - #include "iface.h" - #include "session_info.h" - #include "iscsi_util.h" - -+int setup_abstract_addr(struct sockaddr_un *addr, char *unix_sock_name) -+{ -+ memset(addr, 0, sizeof(*addr)); -+ addr->sun_family = AF_LOCAL; -+ strlcpy(addr->sun_path + 1, unix_sock_name, sizeof(addr->sun_path) - 1); -+ return offsetof(struct sockaddr_un, sun_path) + -+ strlen(addr->sun_path + 1) + 1; -+} -+ - void daemon_init(void) - { - int fd; -diff --git a/usr/iscsi_util.h b/usr/iscsi_util.h -index 110dfa8..ff725eb 100644 ---- a/usr/iscsi_util.h -+++ b/usr/iscsi_util.h -@@ -26,4 +26,7 @@ extern int __iscsi_match_session(struct node_rec *rec, char *targetname, - extern char *strstrip(char *s); - extern char *cfg_get_string_param(char *pathname, const char *key); - -+struct sockaddr_un; -+extern int setup_abstract_addr(struct sockaddr_un *addr, char *unix_sock_name); -+ - #endif -diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c -index 715c0aa..0e91dee 100644 ---- a/usr/iscsid_req.c -+++ b/usr/iscsid_req.c -@@ -67,12 +67,7 @@ static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid) - return ISCSI_ERR_ISCSID_NOTCONN; - } - -- addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(unix_sock_name) + 1; -- -- memset(&addr, 0, sizeof(addr)); -- addr.sun_family = AF_LOCAL; -- memcpy((char *) &addr.sun_path + 1, unix_sock_name, -- strlen(unix_sock_name)); -+ addr_len = setup_abstract_addr(&addr, unix_sock_name); - - /* - * Trying to connect with exponential backoff -diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c -index 87bd346..a82c063 100644 ---- a/usr/mgmt_ipc.c -+++ b/usr/mgmt_ipc.c -@@ -59,11 +59,7 @@ mgmt_ipc_listen(void) - return fd; - } - -- addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1; -- -- memset(&addr, 0, sizeof(addr)); -- addr.sun_family = AF_LOCAL; -- memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len); -+ addr_len = setup_abstract_addr(&addr, ISCSIADM_NAMESPACE); - - if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) { - log_error("Can not bind IPC socket"); --- -1.8.3.1 - diff --git a/0035-flashnode-Add-support-to-set-ISCSI_FLASHNODE_CHAP_OU.patch b/0035-flashnode-Add-support-to-set-ISCSI_FLASHNODE_CHAP_OU.patch deleted file mode 100644 index cfbde0c..0000000 --- a/0035-flashnode-Add-support-to-set-ISCSI_FLASHNODE_CHAP_OU.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 360a40f8a83e08a09b34cb12e269c793028b315e Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:28 -0400 -Subject: [PATCH] flashnode: Add support to set ISCSI_FLASHNODE_CHAP_OUT_IDX - param - -Add support to set the chap_out_idx session param of flashnode -entry. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/flashnode.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/usr/flashnode.c b/usr/flashnode.c -index da1392a..fe5ab57 100644 ---- a/usr/flashnode.c -+++ b/usr/flashnode.c -@@ -449,6 +449,12 @@ int flashnode_build_config(struct list_head *params, - fnode->sess.portal_type, - sizeof(fnode->sess.portal_type))) - count++; -+ } else if (!strcmp(param->name, -+ to_key(FLASHNODE_SESS_CHAP_OUT_IDX))) { -+ if (!flashnode_fill_uint32(fnode, &iov[count], -+ ISCSI_FLASHNODE_CHAP_OUT_IDX, -+ fnode->sess.chap_out_idx)) -+ count++; - } else if (!strcmp(param->name, to_key(FLASHNODE_CONN_PORT))) { - if (fnode->conn[0].port) - port = fnode->conn[0].port; --- -1.8.3.1 - diff --git a/0036-iscsiadm-Use-x-option-instead-of-v-to-specify-chap_t.patch b/0036-iscsiadm-Use-x-option-instead-of-v-to-specify-chap_t.patch deleted file mode 100644 index c18f6da..0000000 --- a/0036-iscsiadm-Use-x-option-instead-of-v-to-specify-chap_t.patch +++ /dev/null @@ -1,146 +0,0 @@ -From b3913c5943b6e908a1bb8ce83a2e79200d0ceed9 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:29 -0400 -Subject: [PATCH] iscsiadm: Use '-x' option instead of '-v' to specify - chap_tbl_idx - -Make appropriate changes to use -x option for chap_tbl_idx cmdline -param. This is done because -v option is used along with -n option -to get the name/value pair. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/host.h | 1 + - usr/iscsiadm.c | 36 +++++++++++++++++------------------- - 2 files changed, 18 insertions(+), 19 deletions(-) - -diff --git a/usr/host.h b/usr/host.h -index db44cfa..52e5b9e 100644 ---- a/usr/host.h -+++ b/usr/host.h -@@ -7,6 +7,7 @@ - - #define MAX_HOST_NO UINT_MAX - -+#define MAX_CHAP_ENTRIES 2048 - #define MAX_CHAP_BUF_SZ 4096 - #define REQ_CHAP_BUF_SZ (MAX_CHAP_BUF_SZ + sizeof(struct iscsi_uevent)) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index c7337ae..beabdf0 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -115,7 +115,7 @@ static struct option const long_options[] = - {"packetsize", required_argument, NULL, 'b'}, - {"count", required_argument, NULL, 'c'}, - {"interval", required_argument, NULL, 'i'}, -- {"flashnode_idx", optional_argument, NULL, 'x'}, -+ {"index", optional_argument, NULL, 'x'}, - {"portal_type", optional_argument, NULL, 'A'}, - {NULL, 0, NULL, 0}, - }; -@@ -136,7 +136,7 @@ iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,au - iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ - iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ --iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] ]\n\ -+iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -x chap_tbl_idx ] ] | [ -C flashnode [ -A portal_type ] [ -x flashnode_idx ] ] ] [ [ -o operation ] [ -n name ] [ -v value ] ] \n\ - iscsiadm -k priority\n"); - } - exit(status); -@@ -1426,18 +1426,10 @@ exit_chap_info: - return rc; - } - --static int delete_host_chap_info(uint32_t host_no, char *value) -+static int delete_host_chap_info(uint32_t host_no, uint16_t chap_tbl_idx) - { - struct iscsi_transport *t = NULL; - int fd, rc = 0; -- uint16_t chap_tbl_idx; -- -- if (!value) { -- log_error("CHAP deletion requires --value=table_index."); -- return ISCSI_ERR_INVAL; -- } -- -- chap_tbl_idx = (uint16_t)atoi(value); - - t = iscsi_sysfs_get_transport_by_hba(host_no); - if (!t) { -@@ -1472,22 +1464,28 @@ exit_delete_chap: - } - - static int exec_host_chap_op(int op, int info_level, uint32_t host_no, -- char *value) -+ uint64_t chap_index) - { - int rc = ISCSI_ERR_INVAL; - -+ if (op != OP_SHOW && (chap_index > (uint64_t)MAX_CHAP_ENTRIES)) { -+ log_error("Invalid chap table index."); -+ goto exit_chap_op; -+ } -+ - switch (op) { - case OP_SHOW: - rc = get_host_chap_info(host_no); - break; - case OP_DELETE: -- rc = delete_host_chap_info(host_no, value); -+ rc = delete_host_chap_info(host_no, chap_index); - break; - default: - log_error("Invalid operation."); - break; - } - -+exit_chap_op: - return rc; - } - -@@ -2818,7 +2816,7 @@ main(int argc, char **argv) - struct iface_rec *iface = NULL, *tmp; - struct node_rec *rec = NULL; - uint64_t host_no = (uint64_t)MAX_HOST_NO + 1; -- uint64_t flashnode_idx = (uint64_t)MAX_FLASHNODE_IDX + 1; -+ uint64_t index = (uint64_t)MAX_FLASHNODE_IDX + 1; - struct user_param *param; - struct list_head params; - -@@ -2962,9 +2960,9 @@ main(int argc, char **argv) - ISCSI_VERSION_STR); - return 0; - case 'x': -- flashnode_idx = strtoull(optarg, NULL, 10); -+ index = strtoull(optarg, NULL, 10); - if (errno) { -- log_error("Invalid flashnode index %s. %s.", -+ log_error("Invalid index %s. %s.", - optarg, strerror(errno)); - rc = ISCSI_ERR_INVAL; - goto free_ifaces; -@@ -3041,7 +3039,7 @@ main(int argc, char **argv) - break; - } - rc = exec_host_chap_op(op, info_level, host_no, -- value); -+ index); - break; - case MODE_FLASHNODE: - if (host_no > MAX_HOST_NO) { -@@ -3051,8 +3049,8 @@ main(int argc, char **argv) - } - - rc = exec_flashnode_op(op, info_level, host_no, -- flashnode_idx, -- portal_type, ¶ms); -+ index, portal_type, -+ ¶ms); - break; - default: - log_error("Invalid Sub Mode"); --- -1.8.3.1 - diff --git a/0037-iscsiadm-Man-page-changes-to-use-x-option-for-chap_t.patch b/0037-iscsiadm-Man-page-changes-to-use-x-option-for-chap_t.patch deleted file mode 100644 index ef5efc5..0000000 --- a/0037-iscsiadm-Man-page-changes-to-use-x-option-for-chap_t.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0c4022d865d81a0fb2fc6dcba8df72a6da753cfe Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:30 -0400 -Subject: [PATCH] iscsiadm: Man page changes to use -x option for chap_tbl_idx - -Changes in iscsiadm man page to use -x option instead of -v option -for chap_tbl_idx cmdline param. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - doc/iscsiadm.8 | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index 6b15fcd..0e8149c 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -16,7 +16,7 @@ iscsiadm \- open-iscsi administration utility - - \fBiscsiadm\fR \-m fw [ \-d debug_level ] [\-l] - --\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-o operation ] [ \-v chap_tbl_idx ] ] | [ \-C flashnode [ \-o operation ] [ \-A portal_type ] [ \-x flashnode_idx ] [ \-n name ] [ \-v value ] ] ] -+\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-x chap_tbl_idx ] ] | [ \-C flashnode [ \-A portal_type ] [ \-x flashnode_idx ] ] ] [ [ \-o operation ] [ \-n name ] [ \-v value ] ] - - \fBiscsiadm\fR \-k priority - -@@ -74,7 +74,7 @@ iscsiadm -m iface -I ifacename -C ping -a ipaddr -b packetsize -c count -i inter - - For host, it supports chap and flashnode as submodes. For example, - --iscsiadm -m host -H hostno -C chap -v chap_tbl_idx -o operation -+iscsiadm -m host -H hostno -C chap -x chap_tbl_idx -o operation - - iscsiadm -m host -H hostno -C flashnode -x flashnode_idx -o operation - -@@ -320,10 +320,10 @@ This option is only valid for node mode and flashnode submode of host mode. - display version and exit - - .TP --\fB\-x\fR, \fB\-\-flashnode_idx=\fIindex\fR --Specify the \fIindex\fR of the flash node to operate on. -+\fB\-x\fR, \fB\-\-index=\fIindex\fR -+Specify the \fIindex\fR of the entity to operate on. - .IP --This option is only valid for flashnode submode of host mode. -+This option is only valid for chap and flashnode submodes of host mode. - - .SH DISCOVERY TYPES - iSCSI defines 3 discovery types: SendTargets, SLP, and iSNS. --- -1.8.3.1 - diff --git a/0038-README-changes-to-use-long-option-index-instead-of-f.patch b/0038-README-changes-to-use-long-option-index-instead-of-f.patch deleted file mode 100644 index fae2288..0000000 --- a/0038-README-changes-to-use-long-option-index-instead-of-f.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 38b2993786c26a2c7bb79a42fc8c644720b4507c Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:31 -0400 -Subject: [PATCH] README changes to use long option --index instead of - --flashnode_idx - -This change supports use of -x option instead of -v option for -chap_tbl_idx cmdline param. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - README | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/README b/README -index 29b00a9..dda16c9 100644 ---- a/README -+++ b/README -@@ -393,7 +393,7 @@ Usage: iscsiadm [OPTION] - See below for examples. - -m iface --interface=iscsi_ifacename -C ping --ip=[ipaddr] --packetsize=[size] - --count=[count] --interval=[interval] -- -m host --host=hostno|MAC --print=level -C chap --op=[op] --value=[chap_tbl_idx] -+ -m host --host=hostno|MAC --print=level -C chap --op=[op] --index=[chap_tbl_idx] - Display information for a specific host. The host - can be passed in by host number or by MAC address. - If a host is not passed in then info -@@ -414,13 +414,13 @@ Usage: iscsiadm [OPTION] - Create new flash node entry for the given host of the - specified portal_type. This returns the index of the - newly created entry on success. -- -m host --host=hostno|MAC -C flashnode --flashnode_idx=[flashnode index] \ -+ -m host --host=hostno|MAC -C flashnode --index=[flashnode index] \ - --op=[UPDATE] --name=[name] --value=[value] - Update the params of the speficied flash node. - The [name] and [value] pairs must be provided for the - params that need to be updated. Multiple params can - be updated using a single command. -- -m host --host=hostno|MAC -C flashnode--flashnode_idx=[flashnode index] \ -+ -m host --host=hostno|MAC -C flashnode --index=[flashnode index] \ - --op=[SHOW | DELETE | LOGIN | LOGOUT] - op=DELETE|LOGIN|LOGOUT will perform deletion/login/ - logout operation on the specified flash node. --- -1.8.3.1 - diff --git a/0039-iscsiadm-Add-support-to-set-CHAP-entry-using-host-ch.patch b/0039-iscsiadm-Add-support-to-set-CHAP-entry-using-host-ch.patch deleted file mode 100644 index 271cef3..0000000 --- a/0039-iscsiadm-Add-support-to-set-CHAP-entry-using-host-ch.patch +++ /dev/null @@ -1,590 +0,0 @@ -From 062718a9579a10ea7c87e46162f80e3f57e80b67 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:32 -0400 -Subject: [PATCH] iscsiadm: Add support to set CHAP entry using host chap mode - -Provide support to add and update CHAP entry using chap submode of -iscsiadm host mode. -Both, new and update, iscsiadm operations perform the same function. -Currently only one entry can be added or updated at a time. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - include/iscsi_if.h | 19 ++++- - usr/host.c | 110 ++++++++++++++++++++++++++++ - usr/host.h | 1 + - usr/idbm.c | 8 ++- - usr/idbm.h | 1 + - usr/iscsi_ipc.h | 3 + - usr/iscsiadm.c | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++--- - usr/netlink.c | 25 +++++++ - 8 files changed, 360 insertions(+), 14 deletions(-) - -diff --git a/include/iscsi_if.h b/include/iscsi_if.h -index 01d38e7..0284662 100644 ---- a/include/iscsi_if.h -+++ b/include/iscsi_if.h -@@ -74,8 +74,9 @@ enum iscsi_uevent_e { - ISCSI_UEVENT_LOGIN_FLASHNODE = UEVENT_BASE + 28, - ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, - ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, -+ ISCSI_UEVENT_SET_CHAP = UEVENT_BASE + 31, - -- ISCSI_UEVENT_MAX = ISCSI_UEVENT_LOGOUT_FLASHNODE_SID, -+ ISCSI_UEVENT_MAX = ISCSI_UEVENT_SET_CHAP, - - /* up events */ - ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, -@@ -318,8 +319,16 @@ enum iscsi_param_type { - ISCSI_HOST_PARAM, /* iscsi_host_param */ - ISCSI_NET_PARAM, /* iscsi_net_param */ - ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ -+ ISCSI_CHAP_PARAM, /* iscsi_chap_param */ - }; - -+/* structure for minimalist usecase */ -+struct iscsi_param_info { -+ uint32_t len; /* Actual length of the param value */ -+ uint16_t param; /* iscsi param */ -+ uint8_t value[0]; /* length sized value follows */ -+} __attribute__((__packed__)); -+ - struct iscsi_iface_param_info { - uint32_t iface_num; /* iface number, 0 - n */ - uint32_t len; /* Actual length of the param */ -@@ -748,6 +757,14 @@ enum chap_type_e { - CHAP_TYPE_IN, - }; - -+enum iscsi_chap_param { -+ ISCSI_CHAP_PARAM_INDEX, -+ ISCSI_CHAP_PARAM_CHAP_TYPE, -+ ISCSI_CHAP_PARAM_USERNAME, -+ ISCSI_CHAP_PARAM_PASSWORD, -+ ISCSI_CHAP_PARAM_PASSWORD_LEN -+}; -+ - #define ISCSI_CHAP_AUTH_NAME_MAX_LEN 256 - #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN 256 - struct iscsi_chap_rec { -diff --git a/usr/host.c b/usr/host.c -index 1fcb350..f2052d3 100644 ---- a/usr/host.c -+++ b/usr/host.c -@@ -34,6 +34,7 @@ - #include "initiator.h" - #include "iface.h" - #include "iscsi_err.h" -+#include "iscsi_netlink.h" - - static int match_host_to_session(void *data, struct session_info *info) - { -@@ -314,3 +315,112 @@ int host_info_print(int info_level, uint32_t host_no) - } - return 0; - } -+ -+static int chap_fill_param_uint(struct iovec *iov, int param, -+ uint32_t param_val, int param_len) -+{ -+ struct iscsi_param_info *param_info; -+ struct nlattr *attr; -+ int len; -+ uint8_t val8 = 0; -+ uint16_t val16 = 0; -+ uint32_t val32 = 0; -+ char *val = NULL; -+ -+ len = sizeof(struct iscsi_param_info) + param_len; -+ iov->iov_base = iscsi_nla_alloc(param, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ param_info = (struct iscsi_param_info *)ISCSI_NLA_DATA(attr); -+ param_info->param = param; -+ param_info->len = param_len; -+ -+ switch (param_len) { -+ case 1: -+ val8 = (uint8_t)param_val; -+ val = (char *)&val8; -+ break; -+ -+ case 2: -+ val16 = (uint16_t)param_val; -+ val = (char *)&val16; -+ break; -+ -+ case 4: -+ val32 = (uint32_t)param_val; -+ val = (char *)&val32; -+ break; -+ -+ default: -+ goto free; -+ } -+ memcpy(param_info->value, val, param_len); -+ -+ return 0; -+ -+free: -+ free(iov->iov_base); -+ iov->iov_base = NULL; -+ iov->iov_len = 0; -+ return 1; -+} -+ -+static int chap_fill_param_str(struct iovec *iov, int param, char *param_val, -+ int param_len) -+{ -+ struct iscsi_param_info *param_info; -+ struct nlattr *attr; -+ int len; -+ -+ len = sizeof(struct iscsi_param_info) + param_len; -+ iov->iov_base = iscsi_nla_alloc(param, len); -+ if (!iov->iov_base) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ -+ param_info = (struct iscsi_param_info *)ISCSI_NLA_DATA(attr); -+ param_info->param = param; -+ param_info->len = param_len; -+ memcpy(param_info->value, param_val, param_len); -+ return 0; -+} -+ -+int chap_build_config(struct iscsi_chap_rec *crec, struct iovec *iovs) -+{ -+ struct iovec *iov = NULL; -+ int count = 0; -+ -+ /* start at 2, because 0 is for nlmsghdr and 1 for event */ -+ iov = iovs + 2; -+ -+ if (!chap_fill_param_uint(&iov[count], ISCSI_CHAP_PARAM_INDEX, -+ crec->chap_tbl_idx, -+ sizeof(crec->chap_tbl_idx))) -+ count++; -+ -+ if (!chap_fill_param_uint(&iov[count], ISCSI_CHAP_PARAM_CHAP_TYPE, -+ crec->chap_type, sizeof(crec->chap_type))) -+ count++; -+ -+ if (!chap_fill_param_str(&iov[count], ISCSI_CHAP_PARAM_USERNAME, -+ crec->username, strlen(crec->username))) -+ count++; -+ -+ if (!chap_fill_param_str(&iov[count], ISCSI_CHAP_PARAM_PASSWORD, -+ (char *)crec->password, -+ strlen((char *)crec->password))) -+ count++; -+ -+ if (!chap_fill_param_uint(&iov[count], ISCSI_CHAP_PARAM_PASSWORD_LEN, -+ crec->password_length, -+ sizeof(crec->password_length))) -+ count++; -+ -+ return count; -+} -diff --git a/usr/host.h b/usr/host.h -index 52e5b9e..149aa0d 100644 ---- a/usr/host.h -+++ b/usr/host.h -@@ -17,5 +17,6 @@ struct host_info { - }; - - extern int host_info_print(int info_level, uint32_t host_no); -+extern int chap_build_config(struct iscsi_chap_rec *crec, struct iovec *iovs); - - #endif -diff --git a/usr/idbm.c b/usr/idbm.c -index 1e4f8c8..6b6f57c 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -456,7 +456,7 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) - __recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1); - } - --static void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) -+void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) - { - int num = 0; - -@@ -465,14 +465,14 @@ static void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) - - if (r->chap_type == CHAP_TYPE_OUT) { - __recinfo_str(HOST_AUTH_USERNAME, ri, r, username, IDBM_SHOW, -- num, 0); -+ num, 1); - __recinfo_str(HOST_AUTH_PASSWORD, ri, r, password, IDBM_MASKED, - num, 1); - __recinfo_int(HOST_AUTH_PASSWORD_LEN, ri, r, password_length, - IDBM_HIDE, num, 1); - } else { - __recinfo_str(HOST_AUTH_USERNAME_IN, ri, r, username, IDBM_SHOW, -- num, 0); -+ num, 1); - __recinfo_str(HOST_AUTH_PASSWORD_IN, ri, r, password, - IDBM_MASKED, num, 1); - __recinfo_int(HOST_AUTH_PASSWORD_IN_LEN, ri, r, password_length, -@@ -852,6 +852,8 @@ updated: - check_password_param(discovery.sendtargets.auth.password_in); - check_password_param(discovery.slp.auth.password); - check_password_param(discovery.slp.auth.password_in); -+ check_password_param(host.auth.password); -+ check_password_param(host.auth.password_in); - - return 0; - } -diff --git a/usr/idbm.h b/usr/idbm.h -index 5e4038d..b9020fe 100644 ---- a/usr/idbm.h -+++ b/usr/idbm.h -@@ -185,6 +185,7 @@ extern struct node_rec * - idbm_create_rec_from_boot_context(struct boot_context *context); - - extern int idbm_print_host_chap_info(struct iscsi_chap_rec *chap); -+extern void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri); - - extern int idbm_print_flashnode_info(struct flashnode_rec *target); - extern void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri); -diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h -index b6665cb..a32da1c 100644 ---- a/usr/iscsi_ipc.h -+++ b/usr/iscsi_ipc.h -@@ -143,6 +143,9 @@ struct iscsi_ipc { - uint16_t chap_tbl_idx, uint32_t num_entries, - char *chap_buf, uint32_t *valid_chap_entries); - -+ int (*set_chap) (uint64_t transport_handle, uint32_t host_no, -+ struct iovec *iovs, uint32_t param_count); -+ - int (*delete_chap) (uint64_t transport_handle, uint32_t host_no, - uint16_t chap_tbl_idx); - int (*set_flash_node_params) (uint64_t transport_handle, -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index beabdf0..045259b 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -115,7 +115,7 @@ static struct option const long_options[] = - {"packetsize", required_argument, NULL, 'b'}, - {"count", required_argument, NULL, 'c'}, - {"interval", required_argument, NULL, 'i'}, -- {"index", optional_argument, NULL, 'x'}, -+ {"index", required_argument, NULL, 'x'}, - {"portal_type", optional_argument, NULL, 'A'}, - {NULL, 0, NULL, 0}, - }; -@@ -1426,11 +1426,193 @@ exit_chap_info: - return rc; - } - -+static int fill_host_chap_rec(struct list_head *params, -+ struct iscsi_chap_rec *crec, recinfo_t *cinfo, -+ uint16_t chap_tbl_idx, int type, int *param_count) -+{ -+ struct user_param *param; -+ int rc = 0; -+ -+ crec->chap_tbl_idx = chap_tbl_idx; -+ crec->chap_type = type; -+ -+ idbm_recinfo_host_chap(crec, cinfo); -+ -+ list_for_each_entry(param, params, list) { -+ rc = idbm_rec_update_param(cinfo, param->name, param->value, 0); -+ if (rc) -+ break; -+ } -+ -+ if (!rc) -+ *param_count += 3; /* index, type and password_length */ -+ -+ return rc; -+} -+ -+static int verify_host_chap_params(struct list_head *params, int *type, -+ int *param_count) -+{ -+ struct user_param *param; -+ int username = -1; -+ int password = -1; -+ int rc = 0; -+ -+ list_for_each_entry(param, params, list) { -+ *param_count += 1; -+ -+ if (!strcmp(param->name, HOST_AUTH_USERNAME)) -+ username = CHAP_TYPE_OUT; -+ else if (!strcmp(param->name, HOST_AUTH_PASSWORD)) -+ password = CHAP_TYPE_OUT; -+ else if (!strcmp(param->name, HOST_AUTH_USERNAME_IN)) -+ username = CHAP_TYPE_IN; -+ else if (!strcmp(param->name, HOST_AUTH_PASSWORD_IN)) -+ password = CHAP_TYPE_IN; -+ else -+ continue; -+ } -+ -+ if ((username == CHAP_TYPE_OUT) && (password == CHAP_TYPE_OUT)) { -+ if (type) -+ *type = CHAP_TYPE_OUT; -+ -+ rc = ISCSI_SUCCESS; -+ } else if ((username == CHAP_TYPE_IN) && (password == CHAP_TYPE_IN)) { -+ if (type) -+ *type = CHAP_TYPE_IN; -+ -+ rc = ISCSI_SUCCESS; -+ } else { -+ rc = ISCSI_ERR; -+ } -+ -+ return rc; -+} -+ -+static int set_host_chap_info(uint32_t host_no, uint64_t chap_index, -+ struct list_head *params) -+{ -+ struct iscsi_transport *t = NULL; -+ struct iscsi_chap_rec crec; -+ recinfo_t *chap_info = NULL; -+ struct iovec *iovs = NULL; -+ struct iovec *iov = NULL; -+ int type; -+ int param_count; -+ int param_used; -+ int rc = 0; -+ int fd, i = 0; -+ -+ if (list_empty(params)) { -+ log_error("Chap username/password not provided."); -+ goto exit_set_chap; -+ } -+ -+ chap_info = idbm_recinfo_alloc(MAX_KEYS); -+ if (!chap_info) { -+ log_error("Out of Memory."); -+ rc = ISCSI_ERR_NOMEM; -+ goto exit_set_chap; -+ } -+ -+ t = iscsi_sysfs_get_transport_by_hba(host_no); -+ if (!t) { -+ log_error("Could not match hostno %d to transport.", host_no); -+ rc = ISCSI_ERR_TRANS_NOT_FOUND; -+ goto free_info_rec; -+ } -+ -+ rc = verify_host_chap_params(params, &type, ¶m_count); -+ if (rc) { -+ log_error("Invalid username/password pair passed. Unable to determine the type of chap entry"); -+ rc = ISCSI_ERR_INVAL; -+ goto free_info_rec; -+ } -+ -+ if (param_count > 2) { -+ log_error("Only one pair of username/password can be passed."); -+ rc = ISCSI_ERR; -+ goto free_info_rec; -+ } -+ -+ memset(&crec, 0, sizeof(crec)); -+ rc = fill_host_chap_rec(params, &crec, chap_info, chap_index, type, -+ ¶m_count); -+ if (rc) { -+ log_error("Unable to fill CHAP record"); -+ goto free_info_rec; -+ } -+ -+ /* +2 for event and nlmsghdr */ -+ param_count += 2; -+ iovs = calloc((param_count * sizeof(struct iovec)), -+ sizeof(char)); -+ if (!iovs) { -+ log_error("Out of Memory."); -+ rc = ISCSI_ERR_NOMEM; -+ goto free_info_rec; -+ } -+ -+ /* param_used gives actual number of iovecs used for chap */ -+ param_used = chap_build_config(&crec, iovs); -+ if (!param_used) { -+ log_error("Build chap config failed."); -+ rc = ISCSI_ERR; -+ goto free_iovec; -+ } -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ rc = ISCSI_ERR_INTERNAL; -+ log_error("Netlink open failed."); -+ goto free_iovec; -+ } -+ -+ rc = ipc->set_chap(t->handle, host_no, iovs, param_count); -+ if (rc < 0) { -+ log_error("CHAP setting failed"); -+ if (rc == -EBUSY) { -+ rc = ISCSI_ERR_BUSY; -+ log_error("CHAP index %d is in use.", -+ crec.chap_tbl_idx); -+ } else { -+ rc = ISCSI_ERR; -+ } -+ -+ goto exit_set_chap; -+ } -+ -+ ipc->ctldev_close(); -+ -+free_iovec: -+ /* start at 2, because 0 is for nlmsghdr and 1 for event */ -+ iov = iovs + 2; -+ for (i = 0; i < param_used; i++, iov++) { -+ if (iov->iov_base) -+ free(iov->iov_base); -+ } -+ -+ free(iovs); -+ -+free_info_rec: -+ if (chap_info) -+ free(chap_info); -+ -+exit_set_chap: -+ return rc; -+} -+ - static int delete_host_chap_info(uint32_t host_no, uint16_t chap_tbl_idx) - { - struct iscsi_transport *t = NULL; - int fd, rc = 0; - -+ if (chap_tbl_idx > MAX_CHAP_ENTRIES) { -+ log_error("Invalid chap table index."); -+ goto exit_delete_chap; -+ } -+ - t = iscsi_sysfs_get_transport_by_hba(host_no); - if (!t) { - log_error("Could not match hostno %d to " -@@ -1464,19 +1646,18 @@ exit_delete_chap: - } - - static int exec_host_chap_op(int op, int info_level, uint32_t host_no, -- uint64_t chap_index) -+ uint64_t chap_index, struct list_head *params) - { - int rc = ISCSI_ERR_INVAL; - -- if (op != OP_SHOW && (chap_index > (uint64_t)MAX_CHAP_ENTRIES)) { -- log_error("Invalid chap table index."); -- goto exit_chap_op; -- } -- - switch (op) { - case OP_SHOW: - rc = get_host_chap_info(host_no); - break; -+ case OP_NEW: -+ case OP_UPDATE: -+ rc = set_host_chap_info(host_no, chap_index, params); -+ break; - case OP_DELETE: - rc = delete_host_chap_info(host_no, chap_index); - break; -@@ -1485,7 +1666,6 @@ static int exec_host_chap_op(int op, int info_level, uint32_t host_no, - break; - } - --exit_chap_op: - return rc; - } - -@@ -2816,7 +2996,7 @@ main(int argc, char **argv) - struct iface_rec *iface = NULL, *tmp; - struct node_rec *rec = NULL; - uint64_t host_no = (uint64_t)MAX_HOST_NO + 1; -- uint64_t index = (uint64_t)MAX_FLASHNODE_IDX + 1; -+ uint64_t index = ULLONG_MAX; - struct user_param *param; - struct list_head params; - -@@ -3038,8 +3218,12 @@ main(int argc, char **argv) - rc = ISCSI_ERR_INVAL; - break; - } -+ -+ if (index == ULLONG_MAX) -+ index = (uint64_t)MAX_CHAP_ENTRIES + 1; -+ - rc = exec_host_chap_op(op, info_level, host_no, -- index); -+ index, ¶ms); - break; - case MODE_FLASHNODE: - if (host_no > MAX_HOST_NO) { -@@ -3048,6 +3232,9 @@ main(int argc, char **argv) - break; - } - -+ if (index == ULLONG_MAX) -+ index = (uint64_t)MAX_FLASHNODE_IDX + 1; -+ - rc = exec_flashnode_op(op, info_level, host_no, - index, portal_type, - ¶ms); -diff --git a/usr/netlink.c b/usr/netlink.c -index c07fe3c..151b56d 100644 ---- a/usr/netlink.c -+++ b/usr/netlink.c -@@ -1228,6 +1228,30 @@ static int kget_chap(uint64_t transport_handle, uint32_t host_no, - return rc; - } - -+static int kset_chap(uint64_t transport_handle, uint32_t host_no, -+ struct iovec *iovs, uint32_t param_count) -+{ -+ int rc, ev_len; -+ struct iscsi_uevent ev; -+ struct iovec *iov = iovs + 1; -+ -+ log_debug(8, "in %s", __func__); -+ -+ ev_len = sizeof(ev); -+ ev.type = ISCSI_UEVENT_SET_CHAP; -+ ev.transport_handle = transport_handle; -+ ev.u.set_path.host_no = host_no; -+ -+ iov->iov_base = &ev; -+ iov->iov_len = sizeof(ev); -+ -+ rc = __kipc_call(iovs, param_count); -+ if (rc < 0) -+ return rc; -+ -+ return 0; -+} -+ - static int kdelete_chap(uint64_t transport_handle, uint32_t host_no, - uint16_t chap_tbl_idx) - { -@@ -1705,6 +1729,7 @@ struct iscsi_ipc nl_ipc = { - .recv_conn_state = krecv_conn_state, - .exec_ping = kexec_ping, - .get_chap = kget_chap, -+ .set_chap = kset_chap, - .delete_chap = kdelete_chap, - .set_flash_node_params = kset_flashnode_params, - .new_flash_node = knew_flashnode, --- -1.8.3.1 - diff --git a/0040-iscsi-tools-Correctly-get-username_in-and-password_i.patch b/0040-iscsi-tools-Correctly-get-username_in-and-password_i.patch deleted file mode 100644 index e15c4b1..0000000 --- a/0040-iscsi-tools-Correctly-get-username_in-and-password_i.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 65ce3a27da47cecf71015b16b1d186c49cbb7bcc Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:33 -0400 -Subject: [PATCH] iscsi tools: Correctly get username_in and password_in - flashnode params - -Fix to correctly read username_in and password_in sysfs params for -flashnode session. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iscsi_sysfs.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c -index 56cb90c..04c3673 100644 ---- a/usr/iscsi_sysfs.c -+++ b/usr/iscsi_sysfs.c -@@ -601,12 +601,12 @@ int iscsi_sysfs_get_flashnode_info(struct flashnode_rec *fnode, - sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "username", - (fnode->sess).username, sizeof((fnode->sess).username)); - sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "username_in", -- (fnode->sess).username, -+ (fnode->sess).username_in, - sizeof((fnode->sess).username_in)); - sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "password", - (fnode->sess).password, sizeof((fnode->sess).password)); - sysfs_get_str(sess_id, ISCSI_FLASHNODE_SUBSYS, "password_in", -- (fnode->sess).password, -+ (fnode->sess).password_in, - sizeof((fnode->sess).password_in)); - sysfs_get_uint(conn_id, ISCSI_FLASHNODE_SUBSYS, "statsn", - &((fnode->conn[0]).stat_sn)); --- -1.8.3.1 - diff --git a/0041-README-changes-for-adding-support-to-set-CHAP-entry.patch b/0041-README-changes-for-adding-support-to-set-CHAP-entry.patch deleted file mode 100644 index 35d9d5d..0000000 --- a/0041-README-changes-for-adding-support-to-set-CHAP-entry.patch +++ /dev/null @@ -1,84 +0,0 @@ -From f1ed1f7049f42ad12f5e6bf5b02de75290271c56 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Tue, 17 Sep 2013 08:07:34 -0400 -Subject: [PATCH] README changes for adding support to set CHAP entry - -README changes for the support added to set CHAP entry using chap -submode of iscsiadm host mode. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - README | 42 +++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 41 insertions(+), 1 deletion(-) - -diff --git a/README b/README -index dda16c9..813548d 100644 ---- a/README -+++ b/README -@@ -393,7 +393,7 @@ Usage: iscsiadm [OPTION] - See below for examples. - -m iface --interface=iscsi_ifacename -C ping --ip=[ipaddr] --packetsize=[size] - --count=[count] --interval=[interval] -- -m host --host=hostno|MAC --print=level -C chap --op=[op] --index=[chap_tbl_idx] -+ -m host --host=hostno|MAC --print=level -C chap --op=[SHOW] - Display information for a specific host. The host - can be passed in by host number or by MAC address. - If a host is not passed in then info -@@ -406,6 +406,14 @@ Usage: iscsiadm [OPTION] - is connected to. - 3 = Print iscsi params used. - 4 = Print SCSI info like LUNs, device state. -+ -m host --host=hostno|MAC -C chap --op=[DELETE] --index=[chap_tbl_idx] -+ Delete chap entry at the given index from chap table. -+ -m host --host=hostno|MAC -C chap --op=[NEW | UPDATE] --index=[chap_tbl_idx] \ -+ --name=[name] --value=[value] -+ Add new or update existing chap entry at the given -+ index with given username and password pair. If index -+ is not passed then entry is added at the first free -+ index in chap table. - -m host --host=hostno|MAC -C flashnode - Display list of all the targets in adapter's - flash (flash node), for the specified host, -@@ -1033,6 +1041,38 @@ To now log into targets it is the same as with sofware iscsi. See section - - Delete a flash node entry - ./iscsiadm -m host -H 6 -C flashnode -x 1 -o delete - -+ Host mode with chap submode: -+ -+ - Display list of chap entries for a host -+ -+ ./iscsiadm -m host -H 6 -C chap -o show -+ -+ This will list all the chap entries for the given host. -+ -+ - Delete a chap entry for a host -+ -+ ./iscsiadm -m host -H 6 -C chap -o delete -x 5 -+ -+ This will delete any chap entry present at given index 5. -+ -+ - Add/Update a local chap entry for a host -+ -+ ./iscsiadm -m host -H 6 -C chap -o update -x 4 -n username \ -+ -v value -n password -v value -+ -+ This will update the local chap entry present at index 4. If index 4 -+ is free then entry of type local chap will be created at that index -+ with given username and password values. -+ -+ - Add/Update a bidi chap entry for a host -+ -+ ./iscsiadm -m host -H 6 -C chap -o update -x 5 -n username_in \ -+ -v value -n password_in -v value -+ -+ This will update the bidi chap entry present at index 5. If index 5 -+ is free then entry of type bidi chap will be created at that index -+ with given username_in and password_in values. -+ - 6. Configuration - ================ - --- -1.8.3.1 - diff --git a/0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch b/0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch deleted file mode 100644 index 7e72808..0000000 --- a/0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 0a95bc409c6282b95c48ba39a16e17c3e6e26537 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 18 Oct 2013 09:29:17 -0400 -Subject: [PATCH] iscsi tools: Setup iface conf file with all iface attrs - exported in sysfs - -Currently, iface conf file does not get populated with all the iface -attrs that are exported in corresponding sysfs entry. -This patch allows to setup conf file with all iface attrs in sysfs. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iface.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/usr/iface.c b/usr/iface.c -index c86892e..8580d1a 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -476,11 +476,8 @@ static int iface_setup_binding_from_kern_iface(void *data, - } - - memset(&iface, 0, sizeof(struct iface_rec)); -- strcpy(iface.hwaddress, hinfo->iface.hwaddress); -- strcpy(iface.transport_name, hinfo->iface.transport_name); -- - if (kern_iface) { -- iface.iface_num = kern_iface->iface_num; -+ memcpy(&iface, kern_iface, sizeof(iface)); - - snprintf(iface.name, sizeof(iface.name), "%s.%s.%s.%u", - kern_iface->transport_name, -@@ -492,6 +489,9 @@ static int iface_setup_binding_from_kern_iface(void *data, - hinfo->iface.transport_name, hinfo->iface.hwaddress); - } - -+ strcpy(iface.hwaddress, hinfo->iface.hwaddress); -+ strcpy(iface.transport_name, hinfo->iface.transport_name); -+ - memset(iface_path, 0, sizeof(iface_path)); - snprintf(iface_path, PATH_MAX, "%s/%s", IFACE_CONFIG_DIR, - iface.name); --- -1.8.3.1 - diff --git a/0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch b/0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch deleted file mode 100644 index 40cafea..0000000 --- a/0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 026c8d771c1df457cd26e7066b503cadfbbc98df Mon Sep 17 00:00:00 2001 -From: Harish Zunjarrao -Date: Fri, 18 Oct 2013 09:29:18 -0400 -Subject: [PATCH] iscsi_if.h: Remove numbers used for network parameter - settings - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - include/iscsi_if.h | 38 +++++++++++++++++++------------------- - 1 file changed, 19 insertions(+), 19 deletions(-) - -diff --git a/include/iscsi_if.h b/include/iscsi_if.h -index 0284662..e837dd0 100644 ---- a/include/iscsi_if.h -+++ b/include/iscsi_if.h -@@ -395,25 +395,25 @@ struct iscsi_path { - /* iSCSI network params */ - enum iscsi_net_param { - ISCSI_NET_PARAM_IPV4_ADDR = 1, -- ISCSI_NET_PARAM_IPV4_SUBNET = 2, -- ISCSI_NET_PARAM_IPV4_GW = 3, -- ISCSI_NET_PARAM_IPV4_BOOTPROTO = 4, -- ISCSI_NET_PARAM_MAC = 5, -- ISCSI_NET_PARAM_IPV6_LINKLOCAL = 6, -- ISCSI_NET_PARAM_IPV6_ADDR = 7, -- ISCSI_NET_PARAM_IPV6_ROUTER = 8, -- ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG = 9, -- ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG = 10, -- ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG = 11, -- ISCSI_NET_PARAM_IFACE_ENABLE = 12, -- ISCSI_NET_PARAM_VLAN_ID = 13, -- ISCSI_NET_PARAM_VLAN_PRIORITY = 14, -- ISCSI_NET_PARAM_VLAN_ENABLED = 15, -- ISCSI_NET_PARAM_VLAN_TAG = 16, -- ISCSI_NET_PARAM_IFACE_TYPE = 17, -- ISCSI_NET_PARAM_IFACE_NAME = 18, -- ISCSI_NET_PARAM_MTU = 19, -- ISCSI_NET_PARAM_PORT = 20, -+ ISCSI_NET_PARAM_IPV4_SUBNET, -+ ISCSI_NET_PARAM_IPV4_GW, -+ ISCSI_NET_PARAM_IPV4_BOOTPROTO, -+ ISCSI_NET_PARAM_MAC, -+ ISCSI_NET_PARAM_IPV6_LINKLOCAL, -+ ISCSI_NET_PARAM_IPV6_ADDR, -+ ISCSI_NET_PARAM_IPV6_ROUTER, -+ ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG, -+ ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG, -+ ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG, -+ ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM_VLAN_ID, -+ ISCSI_NET_PARAM_VLAN_PRIORITY, -+ ISCSI_NET_PARAM_VLAN_ENABLED, -+ ISCSI_NET_PARAM_VLAN_TAG, -+ ISCSI_NET_PARAM_IFACE_TYPE, -+ ISCSI_NET_PARAM_IFACE_NAME, -+ ISCSI_NET_PARAM_MTU, -+ ISCSI_NET_PARAM_PORT, - }; - - enum iscsi_conn_state { --- -1.8.3.1 - diff --git a/0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch b/0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch deleted file mode 100644 index 4fea308..0000000 --- a/0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch +++ /dev/null @@ -1,122 +0,0 @@ -From d1e07af2ed3aa480107213378a54bfc9a6a36c0a Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 18 Oct 2013 09:29:19 -0400 -Subject: [PATCH] iscsi_if.h: Additional parameters for network param settings - -Added support to display and update additional network parameters -through iscsiadm - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - include/iscsi_if.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 79 insertions(+) - -diff --git a/include/iscsi_if.h b/include/iscsi_if.h -index e837dd0..e59bcd0 100644 ---- a/include/iscsi_if.h -+++ b/include/iscsi_if.h -@@ -320,6 +320,7 @@ enum iscsi_param_type { - ISCSI_NET_PARAM, /* iscsi_net_param */ - ISCSI_FLASHNODE_PARAM, /* iscsi_flashnode_param */ - ISCSI_CHAP_PARAM, /* iscsi_chap_param */ -+ ISCSI_IFACE_PARAM, /* iscsi_iface_param */ - }; - - /* structure for minimalist usecase */ -@@ -392,6 +393,10 @@ struct iscsi_path { - #define ISCSI_VLAN_DISABLE 0x01 - #define ISCSI_VLAN_ENABLE 0x02 - -+/* iscsi generic enable/disabled setting for various features */ -+#define ISCSI_NET_PARAM_DISABLE 0x01 -+#define ISCSI_NET_PARAM_ENABLE 0x02 -+ - /* iSCSI network params */ - enum iscsi_net_param { - ISCSI_NET_PARAM_IPV4_ADDR = 1, -@@ -414,6 +419,80 @@ enum iscsi_net_param { - ISCSI_NET_PARAM_IFACE_NAME, - ISCSI_NET_PARAM_MTU, - ISCSI_NET_PARAM_PORT, -+ ISCSI_NET_PARAM_IPADDR_STATE, -+ ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE, -+ ISCSI_NET_PARAM_IPV6_ROUTER_STATE, -+ ISCSI_NET_PARAM_DELAYED_ACK_EN, -+ ISCSI_NET_PARAM_TCP_NAGLE_DISABLE, -+ ISCSI_NET_PARAM_TCP_WSF_DISABLE, -+ ISCSI_NET_PARAM_TCP_WSF, -+ ISCSI_NET_PARAM_TCP_TIMER_SCALE, -+ ISCSI_NET_PARAM_TCP_TIMESTAMP_EN, -+ ISCSI_NET_PARAM_CACHE_ID, -+ ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN, -+ ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN, -+ ISCSI_NET_PARAM_IPV4_TOS_EN, -+ ISCSI_NET_PARAM_IPV4_TOS, -+ ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN, -+ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN, -+ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID, -+ ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN, -+ ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN, -+ ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID, -+ ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN, -+ ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE, -+ ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN, -+ ISCSI_NET_PARAM_IPV4_TTL, -+ ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN, -+ ISCSI_NET_PARAM_IPV6_MLD_EN, -+ ISCSI_NET_PARAM_IPV6_FLOW_LABEL, -+ ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS, -+ ISCSI_NET_PARAM_IPV6_HOP_LIMIT, -+ ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO, -+ ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME, -+ ISCSI_NET_PARAM_IPV6_ND_STALE_TMO, -+ ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT, -+ ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU, -+ ISCSI_NET_PARAM_REDIRECT_EN, -+}; -+ -+enum iscsi_ipaddress_state { -+ ISCSI_IPDDRESS_STATE_UNCONFIGURED, -+ ISCSI_IPDDRESS_STATE_ACQUIRING, -+ ISCSI_IPDDRESS_STATE_TENTATIVE, -+ ISCSI_IPDDRESS_STATE_VALID, -+ ISCSI_IPDDRESS_STATE_DISABLING, -+ ISCSI_IPDDRESS_STATE_INVALID, -+ ISCSI_IPDDRESS_STATE_DEPRECATED, -+}; -+ -+enum iscsi_router_state { -+ ISCSI_ROUTER_STATE_UNKNOWN, -+ ISCSI_ROUTER_STATE_ADVERTISED, -+ ISCSI_ROUTER_STATE_MANUAL, -+ ISCSI_ROUTER_STATE_STALE, -+}; -+ -+/* iSCSI specific settings params for iface */ -+enum iscsi_iface_param { -+ ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO, -+ ISCSI_IFACE_PARAM_HDRDGST_EN, -+ ISCSI_IFACE_PARAM_DATADGST_EN, -+ ISCSI_IFACE_PARAM_IMM_DATA_EN, -+ ISCSI_IFACE_PARAM_INITIAL_R2T_EN, -+ ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN, -+ ISCSI_IFACE_PARAM_PDU_INORDER_EN, -+ ISCSI_IFACE_PARAM_ERL, -+ ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH, -+ ISCSI_IFACE_PARAM_FIRST_BURST, -+ ISCSI_IFACE_PARAM_MAX_R2T, -+ ISCSI_IFACE_PARAM_MAX_BURST, -+ ISCSI_IFACE_PARAM_CHAP_AUTH_EN, -+ ISCSI_IFACE_PARAM_BIDI_CHAP_EN, -+ ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL, -+ ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN, -+ ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN, -+ ISCSI_IFACE_PARAM_INITIATOR_NAME, - }; - - enum iscsi_conn_state { --- -1.8.3.1 - diff --git a/0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch b/0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch deleted file mode 100644 index 6ef8896..0000000 --- a/0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch +++ /dev/null @@ -1,243 +0,0 @@ -From 466efaad99b0fc0d1181443386b823739a8b483b Mon Sep 17 00:00:00 2001 -From: Harish Zunjarrao -Date: Fri, 18 Oct 2013 09:29:20 -0400 -Subject: [PATCH] iscsi tools: Use macro to set IPv4/IPv6 IP addresses - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Vikas Chaudhary -Signed-off-by: Adheer Chandravanshi ---- - usr/iface.c | 154 +++++++++++++++++++++++++++--------------------------------- - 1 file changed, 69 insertions(+), 85 deletions(-) - -diff --git a/usr/iface.c b/usr/iface.c -index 8580d1a..19ad5ab 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -1484,8 +1484,8 @@ static int iface_fill_router_autocfg(struct iovec *iov, struct iface_rec *iface) - } - - /* IPv4 IPAddress/Subnet Mask/Gateway: 4 bytes */ --static int iface_fill_net_ipv4_addr(struct iovec *iov, struct iface_rec *iface, -- uint32_t param) -+static int iface_fill_net_ipv4_addr(struct iovec *iov, uint32_t iface_num, -+ uint16_t param, char *param_val) - { - int rc = 1; - int len; -@@ -1502,29 +1502,12 @@ static int iface_fill_net_ipv4_addr(struct iovec *iov, struct iface_rec *iface, - net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); - net_param->param = param; - net_param->iface_type = ISCSI_IFACE_TYPE_IPV4; -- net_param->iface_num = iface->iface_num; -+ net_param->iface_num = iface_num; - net_param->len = 4; - net_param->param_type = ISCSI_NET_PARAM; -- -- switch (param) { -- case ISCSI_NET_PARAM_IPV4_ADDR: -- rc = inet_pton(AF_INET, iface->ipaddress, net_param->value); -- if (rc <= 0) -- goto free; -- break; -- case ISCSI_NET_PARAM_IPV4_SUBNET: -- rc = inet_pton(AF_INET, iface->subnet_mask, net_param->value); -- if (rc <= 0) -- goto free; -- break; -- case ISCSI_NET_PARAM_IPV4_GW: -- rc = inet_pton(AF_INET, iface->gateway, net_param->value); -- if (rc <= 0) -- goto free; -- break; -- default: -+ rc = inet_pton(AF_INET, param_val, net_param->value); -+ if (rc <= 0) - goto free; -- } - - /* validate */ - if (!net_param->value[0] && !net_param->value[1] && -@@ -1539,9 +1522,19 @@ free: - return 1; - } - -+#define IFACE_SET_NET_PARAM_IPV4_ADDR(iov, inum, param, ival, gcnt, \ -+ lcnt) { \ -+ if (strstr(ival, ".")) { \ -+ if (!iface_fill_net_ipv4_addr(iov, inum, param, ival)) {\ -+ (*gcnt)++; \ -+ (*lcnt)++; \ -+ } \ -+ } \ -+} -+ - /* IPv6 IPAddress/LinkLocal/Router: 16 bytes */ --static int iface_fill_net_ipv6_addr(struct iovec *iov, struct iface_rec *iface, -- uint32_t param) -+static int iface_fill_net_ipv6_addr(struct iovec *iov, uint32_t iface_num, -+ uint16_t param, char *param_val) - { - int rc; - int len; -@@ -1558,30 +1551,12 @@ static int iface_fill_net_ipv6_addr(struct iovec *iov, struct iface_rec *iface, - net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); - net_param->param = param; - net_param->iface_type = ISCSI_IFACE_TYPE_IPV6; -- net_param->iface_num = iface->iface_num; -+ net_param->iface_num = iface_num; - net_param->param_type = ISCSI_NET_PARAM; - net_param->len = 16; -- -- switch (param) { -- case ISCSI_NET_PARAM_IPV6_ADDR: -- rc = inet_pton(AF_INET6, iface->ipaddress, net_param->value); -- if (rc <= 0) -- goto free; -- break; -- case ISCSI_NET_PARAM_IPV6_LINKLOCAL: -- rc = inet_pton(AF_INET6, iface->ipv6_linklocal, -- net_param->value); -- if (rc <= 0) -- goto free; -- break; -- case ISCSI_NET_PARAM_IPV6_ROUTER: -- rc = inet_pton(AF_INET6, iface->ipv6_router, net_param->value); -- if (rc <= 0) -- goto free; -- break; -- default: -+ rc = inet_pton(AF_INET6, param_val, net_param->value); -+ if (rc <= 0) - goto free; -- } - - return 0; - free: -@@ -1591,6 +1566,16 @@ free: - return 1; - } - -+#define IFACE_SET_NET_PARAM_IPV6_ADDR(iov, inum, param, ival, gcnt, \ -+ lcnt) { \ -+ if (strstr(ival, ":")) { \ -+ if (!iface_fill_net_ipv6_addr(iov, inum, param, ival)) {\ -+ (*gcnt)++; \ -+ (*lcnt)++; \ -+ } \ -+ } \ -+} -+ - struct iface_net_config { - struct iface_rec *primary; - struct iovec *iovs; -@@ -1635,28 +1620,27 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - net_config->count++; - count++; - } -- if (!iface_fill_net_ipv4_addr(&iov[net_config->count], -- iface, -- ISCSI_NET_PARAM_IPV4_ADDR)) { -- net_config->count++; -- count++; -- } -- if (strstr(iface->subnet_mask, ".")) { -- if (!iface_fill_net_ipv4_addr( -- &iov[net_config->count], iface, -- ISCSI_NET_PARAM_IPV4_SUBNET)) { -- net_config->count++; -- count++; -- } -- } -- if (strstr(iface->gateway, ".")) { -- if (!iface_fill_net_ipv4_addr( -- &iov[net_config->count], iface, -- ISCSI_NET_PARAM_IPV4_GW)) { -- net_config->count++; -- count++; -- } -- } -+ -+ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_NET_PARAM_IPV4_ADDR, -+ iface->ipaddress, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_NET_PARAM_IPV4_SUBNET, -+ iface->subnet_mask, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_NET_PARAM_IPV4_ADDR(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_NET_PARAM_IPV4_GW, -+ iface->gateway, -+ &net_config->count, -+ &count); - } - - /* -@@ -1727,12 +1711,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - count++; - } - /* User provided IPv6 Address */ -- if (!iface_fill_net_ipv6_addr(&iov[net_config->count], -- iface, -- ISCSI_NET_PARAM_IPV6_ADDR)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_NET_PARAM_IPV6_ADDR, -+ iface->ipaddress, -+ &net_config->count, -+ &count); - } - - /* For LinkLocal Address */ -@@ -1751,12 +1735,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - count++; - } - /* User provided Link Local Address */ -- if (!iface_fill_net_ipv6_addr(&iov[net_config->count], -- iface, -- ISCSI_NET_PARAM_IPV6_LINKLOCAL)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_NET_PARAM_IPV6_LINKLOCAL, -+ iface->ipv6_linklocal, -+ &net_config->count, -+ &count); - } - - /* For Router Address */ -@@ -1773,12 +1757,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - count++; - } - /* User provided Router Address */ -- if (!iface_fill_net_ipv6_addr(&iov[net_config->count], -- iface, -- ISCSI_NET_PARAM_IPV6_ROUTER)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_NET_PARAM_IPV6_ADDR(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_NET_PARAM_IPV6_ROUTER, -+ iface->ipv6_router, -+ &net_config->count, -+ &count); - } - - /* --- -1.8.3.1 - diff --git a/0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch b/0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch deleted file mode 100644 index 22334e1..0000000 --- a/0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch +++ /dev/null @@ -1,220 +0,0 @@ -From 2220ee4334637946e93dca5c68889b5e3e807515 Mon Sep 17 00:00:00 2001 -From: Harish Zunjarrao -Date: Fri, 18 Oct 2013 09:29:21 -0400 -Subject: [PATCH] iscsi tools: Use single function to enable/disable network - parameters - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iface.c | 148 ++++++++++++++++++++++++++++++------------------------------ - 1 file changed, 74 insertions(+), 74 deletions(-) - -diff --git a/usr/iface.c b/usr/iface.c -index 19ad5ab..292c804 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -1311,60 +1311,45 @@ static int iface_fill_vlan_id(struct iovec *iov, struct iface_rec *iface, - return 0; - } - --/* IPv4/IPv6 VLAN state: disable/enable */ --static int iface_fill_vlan_state(struct iovec *iov, struct iface_rec *iface, -- uint32_t iface_type) -+/* disable/enable parameters */ -+static int iface_fill_param_state(struct iovec *iov, uint32_t iface_num, -+ uint8_t iface_type, uint16_t param, -+ uint8_t param_type, char *param_val) - { - int len; - struct iscsi_iface_param_info *net_param; - struct nlattr *attr; - -+ if (!param_val[0]) -+ return 1; -+ - len = sizeof(struct iscsi_iface_param_info) + 1; -- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_VLAN_ENABLED, len); -+ iov->iov_base = iscsi_nla_alloc(param, len); - if (!(iov->iov_base)) - return 1; - - attr = iov->iov_base; - iov->iov_len = NLA_ALIGN(attr->nla_len); - net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); -- net_param->param = ISCSI_NET_PARAM_VLAN_ENABLED; -- net_param->iface_type = iface_type; -- net_param->iface_num = iface->iface_num; -- net_param->param_type = ISCSI_NET_PARAM; -+ net_param->iface_num = iface_num; - net_param->len = 1; -- if (strcmp(iface->vlan_state, "disable") && iface->vlan_id) -- net_param->value[0] = ISCSI_VLAN_ENABLE; -+ net_param->param = param; -+ net_param->iface_type = iface_type; -+ net_param->param_type = param_type; -+ if (strcmp(param_val, "disable")) -+ net_param->value[0] = ISCSI_NET_PARAM_ENABLE; - else /* Assume disabled */ -- net_param->value[0] = ISCSI_VLAN_DISABLE; -+ net_param->value[0] = ISCSI_NET_PARAM_DISABLE; - return 0; - } - --/* IPv4/IPv6 Network state: disable/enable */ --static int iface_fill_net_state(struct iovec *iov, struct iface_rec *iface, -- uint32_t iface_type) --{ -- int len; -- struct iscsi_iface_param_info *net_param; -- struct nlattr *attr; -- -- len = sizeof(struct iscsi_iface_param_info) + 1; -- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_IFACE_ENABLE, len); -- if (!(iov->iov_base)) -- return 1; -- -- attr = iov->iov_base; -- iov->iov_len = NLA_ALIGN(attr->nla_len); -- net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); -- net_param->param = ISCSI_NET_PARAM_IFACE_ENABLE; -- net_param->iface_type = iface_type; -- net_param->iface_num = iface->iface_num; -- net_param->param_type = ISCSI_NET_PARAM; -- net_param->len = 1; -- if (!strcmp(iface->state, "disable")) -- net_param->value[0] = ISCSI_IFACE_DISABLE; -- else /* Assume enabled */ -- net_param->value[0] = ISCSI_IFACE_ENABLE; -- return 0; -+#define IFACE_SET_PARAM_STATE(iov, inum, itype, param, ptype, ival, \ -+ gcnt, lcnt) { \ -+ if (!iface_fill_param_state(iov, inum, itype, param, ptype, \ -+ ival)) { \ -+ (*gcnt)++; \ -+ (*lcnt)++; \ -+ } \ - } - - /* IPv4 Bootproto: DHCP/static */ -@@ -1598,13 +1583,14 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - iptype = iface_get_iptype(iface); - if (iptype == ISCSI_IFACE_TYPE_IPV4) { - if (!strcmp(iface->state, "disable")) { -- if (!iface_fill_net_state(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV4)) { -- net_config->count++; -- count++; -- } -- -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM, -+ iface->state, -+ &net_config->count, -+ &count); - return 0; - } - -@@ -1648,18 +1634,24 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - * fill state and other parameters (if any) - */ - if (count) { -- if (!iface_fill_net_state(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV4)) { -- net_config->count++; -- count++; -- } -- if (!iface_fill_vlan_state(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV4)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM, -+ iface->state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_VLAN_ENABLED, -+ ISCSI_NET_PARAM, -+ iface->vlan_state, -+ &net_config->count, -+ &count); -+ - if (strcmp(iface->vlan_state, "disable") && - iface->vlan_id) { - if (!iface_fill_vlan_id(&iov[net_config->count], -@@ -1687,12 +1679,14 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - } - } else if (iptype == ISCSI_IFACE_TYPE_IPV6) { - if (!strcmp(iface->state, "disable")) { -- if (!iface_fill_net_state(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV6)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM, -+ iface->state, -+ &net_config->count, -+ &count); - return 0; - } - -@@ -1770,18 +1764,24 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - * fill state and other parameters - */ - if (count) { -- if (!iface_fill_net_state(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV6)) { -- net_config->count++; -- count++; -- } -- if (!iface_fill_vlan_state(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV6)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM, -+ iface->state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_VLAN_ENABLED, -+ ISCSI_NET_PARAM, -+ iface->vlan_state, -+ &net_config->count, -+ &count); -+ - if (strcmp(iface->vlan_state, "disable") && - iface->vlan_id) { - if (!iface_fill_vlan_id(&iov[net_config->count], --- -1.8.3.1 - diff --git a/0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch b/0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch deleted file mode 100644 index b8f451c..0000000 --- a/0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch +++ /dev/null @@ -1,215 +0,0 @@ -From d8991c9e1de373a1c55ad2f8ca07bb3fbda1aa5c Mon Sep 17 00:00:00 2001 -From: Harish Zunjarrao -Date: Fri, 18 Oct 2013 09:29:22 -0400 -Subject: [PATCH] iscsi tools: Use single function to set integer network - parameters - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iface.c | 162 +++++++++++++++++++++++++++++++++--------------------------- - 1 file changed, 90 insertions(+), 72 deletions(-) - -diff --git a/usr/iface.c b/usr/iface.c -index 292c804..6454f75 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -1223,58 +1223,68 @@ int iface_get_param_count(struct iface_rec *iface, int iface_all) - return iface_params.count; - } - --/* IPv4/IPv6 Port: 3260 or User defined */ --static int iface_fill_port(struct iovec *iov, struct iface_rec *iface, -- uint32_t iface_type) -+/* write integer parameter value */ -+static int iface_fill_int_param_val(struct iovec *iov, uint32_t iface_num, -+ uint8_t iface_type, uint16_t param, -+ uint8_t param_type, uint32_t param_len, -+ uint32_t param_val) - { - int len; - struct iscsi_iface_param_info *net_param; -- uint16_t port = 3260; - struct nlattr *attr; -+ uint8_t val8 = 0; -+ uint16_t val16 = 0; -+ uint32_t val32 = 0; -+ char *val = NULL; - -- len = sizeof(struct iscsi_iface_param_info) + sizeof(port); -- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_PORT, len); -- if (!iov->iov_base) -- return 1; -- attr = iov->iov_base; -- iov->iov_len = NLA_ALIGN(attr->nla_len); -- -- net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); -- net_param->param = ISCSI_NET_PARAM_PORT; -- net_param->iface_type = iface_type; -- net_param->iface_num = iface->iface_num; -- net_param->param_type = ISCSI_NET_PARAM; -- net_param->len = 2; -- if (iface->port) -- port = iface->port; -- memcpy(net_param->value, &port, net_param->len); -- return 0; --} -- --static int iface_fill_mtu(struct iovec *iov, struct iface_rec *iface, -- uint32_t iface_type) --{ -- int len; -- struct iscsi_iface_param_info *net_param; -- uint16_t mtu = 0; -- struct nlattr *attr; -- -- len = sizeof(struct iscsi_iface_param_info) + 2; -- iov->iov_base = iscsi_nla_alloc(ISCSI_NET_PARAM_MTU, len); -+ len = sizeof(struct iscsi_iface_param_info) + param_len; -+ iov->iov_base = iscsi_nla_alloc(param, len); - if (!(iov->iov_base)) - return 1; -+ - attr = iov->iov_base; - iov->iov_len = NLA_ALIGN(attr->nla_len); -- - net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); -- net_param->param = ISCSI_NET_PARAM_MTU; -+ net_param->iface_num = iface_num; -+ net_param->len = param_len; -+ net_param->param = param; - net_param->iface_type = iface_type; -- net_param->iface_num = iface->iface_num; -- net_param->param_type = ISCSI_NET_PARAM; -- net_param->len = 2; -- mtu = iface->mtu; -- memcpy(net_param->value, &mtu, net_param->len); -+ net_param->param_type = param_type; -+ switch (param_len) { -+ case 1: -+ val8 = (uint8_t)param_val; -+ val = (char *)&val8; -+ break; -+ -+ case 2: -+ val16 = (uint16_t)param_val; -+ val = (char *)&val16; -+ break; -+ -+ case 4: -+ val32 = (uint32_t)param_val; -+ val = (char *)&val32; -+ break; -+ -+ default: -+ goto free; -+ } -+ memcpy(net_param->value, val, param_len); - return 0; -+free: -+ free(iov->iov_base); -+ iov->iov_base = NULL; -+ iov->iov_len = 0; -+ return 1; -+} -+ -+#define IFACE_SET_PARAM_INTVAL(iov, inum, itype, param, ptype, plen, \ -+ ival, gcnt, lcnt) { \ -+ if (ival && !iface_fill_int_param_val(iov, inum, itype, param, \ -+ ptype, plen, ival)) { \ -+ (*gcnt)++; \ -+ (*lcnt)++; \ -+ } \ - } - - /* IPv4/IPv6 VLAN_ID: decimal value <= 4095 */ -@@ -1660,22 +1670,26 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - count++; - } - } -- if (iface->mtu) { -- if (!iface_fill_mtu(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV4)) { -- net_config->count++; -- count++; -- } -- } -- if (iface->port) { -- if (!iface_fill_port(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV4)) { -- net_config->count++; -- count++; -- } -- } -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_MTU, -+ ISCSI_NET_PARAM, -+ 2, -+ iface->mtu, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_PORT, -+ ISCSI_NET_PARAM, -+ 2, -+ iface->port, -+ &net_config->count, -+ &count); - } - } else if (iptype == ISCSI_IFACE_TYPE_IPV6) { - if (!strcmp(iface->state, "disable")) { -@@ -1791,22 +1805,26 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - count++; - } - } -- if (iface->mtu) { -- if (!iface_fill_mtu(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV6)) { -- net_config->count++; -- count++; -- } -- } -- if (iface->port) { -- if (!iface_fill_port(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV6)) { -- net_config->count++; -- count++; -- } -- } -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_MTU, -+ ISCSI_NET_PARAM, -+ 2, -+ iface->mtu, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_PORT, -+ ISCSI_NET_PARAM, -+ 2, -+ iface->port, -+ &net_config->count, -+ &count); - } - } - return 0; --- -1.8.3.1 - diff --git a/0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch b/0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch deleted file mode 100644 index 0512f6d..0000000 --- a/0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch +++ /dev/null @@ -1,44 +0,0 @@ -From da404f2137daa4e5cf06d69e4d7b6a0bff8c13b5 Mon Sep 17 00:00:00 2001 -From: Harish Zunjarrao -Date: Fri, 18 Oct 2013 09:29:23 -0400 -Subject: [PATCH] iscsi tools: Ignore network parameter if not enabled/disabled - -If iface does not contain network parameter or incorrect value is set, -do not send that network parameter value to driver. - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iface.c | 13 ++++++++++--- - 1 file changed, 10 insertions(+), 3 deletions(-) - -diff --git a/usr/iface.c b/usr/iface.c -index 6454f75..55b0dd4 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -1346,11 +1346,18 @@ static int iface_fill_param_state(struct iovec *iov, uint32_t iface_num, - net_param->param = param; - net_param->iface_type = iface_type; - net_param->param_type = param_type; -- if (strcmp(param_val, "disable")) -- net_param->value[0] = ISCSI_NET_PARAM_ENABLE; -- else /* Assume disabled */ -+ if (!strcmp(param_val, "disable")) - net_param->value[0] = ISCSI_NET_PARAM_DISABLE; -+ else if (!strcmp(param_val, "enable")) -+ net_param->value[0] = ISCSI_NET_PARAM_ENABLE; -+ else -+ goto free; - return 0; -+free: -+ free(iov->iov_base); -+ iov->iov_base = NULL; -+ iov->iov_len = 0; -+ return 1; - } - - #define IFACE_SET_PARAM_STATE(iov, inum, itype, param, ptype, ival, \ --- -1.8.3.1 - diff --git a/0049-iscsi-tools-Additional-parameters-for-network-settin.patch b/0049-iscsi-tools-Additional-parameters-for-network-settin.patch deleted file mode 100644 index 888d34c..0000000 --- a/0049-iscsi-tools-Additional-parameters-for-network-settin.patch +++ /dev/null @@ -1,1445 +0,0 @@ -From 66d9f120e26d49329667e4b9f5a84076c4f66a6e Mon Sep 17 00:00:00 2001 -From: Harish Zunjarrao -Date: Fri, 18 Oct 2013 09:29:24 -0400 -Subject: [PATCH] iscsi tools: Additional parameters for network settings - -Signed-off-by: Harish Zunjarrao -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/config.h | 50 +++- - usr/idbm.c | 76 +++++ - usr/idbm_fields.h | 49 ++++ - usr/iface.c | 847 ++++++++++++++++++++++++++++++++++++++++++++++++------ - usr/iscsi_sysfs.c | 200 +++++++++++++ - 5 files changed, 1132 insertions(+), 90 deletions(-) - -diff --git a/usr/config.h b/usr/config.h -index d457bdd..fd31a54 100644 ---- a/usr/config.h -+++ b/usr/config.h -@@ -232,11 +232,59 @@ typedef struct iface_rec { - * 1 = enable */ - uint16_t mtu; - uint16_t port; -+ char delayed_ack[ISCSI_MAX_STR_LEN]; -+ char nagle[ISCSI_MAX_STR_LEN]; -+ char tcp_wsf_state[ISCSI_MAX_STR_LEN]; -+ uint8_t tcp_wsf; -+ uint8_t tcp_timer_scale; -+ char tcp_timestamp[ISCSI_MAX_STR_LEN]; -+ char dhcp_dns[ISCSI_MAX_STR_LEN]; -+ char dhcp_slp_da[ISCSI_MAX_STR_LEN]; -+ char tos_state[ISCSI_MAX_STR_LEN]; -+ uint8_t tos; -+ char gratuitous_arp[ISCSI_MAX_STR_LEN]; -+ char dhcp_alt_client_id_state[ISCSI_MAX_STR_LEN]; -+ char dhcp_alt_client_id[ISCSI_MAX_STR_LEN]; -+ char dhcp_req_vendor_id_state[ISCSI_MAX_STR_LEN]; -+ char dhcp_vendor_id_state[ISCSI_MAX_STR_LEN]; -+ char dhcp_vendor_id[ISCSI_MAX_STR_LEN]; -+ char dhcp_learn_iqn[ISCSI_MAX_STR_LEN]; -+ char fragmentation[ISCSI_MAX_STR_LEN]; -+ char incoming_forwarding[ISCSI_MAX_STR_LEN]; -+ uint8_t ttl; -+ char gratuitous_neighbor_adv[ISCSI_MAX_STR_LEN]; -+ char redirect[ISCSI_MAX_STR_LEN]; -+ char mld[ISCSI_MAX_STR_LEN]; -+ uint32_t flow_label; -+ uint32_t traffic_class; -+ uint8_t hop_limit; -+ uint32_t nd_reachable_tmo; -+ uint32_t nd_rexmit_time; -+ uint32_t nd_stale_tmo; -+ uint8_t dup_addr_detect_cnt; -+ uint32_t router_adv_link_mtu; -+ uint16_t def_task_mgmt_tmo; -+ char header_digest[ISCSI_MAX_STR_LEN]; -+ char data_digest[ISCSI_MAX_STR_LEN]; -+ char immediate_data[ISCSI_MAX_STR_LEN]; -+ char initial_r2t[ISCSI_MAX_STR_LEN]; -+ char data_seq_inorder[ISCSI_MAX_STR_LEN]; -+ char data_pdu_inorder[ISCSI_MAX_STR_LEN]; -+ uint8_t erl; -+ uint32_t max_recv_dlength; -+ uint32_t first_burst_len; -+ uint16_t max_out_r2t; -+ uint32_t max_burst_len; -+ char chap_auth[ISCSI_MAX_STR_LEN]; -+ char bidi_chap[ISCSI_MAX_STR_LEN]; -+ char strict_login_comp[ISCSI_MAX_STR_LEN]; -+ char discovery_auth[ISCSI_MAX_STR_LEN]; -+ char discovery_logout[ISCSI_MAX_STR_LEN]; - char port_state[ISCSI_MAX_STR_LEN]; - char port_speed[ISCSI_MAX_STR_LEN]; - /* - * TODO: we may have to make this bigger and interconnect -- * specific for infinniband -+ * specific for infiniband - */ - char hwaddress[ISCSI_HWADDRESS_BUF_SIZE]; - char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; -diff --git a/usr/idbm.c b/usr/idbm.c -index 6b6f57c..4428ebe 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -454,6 +454,82 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) - __recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, dhcp_alt_client_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, dhcp_req_vendor_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, dup_addr_detect_cnt, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, gratuitous_neighbor_adv, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, nd_reachable_tmo, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, router_adv_link_mtu, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint8(IFACE_TCP_WSF, ri, r, tcp_wsf, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, tcp_timer_scale, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, tcp_timestamp, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_REDIRECT, ri, r, redirect, IDBM_SHOW, num, 1); -+ __recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, def_task_mgmt_tmo, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_HDRDGST, ri, r, header_digest, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DATADGST, ri, r, data_digest, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_IMM_DATA, ri, r, immediate_data, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_INITIAL_R2T, ri, r, initial_r2t, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DSEQ_INORDER, ri, r, data_seq_inorder, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DPDU_INORDER, ri, r, data_pdu_inorder, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint8(IFACE_ERL, ri, r, erl, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, max_recv_dlength, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_FIRST_BURST, ri, r, first_burst_len, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint16(IFACE_MAX_R2T, ri, r, max_out_r2t, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_MAX_BURST, ri, r, max_burst_len, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_CHAP_AUTH, ri, r, chap_auth, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_BIDI_CHAP, ri, r, bidi_chap, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, strict_login_comp, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, discovery_auth, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, discovery_logout, -+ IDBM_SHOW, num, 1); - } - - void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri) -diff --git a/usr/idbm_fields.h b/usr/idbm_fields.h -index 179dda8..5790a03 100644 ---- a/usr/idbm_fields.h -+++ b/usr/idbm_fields.h -@@ -89,6 +89,55 @@ - #define IFACE_NUM "iface.iface_num" - #define IFACE_MTU "iface.mtu" - #define IFACE_PORT "iface.port" -+#define IFACE_DELAYED_ACK "iface.delayed_ack" -+#define IFACE_TCP_NAGLE "iface.tcp_nagle" -+#define IFACE_TCP_WSF_STATE "iface.tcp_wsf_state" -+#define IFACE_TCP_WSF "iface.tcp_wsf" -+#define IFACE_TCP_TIMER_SCALE "iface.tcp_timer_scale" -+#define IFACE_TCP_TIMESTAMP "iface.tcp_timestamp" -+#define IFACE_DHCP_DNS "iface.dhcp_dns" -+#define IFACE_DHCP_SLP_DA "iface.dhcp_slp_da" -+#define IFACE_TOS_STATE "iface.tos_state" -+#define IFACE_TOS "iface.tos" -+#define IFACE_GRAT_ARP "iface.gratuitous_arp" -+#define IFACE_DHCP_ALT_CID "iface.dhcp_alt_client_id_state" -+#define IFACE_DHCP_ALT_CID_STR "iface.dhcp_alt_client_id" -+#define IFACE_DHCP_REQ_VID "iface.dhcp_req_vendor_id_state" -+#define IFACE_DHCP_VID "iface.dhcp_vendor_id_state" -+#define IFACE_DHCP_VID_STR "iface.dhcp_vendor_id" -+#define IFACE_DHCP_LEARN_IQN "iface.dhcp_learn_iqn" -+#define IFACE_FRAGMENTATION "iface.fragmentation" -+#define IFACE_IN_FORWARD "iface.incoming_forwarding" -+#define IFACE_TTL "iface.ttl" -+#define IFACE_GRAT_NEIGHBOR_ADV "iface.gratuitous_neighbor_adv" -+#define IFACE_REDIRECT "iface.redirect" -+#define IFACE_IGNORE_ICMP_ECHO_REQ "iface.ignore_icmp_echo_request" -+#define IFACE_MLD "iface.mld" -+#define IFACE_FLOW_LABEL "iface.flow_label" -+#define IFACE_TRAFFIC_CLASS "iface.traffic_class" -+#define IFACE_HOP_LIMIT "iface.hop_limit" -+#define IFACE_ND_REACHABLE_TMO "iface.nd_reachable_tmo" -+#define IFACE_ND_REXMIT_TIME "iface.nd_rexmit_time" -+#define IFACE_ND_STALE_TMO "iface.nd_stale_tmo" -+#define IFACE_DUP_ADDR_DETECT_CNT "iface.dup_addr_detect_cnt" -+#define IFACE_RTR_ADV_LINK_MTU "iface.router_adv_link_mtu" -+#define IFACE_DEF_TMF_TMO "iface.def_task_mgmt_timeout" -+#define IFACE_HDRDGST "iface.header_digest" -+#define IFACE_DATADGST "iface.data_digest" -+#define IFACE_IMM_DATA "iface.immediate_data" -+#define IFACE_INITIAL_R2T "iface.initial_r2t" -+#define IFACE_DSEQ_INORDER "iface.data_seq_inorder" -+#define IFACE_DPDU_INORDER "iface.data_pdu_inorder" -+#define IFACE_ERL "iface.erl" -+#define IFACE_MAX_RECV_DLEN "iface.max_receive_data_len" -+#define IFACE_FIRST_BURST "iface.first_burst_len" -+#define IFACE_MAX_R2T "iface.max_outstanding_r2t" -+#define IFACE_MAX_BURST "iface.max_burst_len" -+#define IFACE_CHAP_AUTH "iface.chap_auth" -+#define IFACE_BIDI_CHAP "iface.bidi_chap" -+#define IFACE_STRICT_LOGIN_COMP "iface.strict_login_compliance" -+#define IFACE_DISCOVERY_AUTH "iface.discovery_auth" -+#define IFACE_DISCOVERY_LOGOUT "iface.discovery_logout" - - /* discovery fields */ - #define DISC_STARTUP "discovery.startup" -diff --git a/usr/iface.c b/usr/iface.c -index 55b0dd4..87ac875 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -601,6 +601,105 @@ void iface_copy(struct iface_rec *dst, struct iface_rec *src) - dst->mtu = src->mtu; - if (src->port) - dst->port = src->port; -+ if (strlen(src->delayed_ack)) -+ strcpy(dst->delayed_ack, src->delayed_ack); -+ if (strlen(src->nagle)) -+ strcpy(dst->nagle, src->nagle); -+ if (strlen(src->tcp_wsf_state)) -+ strcpy(dst->tcp_wsf_state, src->tcp_wsf_state); -+ if (src->tcp_wsf) -+ dst->tcp_wsf = src->tcp_wsf; -+ if (src->tcp_timer_scale) -+ dst->tcp_timer_scale = src->tcp_timer_scale; -+ if (strlen(src->tcp_timestamp)) -+ strcpy(dst->tcp_timestamp, src->tcp_timestamp); -+ if (strlen(src->dhcp_dns)) -+ strcpy(dst->dhcp_dns, src->dhcp_dns); -+ if (strlen(src->dhcp_slp_da)) -+ strcpy(dst->dhcp_slp_da, src->dhcp_slp_da); -+ if (strlen(src->tos_state)) -+ strcpy(dst->tos_state, src->tos_state); -+ if (src->tos) -+ dst->tos = src->tos; -+ if (strlen(src->gratuitous_arp)) -+ strcpy(dst->gratuitous_arp, src->gratuitous_arp); -+ if (strlen(src->dhcp_alt_client_id_state)) -+ strcpy(dst->dhcp_alt_client_id_state, -+ src->dhcp_alt_client_id_state); -+ if (strlen(src->dhcp_alt_client_id)) -+ strcpy(dst->dhcp_alt_client_id, src->dhcp_alt_client_id); -+ if (strlen(src->dhcp_req_vendor_id_state)) -+ strcpy(dst->dhcp_req_vendor_id_state, -+ src->dhcp_req_vendor_id_state); -+ if (strlen(src->dhcp_vendor_id_state)) -+ strcpy(dst->dhcp_vendor_id_state, src->dhcp_vendor_id_state); -+ if (strlen(src->dhcp_vendor_id)) -+ strcpy(dst->dhcp_vendor_id, src->dhcp_vendor_id); -+ if (strlen(src->dhcp_learn_iqn)) -+ strcpy(dst->dhcp_learn_iqn, src->dhcp_learn_iqn); -+ if (strlen(src->fragmentation)) -+ strcpy(dst->fragmentation, src->fragmentation); -+ if (strlen(src->incoming_forwarding)) -+ strcpy(dst->incoming_forwarding, src->incoming_forwarding); -+ if (src->ttl) -+ dst->ttl = src->ttl; -+ if (strlen(src->gratuitous_neighbor_adv)) -+ strcpy(dst->gratuitous_neighbor_adv, -+ src->gratuitous_neighbor_adv); -+ if (strlen(src->redirect)) -+ strcpy(dst->redirect, src->redirect); -+ if (strlen(src->mld)) -+ strcpy(dst->mld, src->mld); -+ if (src->flow_label) -+ dst->flow_label = src->flow_label; -+ if (src->traffic_class) -+ dst->traffic_class = src->traffic_class; -+ if (src->hop_limit) -+ dst->hop_limit = src->hop_limit; -+ if (src->nd_reachable_tmo) -+ dst->nd_reachable_tmo = src->nd_reachable_tmo; -+ if (src->nd_rexmit_time) -+ dst->nd_rexmit_time = src->nd_rexmit_time; -+ if (src->nd_stale_tmo) -+ dst->nd_stale_tmo = src->nd_stale_tmo; -+ if (src->dup_addr_detect_cnt) -+ dst->dup_addr_detect_cnt = src->dup_addr_detect_cnt; -+ if (src->router_adv_link_mtu) -+ dst->router_adv_link_mtu = src->router_adv_link_mtu; -+ if (src->def_task_mgmt_tmo) -+ dst->def_task_mgmt_tmo = src->def_task_mgmt_tmo; -+ if (strlen(src->header_digest)) -+ strcpy(dst->header_digest, src->header_digest); -+ if (strlen(src->data_digest)) -+ strcpy(dst->data_digest, src->data_digest); -+ if (strlen(src->immediate_data)) -+ strcpy(dst->immediate_data, src->immediate_data); -+ if (strlen(src->initial_r2t)) -+ strcpy(dst->initial_r2t, src->initial_r2t); -+ if (strlen(src->data_seq_inorder)) -+ strcpy(dst->data_seq_inorder, src->data_seq_inorder); -+ if (strlen(src->data_pdu_inorder)) -+ strcpy(dst->data_pdu_inorder, src->data_pdu_inorder); -+ if (src->erl) -+ dst->erl = src->erl; -+ if (src->max_recv_dlength) -+ dst->max_recv_dlength = src->max_recv_dlength; -+ if (src->first_burst_len) -+ dst->first_burst_len = src->first_burst_len; -+ if (src->max_out_r2t) -+ dst->max_out_r2t = src->max_out_r2t; -+ if (src->max_burst_len) -+ dst->max_burst_len = src->max_burst_len; -+ if (strlen(src->chap_auth)) -+ strcpy(dst->chap_auth, src->chap_auth); -+ if (strlen(src->bidi_chap)) -+ strcpy(dst->bidi_chap, src->bidi_chap); -+ if (strlen(src->strict_login_comp)) -+ strcpy(dst->strict_login_comp, src->strict_login_comp); -+ if (strlen(src->discovery_auth)) -+ strcpy(dst->discovery_auth, src->discovery_auth); -+ if (strlen(src->discovery_logout)) -+ strcpy(dst->discovery_logout, src->discovery_logout); - if (strlen(src->hwaddress)) - strcpy(dst->hwaddress, src->hwaddress); - if (strlen(src->transport_name)) -@@ -1026,6 +1125,79 @@ struct iface_param_count { - int count; - }; - -+#define IFACE_NET_PARAM_EN_CNT(param_val, cnt) { \ -+ if (!strcmp(param_val, "disable") || \ -+ !strcmp(param_val, "enable")) \ -+ (*cnt)++; \ -+} -+ -+/** -+ * iface_get_common_param_count - Gets common parameters count for given iface -+ * @iface: iface to setup -+ * @count: number of parameters to set -+ */ -+static void iface_get_common_param_count(struct iface_rec *iface, int *count) -+{ -+ if (strcmp(iface->vlan_state, "disable")) { -+ /* vlan_state enabled */ -+ (*count)++; -+ -+ if (iface->vlan_id) -+ /* For vlan value */ -+ (*count)++; -+ } else { -+ /* vlan_state disabled */ -+ (*count)++; -+ } -+ -+ if (iface->mtu) -+ (*count)++; -+ -+ if (iface->port) -+ (*count)++; -+ -+ IFACE_NET_PARAM_EN_CNT(iface->delayed_ack, count); -+ IFACE_NET_PARAM_EN_CNT(iface->nagle, count); -+ IFACE_NET_PARAM_EN_CNT(iface->tcp_wsf_state, count); -+ IFACE_NET_PARAM_EN_CNT(iface->tcp_timestamp, count); -+ IFACE_NET_PARAM_EN_CNT(iface->redirect, count); -+ IFACE_NET_PARAM_EN_CNT(iface->header_digest, count); -+ IFACE_NET_PARAM_EN_CNT(iface->data_digest, count); -+ IFACE_NET_PARAM_EN_CNT(iface->immediate_data, count); -+ IFACE_NET_PARAM_EN_CNT(iface->initial_r2t, count); -+ IFACE_NET_PARAM_EN_CNT(iface->data_seq_inorder, count); -+ IFACE_NET_PARAM_EN_CNT(iface->data_pdu_inorder, count); -+ IFACE_NET_PARAM_EN_CNT(iface->chap_auth, count); -+ IFACE_NET_PARAM_EN_CNT(iface->bidi_chap, count); -+ IFACE_NET_PARAM_EN_CNT(iface->strict_login_comp, count); -+ IFACE_NET_PARAM_EN_CNT(iface->discovery_auth, count); -+ IFACE_NET_PARAM_EN_CNT(iface->discovery_logout, count); -+ -+ if (iface->tcp_wsf) -+ (*count)++; -+ -+ if (iface->tcp_timer_scale) -+ (*count)++; -+ -+ if (iface->def_task_mgmt_tmo) -+ (*count)++; -+ -+ if (iface->erl) -+ (*count)++; -+ -+ if (iface->max_recv_dlength) -+ (*count)++; -+ -+ if (iface->first_burst_len) -+ (*count)++; -+ -+ if (iface->max_burst_len) -+ (*count)++; -+ -+ if (iface->max_out_r2t) -+ (*count)++; -+} -+ - /** - * __iface_get_param_count - Gets netconfig parameter count for given iface - * @data: iface_param_count structure -@@ -1044,10 +1216,10 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) - if (iptype == ISCSI_IFACE_TYPE_IPV4) { - - if (strcmp(iface->state, "disable")) { -- if (strstr(iface->bootproto, "dhcp")) -+ if (strstr(iface->bootproto, "dhcp")) { - /* DHCP enabled */ - count++; -- else { -+ } else { - /* DHCP disabled */ - count++; - -@@ -1062,12 +1234,13 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) - if (strstr(iface->gateway, ".")) - /* User configured Gateway */ - count++; -- } else -+ } else { - /* - * IPv4 Address not valid, decrement - * count of DHCP - */ - count--; -+ } - } - - /* -@@ -1078,37 +1251,68 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) - /* iface state */ - count++; - -- if (strcmp(iface->vlan_state, "disable")) { -- /* vlan_state enabled */ -+ IFACE_NET_PARAM_EN_CNT(iface->dhcp_dns, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT(iface->dhcp_slp_da, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT(iface->tos_state, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT(iface->gratuitous_arp, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT( -+ iface->dhcp_alt_client_id_state, -+ &count); -+ -+ if (iface->dhcp_alt_client_id[0]) - count++; - -- if (iface->vlan_id) -- /* For vlan value */ -- count++; -- } else -- /* vlan_state disabled */ -+ IFACE_NET_PARAM_EN_CNT( -+ iface->dhcp_req_vendor_id_state, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT( -+ iface->dhcp_vendor_id_state, -+ &count); -+ -+ if (iface->dhcp_vendor_id[0]) - count++; - -- if (iface->mtu) -+ IFACE_NET_PARAM_EN_CNT(iface->dhcp_learn_iqn, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT(iface->fragmentation, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT( -+ iface->incoming_forwarding, -+ &count); -+ -+ if (iface->tos) - count++; - -- if (iface->port) -+ if (iface->ttl) - count++; -+ -+ iface_get_common_param_count(iface, &count); - } -- } else -+ } else { - /* IPv4 is disabled, iface state */ - count++; -- -+ } - } else if (iptype == ISCSI_IFACE_TYPE_IPV6) { - - if (strcmp(iface->state, "disable")) { - - /* IPv6 Address */ - if (strstr(iface->ipv6_autocfg, "nd") || -- strstr(iface->ipv6_autocfg, "dhcpv6")) -+ strstr(iface->ipv6_autocfg, "dhcpv6")) { - /* Autocfg enabled */ - count++; -- else { -+ } else { - /* Autocfg disabled */ - count++; - -@@ -1169,26 +1373,42 @@ static int __iface_get_param_count(void *data, struct iface_rec *iface) - /* iface state */ - count++; - -- if (strcmp(iface->vlan_state, "disable")) { -- /* vlan_state enabled */ -+ IFACE_NET_PARAM_EN_CNT( -+ iface->gratuitous_neighbor_adv, -+ &count); -+ -+ IFACE_NET_PARAM_EN_CNT(iface->mld, &count); -+ -+ if (iface->flow_label) -+ count++; -+ -+ if (iface->traffic_class) -+ count++; -+ -+ if (iface->hop_limit) - count++; - -- if (iface->vlan_id) -- /* For vlan value */ -- count++; -- } else -- /* vlan_state disabled */ -+ if (iface->nd_reachable_tmo) - count++; - -- if (iface->mtu) -+ if (iface->nd_rexmit_time) - count++; - -- if (iface->port) -+ if (iface->nd_stale_tmo) - count++; -+ -+ if (iface->dup_addr_detect_cnt) -+ count++; -+ -+ if (iface->router_adv_link_mtu) -+ count++; -+ -+ iface_get_common_param_count(iface, &count); - } -- } else -+ } else { - /* IPv6 is disabled, iface state */ - count++; -+ } - } - - iface_params->count += count; -@@ -1578,6 +1798,44 @@ free: - } \ - } - -+/* write string parameter value */ -+static int iface_fill_str_param_val(struct iovec *iov, uint32_t iface_num, -+ uint8_t iface_type, uint16_t param, -+ uint32_t param_len, char *param_val) -+{ -+ int len; -+ struct iscsi_iface_param_info *net_param; -+ struct nlattr *attr; -+ -+ if (!param_val[0]) -+ return 1; -+ -+ len = sizeof(struct iscsi_iface_param_info) + param_len; -+ iov->iov_base = iscsi_nla_alloc(param, len); -+ if (!(iov->iov_base)) -+ return 1; -+ -+ attr = iov->iov_base; -+ iov->iov_len = NLA_ALIGN(attr->nla_len); -+ net_param = (struct iscsi_iface_param_info *)ISCSI_NLA_DATA(attr); -+ net_param->iface_num = iface_num; -+ net_param->len = param_len; -+ net_param->param = param; -+ net_param->iface_type = iface_type; -+ net_param->param_type = ISCSI_NET_PARAM; -+ memcpy(net_param->value, param_val, param_len); -+ return 0; -+} -+ -+#define IFACE_SET_NET_PARAM_STRVAL(iov, inum, itype, param, plen, \ -+ ival, gcnt, lcnt) { \ -+ if (!iface_fill_str_param_val(iov, inum, itype, param, plen, \ -+ ival)) { \ -+ (*gcnt)++; \ -+ (*lcnt)++; \ -+ } \ -+} -+ - struct iface_net_config { - struct iface_rec *primary; - struct iovec *iovs; -@@ -1597,8 +1855,12 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - /* start at 2, because 0 is for nlmsghdr and 1 for event */ - iov = net_config->iovs + 2; - -+ if (!iface->port) -+ iface->port = 3260; -+ - iptype = iface_get_iptype(iface); -- if (iptype == ISCSI_IFACE_TYPE_IPV4) { -+ switch (iptype) { -+ case ISCSI_IFACE_TYPE_IPV4: - if (!strcmp(iface->state, "disable")) { - IFACE_SET_PARAM_STATE(&iov[net_config->count], - iface->iface_num, -@@ -1652,53 +1914,136 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - */ - if (count) { - IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN, -+ ISCSI_NET_PARAM, -+ iface->dhcp_dns, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN, -+ ISCSI_NET_PARAM, -+ iface->dhcp_slp_da, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_TOS_EN, -+ ISCSI_NET_PARAM, -+ iface->tos_state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], - iface->iface_num, - ISCSI_IFACE_TYPE_IPV4, -- ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM_IPV4_TOS, - ISCSI_NET_PARAM, -- iface->state, -+ 1, -+ iface->tos, - &net_config->count, - &count); - - IFACE_SET_PARAM_STATE(&iov[net_config->count], - iface->iface_num, - ISCSI_IFACE_TYPE_IPV4, -- ISCSI_NET_PARAM_VLAN_ENABLED, -+ ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN, - ISCSI_NET_PARAM, -- iface->vlan_state, -+ iface->gratuitous_arp, - &net_config->count, - &count); - -- if (strcmp(iface->vlan_state, "disable") && -- iface->vlan_id) { -- if (!iface_fill_vlan_id(&iov[net_config->count], -- iface, ISCSI_IFACE_TYPE_IPV4)) { -- net_config->count++; -- count++; -- } -- } -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN, -+ ISCSI_NET_PARAM, -+ iface->dhcp_alt_client_id_state, -+ &net_config->count, -+ &count); - -- IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -- iface->iface_num, -- ISCSI_IFACE_TYPE_IPV4, -- ISCSI_NET_PARAM_MTU, -- ISCSI_NET_PARAM, -- 2, -- iface->mtu, -- &net_config->count, -- &count); -+ IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID, -+ strlen(iface->dhcp_alt_client_id), -+ iface->dhcp_alt_client_id, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN, -+ ISCSI_NET_PARAM, -+ iface->dhcp_req_vendor_id_state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN, -+ ISCSI_NET_PARAM, -+ iface->dhcp_vendor_id_state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_NET_PARAM_STRVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID, -+ strlen(iface->dhcp_vendor_id), -+ iface->dhcp_vendor_id, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN, -+ ISCSI_NET_PARAM, -+ iface->dhcp_learn_iqn, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE, -+ ISCSI_NET_PARAM, -+ iface->fragmentation, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV4, -+ ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN, -+ ISCSI_NET_PARAM, -+ iface->incoming_forwarding, -+ &net_config->count, -+ &count); - - IFACE_SET_PARAM_INTVAL(&iov[net_config->count], - iface->iface_num, - ISCSI_IFACE_TYPE_IPV4, -- ISCSI_NET_PARAM_PORT, -+ ISCSI_NET_PARAM_IPV4_TTL, - ISCSI_NET_PARAM, -- 2, -- iface->port, -+ 1, -+ iface->ttl, - &net_config->count, - &count); - } -- } else if (iptype == ISCSI_IFACE_TYPE_IPV6) { -+ break; -+ -+ case ISCSI_IFACE_TYPE_IPV6: - if (!strcmp(iface->state, "disable")) { - IFACE_SET_PARAM_STATE(&iov[net_config->count], - iface->iface_num, -@@ -1786,53 +2131,377 @@ static int __iface_build_net_config(void *data, struct iface_rec *iface) - */ - if (count) { - IFACE_SET_PARAM_STATE(&iov[net_config->count], -- iface->iface_num, -- ISCSI_IFACE_TYPE_IPV6, -- ISCSI_NET_PARAM_IFACE_ENABLE, -- ISCSI_NET_PARAM, -- iface->state, -- &net_config->count, -- &count); -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN, -+ ISCSI_NET_PARAM, -+ iface->gratuitous_neighbor_adv, -+ &net_config->count, -+ &count); - - IFACE_SET_PARAM_STATE(&iov[net_config->count], - iface->iface_num, - ISCSI_IFACE_TYPE_IPV6, -- ISCSI_NET_PARAM_VLAN_ENABLED, -+ ISCSI_NET_PARAM_IPV6_MLD_EN, - ISCSI_NET_PARAM, -- iface->vlan_state, -+ iface->mld, - &net_config->count, - &count); - -- if (strcmp(iface->vlan_state, "disable") && -- iface->vlan_id) { -- if (!iface_fill_vlan_id(&iov[net_config->count], -- iface, -- ISCSI_IFACE_TYPE_IPV6)) { -- net_config->count++; -- count++; -- } -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_FLOW_LABEL, -+ ISCSI_NET_PARAM, -+ 4, -+ iface->flow_label, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS, -+ ISCSI_NET_PARAM, -+ 1, -+ iface->traffic_class, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_HOP_LIMIT, -+ ISCSI_NET_PARAM, -+ 1, -+ iface->hop_limit, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO, -+ ISCSI_NET_PARAM, -+ 4, -+ iface->nd_reachable_tmo, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME, -+ ISCSI_NET_PARAM, -+ 4, -+ iface->nd_rexmit_time, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_ND_STALE_TMO, -+ ISCSI_NET_PARAM, -+ 4, -+ iface->nd_stale_tmo, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT, -+ ISCSI_NET_PARAM, -+ 1, -+ iface->dup_addr_detect_cnt, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ ISCSI_IFACE_TYPE_IPV6, -+ ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU, -+ ISCSI_NET_PARAM, -+ 4, -+ iface->router_adv_link_mtu, -+ &net_config->count, -+ &count); -+ } -+ break; -+ } -+ -+ /* Fill parameters common to IPv4 and IPv6 ifaces */ -+ if (count) { -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_IFACE_ENABLE, -+ ISCSI_NET_PARAM, -+ iface->state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_VLAN_ENABLED, -+ ISCSI_NET_PARAM, -+ iface->vlan_state, -+ &net_config->count, -+ &count); -+ -+ if (strcmp(iface->vlan_state, "disable") && iface->vlan_id) { -+ if (!iface_fill_vlan_id(&iov[net_config->count], iface, -+ iptype)) { -+ net_config->count++; -+ count++; - } -- -- IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -- iface->iface_num, -- ISCSI_IFACE_TYPE_IPV6, -- ISCSI_NET_PARAM_MTU, -- ISCSI_NET_PARAM, -- 2, -- iface->mtu, -- &net_config->count, -- &count); -- -- IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -- iface->iface_num, -- ISCSI_IFACE_TYPE_IPV6, -- ISCSI_NET_PARAM_PORT, -- ISCSI_NET_PARAM, -- 2, -- iface->port, -- &net_config->count, -- &count); - } -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_MTU, -+ ISCSI_NET_PARAM, -+ 2, -+ iface->mtu, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_PORT, -+ ISCSI_NET_PARAM, -+ 2, -+ iface->port, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_DELAYED_ACK_EN, -+ ISCSI_NET_PARAM, -+ iface->delayed_ack, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_TCP_NAGLE_DISABLE, -+ ISCSI_NET_PARAM, -+ iface->nagle, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_TCP_WSF_DISABLE, -+ ISCSI_NET_PARAM, -+ iface->tcp_wsf_state, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_TCP_WSF, -+ ISCSI_NET_PARAM, -+ 1, -+ iface->tcp_wsf, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_TCP_TIMER_SCALE, -+ ISCSI_NET_PARAM, -+ 1, -+ iface->tcp_timer_scale, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_TCP_TIMESTAMP_EN, -+ ISCSI_NET_PARAM, -+ iface->tcp_timestamp, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_NET_PARAM_REDIRECT_EN, -+ ISCSI_NET_PARAM, -+ iface->redirect, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO, -+ ISCSI_IFACE_PARAM, -+ 2, -+ iface->def_task_mgmt_tmo, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_HDRDGST_EN, -+ ISCSI_IFACE_PARAM, -+ iface->header_digest, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_DATADGST_EN, -+ ISCSI_IFACE_PARAM, -+ iface->data_digest, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_IMM_DATA_EN, -+ ISCSI_IFACE_PARAM, -+ iface->immediate_data, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_INITIAL_R2T_EN, -+ ISCSI_IFACE_PARAM, -+ iface->initial_r2t, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN, -+ ISCSI_IFACE_PARAM, -+ iface->data_seq_inorder, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_PDU_INORDER_EN, -+ ISCSI_IFACE_PARAM, -+ iface->data_pdu_inorder, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_ERL, -+ ISCSI_IFACE_PARAM, -+ 1, -+ iface->erl, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH, -+ ISCSI_IFACE_PARAM, -+ 4, -+ iface->max_recv_dlength, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_FIRST_BURST, -+ ISCSI_IFACE_PARAM, -+ 4, -+ iface->first_burst_len, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_MAX_R2T, -+ ISCSI_IFACE_PARAM, -+ 2, -+ iface->max_out_r2t, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_INTVAL(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_MAX_BURST, -+ ISCSI_IFACE_PARAM, -+ 4, -+ iface->max_burst_len, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_CHAP_AUTH_EN, -+ ISCSI_IFACE_PARAM, -+ iface->chap_auth, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_BIDI_CHAP_EN, -+ ISCSI_IFACE_PARAM, -+ iface->bidi_chap, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN, -+ ISCSI_IFACE_PARAM, -+ iface->strict_login_comp, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL, -+ ISCSI_IFACE_PARAM, -+ iface->discovery_auth, -+ &net_config->count, -+ &count); -+ -+ IFACE_SET_PARAM_STATE(&iov[net_config->count], -+ iface->iface_num, -+ iptype, -+ ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN, -+ ISCSI_IFACE_PARAM, -+ iface->discovery_logout, -+ &net_config->count, -+ &count); - } - return 0; - } -diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c -index 04c3673..c916ed8 100644 ---- a/usr/iscsi_sysfs.c -+++ b/usr/iscsi_sysfs.c -@@ -856,6 +856,71 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, - - sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "subnet", - iface->subnet_mask, sizeof(iface->subnet_mask)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_alt_client_id_en", -+ iface->dhcp_alt_client_id_state, -+ sizeof(iface->dhcp_alt_client_id_state)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_alt_client_id", -+ iface->dhcp_alt_client_id, -+ sizeof(iface->dhcp_alt_client_id)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_dns_address_en", -+ iface->dhcp_dns, sizeof(iface->dhcp_dns)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_learn_iqn_en", -+ iface->dhcp_learn_iqn, -+ sizeof(iface->dhcp_learn_iqn)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_req_vendor_id_en", -+ iface->dhcp_req_vendor_id_state, -+ sizeof(iface->dhcp_req_vendor_id_state)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_use_vendor_id_en", -+ iface->dhcp_vendor_id_state, -+ sizeof(iface->dhcp_vendor_id_state)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_vendor_id", -+ iface->dhcp_vendor_id, -+ sizeof(iface->dhcp_vendor_id)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dhcp_slp_da_info_en", -+ iface->dhcp_slp_da, sizeof(iface->dhcp_slp_da)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "fragment_disable", -+ iface->fragmentation, -+ sizeof(iface->fragmentation)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "grat_arp_en", -+ iface->gratuitous_arp, -+ sizeof(iface->gratuitous_arp)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "incoming_forwarding_en", -+ iface->incoming_forwarding, -+ sizeof(iface->incoming_forwarding)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "tos_en", -+ iface->tos_state, sizeof(iface->tos_state)); -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "tos", &iface->tos)) -+ iface->tos = 0; -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "ttl", &iface->ttl)) -+ iface->ttl = 0; - } else { - sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, - "ipaddr_autocfg", -@@ -872,6 +937,53 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, - sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "router_addr", - iface->ipv6_router, - sizeof(iface->ipv6_router)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "router_state", -+ iface->router_autocfg, -+ sizeof(iface->router_autocfg)); -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "dup_addr_detect_cnt", -+ &iface->dup_addr_detect_cnt)) -+ iface->dup_addr_detect_cnt = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "flow_label", &iface->flow_label)) -+ iface->flow_label = 0; -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "grat_neighbor_adv_en", -+ iface->gratuitous_neighbor_adv, -+ sizeof(iface->gratuitous_neighbor_adv)); -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "hop_limit", &iface->hop_limit)) -+ iface->hop_limit = 0; -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "mld_en", -+ iface->mld, sizeof(iface->mld)); -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "nd_reachable_tmo", -+ &iface->nd_reachable_tmo)) -+ iface->nd_reachable_tmo = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "nd_rexmit_time", &iface->nd_rexmit_time)) -+ iface->nd_rexmit_time = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "nd_stale_tmo", &iface->nd_stale_tmo)) -+ iface->nd_stale_tmo = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "router_adv_link_mtu", -+ &iface->router_adv_link_mtu)) -+ iface->router_adv_link_mtu = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "traffic_class", &iface->traffic_class)) -+ iface->traffic_class = 0; - } - - if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, "port", -@@ -888,6 +1000,94 @@ static int iscsi_sysfs_read_iface(struct iface_rec *iface, int host_no, - &iface->vlan_priority)) - iface->vlan_priority = UINT8_MAX; - -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "vlan_enabled", -+ iface->vlan_state, sizeof(iface->vlan_state)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "enabled", -+ iface->state, sizeof(iface->state)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "delayed_ack_en", -+ iface->delayed_ack, sizeof(iface->delayed_ack)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_nagle_disable", -+ iface->nagle, sizeof(iface->nagle)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_wsf_disable", -+ iface->tcp_wsf_state, sizeof(iface->tcp_wsf_state)); -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_wsf", -+ &iface->tcp_wsf)) -+ iface->tcp_wsf = 0; -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "tcp_timer_scale", &iface->tcp_timer_scale)) -+ iface->tcp_timer_scale = 0; -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "tcp_timestamp_en", -+ iface->tcp_timestamp, sizeof(iface->tcp_timestamp)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "redirect_en", -+ iface->redirect, sizeof(iface->redirect)); -+ -+ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "def_taskmgmt_tmo", &iface->def_task_mgmt_tmo)) -+ iface->def_task_mgmt_tmo = 0; -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "header_digest", -+ iface->header_digest, sizeof(iface->header_digest)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_digest", -+ iface->data_digest, sizeof(iface->data_digest)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "immediate_data", -+ iface->immediate_data, sizeof(iface->immediate_data)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "initial_r2t", -+ iface->initial_r2t, sizeof(iface->initial_r2t)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_seq_in_order", -+ iface->data_seq_inorder, sizeof(iface->data_seq_inorder)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "data_pdu_in_order", -+ iface->data_pdu_inorder, sizeof(iface->data_pdu_inorder)); -+ -+ if (sysfs_get_uint8(iface_kern_id, ISCSI_IFACE_SUBSYS, "erl", -+ &iface->erl)) -+ iface->erl = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "max_recv_dlength", &iface->max_recv_dlength)) -+ iface->max_recv_dlength = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "first_burst_len", &iface->first_burst_len)) -+ iface->first_burst_len = 0; -+ -+ if (sysfs_get_uint16(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "max_outstanding_r2t", &iface->max_out_r2t)) -+ iface->max_out_r2t = 0; -+ -+ if (sysfs_get_uint(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "max_burst_len", &iface->max_burst_len)) -+ iface->max_burst_len = 0; -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "chap_auth", -+ iface->chap_auth, sizeof(iface->chap_auth)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "bidi_chap", -+ iface->bidi_chap, sizeof(iface->bidi_chap)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "strict_login_comp_en", -+ iface->strict_login_comp, -+ sizeof(iface->strict_login_comp)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, -+ "discovery_auth_optional", -+ iface->discovery_auth, sizeof(iface->discovery_auth)); -+ -+ sysfs_get_str(iface_kern_id, ISCSI_IFACE_SUBSYS, "discovery_logout", -+ iface->discovery_logout, sizeof(iface->discovery_logout)); -+ - if (sscanf(iface_kern_id, "ipv%d-iface-%u-%u", &iface_type, - &tmp_host_no, &iface_num) == 3) - iface->iface_num = iface_num; --- -1.8.3.1 - diff --git a/0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch b/0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch deleted file mode 100644 index 28e212f..0000000 --- a/0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 9260457c1df5f519a63744114cbdf7e50cd75ed7 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 18 Oct 2013 09:29:25 -0400 -Subject: [PATCH] iscsi tools: iface params should be updated for node_rec as - well. - -While updating iface params, the changes should get applied to the -node records as well. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/idbm.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 90 insertions(+) - -diff --git a/usr/idbm.c b/usr/idbm.c -index 4428ebe..c6460ad 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -292,6 +292,96 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) - __recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1); - -+ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, iface.dhcp_alt_client_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, iface.dhcp_alt_client_id, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, iface.dhcp_learn_iqn, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, iface.dhcp_req_vendor_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_IN_FORWARD, ri, r, iface.incoming_forwarding, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state, IDBM_SHOW, num, -+ 1); -+ __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, -+ iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, -+ iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, iface.nd_reachable_tmo, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, iface.nd_rexmit_time, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, -+ iface.router_adv_link_mtu, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, iface.tcp_wsf_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TCP_WSF, ri, r, iface.tcp_wsf, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, iface.tcp_timer_scale, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, iface.tcp_timestamp, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_REDIRECT, ri, r, iface.redirect, IDBM_SHOW, num, 1); -+ __recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, iface.def_task_mgmt_tmo, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_HDRDGST, ri, r, iface.header_digest, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DATADGST, ri, r, iface.data_digest, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_IMM_DATA, ri, r, iface.immediate_data, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_INITIAL_R2T, ri, r, iface.initial_r2t, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DSEQ_INORDER, ri, r, iface.data_seq_inorder, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DPDU_INORDER, ri, r, iface.data_pdu_inorder, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_ERL, ri, r, iface.erl, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, iface.max_recv_dlength, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_FIRST_BURST, ri, r, iface.first_burst_len, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint16(IFACE_MAX_R2T, ri, r, iface.max_out_r2t, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint32(IFACE_MAX_BURST, ri, r, iface.max_burst_len, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_CHAP_AUTH, ri, r, iface.chap_auth, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_BIDI_CHAP, ri, r, iface.bidi_chap, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, iface.strict_login_comp, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, iface.discovery_auth, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, iface.discovery_logout, -+ IDBM_SHOW, num, 1); -+ -+ - __recinfo_str(NODE_DISC_ADDR, ri, r, disc_address, IDBM_SHOW, - num, 0); - __recinfo_int(NODE_DISC_PORT, ri, r, disc_port, IDBM_SHOW, --- -1.8.3.1 - diff --git a/0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch b/0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch deleted file mode 100644 index 7149ea8..0000000 --- a/0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 75ee9d0af6e200b34e84b1e7b37971213b2fd629 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 18 Oct 2013 09:29:26 -0400 -Subject: [PATCH] iscsi tools: Let default type of iface be ipv4 - -While using iface name to determine its type if the name does not -contain iface type then assume it be to of type ipv4 by default. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iface.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/usr/iface.c b/usr/iface.c -index 87ac875..870dba0 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -450,8 +450,10 @@ int iface_get_iptype(struct iface_rec *iface) - /* try to figure out by name */ - if (strstr(iface->name, "ipv4")) - return ISCSI_IFACE_TYPE_IPV4; -- else -+ else if (strstr(iface->name, "ipv6")) - return ISCSI_IFACE_TYPE_IPV6; -+ else /* assume ipv4 by default */ -+ return ISCSI_IFACE_TYPE_IPV4; - } else { - if (strcmp(iface->bootproto, "dhcp") && - !strstr(iface->ipaddress, ".")) --- -1.8.3.1 - diff --git a/0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch b/0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch deleted file mode 100644 index 2a1da56..0000000 --- a/0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch +++ /dev/null @@ -1,310 +0,0 @@ -From 4a5e9e29d7516e34e35a15c7342afbc3a1c8c176 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Fri, 18 Oct 2013 09:29:27 -0400 -Subject: [PATCH] iscsi tools: Show iface params based on iface type - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/idbm.c | 250 ++++++++++++++++++++++++++++++++++--------------------------- - 1 file changed, 138 insertions(+), 112 deletions(-) - -diff --git a/usr/idbm.c b/usr/idbm.c -index c6460ad..1ade099 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -237,6 +237,9 @@ void - idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) - { - int num = 0, i; -+ int iface_type; -+ -+ iface_type = iface_get_iptype(&r->iface); - - __recinfo_str(NODE_NAME, ri, r, name, IDBM_SHOW, num, 0); - __recinfo_int(NODE_TPGT, ri, r, tpgt, IDBM_SHOW, num, 0); -@@ -266,21 +269,6 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) - __recinfo_str(IFACE_TRANSPORTNAME, ri, r, iface.transport_name, - IDBM_SHOW, num, 1); - __recinfo_str(IFACE_INAME, ri, r, iface.iname, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, iface.linklocal_autocfg, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router, IDBM_SHOW, num, -- 1); - __recinfo_str(IFACE_STATE, ri, r, iface.state, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_VLAN_ID, ri, r, iface.vlan_id, IDBM_SHOW, num, - 1); -@@ -292,50 +280,73 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) - __recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1); - -- __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, iface.dhcp_alt_client_id_state, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, iface.dhcp_alt_client_id, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, iface.dhcp_learn_iqn, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, iface.dhcp_req_vendor_id_state, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_IN_FORWARD, ri, r, iface.incoming_forwarding, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state, IDBM_SHOW, num, -- 1); -- __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, -- iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, -- iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, iface.nd_reachable_tmo, -- IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, iface.nd_rexmit_time, -- IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo, -- IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, -- iface.router_adv_link_mtu, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class, -- IDBM_SHOW, num, 1); -+ if (iface_type == ISCSI_IFACE_TYPE_IPV4) { -+ __recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, -+ iface.dhcp_alt_client_id_state, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, -+ iface.dhcp_alt_client_id, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, -+ iface.dhcp_learn_iqn, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, -+ iface.dhcp_req_vendor_id_state, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_IN_FORWARD, ri, r, -+ iface.incoming_forwarding, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1); -+ } else if (iface_type == ISCSI_IFACE_TYPE_IPV6) { -+ __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, -+ iface.linklocal_autocfg, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, -+ iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, -+ iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, -+ iface.nd_reachable_tmo, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, -+ iface.nd_rexmit_time, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, -+ iface.router_adv_link_mtu, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class, -+ IDBM_SHOW, num, 1); -+ } -+ - __recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW, - num, 1); - __recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1); -@@ -515,6 +526,9 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) - void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) - { - int num = 0; -+ int iface_type; -+ -+ iface_type = iface_get_iptype(r); - - __recinfo_str(IFACE_ISCSINAME, ri, r, name, IDBM_SHOW, num, 0); - __recinfo_str(IFACE_NETNAME, ri, r, netdev, IDBM_SHOW, num, 1); -@@ -523,19 +537,6 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) - __recinfo_str(IFACE_TRANSPORTNAME, ri, r, transport_name, - IDBM_SHOW, num, 1); - __recinfo_str(IFACE_INAME, ri, r, iname, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW, num, 1); - __recinfo_str(IFACE_STATE, ri, r, state, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_VLAN_ID, ri, r, vlan_id, IDBM_SHOW, num, 1); - __recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, vlan_priority, -@@ -544,46 +545,71 @@ void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri) - __recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1); - __recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, dhcp_alt_client_id_state, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, dhcp_req_vendor_id_state, -- IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, dup_addr_detect_cnt, -- IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW, -- num, 1); -- __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, gratuitous_neighbor_adv, -- IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW, num, 1); -- __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, nd_reachable_tmo, -- IDBM_SHOW, num, 1); -- __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time, IDBM_SHOW, -- num, 1); -- __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo, IDBM_SHOW, -- num, 1); -- __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, router_adv_link_mtu, -- IDBM_SHOW, num, 1); -- __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class, IDBM_SHOW, -- num, 1); -+ -+ if (iface_type == ISCSI_IFACE_TYPE_IPV4) { -+ __recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID, ri, r, -+ dhcp_alt_client_id_state, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_REQ_VID, ri, r, -+ dhcp_req_vendor_id_state, IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1); -+ } else if (iface_type == ISCSI_IFACE_TYPE_IPV6) { -+ __recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg, -+ IDBM_SHOW, num, 1); -+ __recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW, -+ num, 1); -+ __recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r, -+ dup_addr_detect_cnt, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r, -+ gratuitous_neighbor_adv, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW, -+ num, 1); -+ __recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r, -+ nd_reachable_tmo, IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo, -+ IDBM_SHOW, num, 1); -+ __recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r, -+ router_adv_link_mtu, IDBM_SHOW, num, 1); -+ __recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class, -+ IDBM_SHOW, num, 1); -+ } -+ - __recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1); - __recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1); - __recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW, --- -1.8.3.1 - diff --git a/0053-iscsiadm-Added-document-for-description-of-iface-att.patch b/0053-iscsiadm-Added-document-for-description-of-iface-att.patch deleted file mode 100644 index a1c3c88..0000000 --- a/0053-iscsiadm-Added-document-for-description-of-iface-att.patch +++ /dev/null @@ -1,534 +0,0 @@ -From 072d8b931e8e03875e5220546e68d5fb2e80bcda Mon Sep 17 00:00:00 2001 -From: Vikas Chaudhary -Date: Fri, 22 Nov 2013 05:46:12 -0500 -Subject: [PATCH] iscsiadm: Added document for description of iface attributes - -Signed-off-by: Vikas Chaudhary ---- - sysfs-documentation | 514 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 514 insertions(+) - create mode 100644 sysfs-documentation - -diff --git a/sysfs-documentation b/sysfs-documentation -new file mode 100644 -index 0000000..54fc497 ---- /dev/null -+++ b/sysfs-documentation -@@ -0,0 +1,514 @@ -+Description of iface attributes and their valid values -+====================================================== -+ -+== IPv4 attributes == -+ -+ipaddress -+--------- -+IP address in format XXX.XXX.XXX.XXX -+ -+gateway -+------- -+IP address of the network router or gateway device in format XXX.XXX.XXX.XXX -+ -+subnet -+------ -+Broadcast address in format XXX.XXX.XXX.XXX -+ -+bootproto -+--------- -+The protocol type used to initialize interface -+ -+Valid values: "dhcp" or "static" -+ -+dhcp_dns_address_en -+------------------- -+Request DNS Server IP Addresses and Domain Name -+ -+If bootproto is set to dhcp and dhcp_dns_address_en is enable, -+requests DNS addresses (option 6) and domain name (option 15) in its -+DHCP parameter request list. -+ -+Valid values: "enable" or "disable" -+ -+dhcp_slp_da_info_en -+------------------- -+Request SLP DA Information and SLP Scope -+If bootproto is set to dhcp and dhcp_slp_da_info_en is enable, -+requests SLP DA information (option 78) and SLP scope (option 79) -+in its DHCP parameter request list. -+ -+Valid values: "enable" or "disable" -+ -+tos_en -+------ -+Enable IPv4 type of service (ToS) -+ -+When tos_en is set to enable, use value set in tos when transmitting IPv4 TCP -+packets on iSCSI connections. -+ -+Valid values: "enable" or "disable" -+ -+tos -+--- -+IPv4 Type of service (ToS) -+ -+When tos_en is set to enable, use value set in tos when transmitting IPv4 TCP -+packets on iSCSI connections. -+ -+Valid range: 8-bit value. [0-255] -+ -+grat_arp_en -+----------- -+Enable Gratuitous ARP Requests -+ -+Valid values: "enable" or "disable" -+ -+dhcp_alt_client_id_en -+--------------------- -+DHCP Use Alternate Client ID -+ -+When dhcp_alt_client_id_en is set to enable, use the Client ID configured in -+dhcp_alt_client_id as its Client ID (DHCP option 61) in outgoing DHCP messages. -+ -+Valid values: "enable" or "disable" -+ -+dhcp_alt_client_id -+------------------ -+DHCP Alternate Client ID -+ -+When dhcp_alt_client_id_en is set to enable, use value set in dhcp_alt_client_id -+for Client ID in DHCP messages. -+ -+Valid values: 11-byte Client ID -+ -+dhcp_req_vendor_id_en -+--------------------- -+DHCP Require Vendor ID -+ -+When dhcp_req_vendor_id_en is set to enable, use value set in dhcp_vendor_id as -+its vendor ID (DHCP option 60) in outgoing DHCP messages. -+ -+Valid values: "enable" or "disable" -+ -+dhcp_use_vendor_id_en -+--------------------- -+DHCP Use Vendor ID -+ -+When dhcp_use_vendor_id_en is set to enable, use value set in dhcp_vendor_id as -+its vendor ID (DHCP option 60) in outgoing DHCP messages. -+ -+Valid values: "enable" or "disable" -+ -+dhcp_vendor_id -+-------------- -+DHCP Vendor ID -+ -+When dhcp_req_vendor_id_en or dhcp_use_vendor_id_en is set to enable, -+use value set in dhcp_vendor_id for Vendor ID in DHCP messages. -+ -+Valid values: 11-byte Client ID -+ -+dhcp_learn_iqn_en -+----------------- -+DHCP Learn IQN -+ -+When dhcp_learn_iqn_en is set to enable, iSCSI initiator attempts to use DHCP -+to learn its (IQN) iSCSI name. -+ -+Valid values: "enable" or "disable" -+ -+fragment_disable -+---------------- -+Fragmentation Disable. -+ -+When fragment_disable is set to disable, iSCSI initiator cannot fragment IP -+datagrams. -+ -+Valid values: "enable" or "disable" -+ -+incoming_forwarding_en -+---------------------- -+When incoming_forwarding_en is set to enable, iSCSI initiator forwards all -+incoming network traffic to the network driver, except for iSCSI TCP packets -+destined to the iSCSI initiator. -+ -+Valid values: "enable" or "disable" -+ -+ttl -+--- -+IPv4 Time to Live (TTL) -+ -+This attribute contain TTL value sent in IPv4 TCP packets transmitted on -+iSCSI connections. -+ -+Valid range: 8-bit value. [0-255] -+ -+== IPv6 attributes == -+ -+ipaddress -+--------- -+IP address in IPv6 format. -+ -+link_local_addr -+--------------- -+Link local address in IPv6 format. -+ -+router_addr -+----------- -+Router address in IPv6 format. -+ -+ipaddr_autocfg -+-------------- -+Autoconfigure IPv6 Address. -+ -+Valid values: nd, dhcpv6 or disable -+qla4xxx don't support dhcpv6. -+ -+link_local_autocfg -+------------------ -+Autoconfigure IPv6 Link Local Address. -+ -+IPv6 neighbor discovery protocol to discover Link Local Address. -+ -+Valid values: auto or disable -+ -+ -+router_autocfg -+-------------- -+Autoconfigure IPv6 Router address. -+ -+IPv6 neighbor discovery protocol to discover a default router address. -+ -+Valid values: auto or disable -+ -+link_local_state -+---------------- -+This Read-only attribute show Link Local IP address state in sysfs. -+ -+Valid values: Unconfigured, Acquiring, Tentative, Valid, Disabling, Invalid, -+ Deprecated. -+ -+ -+router_state -+------------ -+This Read-only attribute shows router state. -+ -+Valid values: Unknown, Advertised, Manual, Stale. -+ -+ -+grat_neighbor_adv_en -+-------------------- -+Enable Gratuitious Neighbor Advertisement -+ -+Valid values: "enable" or "disable" -+ -+mld_en -+------ -+Enable IPv6 Multicast Listener Discovery -+ -+Valid values: "enable" or "disable" -+ -+flow_label -+---------- -+This attribute specifies the default value of the Flow Label field in the -+IPv6 header of TCP packets transmitted on iSCSI connections -+ -+Valid range: 20-bit value. [0-1048575] -+Value zero indicates that the traffic is not assigned to a labelled flow. -+ -+traffic_class -+------------- -+This attribute specifies the IPv6 traffic class value to be used in IPv6 -+TCP packets transmitted from the firmware on iSCSI connections. -+ -+Valid range: 8-bit value. [0-255] -+ -+hop_limit -+--------- -+This attribute specifies the IPv6 hop limit value to be used in IPv6 TCP -+packets transmitted from the firmware on iSCSI connections -+ -+Valid range: 8-bit value. [0-255] -+ -+nd_reachable_tmo -+---------------- -+This attribute specifies the time (in milliseconds) that a node assumes -+that the neighbor is reachable after confirmation. -+ -+Valid range: 4-byte value. [0-4294967295] -+ -+nd_rexmit_time -+-------------- -+This attribute specifies the time (in milliseconds) between retransmitted -+neighbor solicitation messages. -+ -+Valid range: 4-byte value. [0-4294967295] -+ -+nd_stale_tmo -+------------ -+This attribute specifies the time (in milliseconds) after which a stale -+neighbor or destination cache entry is discarded. -+ -+Valid range: 4-byte value. [0-4294967295] -+ -+dup_addr_detect_cnt -+------------------- -+This attribute specifies the IPv6 duplicate address detection count -+ -+Valid range: 8-bit value. [0-255] -+ 0 - Disable -+ 1 - TryOnce -+ 2 - TryTwice, and so on -+ -+router_adv_link_mtu -+------------------- -+IPv6 Router Advertised Link MTU Size. -+ -+Valid range: 1280 bytes to 1500 bytes -+ -+== Common == -+enabled -+------- -+This attribute is used to enable or disable IPv4 or IPv6 protocol. -+ -+Valid values: "enable" or "disable" -+ -+vlan_id -+------- -+This attribute specifies 12-bit VLAN identifier (VID) -+ -+Valid range: 12-bit value. [1-4094] -+ -+vlan_priority -+------------- -+This attribute specifies Priority to outbound packets containing the -+specified VLAN-ID (VID) -+ -+Valid range: 3-bit value. [0-7] -+ -+vlan_enabled -+------------ -+VLAN Tagging Enable. -+ -+When this attribute is set to enable, use value set in vlan_id and -+vlan_priority to transmit IP packets, and discards IP packets that were -+received without a matching VLAN ID -+ -+Valid values: "enable" or "disable" -+ -+mtu -+--- -+Ethernet MTU Size. -+ -+This field specifies the maximum payload length in byte of an -+Ethernet frame supported by iSCSI initiator. -+ -+Valid values: 576 bytes to 9000 bytes -+ -+port -+---- -+This attribute shows the initiator iSCSI port number. -+ -+ipaddress_state -+--------------- -+This Read-only attribute show IP address state. -+ -+Valid values: Unconfigured, Acquiring, Tentative, Valid, Disabling, Invalid, -+ Deprecated. -+ -+delayed_ack_en -+-------------- -+When this attribute is set to enable, TCP delayed ACK is enabled. -+ -+Valid values: "enable" or "disable" -+ -+tcp_nagle_disable -+----------------- -+When this attribute is set to disable, TCP Nagle algorithm is disabled. -+ -+Valid values: "enable" or "disable" -+ -+tcp_wsf_disable -+--------------- -+When this attribute is set to disable, TCP window scale is disabled. -+ -+Valid values: "enable" or "disable" -+ -+tcp_wsf -+------- -+This attribute specifies the TCP window scale factor to be negotiated -+on TCP connections. -+ -+Valid range: 8-bit value. [0-255] -+ -+tcp_timer_scale -+--------------- -+The TCP Timer Scale is scale factor that adjusts the time interval between -+timer ticks on a TCP connection. The scale factor allows for faster time-outs -+for connections running on a very small network, versus connections running -+on a very large network. -+ -+Valid range: 3-bit value. [0-7] -+ -+tcp_timestamp_en -+---------------- -+When this attribute is set to enable, iSCSI initiator negotiates to use time -+stamps in TCP headers -+ -+Valid values: "enable" or "disable" -+ -+cache_id -+-------- -+This Read-only attribute is used to find the valid cache entries for the -+interface. -+ -+For IPv4, ARP cache entry -+For IPv6, Neighbor cache entry -+ -+redirect_en -+----------- -+For IPv4: -+When this attribute is set to enable, an ARP redirect can modify the address -+resolution protocol (ARP) table and any active connections. -+ -+For IPv6: -+When this attribute is set to enable and neighbor advertisements are received, -+the connection table is examined and updated if any active connections match -+the IP address on the neighbor advertisement. This action is required for -+failover and redirect. -+ -+Valid values: "enable" or "disable" -+ -+def_taskmgmt_tmo -+---------------- -+This attribute specifies timeout interval in seconds that iSCSI uses for -+timing out task-management commands. -+ -+Valid range: 16-bit value [0-65535]. -+ -+header_digest -+------------- -+When this attribute is set to enable iSCSI initiator negotiates for -+HeaderDigest=CRC32 and when set to disable negotiates HeaderDigest=none. -+ -+Valid values: "enable" or "disable" -+ -+data_digest -+----------- -+When this attribute is set to enable iSCSI initiator negotiates for -+DataDigest=CRC32 and when set to disable negotiates DataDigest=none. -+ -+Valid values: "enable" or "disable" -+ -+immediate_data -+-------------- -+When this attribute is set to enable iSCSI initiator negotiates for -+ImmediateData=yes and When set to disable negotiates ImmediateData=none -+ -+Valid values: "enable" or "disable" -+ -+initial_r2t -+----------- -+When this attribute is set to enable iSCSI initiator negotiates for -+InitialR2T=yes. When set to disable negotiates InitialR2T=no. -+ -+Valid values: "enable" or "disable" -+ -+data_seq_in_order -+----------------- -+When this attribute is set to enable iSCSI initiator set data sequences -+in order -+ -+Valid values: "enable" or "disable" -+qla4xxx does not support out-of-order data sequences -+ -+data_pdu_in_order -+----------------- -+When this attribute is set to enable iSCSI initiator set Data PDU -+in order -+ -+Valid values: "enable" or "disable" -+qla4xxx does not support out-of-order Data PDUs. -+ -+erl -+--- -+Error Recovery Level -+ -+This attribute specifies error recovery level (ERL) supported by the -+connection. -+ -+Valid values: 2-bit value [0-2] -+ -+max_recv_dlength -+---------------- -+iSCSI Maximum Receive Data Segment Length. -+ -+This attribute specifies Maximum data segment length in bytes, that receive -+in an iSCSI PDU. -+ -+first_burst_len -+--------------- -+iSCSI First Burst Length -+ -+This attribute Specifies the maximum amount of unsolicited data an iSCSI -+initiator can send to the target during the execution of a single SCSI command, -+in bytes. -+ -+max_outstanding_r2t -+------------------- -+iSCSI Maximum Outstanding R2T -+ -+This attribute Specifies how many R2T PDUs per command can be outstanding -+during an iSCSI session. -+ -+max_burst_len -+------------- -+This attribute Specifies the maximum length for unsolicited or immediate data -+iSCSI session can send or receive. -+ -+chap_auth -+--------- -+When this attribute is set to enable iSCSI session performs authentication -+during the security state of login phase. -+ -+Valid values: "enable" or "disable" -+ -+bidi_chap -+--------- -+When this attribute is set to enable iSCSI session generates a CHAP challenge -+to any target that has issued a CHAP challenge to the iSCSI session. -+iSCSI session issues the challenge to the target after responding to the -+targets challenge. This attribute is ignored if chap_auth is set to disable. -+ -+Valid values: "enable" or "disable" -+ -+discovery_auth_optional -+----------------------- -+When this attribute is set to enable and the chap_auth is set to enable, -+iSCSI session does not require authentication on discovery sessions unless -+requested by the peer. When this attribute is set to disable iSCSI session -+requires CHAP authentication for a discovery session. -+ -+Valid values: "enable" or "disable" -+ -+discovery_logout -+---------------- -+When this attribute is set to enable, iSCSI initiator initiates an iSCSI logout -+on a discovery session when discovery is complete (before closing the connection). -+When this attribute is set to disable, iSCSI initiator closes the connection when -+discovery is complete. -+ -+Valid values: "enable" or "disable" -+ -+strict_login_comp_en -+-------------------- -+When this attribute is set to enable, iSCSI initiator enforces the iSCSI login -+negotiation rules. When this attribute is set to disable, iSCSI initiator does -+not enforce iSCSI login negotiation. -+ -+Valid values: "enable" or "disable" -+ -+initiator_name -+-------------- -+This Read-only attribute contains the iSCSI Name string used by the firmware. --- -1.8.3.1 - diff --git a/0054-iscsi_tool-Add-offload-host-statistics-support.patch b/0054-iscsi_tool-Add-offload-host-statistics-support.patch deleted file mode 100644 index 240056e..0000000 --- a/0054-iscsi_tool-Add-offload-host-statistics-support.patch +++ /dev/null @@ -1,524 +0,0 @@ -From fe6623803d1135fd382146faa847bcdf5dc6abc3 Mon Sep 17 00:00:00 2001 -From: Lalit Chandivade -Date: Fri, 22 Nov 2013 05:46:13 -0500 -Subject: [PATCH] iscsi_tool: Add offload host statistics support. - -Signed-off-by: Lalit Chandivade -Signed-off-by: Vikas Chaudhary ---- - include/iscsi_if.h | 116 ++++++++++++++++++++++++- - usr/iscsi_ipc.h | 2 + - usr/iscsiadm.c | 244 ++++++++++++++++++++++++++++++++++++++++++++++++++++- - usr/netlink.c | 47 +++++++++++ - 4 files changed, 406 insertions(+), 3 deletions(-) - -diff --git a/include/iscsi_if.h b/include/iscsi_if.h -index e59bcd0..9d15811 100644 ---- a/include/iscsi_if.h -+++ b/include/iscsi_if.h -@@ -75,8 +75,8 @@ enum iscsi_uevent_e { - ISCSI_UEVENT_LOGOUT_FLASHNODE = UEVENT_BASE + 29, - ISCSI_UEVENT_LOGOUT_FLASHNODE_SID = UEVENT_BASE + 30, - ISCSI_UEVENT_SET_CHAP = UEVENT_BASE + 31, -- -- ISCSI_UEVENT_MAX = ISCSI_UEVENT_SET_CHAP, -+ ISCSI_UEVENT_GET_HOST_STATS = UEVENT_BASE + 32, -+ ISCSI_UEVENT_MAX = ISCSI_UEVENT_GET_HOST_STATS, - - /* up events */ - ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, -@@ -251,6 +251,10 @@ struct iscsi_uevent { - uint32_t host_no; - uint32_t sid; - } logout_flashnode_sid; -+ struct msg_get_host_stats { -+ uint32_t host_no; -+ } get_host_stats; -+ - } u; - union { - /* messages k -> u */ -@@ -854,4 +858,112 @@ struct iscsi_chap_rec { - uint8_t password_length; - }; - -+#define ISCSI_HOST_STATS_CUSTOM_MAX 32 -+#define ISCSI_HOST_STATS_CUSTOM_DESC_MAX 64 -+struct iscsi_host_stats_custom { -+ char desc[ISCSI_HOST_STATS_CUSTOM_DESC_MAX]; -+ uint64_t value; -+}; -+ -+/* struct iscsi_offload_host_stats: Host statistics, -+ * Include statistics for MAC, IP, TCP & iSCSI. -+ */ -+struct iscsi_offload_host_stats { -+ /* MAC */ -+ uint64_t mactx_frames; -+ uint64_t mactx_bytes; -+ uint64_t mactx_multicast_frames; -+ uint64_t mactx_broadcast_frames; -+ uint64_t mactx_pause_frames; -+ uint64_t mactx_control_frames; -+ uint64_t mactx_deferral; -+ uint64_t mactx_excess_deferral; -+ uint64_t mactx_late_collision; -+ uint64_t mactx_abort; -+ uint64_t mactx_single_collision; -+ uint64_t mactx_multiple_collision; -+ uint64_t mactx_collision; -+ uint64_t mactx_frames_dropped; -+ uint64_t mactx_jumbo_frames; -+ uint64_t macrx_frames; -+ uint64_t macrx_bytes; -+ uint64_t macrx_unknown_control_frames; -+ uint64_t macrx_pause_frames; -+ uint64_t macrx_control_frames; -+ uint64_t macrx_dribble; -+ uint64_t macrx_frame_length_error; -+ uint64_t macrx_jabber; -+ uint64_t macrx_carrier_sense_error; -+ uint64_t macrx_frame_discarded; -+ uint64_t macrx_frames_dropped; -+ uint64_t mac_crc_error; -+ uint64_t mac_encoding_error; -+ uint64_t macrx_length_error_large; -+ uint64_t macrx_length_error_small; -+ uint64_t macrx_multicast_frames; -+ uint64_t macrx_broadcast_frames; -+ /* IP */ -+ uint64_t iptx_packets; -+ uint64_t iptx_bytes; -+ uint64_t iptx_fragments; -+ uint64_t iprx_packets; -+ uint64_t iprx_bytes; -+ uint64_t iprx_fragments; -+ uint64_t ip_datagram_reassembly; -+ uint64_t ip_invalid_address_error; -+ uint64_t ip_error_packets; -+ uint64_t ip_fragrx_overlap; -+ uint64_t ip_fragrx_outoforder; -+ uint64_t ip_datagram_reassembly_timeout; -+ uint64_t ipv6tx_packets; -+ uint64_t ipv6tx_bytes; -+ uint64_t ipv6tx_fragments; -+ uint64_t ipv6rx_packets; -+ uint64_t ipv6rx_bytes; -+ uint64_t ipv6rx_fragments; -+ uint64_t ipv6_datagram_reassembly; -+ uint64_t ipv6_invalid_address_error; -+ uint64_t ipv6_error_packets; -+ uint64_t ipv6_fragrx_overlap; -+ uint64_t ipv6_fragrx_outoforder; -+ uint64_t ipv6_datagram_reassembly_timeout; -+ /* TCP */ -+ uint64_t tcptx_segments; -+ uint64_t tcptx_bytes; -+ uint64_t tcprx_segments; -+ uint64_t tcprx_byte; -+ uint64_t tcp_duplicate_ack_retx; -+ uint64_t tcp_retx_timer_expired; -+ uint64_t tcprx_duplicate_ack; -+ uint64_t tcprx_pure_ackr; -+ uint64_t tcptx_delayed_ack; -+ uint64_t tcptx_pure_ack; -+ uint64_t tcprx_segment_error; -+ uint64_t tcprx_segment_outoforder; -+ uint64_t tcprx_window_probe; -+ uint64_t tcprx_window_update; -+ uint64_t tcptx_window_probe_persist; -+ /* ECC */ -+ uint64_t ecc_error_correction; -+ /* iSCSI */ -+ uint64_t iscsi_pdu_tx; -+ uint64_t iscsi_data_bytes_tx; -+ uint64_t iscsi_pdu_rx; -+ uint64_t iscsi_data_bytes_rx; -+ uint64_t iscsi_io_completed; -+ uint64_t iscsi_unexpected_io_rx; -+ uint64_t iscsi_format_error; -+ uint64_t iscsi_hdr_digest_error; -+ uint64_t iscsi_data_digest_error; -+ uint64_t iscsi_sequence_error; -+ /* -+ * iSCSI Custom Host Statistics support, i.e. Transport could -+ * extend existing host statistics with its own specific statistics -+ * up to ISCSI_HOST_STATS_CUSTOM_MAX -+ */ -+ uint32_t custom_length; -+ struct iscsi_host_stats_custom custom[0] -+ __attribute__ ((aligned (sizeof(uint64_t)))); -+}; -+ - #endif -diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h -index a32da1c..9d26d54 100644 ---- a/usr/iscsi_ipc.h -+++ b/usr/iscsi_ipc.h -@@ -161,6 +161,8 @@ struct iscsi_ipc { - uint32_t flashnode_idx); - int (*logout_flash_node_sid) (uint64_t transport_handle, - uint32_t host_no, uint32_t sid); -+ int (*get_host_stats) (uint64_t transport_handle, uint32_t host_no, -+ char *host_stats); - }; - - #endif /* ISCSI_IPC_H */ -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 045259b..ed2c0c3 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -69,7 +69,8 @@ enum iscsiadm_mode { - MODE_FW, - MODE_PING, - MODE_CHAP, -- MODE_FLASHNODE -+ MODE_FLASHNODE, -+ MODE_HOST_STATS - }; - - enum iscsiadm_op { -@@ -137,6 +138,7 @@ iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ - iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ - iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -x chap_tbl_idx ] ] | [ -C flashnode [ -A portal_type ] [ -x flashnode_idx ] ] ] [ [ -o operation ] [ -n name ] [ -v value ] ] \n\ -+iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] | [ -C stats ] ]\n\ - iscsiadm -k priority\n"); - } - exit(status); -@@ -207,6 +209,9 @@ str_to_submode(char *str) - sub_mode = MODE_CHAP; - else if (!strcmp("flashnode", str)) - sub_mode = MODE_FLASHNODE; -+ else if (!strcmp("stats", str)) -+ sub_mode = MODE_HOST_STATS; -+ - else - sub_mode = -1; - -@@ -2025,6 +2030,232 @@ exit_flashnode_op: - return rc; - } - -+static void print_host_stats(struct iscsi_offload_host_stats *host_stats) -+{ -+ /* MAC */ -+ printf("Host Statistics:\n" -+ "\tmactx_frames: %lld\n" -+ "\tmactx_bytes: %lld\n" -+ "\tmactx_multicast_frames: %lld\n" -+ "\tmactx_broadcast_frames: %lld\n" -+ "\tmactx_pause_frames: %lld\n" -+ "\tmactx_control_frames: %lld\n" -+ "\tmactx_deferral: %lld\n" -+ "\tmactx_excess_deferral: %lld\n" -+ "\tmactx_late_collision: %lld\n" -+ "\tmactx_abort: %lld\n" -+ "\tmactx_single_collision: %lld\n" -+ "\tmactx_multiple_collision: %lld\n" -+ "\tmactx_collision: %lld\n" -+ "\tmactx_frames_dropped: %lld\n" -+ "\tmactx_jumbo_frames: %lld\n" -+ "\tmacrx_frames: %lld\n" -+ "\tmacrx_bytes: %lld\n" -+ "\tmacrx_unknown_control_frames: %lld\n" -+ "\tmacrx_pause_frames: %lld\n" -+ "\tmacrx_control_frames: %lld\n" -+ "\tmacrx_dribble: %lld\n" -+ "\tmacrx_frame_length_error: %lld\n" -+ "\tmacrx_jabber: %lld\n" -+ "\tmacrx_carrier_sense_error: %lld\n" -+ "\tmacrx_frame_discarded: %lld\n" -+ "\tmacrx_frames_dropped: %lld\n" -+ "\tmac_crc_error: %lld\n" -+ "\tmac_encoding_error: %lld\n" -+ "\tmacrx_length_error_large: %lld\n" -+ "\tmacrx_length_error_small: %lld\n" -+ "\tmacrx_multicast_frames: %lld\n" -+ "\tmacrx_broadcast_frames: %lld\n" -+ /* IP */ -+ "\tiptx_packets: %lld\n" -+ "\tiptx_bytes: %lld\n" -+ "\tiptx_fragments: %lld\n" -+ "\tiprx_packets: %lld\n" -+ "\tiprx_bytes: %lld\n" -+ "\tiprx_fragments: %lld\n" -+ "\tip_datagram_reassembly: %lld\n" -+ "\tip_invalid_address_error: %lld\n" -+ "\tip_error_packets: %lld\n" -+ "\tip_fragrx_overlap: %lld\n" -+ "\tip_fragrx_outoforder: %lld\n" -+ "\tip_datagram_reassembly_timeout: %lld\n" -+ "\tipv6tx_packets: %lld\n" -+ "\tipv6tx_bytes: %lld\n" -+ "\tipv6tx_fragments: %lld\n" -+ "\tipv6rx_packets: %lld\n" -+ "\tipv6rx_bytes: %lld\n" -+ "\tipv6rx_fragments: %lld\n" -+ "\tipv6_datagram_reassembly: %lld\n" -+ "\tipv6_invalid_address_error: %lld\n" -+ "\tipv6_error_packets: %lld\n" -+ "\tipv6_fragrx_overlap: %lld\n" -+ "\tipv6_fragrx_outoforder: %lld\n" -+ "\tipv6_datagram_reassembly_timeout: %lld\n" -+ /* TCP */ -+ "\ttcptx_segments: %lld\n" -+ "\ttcptx_bytes: %lld\n" -+ "\ttcprx_segments: %lld\n" -+ "\ttcprx_byte: %lld\n" -+ "\ttcp_duplicate_ack_retx: %lld\n" -+ "\ttcp_retx_timer_expired: %lld\n" -+ "\ttcprx_duplicate_ack: %lld\n" -+ "\ttcprx_pure_ackr: %lld\n" -+ "\ttcptx_delayed_ack: %lld\n" -+ "\ttcptx_pure_ack: %lld\n" -+ "\ttcprx_segment_error: %lld\n" -+ "\ttcprx_segment_outoforder: %lld\n" -+ "\ttcprx_window_probe: %lld\n" -+ "\ttcprx_window_update: %lld\n" -+ "\ttcptx_window_probe_persist: %lld\n" -+ /* ECC */ -+ "\tecc_error_correction: %lld\n" -+ /* iSCSI */ -+ "\tiscsi_pdu_tx: %lld\n" -+ "\tiscsi_data_bytes_tx: %lld\n" -+ "\tiscsi_pdu_rx: %lld\n" -+ "\tiscsi_data_bytes_rx: %lld\n" -+ "\tiscsi_io_completed: %lld\n" -+ "\tiscsi_unexpected_io_rx: %lld\n" -+ "\tiscsi_format_error: %lld\n" -+ "\tiscsi_hdr_digest_error: %lld\n" -+ "\tiscsi_data_digest_error: %lld\n" -+ "\tiscsi_sequence_error: %lld\n", -+ /* MAC */ -+ (unsigned long long)host_stats->mactx_frames, -+ (unsigned long long)host_stats->mactx_bytes, -+ (unsigned long long)host_stats->mactx_multicast_frames, -+ (unsigned long long)host_stats->mactx_broadcast_frames, -+ (unsigned long long)host_stats->mactx_pause_frames, -+ (unsigned long long)host_stats->mactx_control_frames, -+ (unsigned long long)host_stats->mactx_deferral, -+ (unsigned long long)host_stats->mactx_excess_deferral, -+ (unsigned long long)host_stats->mactx_late_collision, -+ (unsigned long long)host_stats->mactx_abort, -+ (unsigned long long)host_stats->mactx_single_collision, -+ (unsigned long long)host_stats->mactx_multiple_collision, -+ (unsigned long long)host_stats->mactx_collision, -+ (unsigned long long)host_stats->mactx_frames_dropped, -+ (unsigned long long)host_stats->mactx_jumbo_frames, -+ (unsigned long long)host_stats->macrx_frames, -+ (unsigned long long)host_stats->macrx_bytes, -+ (unsigned long long)host_stats->macrx_unknown_control_frames, -+ (unsigned long long)host_stats->macrx_pause_frames, -+ (unsigned long long)host_stats->macrx_control_frames, -+ (unsigned long long)host_stats->macrx_dribble, -+ (unsigned long long)host_stats->macrx_frame_length_error, -+ (unsigned long long)host_stats->macrx_jabber, -+ (unsigned long long)host_stats->macrx_carrier_sense_error, -+ (unsigned long long)host_stats->macrx_frame_discarded, -+ (unsigned long long)host_stats->macrx_frames_dropped, -+ (unsigned long long)host_stats->mac_crc_error, -+ (unsigned long long)host_stats->mac_encoding_error, -+ (unsigned long long)host_stats->macrx_length_error_large, -+ (unsigned long long)host_stats->macrx_length_error_small, -+ (unsigned long long)host_stats->macrx_multicast_frames, -+ (unsigned long long)host_stats->macrx_broadcast_frames, -+ /* IP */ -+ (unsigned long long)host_stats->iptx_packets, -+ (unsigned long long)host_stats->iptx_bytes, -+ (unsigned long long)host_stats->iptx_fragments, -+ (unsigned long long)host_stats->iprx_packets, -+ (unsigned long long)host_stats->iprx_bytes, -+ (unsigned long long)host_stats->iprx_fragments, -+ (unsigned long long)host_stats->ip_datagram_reassembly, -+ (unsigned long long)host_stats->ip_invalid_address_error, -+ (unsigned long long)host_stats->ip_error_packets, -+ (unsigned long long)host_stats->ip_fragrx_overlap, -+ (unsigned long long)host_stats->ip_fragrx_outoforder, -+ (unsigned long long)host_stats->ip_datagram_reassembly_timeout, -+ (unsigned long long)host_stats->ipv6tx_packets, -+ (unsigned long long)host_stats->ipv6tx_bytes, -+ (unsigned long long)host_stats->ipv6tx_fragments, -+ (unsigned long long)host_stats->ipv6rx_packets, -+ (unsigned long long)host_stats->ipv6rx_bytes, -+ (unsigned long long)host_stats->ipv6rx_fragments, -+ (unsigned long long)host_stats->ipv6_datagram_reassembly, -+ (unsigned long long)host_stats->ipv6_invalid_address_error, -+ (unsigned long long)host_stats->ipv6_error_packets, -+ (unsigned long long)host_stats->ipv6_fragrx_overlap, -+ (unsigned long long)host_stats->ipv6_fragrx_outoforder, -+ (unsigned long long)host_stats->ipv6_datagram_reassembly_timeout, -+ /* TCP */ -+ (unsigned long long)host_stats->tcptx_segments, -+ (unsigned long long)host_stats->tcptx_bytes, -+ (unsigned long long)host_stats->tcprx_segments, -+ (unsigned long long)host_stats->tcprx_byte, -+ (unsigned long long)host_stats->tcp_duplicate_ack_retx, -+ (unsigned long long)host_stats->tcp_retx_timer_expired, -+ (unsigned long long)host_stats->tcprx_duplicate_ack, -+ (unsigned long long)host_stats->tcprx_pure_ackr, -+ (unsigned long long)host_stats->tcptx_delayed_ack, -+ (unsigned long long)host_stats->tcptx_pure_ack, -+ (unsigned long long)host_stats->tcprx_segment_error, -+ (unsigned long long)host_stats->tcprx_segment_outoforder, -+ (unsigned long long)host_stats->tcprx_window_probe, -+ (unsigned long long)host_stats->tcprx_window_update, -+ (unsigned long long)host_stats->tcptx_window_probe_persist, -+ /* ECC */ -+ (unsigned long long)host_stats->ecc_error_correction, -+ /* iSCSI */ -+ (unsigned long long)host_stats->iscsi_pdu_tx, -+ (unsigned long long)host_stats->iscsi_data_bytes_tx, -+ (unsigned long long)host_stats->iscsi_pdu_rx, -+ (unsigned long long)host_stats->iscsi_data_bytes_rx, -+ (unsigned long long)host_stats->iscsi_io_completed, -+ (unsigned long long)host_stats->iscsi_unexpected_io_rx, -+ (unsigned long long)host_stats->iscsi_format_error, -+ (unsigned long long)host_stats->iscsi_hdr_digest_error, -+ (unsigned long long)host_stats->iscsi_data_digest_error, -+ (unsigned long long)host_stats->iscsi_sequence_error); -+} -+ -+static int exec_host_stats_op(int op, int info_level, uint32_t host_no) -+{ -+ struct iscsi_transport *t = NULL; -+ char *req_buf; -+ int rc = ISCSI_SUCCESS; -+ int fd = 0, buf_size = 0; -+ -+ t = iscsi_sysfs_get_transport_by_hba(host_no); -+ if (!t) { -+ log_error("Could not match hostno %u to transport.", host_no); -+ rc = ISCSI_ERR_TRANS_NOT_FOUND; -+ goto exit_host_stats; -+ } -+ -+ buf_size = sizeof(struct iscsi_offload_host_stats) + -+ sizeof(struct iscsi_uevent); -+ req_buf = calloc(1, buf_size); -+ if (!req_buf) { -+ log_error("Could not allocate memory for host stats request."); -+ rc = ISCSI_ERR_NOMEM; -+ goto exit_host_stats; -+ } -+ -+ fd = ipc->ctldev_open(); -+ if (fd < 0) { -+ rc = ISCSI_ERR_INTERNAL; -+ log_error("Netlink open failed."); -+ goto exit_host_stats; -+ } -+ -+ rc = ipc->get_host_stats(t->handle, host_no, req_buf); -+ if (rc < 0) { -+ log_error("get_host_stats failed. errno=%d", errno); -+ rc = ISCSI_ERR; -+ goto exit_host_stats; -+ } -+ -+ print_host_stats(req_buf + sizeof(struct iscsi_uevent)); -+ -+ ipc->ctldev_close(); -+ -+exit_host_stats: -+ if (req_buf) -+ free(req_buf); -+ return rc; -+} -+ - static int verify_iface_params(struct list_head *params, struct node_rec *rec) - { - struct user_param *param; -@@ -3239,6 +3470,17 @@ main(int argc, char **argv) - index, portal_type, - ¶ms); - break; -+ case MODE_HOST_STATS: -+ if (!host_no) { -+ log_error("STATS mode requires host no"); -+ rc = ISCSI_ERR_INVAL; -+ break; -+ } -+ -+ rc = exec_host_stats_op(op, info_level, -+ host_no); -+ break; -+ - default: - log_error("Invalid Sub Mode"); - break; -diff --git a/usr/netlink.c b/usr/netlink.c -index 151b56d..1c4b5cc 100644 ---- a/usr/netlink.c -+++ b/usr/netlink.c -@@ -339,6 +339,10 @@ __kipc_call(struct iovec *iovp, int count) - } else if (ev->type == ISCSI_UEVENT_GET_CHAP) { - /* kget_chap() will read */ - return 0; -+ } else if (ev->type == ISCSI_UEVENT_GET_HOST_STATS) { -+ /* kget_host_stats() will read */ -+ return 0; -+ - } else { - if ((rc = nlpayload_read(ctrl_fd, (void*)ev, - sizeof(*ev), 0)) < 0) { -@@ -1439,6 +1443,48 @@ klogout_flashnode_sid(uint64_t transport_handle, uint32_t host_no, - return 0; - } - -+static int kget_host_stats(uint64_t transport_handle, uint32_t host_no, -+ char *host_stats) -+{ -+ int rc = 0; -+ int ev_size; -+ struct iscsi_uevent ev; -+ struct iovec iov[2]; -+ char nlm_ev[NLMSG_SPACE(sizeof(struct iscsi_uevent))]; -+ struct nlmsghdr *nlh; -+ -+ memset(&ev, 0, sizeof(struct iscsi_uevent)); -+ -+ ev.type = ISCSI_UEVENT_GET_HOST_STATS; -+ ev.transport_handle = transport_handle; -+ ev.u.get_host_stats.host_no = host_no; -+ -+ iov[1].iov_base = &ev; -+ iov[1].iov_len = sizeof(ev); -+ rc = __kipc_call(iov, 2); -+ if (rc < 0) -+ return rc; -+ -+ if ((rc = nl_read(ctrl_fd, nlm_ev, -+ NLMSG_SPACE(sizeof(struct iscsi_uevent)), -+ MSG_PEEK)) < 0) { -+ log_error("can not read nlm_ev, error %d", rc); -+ return rc; -+ } -+ -+ nlh = (struct nlmsghdr *)nlm_ev; -+ ev_size = nlh->nlmsg_len - NLMSG_ALIGN(sizeof(struct nlmsghdr)); -+ -+ if ((rc = nlpayload_read(ctrl_fd, (void *)host_stats, -+ ev_size, 0)) < 0) { -+ log_error("can not read from NL socket, error %d", rc); -+ return rc; -+ } -+ -+ return rc; -+} -+ -+ - static void drop_data(struct nlmsghdr *nlh) - { - int ev_size; -@@ -1737,6 +1783,7 @@ struct iscsi_ipc nl_ipc = { - .login_flash_node = klogin_flashnode, - .logout_flash_node = klogout_flashnode, - .logout_flash_node_sid = klogout_flashnode_sid, -+ .get_host_stats = kget_host_stats, - }; - struct iscsi_ipc *ipc = &nl_ipc; - --- -1.8.3.1 - diff --git a/0055-README-Updated-for-host-statistics.patch b/0055-README-Updated-for-host-statistics.patch deleted file mode 100644 index ac404e1..0000000 --- a/0055-README-Updated-for-host-statistics.patch +++ /dev/null @@ -1,33 +0,0 @@ -From d1e8e68f440bbcf5c8b716572ccb3a0904dcd35e Mon Sep 17 00:00:00 2001 -From: Lalit Chandivade -Date: Fri, 22 Nov 2013 05:46:14 -0500 -Subject: [PATCH] README: Updated for host statistics. - -Signed-off-by: Lalit Chandivade -Signed-off-by: Vikas Chaudhary ---- - README | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/README b/README -index 813548d..06d1b6f 100644 ---- a/README -+++ b/README -@@ -1073,6 +1073,14 @@ To now log into targets it is the same as with sofware iscsi. See section - is free then entry of type bidi chap will be created at that index - with given username_in and password_in values. - -+ Host mode with stats submode: -+ -+ - Display host statistics: -+ ./iscsiadm -m host -H 6 -C stats -+ -+ This will print the aggregate statistics on the host adapter port. -+ This includes MAC, TCP/IP, ECC & iSCSI statistics. -+ - 6. Configuration - ================ - --- -1.8.3.1 - diff --git a/0056-iscsiadm.8-Updated-man-page-for-host-statistics.patch b/0056-iscsiadm.8-Updated-man-page-for-host-statistics.patch deleted file mode 100644 index b01aa27..0000000 --- a/0056-iscsiadm.8-Updated-man-page-for-host-statistics.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 4a3076b56834d444eb9e19fc5fa25fff3a9624ec Mon Sep 17 00:00:00 2001 -From: Lalit Chandivade -Date: Fri, 22 Nov 2013 05:46:15 -0500 -Subject: [PATCH] iscsiadm.8: Updated man page for host statistics. - -Signed-off-by: Lalit Chandivade -Signed-off-by: Vikas Chaudhary ---- - doc/iscsiadm.8 | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index 0e8149c..d59af43 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -18,6 +18,8 @@ iscsiadm \- open-iscsi administration utility - - \fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-x chap_tbl_idx ] ] | [ \-C flashnode [ \-A portal_type ] [ \-x flashnode_idx ] ] ] [ [ \-o operation ] [ \-n name ] [ \-v value ] ] - -+\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-o operation ] [ \-v chap_tbl_idx ] ] | [ \-C flashnode [ \-o operation ] [ \-A portal_type ] [ \-x flashnode_idx ] [ \-n name ] [ \-v value ] ] | [ \-C stats ]] -+ - \fBiscsiadm\fR \-k priority - - .SH "DESCRIPTION" -@@ -72,12 +74,14 @@ Currently iscsiadm support ping as submode for iface. For example, - - iscsiadm -m iface -I ifacename -C ping -a ipaddr -b packetsize -c count -i interval - --For host, it supports chap and flashnode as submodes. For example, -+For host, it supports chap , flashnode and stats as submodes. For example, - - iscsiadm -m host -H hostno -C chap -x chap_tbl_idx -o operation - - iscsiadm -m host -H hostno -C flashnode -x flashnode_idx -o operation - -+iscsiadm -m host -H hostno -C stats -+ - .TP - \fB\-d\fR, \fB\-\-debug=\fIdebug_level\fP - print debugging information. Valid values for debug_level are 0 to 8. -@@ -279,6 +283,7 @@ tuple passed in. - .TP - \fB\-s\fR, \fB\-\-stats\fR - Display session statistics. -+This option when used with host mode, displays host statistics. - - .TP - \fB\-S\fR, \fB\-\-show\fR --- -1.8.3.1 - diff --git a/0057-iscsi-tools-Fix-the-iscsiadm-help-options-for-host-m.patch b/0057-iscsi-tools-Fix-the-iscsiadm-help-options-for-host-m.patch deleted file mode 100644 index 8be67e1..0000000 --- a/0057-iscsi-tools-Fix-the-iscsiadm-help-options-for-host-m.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 505ed9d3dbc6f3d746833a2cad7fb62d9ca20c35 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Mon, 30 Dec 2013 06:14:40 -0500 -Subject: [PATCH] iscsi tools: Fix the iscsiadm help options for host mode - -Removing the redundant help message for host mode of iscsiadm. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - usr/iscsiadm.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index ed2c0c3..3cde8d1 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -137,8 +137,7 @@ iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,au - iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ - iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ --iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -x chap_tbl_idx ] ] | [ -C flashnode [ -A portal_type ] [ -x flashnode_idx ] ] ] [ [ -o operation ] [ -n name ] [ -v value ] ] \n\ --iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] | [ -C stats ] ]\n\ -+iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -x chap_tbl_idx ] ] | [ -C flashnode [ -A portal_type ] [ -x flashnode_idx ] ] | [ -C stats ] ] [ [ -o operation ] [ -n name ] [ -v value ] ] \n\ - iscsiadm -k priority\n"); - } - exit(status); --- -1.8.3.1 - diff --git a/0058-Man-page-correction-for-host-mode-options-of-iscsiad.patch b/0058-Man-page-correction-for-host-mode-options-of-iscsiad.patch deleted file mode 100644 index f9b97c6..0000000 --- a/0058-Man-page-correction-for-host-mode-options-of-iscsiad.patch +++ /dev/null @@ -1,31 +0,0 @@ -From bd91b810918df6ac09167aa37c6dc1f32bf907be Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Mon, 30 Dec 2013 06:14:41 -0500 -Subject: [PATCH] Man page correction for host mode options of iscsiadm - -Correct the help options of iscsiadm host mode in its man page. - -Signed-off-by: Adheer Chandravanshi -Signed-off-by: Vikas Chaudhary ---- - doc/iscsiadm.8 | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index d59af43..9a945d1 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -16,9 +16,7 @@ iscsiadm \- open-iscsi administration utility - - \fBiscsiadm\fR \-m fw [ \-d debug_level ] [\-l] - --\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-x chap_tbl_idx ] ] | [ \-C flashnode [ \-A portal_type ] [ \-x flashnode_idx ] ] ] [ [ \-o operation ] [ \-n name ] [ \-v value ] ] -- --\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-o operation ] [ \-v chap_tbl_idx ] ] | [ \-C flashnode [ \-o operation ] [ \-A portal_type ] [ \-x flashnode_idx ] [ \-n name ] [ \-v value ] ] | [ \-C stats ]] -+\fBiscsiadm\fR \-m host [ \-P printlevel ] [ \-H hostno|MAC ] [ [ \-C chap [ \-x chap_tbl_idx ] ] | [ \-C flashnode [ \-A portal_type ] [ \-x flashnode_idx ] ] | [ \-C stats ] ] [ [ \-o operation ] [ \-n name ] [ \-v value ] ] - - \fBiscsiadm\fR \-k priority - --- -1.8.3.1 - diff --git a/0059-ISCSIUIO-Added-tx-doorbell-override-mechanism.patch b/0059-ISCSIUIO-Added-tx-doorbell-override-mechanism.patch deleted file mode 100644 index 6b767d6..0000000 --- a/0059-ISCSIUIO-Added-tx-doorbell-override-mechanism.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 77245b944b7d14a4e139984c3773e994c6ef6703 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Wed, 11 Dec 2013 15:38:12 -0800 -Subject: [PATCH] ISCSIUIO: Added tx doorbell override mechanism - -Added a new tx doorbell field in the uio path to work with new -bnx2x/cnic drivers that supports VF_RSS. - -Signed-off-by: Eddie Wai ---- - iscsiuio/src/unix/libs/bnx2x.c | 13 ++++++++++--- - iscsiuio/src/unix/libs/bnx2x.h | 9 ++++++++- - 2 files changed, 18 insertions(+), 4 deletions(-) - -diff --git a/iscsiuio/src/unix/libs/bnx2x.c b/iscsiuio/src/unix/libs/bnx2x.c -index 36fc48e..748b59d 100644 ---- a/iscsiuio/src/unix/libs/bnx2x.c -+++ b/iscsiuio/src/unix/libs/bnx2x.c -@@ -900,8 +900,14 @@ static int bnx2x_open(nic_t *nic) - struct client_init_general_data *data = bp->bufs; - - bp->client_id = data->client_id; -- if (data->reserved0) -- bp->cid = data->reserved0; -+ if (data->uid.cid) -+ bp->cid = data->uid.cid; -+ if (bp->version.minor >= 78 && bp->version.sub_minor >= 55 && -+ data->uid.cid_override_key == UIO_USE_TX_DOORBELL) { -+ bp->tx_doorbell = data->uid.tx_db_off; -+ LOG_INFO(PFX "%s: tx doorbell override offset = 0x%x", -+ nic->log_name, bp->tx_doorbell); -+ } - } - - LOG_INFO(PFX "%s: func 0x%x, pfid 0x%x, client_id 0x%x, cid 0x%x", -@@ -928,7 +934,8 @@ static int bnx2x_open(nic_t *nic) - USTORM_RX_PRODS_E2_OFFSET(cl_qzone_id) : - USTORM_RX_PRODS_E1X_OFFSET(bp->port, bp->client_id)); - -- bp->tx_doorbell = bp->cid * 0x80 + 0x40; -+ if (!bp->tx_doorbell) -+ bp->tx_doorbell = bp->cid * 0x80 + 0x40; - - bp->get_rx_cons = bnx2x_get_rx_60; - bp->get_tx_cons = bnx2x_get_tx_60; -diff --git a/iscsiuio/src/unix/libs/bnx2x.h b/iscsiuio/src/unix/libs/bnx2x.h -index 0b74e44..ce55cfc 100644 ---- a/iscsiuio/src/unix/libs/bnx2x.h -+++ b/iscsiuio/src/unix/libs/bnx2x.h -@@ -382,6 +382,13 @@ union eth_rx_cqe_70 { - struct eth_rx_cqe_next_page_70 next_page_cqe_70; - }; - -+struct uio_init_data { -+ __u32 cid; -+ __u32 tx_db_off; -+ __u32 cid_override_key; -+#define UIO_USE_TX_DOORBELL 0x017855DB -+}; -+ - struct client_init_general_data { - __u8 client_id; - __u8 statistics_counter_id; -@@ -394,7 +401,7 @@ struct client_init_general_data { - __u8 func_id; - __u8 cos; - __u8 traffic_type; -- __u32 reserved0; -+ struct uio_init_data uid; - }; - - /****************************************************************************** --- -1.8.3.1 - diff --git a/0060-ISCSIUIO-Added-fix-for-the-iface.subnet_mask-decodin.patch b/0060-ISCSIUIO-Added-fix-for-the-iface.subnet_mask-decodin.patch deleted file mode 100644 index 143d6c6..0000000 --- a/0060-ISCSIUIO-Added-fix-for-the-iface.subnet_mask-decodin.patch +++ /dev/null @@ -1,29 +0,0 @@ -From df68365bef167778fb59059e78090d33a01e4e7f Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Wed, 11 Dec 2013 15:38:13 -0800 -Subject: [PATCH] ISCSIUIO: Added fix for the iface.subnet_mask decoding for - IPv6 - -Fixed a inet_pton decode error for the iface.subnet_mask for IPv6. - -Signed-off-by: Eddie Wai ---- - iscsiuio/src/unix/iscsid_ipc.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/iscsiuio/src/unix/iscsid_ipc.c b/iscsiuio/src/unix/iscsid_ipc.c -index e22de0d..033308d 100644 ---- a/iscsiuio/src/unix/iscsid_ipc.c -+++ b/iscsiuio/src/unix/iscsid_ipc.c -@@ -274,7 +274,7 @@ static int decode_iface(struct iface_rec_decode *ird, struct iface_rec *rec) - sizeof(struct in6_addr)); - /* Subnet mask priority: CIDR, then rec */ - if (!ird->ipv6_subnet_mask.s6_addr) -- inet_pton(AF_INET, rec->subnet_mask, -+ inet_pton(AF_INET6, rec->subnet_mask, - &ird->ipv6_subnet_mask); - - /* For LL on, ignore the IPv6 addr in the iface */ --- -1.8.3.1 - diff --git a/0061-ISCSIUIO-Added-fix-for-the-ARP-cache-flush-mechanism.patch b/0061-ISCSIUIO-Added-fix-for-the-ARP-cache-flush-mechanism.patch deleted file mode 100644 index 62a8927..0000000 --- a/0061-ISCSIUIO-Added-fix-for-the-ARP-cache-flush-mechanism.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 817a0831c54f06dda2727fe1118e7a65181eb128 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Wed, 11 Dec 2013 15:38:14 -0800 -Subject: [PATCH] ISCSIUIO: Added fix for the ARP cache flush mechanism - -The ARP cache table wasn't being flushed correctly due to a bug -in the time stamp comparison. The same bug can also be observed -to find the oldest entry in the ARP cache table to override. - -Signed-off-by: Eddie Wai ---- - iscsiuio/src/uip/uip_arp.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/iscsiuio/src/uip/uip_arp.c b/iscsiuio/src/uip/uip_arp.c -index f7a9594..a8de07f 100644 ---- a/iscsiuio/src/uip/uip_arp.c -+++ b/iscsiuio/src/uip/uip_arp.c -@@ -112,7 +112,7 @@ void uip_arp_timer(void) - for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { - tabptr = &arp_table[i]; - if ((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && -- arptime - tabptr->time >= UIP_ARP_MAXAGE) -+ (u8_t)(arptime - tabptr->time) >= UIP_ARP_MAXAGE) - memset(tabptr->ipaddr, 0, 4); - } - -@@ -165,8 +165,8 @@ static void uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr) - c = 0; - for (i = 0; i < UIP_ARPTAB_SIZE; ++i) { - tabptr = &arp_table[i]; -- if (arptime - tabptr->time > tmpage) { -- tmpage = arptime - tabptr->time; -+ if ((u8_t)(arptime - tabptr->time) > tmpage) { -+ tmpage = (u8_t)(arptime - tabptr->time); - c = i; - } - } --- -1.8.3.1 - diff --git a/0062-ISCSIUIO-Updated-RELEASE-note-and-version.patch b/0062-ISCSIUIO-Updated-RELEASE-note-and-version.patch deleted file mode 100644 index 435d1ae..0000000 --- a/0062-ISCSIUIO-Updated-RELEASE-note-and-version.patch +++ /dev/null @@ -1,102 +0,0 @@ -From eb1d2751f989b8c9031964912ef2e952916735ca Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Wed, 11 Dec 2013 15:38:15 -0800 -Subject: [PATCH] ISCSIUIO: Updated RELEASE note and version - -old version: 0.7.8.1b -new version: 0.7.8.2 - -Signed-off-by: Eddie Wai ---- - iscsiuio/README | 4 ++-- - iscsiuio/RELEASE.TXT | 24 ++++++++++++++++++++++-- - iscsiuio/configure.ac | 4 ++-- - iscsiuio/docs/iscsiuio.8 | 2 +- - 4 files changed, 27 insertions(+), 7 deletions(-) - -diff --git a/iscsiuio/README b/iscsiuio/README -index e7e5fe4..a283116 100644 ---- a/iscsiuio/README -+++ b/iscsiuio/README -@@ -1,6 +1,6 @@ - Iscsiuio Userspace Tool --Version 0.7.8.1b --May 01, 2013 -+Version 0.7.8.2 -+Dec 10, 2013 - ------------------------------------------------------ - - This tool is to be used in conjunction with the Broadcom NetXtreme II Linux -diff --git a/iscsiuio/RELEASE.TXT b/iscsiuio/RELEASE.TXT -index de70667..22628fd 100644 ---- a/iscsiuio/RELEASE.TXT -+++ b/iscsiuio/RELEASE.TXT -@@ -1,7 +1,7 @@ - Release Notes - Broadcom uIP Linux Driver -- Version 0.7.8.1b -- 05/01/2013 -+ Version 0.7.8.2 -+ 12/10/2013 - - Broadcom Corporation - 5300 California Avenue, -@@ -10,6 +10,26 @@ - Copyright (c) 2004 - 2013 Broadcom Corporation - All rights reserved - -+uIP v0.7.8.2 (Dec 10, 2013) -+======================================================= -+ Fixes -+ ----- -+ 1. Problem: Cont00072053 - Some hardware iSCSI paths fail during test -+ Cause: The test exercised a corner case where the ARP cache flush -+ mechanism didn't work properly -+ Change: Fixed the ARP cache flush mechanism -+ Impact: All -+ -+ Enhancements -+ ------------ -+ 1. Change: Added a new tx doorbell field in the uio path to work with -+ the new bnx2x/cnic drivers that supports VF_RSS -+ Impact: 10G only -+ -+ 2. Change: Fixed the iface.subnet_mask decoding for IPv6 -+ Impact: IPv6 -+ -+ - uIP v0.7.8.1b (May 01, 2013) - ======================================================= - Enhancements -diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac -index e9a5e32..381b94d 100644 ---- a/iscsiuio/configure.ac -+++ b/iscsiuio/configure.ac -@@ -11,9 +11,9 @@ dnl Benjamin Li (benli@broadcom.com) - dnl - - PACKAGE=iscsiuio --VERSION=0.7.8.1b -+VERSION=0.7.8.2 - --AC_INIT(iscsiuio, 0.7.8.1b, eddie.wai@broadcom.com) -+AC_INIT(iscsiuio, 0.7.8.2, eddie.wai@broadcom.com) - - AM_INIT_AUTOMAKE($PACKAGE, $VERSION) - AC_CONFIG_HEADER(config.h) -diff --git a/iscsiuio/docs/iscsiuio.8 b/iscsiuio/docs/iscsiuio.8 -index ea21d78..3b50409 100644 ---- a/iscsiuio/docs/iscsiuio.8 -+++ b/iscsiuio/docs/iscsiuio.8 -@@ -5,7 +5,7 @@ - .\" - .\" bnx2.4,v 0.7.8.1b - .\" --.TH iscsiuio 8 "05/01/2013" "Broadcom Corporation" -+.TH iscsiuio 8 "12/10/2013" "Broadcom Corporation" - .\" - .\" NAME part - .\" --- -1.8.3.1 - diff --git a/0063-ISCSIUIO-Updated-the-configure-file-to-reflect-the-n.patch b/0063-ISCSIUIO-Updated-the-configure-file-to-reflect-the-n.patch deleted file mode 100644 index 1782332..0000000 --- a/0063-ISCSIUIO-Updated-the-configure-file-to-reflect-the-n.patch +++ /dev/null @@ -1,16698 +0,0 @@ -From 9bd6fba5921aa98effee33071abfe7df8b0157f9 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Thu, 2 Jan 2014 15:00:20 -0600 -Subject: [PATCH] ISCSIUIO: Updated the configure file to reflect the new - version - -Note: Merged Eddie's configure.after attachment instead of patch -on the list becasue of troubles with git/patch/diff. ---- - iscsiuio/configure | 11538 +++++++++++++++++++++++++++++---------------------- - 1 file changed, 6521 insertions(+), 5017 deletions(-) - -diff --git a/iscsiuio/configure b/iscsiuio/configure -index 2740598..444c9c0 100755 ---- a/iscsiuio/configure -+++ b/iscsiuio/configure -@@ -1,27 +1,84 @@ - #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. --# Generated by GNU Autoconf 2.59 for iscsiuio 0.7.8.1b. -+# Generated by GNU Autoconf 2.63 for iscsiuio 0.7.8.2. - # - # Report bugs to . - # --# Copyright (C) 2003 Free Software Foundation, Inc. -+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 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+"$@"}'='"$@"' --elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then -- set -o posix --fi -+# 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 -+ -+ -+ -+ -+# PATH needs CR -+# 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_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 -+if (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 - - # Support unset when possible. - if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -@@ -31,33 +88,60 @@ else - 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); exit 1; } -+fi -+ - # Work around bugs in pre-3.0 UWIN ksh. --$as_unset ENV MAIL MAILPATH -+for as_var in ENV MAIL MAILPATH -+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+done - PS1='$ ' - PS2='> ' - PS4='+ ' - - # NLS nuisances. --for as_var in \ -- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -- LC_TELEPHONE LC_TIME --do -- if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -- eval $as_var=C; export $as_var -- else -- $as_unset $as_var -- fi --done -+LC_ALL=C -+export LC_ALL -+LANGUAGE=C -+export LANGUAGE - - # Required to use basename. --if expr a : '\(a\)' >/dev/null 2>&1; then -+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 -+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename - else - as_basename=false -@@ -65,157 +149,391 @@ fi - - - # Name of the executable. --as_me=`$as_basename "$0" || -+as_me=`$as_basename -- "$0" || - $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ -- X"$0" : 'X\(/\)$' \| \ -- . : '\(.\)' 2>/dev/null || --echo X/"$0" | -- sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -- /^X\/\(\/\/\)$/{ s//\1/; q; } -- /^X\/\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- -- --# PATH needs CR, and LINENO needs CR and PATH. --# 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 -- --# The user is always right. --if test "${PATH_SEPARATOR+set}" != set; then -- echo "#! /bin/sh" >conf$$.sh -- echo "exit 0" >>conf$$.sh -- chmod +x conf$$.sh -- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -- PATH_SEPARATOR=';' -- else -- PATH_SEPARATOR=: -- fi -- rm -f conf$$.sh -+ X"$0" : 'X\(/\)' \| . 2>/dev/null || -+$as_echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` -+ -+# CDPATH. -+$as_unset CDPATH -+ -+ -+if test "x$CONFIG_SHELL" = x; then -+ if (eval ":") 2>/dev/null; then -+ as_have_required=yes -+else -+ as_have_required=no -+fi -+ -+ if test $as_have_required = yes && (eval ": -+(as_func_return () { -+ (exit \$1) -+} -+as_func_success () { -+ as_func_return 0 -+} -+as_func_failure () { -+ as_func_return 1 -+} -+as_func_ret_success () { -+ return 0 -+} -+as_func_ret_failure () { -+ return 1 -+} -+ -+exitcode=0 -+if as_func_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_success failed. -+fi -+ -+if as_func_failure; then -+ exitcode=1 -+ echo as_func_failure succeeded. -+fi -+ -+if as_func_ret_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_ret_success failed. -+fi -+ -+if as_func_ret_failure; then -+ exitcode=1 -+ echo as_func_ret_failure succeeded. -+fi -+ -+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then -+ : -+else -+ exitcode=1 -+ echo positional parameters were not saved. - fi - -+test \$exitcode = 0) || { (exit 1); exit 1; } - -- as_lineno_1=$LINENO -- as_lineno_2=$LINENO -- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -- test "x$as_lineno_1" != "x$as_lineno_2" && -- test "x$as_lineno_3" = "x$as_lineno_2" || { -- # Find who we are. Look in the path if we contain no path at all -- # relative or not. -- 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 -- -- ;; -- 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 -- { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 -- { (exit 1); exit 1; }; } -- fi -- case $CONFIG_SHELL in -- '') -+( -+ as_lineno_1=\$LINENO -+ as_lineno_2=\$LINENO -+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && -+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -+") 2> /dev/null; then -+ : -+else -+ as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR - for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH - do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. -- for as_base in sh bash ksh sh5; do -- case $as_dir in -+ case $as_dir in - /*) -- if ("$as_dir/$as_base" -c ' -- as_lineno_1=$LINENO -- as_lineno_2=$LINENO -- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -- test "x$as_lineno_1" != "x$as_lineno_2" && -- test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then -- $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } -- $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } -- CONFIG_SHELL=$as_dir/$as_base -- export CONFIG_SHELL -- exec "$CONFIG_SHELL" "$0" ${1+"$@"} -- fi;; -- esac -- done -+ for as_base in sh bash ksh sh5; do -+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base" -+ done;; -+ esac - done --;; -- esac -+IFS=$as_save_IFS -+ -+ -+ for as_shell in $as_candidate_shells $SHELL; do -+ # Try only shells that exist, to save several forks. -+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } && -+ { ("$as_shell") 2> /dev/null <<\_ASEOF -+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 -+ -+ -+: -+_ASEOF -+}; then -+ CONFIG_SHELL=$as_shell -+ as_have_required=yes -+ if { "$as_shell" 2> /dev/null <<\_ASEOF -+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_func_return () { -+ (exit $1) -+} -+as_func_success () { -+ as_func_return 0 -+} -+as_func_failure () { -+ as_func_return 1 -+} -+as_func_ret_success () { -+ return 0 -+} -+as_func_ret_failure () { -+ return 1 -+} -+ -+exitcode=0 -+if as_func_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_success failed. -+fi -+ -+if as_func_failure; then -+ exitcode=1 -+ echo as_func_failure succeeded. -+fi -+ -+if as_func_ret_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_ret_success failed. -+fi -+ -+if as_func_ret_failure; then -+ exitcode=1 -+ echo as_func_ret_failure succeeded. -+fi -+ -+if ( set x; as_func_ret_success y && test x = "$1" ); then -+ : -+else -+ exitcode=1 -+ echo positional parameters were not saved. -+fi -+ -+test $exitcode = 0) || { (exit 1); exit 1; } -+ -+( -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } -+ -+_ASEOF -+}; then -+ break -+fi -+ -+fi -+ -+ done -+ -+ if test "x$CONFIG_SHELL" != x; then -+ for as_var in BASH_ENV ENV -+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+ done -+ export CONFIG_SHELL -+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -+fi -+ -+ -+ if test $as_have_required = no; then -+ echo This script requires a shell more modern than all the -+ echo shells that I found on your system. Please install a -+ echo modern shell, or manually run the script under such a -+ echo shell if you do have one. -+ { (exit 1); exit 1; } -+fi -+ -+ -+fi -+ -+fi -+ -+ -+ -+(eval "as_func_return () { -+ (exit \$1) -+} -+as_func_success () { -+ as_func_return 0 -+} -+as_func_failure () { -+ as_func_return 1 -+} -+as_func_ret_success () { -+ return 0 -+} -+as_func_ret_failure () { -+ return 1 -+} -+ -+exitcode=0 -+if as_func_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_success failed. -+fi -+ -+if as_func_failure; then -+ exitcode=1 -+ echo as_func_failure succeeded. -+fi -+ -+if as_func_ret_success; then -+ : -+else -+ exitcode=1 -+ echo as_func_ret_success failed. -+fi -+ -+if as_func_ret_failure; then -+ exitcode=1 -+ echo as_func_ret_failure succeeded. -+fi -+ -+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then -+ : -+else -+ exitcode=1 -+ echo positional parameters were not saved. -+fi -+ -+test \$exitcode = 0") || { -+ echo No shell found that supports shell functions. -+ echo Please tell bug-autoconf@gnu.org about your system, -+ echo including any error possibly output before this message. -+ echo This can help us improve future autoconf versions. -+ echo Configuration will now proceed without shell functions. -+} -+ -+ -+ -+ as_lineno_1=$LINENO -+ as_lineno_2=$LINENO -+ test "x$as_lineno_1" != "x$as_lineno_2" && -+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a -- # line-number line before each line; the second 'sed' does the real -- # work. The second script uses 'N' to pair each line-number line -- # with the numbered line, and appends trailing '-' during -- # substitution so that $LINENO is not a special case at line end. -+ # line-number line after each line using $LINENO; the second 'sed' -+ # does the real work. The second script uses 'N' to pair each -+ # line-number line with the line containing $LINENO, and appends -+ # trailing '-' during substitution so that $LINENO is not a special -+ # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -- # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) -- sed '=' <$as_myself | -+ # scripts with optimization help from Paolo Bonzini. Blame Lee -+ # E. McMahon (1931-1989) for sed's syntax. :-) -+ sed -n ' -+ p -+ /[$]LINENO/= -+ ' <$as_myself | - sed ' -+ s/[$]LINENO.*/&-/ -+ t lineno -+ b -+ :lineno - N -- s,$,-, -- : loop -- s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, -+ :loop -+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop -- s,-$,, -- s,^['$as_cr_digits']*\n,, -+ s/-\n.*// - ' >$as_me.lineno && -- chmod +x $as_me.lineno || -- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 -+ chmod +x "$as_me.lineno" || -+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); 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 sensible to this). -- . ./$as_me.lineno -+ # original and so on. Autoconf is especially sensitive to this). -+ . "./$as_me.lineno" - # Exit status is that of the last command. - exit - } - - --case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in -- *c*,-n*) ECHO_N= ECHO_C=' --' ECHO_T=' ' ;; -- *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; -- *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then -+ as_dirname=dirname -+else -+ as_dirname=false -+fi -+ -+ECHO_C= ECHO_N= ECHO_T= -+case `echo -n x` in -+-n*) -+ case `echo 'x\c'` in -+ *c*) ECHO_T=' ';; # ECHO_T is single tab character. -+ *) ECHO_C='\c';; -+ esac;; -+*) -+ ECHO_N='-n';; - esac -- --if expr a : '\(a\)' >/dev/null 2>&1; then -+if expr a : '\(a\)' >/dev/null 2>&1 && -+ test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr - else - as_expr=false - fi - - rm -f conf$$ conf$$.exe conf$$.file --echo >conf$$.file --if ln -s conf$$.file conf$$ 2>/dev/null; then -- # We could just check for DJGPP; but this test a) works b) is more generic -- # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). -- if test -f conf$$.exe; then -- # Don't use ln at all; we don't have any links -- as_ln_s='cp -p' -- else -+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 --elif ln conf$$.file conf$$ 2>/dev/null; then -- as_ln_s=ln - else - as_ln_s='cp -p' - fi --rm -f conf$$ conf$$.exe conf$$.file -+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=: -@@ -224,7 +542,28 @@ else - as_mkdir_p=false - fi - --as_executable_p="test -f" -+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'" -@@ -233,15 +572,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - --# IFS --# We need space, tab and new line, in precisely that order. --as_nl=' --' --IFS=" $as_nl" -- --# CDPATH. --$as_unset CDPATH -- - - - # Check that we are running under the correct shell. -@@ -397,80 +727,212 @@ tagnames=${tagnames+${tagnames},}CXX - - tagnames=${tagnames+${tagnames},}F77 - -+exec 7<&0 &1 -+ - # Name of the host. - # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, - # so uname gets run too. - ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - --exec 6>&1 -- - # - # Initializations. - # - ac_default_prefix=/usr/local -+ac_clean_files= - ac_config_libobj_dir=. -+LIBOBJS= - cross_compiling=no - subdirs= - MFLAGS= - MAKEFLAGS= - SHELL=${CONFIG_SHELL-/bin/sh} - --# Maximum number of lines to put in a shell here document. --# This variable seems obsolete. It should probably be removed, and --# only ac_max_sed_lines should be used. --: ${ac_max_here_lines=38} -- - # Identity of this package. - PACKAGE_NAME='iscsiuio' - PACKAGE_TARNAME='iscsiuio' --PACKAGE_VERSION='0.7.8.1b' --PACKAGE_STRING='iscsiuio 0.7.8.1b' -+PACKAGE_VERSION='0.7.8.2' -+PACKAGE_STRING='iscsiuio 0.7.8.2' - PACKAGE_BUGREPORT='eddie.wai@broadcom.com' - - # Factoring default headers for most tests. - ac_includes_default="\ - #include --#if HAVE_SYS_TYPES_H -+#ifdef HAVE_SYS_TYPES_H - # include - #endif --#if HAVE_SYS_STAT_H -+#ifdef HAVE_SYS_STAT_H - # include - #endif --#if STDC_HEADERS -+#ifdef STDC_HEADERS - # include - # include - #else --# if HAVE_STDLIB_H -+# ifdef HAVE_STDLIB_H - # include - # endif - #endif --#if HAVE_STRING_H --# if !STDC_HEADERS && HAVE_MEMORY_H -+#ifdef HAVE_STRING_H -+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H - # include - # endif - # include - #endif --#if HAVE_STRINGS_H -+#ifdef HAVE_STRINGS_H - # include - #endif --#if HAVE_INTTYPES_H -+#ifdef HAVE_INTTYPES_H - # include --#else --# if HAVE_STDINT_H --# include --# endif - #endif --#if HAVE_UNISTD_H -+#ifdef HAVE_STDINT_H -+# include -+#endif -+#ifdef HAVE_UNISTD_H - # include - #endif" - - ac_default_prefix= --ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar BASH CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE RANLIB ac_ct_RANLIB CPP EGREP ENDIAN build build_cpu build_vendor build_os host host_cpu host_vendor host_os SED LN_S ECHO AR ac_ct_AR CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL DEBUG_TRUE DEBUG_FALSE LIBOBJS LTLIBOBJS' -+ac_subst_vars='LTLIBOBJS -+LIBOBJS -+DEBUG_FALSE -+DEBUG_TRUE -+LIBTOOL -+ac_ct_F77 -+FFLAGS -+F77 -+CXXCPP -+am__fastdepCXX_FALSE -+am__fastdepCXX_TRUE -+CXXDEPMODE -+ac_ct_CXX -+CXXFLAGS -+CXX -+AR -+ECHO -+LN_S -+SED -+host_os -+host_vendor -+host_cpu -+host -+build_os -+build_vendor -+build_cpu -+build -+ENDIAN -+EGREP -+GREP -+CPP -+RANLIB -+am__fastdepCC_FALSE -+am__fastdepCC_TRUE -+CCDEPMODE -+AMDEPBACKSLASH -+AMDEP_FALSE -+AMDEP_TRUE -+am__quote -+am__include -+DEPDIR -+OBJEXT -+EXEEXT -+ac_ct_CC -+CPPFLAGS -+LDFLAGS -+CFLAGS -+CC -+BASH -+am__untar -+am__tar -+AMTAR -+am__leading_dot -+SET_MAKE -+AWK -+mkdir_p -+INSTALL_STRIP_PROGRAM -+STRIP -+install_sh -+MAKEINFO -+AUTOHEADER -+AUTOMAKE -+AUTOCONF -+ACLOCAL -+VERSION -+PACKAGE -+CYGPATH_W -+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_BUGREPORT -+PACKAGE_STRING -+PACKAGE_VERSION -+PACKAGE_TARNAME -+PACKAGE_NAME -+PATH_SEPARATOR -+SHELL' - ac_subst_files='' -+ac_user_opts=' -+enable_option_checking -+enable_dependency_tracking -+enable_shared -+enable_static -+enable_fast_install -+with_gnu_ld -+enable_libtool_lock -+with_pic -+with_tags -+enable_debug -+' -+ ac_precious_vars='build_alias -+host_alias -+target_alias -+CC -+CFLAGS -+LDFLAGS -+LIBS -+CPPFLAGS -+CPP -+CXX -+CXXFLAGS -+CCC -+CXXCPP -+F77 -+FFLAGS' -+ - - # 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 -@@ -493,34 +955,48 @@ x_libraries=NONE - # 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' --datadir='${prefix}/share' -+datarootdir='${prefix}/share' -+datadir='${datarootdir}' - sysconfdir='${prefix}/etc' - sharedstatedir='${prefix}/com' - localstatedir='${prefix}/var' --libdir='${exec_prefix}/lib' - includedir='${prefix}/include' - oldincludedir='/usr/include' --infodir='${prefix}/info' --mandir='${prefix}/man' -+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" -+ eval $ac_prev=\$ac_option - ac_prev= - continue - fi - -- ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` -+ case $ac_option in -+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; -+ *) ac_optarg=yes ;; -+ esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - -- case $ac_option in -+ case $ac_dashdash$ac_option in -+ --) -+ ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; -@@ -542,33 +1018,61 @@ do - --config-cache | -C) - cache_file=config.cache ;; - -- -datadir | --datadir | --datadi | --datad | --data | --dat | --da) -+ -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; -- -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ -- | --da=*) -+ -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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` -+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. -- expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && -- { echo "$as_me: error: invalid feature name: $ac_feature" >&2 -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } -- ac_feature=`echo $ac_feature | sed 's/-/_/g'` -- eval "enable_$ac_feature=no" ;; -+ 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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` -+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. -- expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && -- { echo "$as_me: error: invalid feature name: $ac_feature" >&2 -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } -- ac_feature=`echo $ac_feature | sed 's/-/_/g'` -- case $ac_option in -- *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; -- *) ac_optarg=yes ;; -+ 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_feature='$ac_optarg'" ;; -+ eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ -@@ -595,6 +1099,12 @@ do - -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 ;; -@@ -619,13 +1129,16 @@ do - | --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 | --local | --loca | --loc | --lo) -+ | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ -- | --localstate=* | --localstat=* | --localsta=* | --localst=* \ -- | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) -+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) -@@ -690,6 +1203,16 @@ do - | --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 ;; -@@ -740,26 +1263,38 @@ do - ac_init_version=: ;; - - -with-* | --with-*) -- ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` -+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. -- expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && -- { echo "$as_me: error: invalid package name: $ac_package" >&2 -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } -- ac_package=`echo $ac_package| sed 's/-/_/g'` -- case $ac_option in -- *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; -- *) ac_optarg=yes ;; -+ 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_package='$ac_optarg'" ;; -+ eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) -- ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` -+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. -- expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && -- { echo "$as_me: error: invalid package name: $ac_package" >&2 -+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && -+ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } -- ac_package=`echo $ac_package | sed 's/-/_/g'` -- eval "with_$ac_package=no" ;; -+ 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. -@@ -779,7 +1314,7 @@ do - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - -- -*) { echo "$as_me: error: unrecognized option: $ac_option -+ -*) { $as_echo "$as_me: error: unrecognized option: $ac_option - Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; -@@ -788,17 +1323,16 @@ Try \`$0 --help' for more information." >&2 - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && -- { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 -+ { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } -- ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` -- eval "$ac_envvar='$ac_optarg'" -+ eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. -- echo "$as_me: WARNING: you should use --build, --host, --target" >&2 -+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && -- echo "$as_me: WARNING: invalid host type: $ac_option" >&2 -+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - -@@ -807,31 +1341,39 @@ done - - if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` -- { echo "$as_me: error: missing argument to $ac_option" >&2 -+ { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } - fi - --# Be sure to have absolute paths. --for ac_var in exec_prefix prefix --do -- eval ac_val=$`echo $ac_var` -- case $ac_val in -- [\\/$]* | ?:[\\/]* | NONE | '' ) ;; -- *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 -- { (exit 1); exit 1; }; };; -+if test -n "$ac_unrecognized_opts"; then -+ case $enable_option_checking in -+ no) ;; -+ fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 -+ { (exit 1); exit 1; }; } ;; -+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac --done -+fi - --# Be sure to have absolute paths. --for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ -- localstatedir libdir includedir oldincludedir infodir mandir -+# 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=$`echo $ac_var` -+ eval ac_val=\$$ac_var -+ # Remove trailing slashes. - case $ac_val in -- [\\/$]* | ?:[\\/]* ) ;; -- *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 -- { (exit 1); exit 1; }; };; -+ */ ) -+ 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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 -+ { (exit 1); exit 1; }; } - done - - # There might be people who depend on the old broken behavior: `$host' -@@ -845,7 +1387,7 @@ target=$target_alias - if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe -- echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. -+ $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 -@@ -858,94 +1400,76 @@ 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_echo "$as_me: error: working directory cannot be determined" >&2 -+ { (exit 1); exit 1; }; } -+test "X$ac_ls_di" = "X$ac_pwd_ls_di" || -+ { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 -+ { (exit 1); exit 1; }; } -+ -+ - # 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 its parent. -- ac_confdir=`(dirname "$0") 2>/dev/null || --$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -- X"$0" : 'X\(//\)[^/]' \| \ -- X"$0" : 'X\(//\)$' \| \ -- X"$0" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$0" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ # 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 -+ if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi - else - ac_srcdir_defaulted=no - fi --if test ! -r $srcdir/$ac_unique_file; then -- if test "$ac_srcdir_defaulted" = yes; then -- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 -+if test ! -r "$srcdir/$ac_unique_file"; then -+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." -+ { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } -- else -- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 -- { (exit 1); exit 1; }; } -- fi - fi --(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || -- { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 -+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -+ac_abs_confdir=`( -+ cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } --srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` --ac_env_build_alias_set=${build_alias+set} --ac_env_build_alias_value=$build_alias --ac_cv_env_build_alias_set=${build_alias+set} --ac_cv_env_build_alias_value=$build_alias --ac_env_host_alias_set=${host_alias+set} --ac_env_host_alias_value=$host_alias --ac_cv_env_host_alias_set=${host_alias+set} --ac_cv_env_host_alias_value=$host_alias --ac_env_target_alias_set=${target_alias+set} --ac_env_target_alias_value=$target_alias --ac_cv_env_target_alias_set=${target_alias+set} --ac_cv_env_target_alias_value=$target_alias --ac_env_CC_set=${CC+set} --ac_env_CC_value=$CC --ac_cv_env_CC_set=${CC+set} --ac_cv_env_CC_value=$CC --ac_env_CFLAGS_set=${CFLAGS+set} --ac_env_CFLAGS_value=$CFLAGS --ac_cv_env_CFLAGS_set=${CFLAGS+set} --ac_cv_env_CFLAGS_value=$CFLAGS --ac_env_LDFLAGS_set=${LDFLAGS+set} --ac_env_LDFLAGS_value=$LDFLAGS --ac_cv_env_LDFLAGS_set=${LDFLAGS+set} --ac_cv_env_LDFLAGS_value=$LDFLAGS --ac_env_CPPFLAGS_set=${CPPFLAGS+set} --ac_env_CPPFLAGS_value=$CPPFLAGS --ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} --ac_cv_env_CPPFLAGS_value=$CPPFLAGS --ac_env_CPP_set=${CPP+set} --ac_env_CPP_value=$CPP --ac_cv_env_CPP_set=${CPP+set} --ac_cv_env_CPP_value=$CPP --ac_env_CXX_set=${CXX+set} --ac_env_CXX_value=$CXX --ac_cv_env_CXX_set=${CXX+set} --ac_cv_env_CXX_value=$CXX --ac_env_CXXFLAGS_set=${CXXFLAGS+set} --ac_env_CXXFLAGS_value=$CXXFLAGS --ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} --ac_cv_env_CXXFLAGS_value=$CXXFLAGS --ac_env_CXXCPP_set=${CXXCPP+set} --ac_env_CXXCPP_value=$CXXCPP --ac_cv_env_CXXCPP_set=${CXXCPP+set} --ac_cv_env_CXXCPP_value=$CXXCPP --ac_env_F77_set=${F77+set} --ac_env_F77_value=$F77 --ac_cv_env_F77_set=${F77+set} --ac_cv_env_F77_value=$F77 --ac_env_FFLAGS_set=${FFLAGS+set} --ac_env_FFLAGS_value=$FFLAGS --ac_cv_env_FFLAGS_set=${FFLAGS+set} --ac_cv_env_FFLAGS_value=$FFLAGS -+ 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. -@@ -954,7 +1478,7 @@ 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 iscsiuio 0.7.8.1b to adapt to many kinds of systems. -+\`configure' configures iscsiuio 0.7.8.2 to adapt to many kinds of systems. - - Usage: $0 [OPTION]... [VAR=VALUE]... - -@@ -974,14 +1498,11 @@ Configuration: - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - --_ACEOF -- -- cat <<_ACEOF - Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX -- [$ac_default_prefix] -+ [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX -- [PREFIX] -+ [PREFIX] - - By default, \`make install' will install all the files in - \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -@@ -991,18 +1512,25 @@ 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] -- --datadir=DIR read-only architecture-independent data [PREFIX/share] -- --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] -- --infodir=DIR info documentation [PREFIX/info] -- --mandir=DIR man documentation [PREFIX/man] -+ --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/iscsiuio] -+ --htmldir=DIR html documentation [DOCDIR] -+ --dvidir=DIR dvi documentation [DOCDIR] -+ --pdfdir=DIR pdf documentation [DOCDIR] -+ --psdir=DIR ps documentation [DOCDIR] - _ACEOF - - cat <<\_ACEOF -@@ -1020,19 +1548,18 @@ fi - - if test -n "$ac_init_help"; then - case $ac_init_help in -- short | recursive ) echo "Configuration of iscsiuio 0.7.8.1b:";; -+ short | recursive ) echo "Configuration of iscsiuio 0.7.8.2:";; - 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] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors -- --enable-shared[=PKGS] -- build shared libraries [default=yes] -- --enable-static[=PKGS] -- build static libraries [default=yes] -+ --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] - --disable-libtool-lock avoid locking (might break parallel builds) -@@ -1044,16 +1571,16 @@ Optional Packages: - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-pic try to use only PIC/non-PIC objects [default=use - both] -- --with-tags[=TAGS] -- include additional configurations [automatic] -+ --with-tags[=TAGS] include additional configurations [automatic] - - 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 -- CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have -- headers in a nonstandard directory -+ LIBS libraries to pass to the linker, e.g. -l -+ CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if -+ you have headers in a nonstandard directory - CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags -@@ -1066,120 +1593,88 @@ 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. -- ac_popdir=`pwd` - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue -- test -d $ac_dir || continue -+ test -d "$ac_dir" || -+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || -+ continue - ac_builddir=. - --if test "$ac_dir" != .; then -- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -- # A "../" for each directory in $ac_dir_suffix. -- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` --else -- ac_dir_suffix= ac_top_builddir= --fi -+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 -- .) # No --srcdir option. We are building in place. -+ .) # We are building in place. - ac_srcdir=. -- if test -z "$ac_top_builddir"; then -- ac_top_srcdir=. -- else -- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -- fi ;; -- [\\/]* | ?:[\\/]* ) # Absolute path. -+ 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 ;; -- *) # Relative path. -- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -- ac_top_srcdir=$ac_top_builddir$srcdir ;; -+ 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 - --# Do not use `cd foo && pwd` to compute absolute paths, because --# the directories may not exist. --case `pwd` in --.) ac_abs_builddir="$ac_dir";; --*) -- case "$ac_dir" in -- .) ac_abs_builddir=`pwd`;; -- [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -- *) ac_abs_builddir=`pwd`/"$ac_dir";; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_top_builddir=${ac_top_builddir}.;; --*) -- case ${ac_top_builddir}. in -- .) ac_abs_top_builddir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -- *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_srcdir=$ac_srcdir;; --*) -- case $ac_srcdir in -- .) ac_abs_srcdir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -- *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_top_srcdir=$ac_top_srcdir;; --*) -- case $ac_top_srcdir in -- .) ac_abs_top_srcdir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -- *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -- esac;; --esac -- -- cd $ac_dir -- # Check for guested configure; otherwise get Cygnus style 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 -- elif test -f $ac_srcdir/configure.ac || -- test -f $ac_srcdir/configure.in; then -- echo -- $ac_configure --help -+ 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 -- echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 -- fi -- cd $ac_popdir -+ $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 0 -+test -n "$ac_init_help" && exit $ac_status - if $ac_init_version; then - cat <<\_ACEOF --iscsiuio configure 0.7.8.1b --generated by GNU Autoconf 2.59 -+iscsiuio configure 0.7.8.2 -+generated by GNU Autoconf 2.63 - --Copyright (C) 2003 Free Software Foundation, Inc. -+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -+2002, 2003, 2004, 2005, 2006, 2007, 2008 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 0 -+ exit - fi --exec 5>config.log --cat >&5 <<_ACEOF -+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 iscsiuio $as_me 0.7.8.1b, which was --generated by GNU Autoconf 2.59. Invocation command line was -+It was created by iscsiuio $as_me 0.7.8.2, which was -+generated by GNU Autoconf 2.63. Invocation command line was - - $ $0 $@ - - _ACEOF -+exec 5>>config.log - { - cat <<_ASUNAME - ## --------- ## -@@ -1198,7 +1693,7 @@ uname -v = `(uname -v) 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` --hostinfo = `(hostinfo) 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` -@@ -1210,8 +1705,9 @@ for as_dir in $PATH - do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. -- echo "PATH: $as_dir" -+ $as_echo "PATH: $as_dir" - done -+IFS=$as_save_IFS - - } >&5 - -@@ -1233,7 +1729,6 @@ _ACEOF - ac_configure_args= - ac_configure_args0= - ac_configure_args1= --ac_sep= - ac_must_keep_next=false - for ac_pass in 1 2 - do -@@ -1244,8 +1739,8 @@ do - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; -- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) -- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; -+ *\'*) -+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; -@@ -1266,9 +1761,7 @@ do - -* ) ac_must_keep_next=true ;; - esac - fi -- ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" -- # Get rid of the leading space. -- ac_sep=" " -+ ac_configure_args="$ac_configure_args '$ac_arg'" - ;; - esac - done -@@ -1279,8 +1772,8 @@ $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_ - # 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: Be sure not to use single quotes in there, as some shells, --# such as our DU 5.0 friend, will then `close' the trap. -+# 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. - { -@@ -1293,20 +1786,35 @@ trap 'exit_status=$? - _ASBOX - 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:$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= ;; #( -+ *) $as_unset $ac_var ;; -+ esac ;; -+ esac -+ done - (set) 2>&1 | -- case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in -- *ac_space=\ *) -+ 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" -- ;; -+ "s/'\''/'\''\\\\'\'''\''/g; -+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" -+ ;; #( - *) -- sed -n \ -- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" -+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; -- esac; --} -+ esac | -+ sort -+) - echo - - cat <<\_ASBOX -@@ -1317,22 +1825,28 @@ _ASBOX - echo - for ac_var in $ac_subst_vars - do -- eval ac_val=$`echo $ac_var` -- echo "$ac_var='"'"'$ac_val'"'"'" -+ 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 - cat <<\_ASBOX --## ------------- ## --## Output files. ## --## ------------- ## -+## ------------------- ## -+## File substitutions. ## -+## ------------------- ## - _ASBOX - echo - for ac_var in $ac_subst_files - do -- eval ac_val=$`echo $ac_var` -- echo "$ac_var='"'"'$ac_val'"'"'" -+ 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 -@@ -1344,26 +1858,24 @@ _ASBOX - ## ----------- ## - _ASBOX - echo -- sed "/^$/d" confdefs.h | sort -+ cat confdefs.h - echo - fi - test "$ac_signal" != 0 && -- echo "$as_me: caught signal $ac_signal" -- echo "$as_me: exit $exit_status" -+ $as_echo "$as_me: caught signal $ac_signal" -+ $as_echo "$as_me: exit $exit_status" - } >&5 -- rm -f core *.core && -- rm -rf conftest* confdefs* conf$$* $ac_clean_files && -+ rm -f core *.core core.conftest.* && -+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -- ' 0 -+' 0 - for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal - done - ac_signal=0 - - # confdefs.h avoids OS command line length limits that DEFS can exceed. --rm -rf conftest* confdefs.h --# AIX cpp loses on an empty file, so make sure it contains at least a newline. --echo >confdefs.h -+rm -f -r conftest* confdefs.h - - # Predefined preprocessor variables. - -@@ -1393,18 +1905,24 @@ _ACEOF - - - # Let the site file select an alternate cache file if it wants to. --# Prefer explicitly selected file to automatically selected ones. --if test -z "$CONFIG_SITE"; then -- if test "x$prefix" != xNONE; then -- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" -- else -- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" -- fi -+# Prefer an explicitly selected file to automatically selected ones. -+ac_site_file1=NONE -+ac_site_file2=NONE -+if test -n "$CONFIG_SITE"; then -+ ac_site_file1=$CONFIG_SITE -+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 $CONFIG_SITE; do -+for ac_site_file in "$ac_site_file1" "$ac_site_file2" -+do -+ test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then -- { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 --echo "$as_me: loading site script $ac_site_file" >&6;} -+ { $as_echo "$as_me:$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" - fi -@@ -1414,54 +1932,61 @@ if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then -- { echo "$as_me:$LINENO: loading cache $cache_file" >&5 --echo "$as_me: loading cache $cache_file" >&6;} -+ { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 -+$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in -- [\\/]* | ?:[\\/]* ) . $cache_file;; -- *) . ./$cache_file;; -+ [\\/]* | ?:[\\/]* ) . "$cache_file";; -+ *) . "./$cache_file";; - esac - fi - else -- { echo "$as_me:$LINENO: creating cache $cache_file" >&5 --echo "$as_me: creating cache $cache_file" >&6;} -+ { $as_echo "$as_me:$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 `(set) 2>&1 | -- sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do -+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" -+ 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,) -- { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 --echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} -+ { $as_echo "$as_me:$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) -- { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 --echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} -+ { $as_echo "$as_me:$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 -- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 --echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} -- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 --echo "$as_me: former value: $ac_old_val" >&2;} -- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 --echo "$as_me: current value: $ac_new_val" >&2;} -- ac_cache_corrupted=: -+ # 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:$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:$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:$LINENO: former value: \`$ac_old_val'" >&5 -+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} -+ { $as_echo "$as_me:$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=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; -+ *\'*) 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 -@@ -1471,13 +1996,39 @@ echo "$as_me: current value: $ac_new_val" >&2;} - fi - done - if $ac_cache_corrupted; then -- { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 --echo "$as_me: error: changes in the environment can compromise the build" >&2;} -- { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 --echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} -+ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+ { $as_echo "$as_me:$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_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } - fi - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' - ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -@@ -1486,56 +2037,37 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - am__api_version="1.9" - ac_aux_dir= --for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do -- if test -f $ac_dir/install-sh; then -+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; 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 -+ 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 -+ 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 -- { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 --echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} -+ { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -+$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } - fi --ac_config_guess="$SHELL $ac_aux_dir/config.guess" --ac_config_sub="$SHELL $ac_aux_dir/config.sub" --ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. -+ -+# 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. -+ - - # Find a good install program. We prefer a C program (faster), - # so one script is as good as another. But avoid the broken or -@@ -1550,11 +2082,12 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - # 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. --echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 --echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 -+# Reject install programs that cannot install multiple files. -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR - for as_dir in $PATH -@@ -1573,7 +2106,7 @@ case $as_dir/ in - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then -+ 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. -@@ -1583,30 +2116,43 @@ case $as_dir/ in - # program-specific install script used by HP pwplus--don't use. - : - else -- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -- break 3 -+ 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. We don't cache a -- # path for INSTALL within a source directory, because that will -+ # 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 path is relative. -+ # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi - fi --echo "$as_me:$LINENO: result: $INSTALL" >&5 --echo "${ECHO_T}$INSTALL" >&6 -+{ $as_echo "$as_me:$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. -@@ -1616,8 +2162,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - - test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - --echo "$as_me:$LINENO: checking whether build environment is sane" >&5 --echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -+$as_echo_n "checking whether build environment is sane... " >&6; } - # Just in case - sleep 1 - echo timestamp > conftest.file -@@ -1640,9 +2186,9 @@ if ( - # 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". -- { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -+ { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken - alias in your environment" >&5 --echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -+$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken - alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi -@@ -1653,26 +2199,23 @@ then - # Ok. - : - else -- { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -+ { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! - Check your system clock" >&5 --echo "$as_me: error: newly created file is older than distributed files! -+$as_echo "$as_me: error: newly created file is older than distributed files! - Check your system clock" >&2;} - { (exit 1); exit 1; }; } - fi --echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+{ $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - test "$program_prefix" != NONE && -- program_transform_name="s,^,$program_prefix,;$program_transform_name" -+ 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 $. echo might interpret backslashes. -+ program_transform_name="s&\$&$program_suffix&;$program_transform_name" -+# Double any \ or $. - # By default was `s,x,x', remove it if useless. --cat <<\_ACEOF >conftest.sed --s/[\\$]/&&/g;s/;s,x,x,$// --_ACEOF --program_transform_name=`echo $program_transform_name | sed -f conftest.sed` --rm conftest.sed -+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` -@@ -1683,8 +2226,8 @@ if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " - else - am_missing_run= -- { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 --echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -+ { $as_echo "$as_me:$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 mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then -@@ -1724,10 +2267,10 @@ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_AWK+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -@@ -1738,54 +2281,58 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $AWK" >&5 --echo "${ECHO_T}$AWK" >&6 -+ { $as_echo "$as_me:$LINENO: result: $AWK" >&5 -+$as_echo "$AWK" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$AWK" && break - done - --echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 --echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 --set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` --if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.make <<\_ACEOF -+SHELL = /bin/sh - all: -- @echo 'ac_maketemp="$(MAKE)"' -+ @echo '@@@%%%=$(MAKE)=@@@%%%' - _ACEOF - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. --eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` --if test -n "$ac_maketemp"; then -- eval ac_cv_prog_make_${ac_make}_set=yes --else -- eval ac_cv_prog_make_${ac_make}_set=no --fi -+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 \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then -- echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - SET_MAKE= - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" - fi - -@@ -1801,8 +2348,8 @@ rmdir .tst 2>/dev/null - # test to see if srcdir already configured - if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then -- { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 --echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} -+ { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -+$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } - fi - -@@ -1856,10 +2403,10 @@ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_STRIP+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -@@ -1870,34 +2417,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $STRIP" >&5 --echo "${ECHO_T}$STRIP" >&6 -+ { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 -+$as_echo "$STRIP" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -1908,27 +2457,37 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - -- test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" - fi - fi - ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP - if test -n "$ac_ct_STRIP"; then -- echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 --echo "${ECHO_T}$ac_ct_STRIP" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -+$as_echo "$ac_ct_STRIP" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -- STRIP=$ac_ct_STRIP -+ if test "x$ac_ct_STRIP" = x; then -+ STRIP=":" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 -@@ -1948,16 +2507,16 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - -- ac_config_headers="$ac_config_headers config.h" -+ac_config_headers="$ac_config_headers config.h" - - for ac_prog in bash - do - # Extract the first word of "$ac_prog", so it can be a program name with args. - set dummy $ac_prog; ac_word=$2 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_path_BASH+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - case $BASH in - [\\/]* | ?:[\\/]*) -@@ -1970,27 +2529,28 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_BASH="$as_dir/$ac_word$ac_exec_ext" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - - ;; - esac - fi - BASH=$ac_cv_path_BASH -- - if test -n "$BASH"; then -- echo "$as_me:$LINENO: result: $BASH" >&5 --echo "${ECHO_T}$BASH" >&6 -+ { $as_echo "$as_me:$LINENO: result: $BASH" >&5 -+$as_echo "$BASH" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$BASH" && break - done - -@@ -2003,10 +2563,10 @@ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_CC+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -@@ -2017,34 +2577,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $CC" >&5 --echo "${ECHO_T}$CC" >&6 -+ { $as_echo "$as_me:$LINENO: result: $CC" >&5 -+$as_echo "$CC" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -2055,38 +2617,49 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 --echo "${ECHO_T}$ac_ct_CC" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+$as_echo "$ac_ct_CC" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -- CC=$ac_ct_CC -+ if test "x$ac_ct_CC" = x; then -+ CC="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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. -+ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_CC+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -@@ -2097,76 +2670,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $CC" >&5 --echo "${ECHO_T}$CC" >&6 -+ { $as_echo "$as_me:$LINENO: result: $CC" >&5 -+$as_echo "$CC" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 "cc", so it can be a program name with args. --set dummy cc; ac_word=$2 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 --if test "${ac_cv_prog_ac_ct_CC+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -- ac_cv_prog_ac_ct_CC="cc" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -- break 2 -+ - fi --done --done -- --fi --fi --ac_ct_CC=$ac_cv_prog_ac_ct_CC --if test -n "$ac_ct_CC"; then -- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 --echo "${ECHO_T}$ac_ct_CC" >&6 --else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 --fi -- -- CC=$ac_ct_CC --else -- CC="$ac_cv_prog_CC" --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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_CC+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -@@ -2178,17 +2711,18 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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. -@@ -2206,24 +2740,25 @@ fi - fi - CC=$ac_cv_prog_CC - if test -n "$CC"; then -- echo "$as_me:$LINENO: result: $CC" >&5 --echo "${ECHO_T}$CC" >&6 -+ { $as_echo "$as_me:$LINENO: result: $CC" >&5 -+$as_echo "$CC" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 -+ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_CC+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -@@ -2234,38 +2769,40 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $CC" >&5 --echo "${ECHO_T}$CC" >&6 -+ { $as_echo "$as_me:$LINENO: result: $CC" >&5 -+$as_echo "$CC" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 -+ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -2276,58 +2813,90 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 --echo "${ECHO_T}$ac_ct_CC" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -+$as_echo "$ac_ct_CC" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$ac_ct_CC" && break - done - -- CC=$ac_ct_CC -+ if test "x$ac_ct_CC" = x; then -+ CC="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH - See \`config.log' for more details." >&5 --echo "$as_me: error: no acceptable C compiler found in \$PATH -+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - - # Provide some information about the compiler. --echo "$as_me:$LINENO:" \ -- "checking for C compiler version" >&5 --ac_compiler=`set X $ac_compile; echo $2` --{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 -- (eval $ac_compiler --version &5) 2>&5 -+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 -+set X $ac_compile -+ac_compiler=$2 -+{ (ac_try="$ac_compiler --version >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } --{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 -- (eval $ac_compiler -v &5) 2>&5 -+{ (ac_try="$ac_compiler -v >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } --{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 -- (eval $ac_compiler -V &5) 2>&5 -+{ (ac_try="$ac_compiler -V >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - - cat >conftest.$ac_ext <<_ACEOF -@@ -2346,111 +2915,150 @@ main () - } - _ACEOF - ac_clean_files_save=$ac_clean_files --ac_clean_files="$ac_clean_files a.out a.exe b.out" -+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. --echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 --echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 --ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` --if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 -- (eval $ac_link_default) 2>&5 -+{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -+$as_echo_n "checking for C compiler default output file name... " >&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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link_default") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then -- # Find the output, starting from the most likely. This scheme is --# not robust to junk in `.', hence go to wildcards (a.*) only as a last --# resort. -- --# Be careful to initialize this variable, since it used to be cached. --# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. --ac_cv_exeext= --# b.out is created by i960 compilers. --for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out -+ # 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 | *.o | *.obj ) -- ;; -- conftest.$ac_ext ) -- # This is the source file. -+ *.$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;; - *.* ) -- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` -- # FIXME: I believe we export ac_cv_exeext for Libtool, -- # but it would be cool to find out if it's true. Does anybody -- # maintain Libtool? --akim. -- export ac_cv_exeext -+ 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 -- echo "$as_me: failed program was:" >&5 -+ ac_file='' -+fi -+ -+{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -+$as_echo "$ac_file" >&6; } -+if test -z "$ac_file"; then -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables - See \`config.log' for more details." >&5 --echo "$as_me: error: C compiler cannot create executables -+$as_echo "$as_me: error: C compiler cannot create executables - See \`config.log' for more details." >&2;} -- { (exit 77); exit 77; }; } -+ { (exit 77); exit 77; }; }; } - fi - - ac_exeext=$ac_cv_exeext --echo "$as_me:$LINENO: result: $ac_file" >&5 --echo "${ECHO_T}$ac_file" >&6 - --# Check the compiler produces executables we can run. If not, either -+# Check that the compiler produces executables we can run. If not, either - # the compiler is broken, or we cross compile. --echo "$as_me:$LINENO: checking whether the C compiler works" >&5 --echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -+$as_echo_n "checking whether the C compiler works... " >&6; } - # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 - # If not cross compiling, check that we can run a simple program. - if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else -- { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. - If you meant to cross compile, use \`--host'. - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot run C compiled programs. -+$as_echo "$as_me: error: cannot run C compiled programs. - If you meant to cross compile, use \`--host'. - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - fi - fi --echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+{ $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - --rm -f a.out a.exe conftest$ac_cv_exeext b.out -+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out - ac_clean_files=$ac_clean_files_save --# Check the compiler produces executables we can run. If not, either -+# Check that the compiler produces executables we can run. If not, either - # the compiler is broken, or we cross compile. --echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 --echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 --echo "$as_me:$LINENO: result: $cross_compiling" >&5 --echo "${ECHO_T}$cross_compiling" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -+$as_echo_n "checking whether we are cross compiling... " >&6; } -+{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -+$as_echo "$cross_compiling" >&6; } - --echo "$as_me:$LINENO: checking for suffix of executables" >&5 --echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>&5 -+{ $as_echo "$as_me:$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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) - # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -@@ -2459,32 +3067,33 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - 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 | *.o | *.obj ) ;; -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` -- export ac_cv_exeext - break;; - * ) break;; - esac - done - else -- { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -+$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - - rm -f conftest$ac_cv_exeext --echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 --echo "${ECHO_T}$ac_cv_exeext" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -+$as_echo "$ac_cv_exeext" >&6; } - - rm -f conftest.$ac_ext - EXEEXT=$ac_cv_exeext - ac_exeext=$EXEEXT --echo "$as_me:$LINENO: checking for suffix of object files" >&5 --echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -2502,39 +3111,48 @@ main () - } - _ACEOF - rm -f conftest.o conftest.obj --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>&5 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then -- for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do -+ 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 ) ;; -+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute suffix of object files: cannot compile -+$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - - rm -f conftest.$ac_cv_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 --echo "${ECHO_T}$ac_cv_objext" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -+$as_echo "$ac_cv_objext" >&6; } - OBJEXT=$ac_cv_objext - ac_objext=$OBJEXT --echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 --echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -2555,50 +3173,54 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_compiler_gnu=no -+ ac_compiler_gnu=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_c_compiler_gnu=$ac_compiler_gnu - - fi --echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 --echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 --GCC=`test $ac_compiler_gnu = yes && echo yes` -+{ $as_echo "$as_me:$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 --CFLAGS="-g" --echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 --echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_save_c_werror_flag=$ac_c_werror_flag -+ ac_c_werror_flag=yes -+ ac_cv_prog_cc_g=no -+ CFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -2614,38 +3236,121 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cc_g=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ CFLAGS="" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_c_werror_flag=$ac_save_c_werror_flag -+ CFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_prog_cc_g=no -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+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 --echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 --echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 -+{ $as_echo "$as_me:$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 -@@ -2661,12 +3366,12 @@ else - CFLAGS= - fi - fi --echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 --echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 --if test "${ac_cv_prog_cc_stdc+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_stdc=no -+ ac_cv_prog_cc_c89=no - ac_save_CC=$CC - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -2700,12 +3405,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) - /* 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 -std1 is added to get -+ 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 -std1. */ -+ 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);}; -@@ -2720,205 +3430,58 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - return 0; - } - _ACEOF --# Don't try gcc -ansi; that turns off useful extensions and --# breaks some systems' header files. --# AIX -qlanglvl=ansi --# Ultrix and OSF/1 -std1 --# HP-UX 10.20 and later -Ae --# HP-UX older versions -Aa -D_HPUX_SOURCE --# SVR4 -Xc -D__EXTENSIONS__ --for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" - do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_prog_cc_stdc=$ac_arg --break -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cc_c89=$ac_arg - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext -+ -+rm -f core conftest.err conftest.$ac_objext -+ test "x$ac_cv_prog_cc_c89" != "xno" && break - done --rm -f conftest.$ac_ext conftest.$ac_objext -+rm -f conftest.$ac_ext - CC=$ac_save_CC - - fi -- --case "x$ac_cv_prog_cc_stdc" in -- x|xno) -- echo "$as_me:$LINENO: result: none needed" >&5 --echo "${ECHO_T}none needed" >&6 ;; -+# AC_CACHE_VAL -+case "x$ac_cv_prog_cc_c89" in -+ x) -+ { $as_echo "$as_me:$LINENO: result: none needed" >&5 -+$as_echo "none needed" >&6; } ;; -+ xno) -+ { $as_echo "$as_me:$LINENO: result: unsupported" >&5 -+$as_echo "unsupported" >&6; } ;; - *) -- echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 --echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 -- CC="$CC $ac_cv_prog_cc_stdc" ;; -+ CC="$CC $ac_cv_prog_cc_c89" -+ { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; - esac - --# Some people use a C++ compiler to compile C. Since we use `exit', --# in C++ we need to declare it. In case someone uses the same compiler --# for both compiling C and C++ we need to have the C++ compiler decide --# the declaration of exit, since it's the most demanding environment. --cat >conftest.$ac_ext <<_ACEOF --#ifndef __cplusplus -- choke me --#endif --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- for ac_declaration in \ -- '' \ -- 'extern "C" void std::exit (int) throw (); using std::exit;' \ -- 'extern "C" void std::exit (int); using std::exit;' \ -- 'extern "C" void exit (int) throw ();' \ -- 'extern "C" void exit (int);' \ -- 'void exit (int);' --do -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_declaration --#include --int --main () --{ --exit (42); -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- : --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 - --continue --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_declaration --int --main () --{ --exit (42); -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- break --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --done --rm -f conftest* --if test -n "$ac_declaration"; then -- echo '#ifdef __cplusplus' >>confdefs.h -- echo $ac_declaration >>confdefs.h -- echo '#endif' >>confdefs.h --fi -- --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' - ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -@@ -2926,7 +3489,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ - ac_compiler_gnu=$ac_cv_c_compiler_gnu - DEPDIR="${am__leading_dot}deps" - -- ac_config_commands="$ac_config_commands depfiles" -+ac_config_commands="$ac_config_commands depfiles" - - - am_make=${MAKE-make} -@@ -2936,8 +3499,8 @@ am__doit: - .PHONY: am__doit - END - # If we don't find an include directive, just comment out the code. --echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 --echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -@@ -2964,15 +3527,15 @@ if test "$am__include" = "#"; then - fi - - --echo "$as_me:$LINENO: result: $_am_result" >&5 --echo "${ECHO_T}$_am_result" >&6 -+{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 -+$as_echo "$_am_result" >&6; } - rm -f confinc confmf - --# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. -+# Check whether --enable-dependency-tracking was given. - if test "${enable_dependency_tracking+set}" = set; then -- enableval="$enable_dependency_tracking" -+ enableval=$enable_dependency_tracking; -+fi - --fi; - if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -@@ -2992,10 +3555,10 @@ fi - - depcc="$CC" am_compiler_list= - --echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 --echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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 -@@ -3082,8 +3645,8 @@ else - fi - - fi --echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 --echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 -+{ $as_echo "$as_me:$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 - - -@@ -3100,16 +3663,16 @@ fi - - - if test "x$CC" != xcc; then -- echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 --echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 -+$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } - else -- echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 --echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 -+$as_echo_n "checking whether cc understands -c and -o together... " >&6; } - fi --set dummy $CC; ac_cc=`echo $2 | -+set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` --if eval "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\" = set"; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -3129,37 +3692,64 @@ _ACEOF - # Make sure it works both with $CC and with simple cc. - # We do the test twice because some compilers refuse to overwrite an - # existing .o file with -o, though they will create one. --ac_try='$CC -c conftest.$ac_ext -o conftest.$ac_objext >&5' --if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -+rm -f conftest2.* -+if { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && -- test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ test -f conftest2.$ac_objext && { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; - then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then -- ac_try='cc -c conftest.$ac_ext -o conftest.$ac_objext >&5' -- if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -+ rm -f conftest2.* -+ if { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && -- test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ test -f conftest2.$ac_objext && { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; - then - # cc works too. -@@ -3173,15 +3763,15 @@ then - else - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi --rm -f conftest* -+rm -f core conftest* - - fi --if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then -- echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - - cat >>confdefs.h <<\_ACEOF - #define NO_MINUS_C_MINUS_O 1 -@@ -3206,10 +3796,10 @@ fi - 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_RANLIB+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -@@ -3220,34 +3810,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $RANLIB" >&5 --echo "${ECHO_T}$RANLIB" >&6 -+ { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 -+$as_echo "$RANLIB" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -3258,116 +3850,41 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - -- test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" - fi - fi - ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB - if test -n "$ac_ct_RANLIB"; then -- echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 --echo "${ECHO_T}$ac_ct_RANLIB" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -+$as_echo "$ac_ct_RANLIB" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -- RANLIB=$ac_ct_RANLIB --else -- RANLIB="$ac_cv_prog_RANLIB" --fi -- -- -- --cat >>confdefs.h <<\_ACEOF --#define _GNU_SOURCE 1 --_ACEOF -- -- --# 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. --echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 --echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 --if test -z "$INSTALL"; then --if test "${ac_cv_path_install+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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 -- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" -- break 3 -- fi -- fi -- done -- done -- ;; --esac --done -- -- --fi -- if test "${ac_cv_path_install+set}" = set; then -- INSTALL=$ac_cv_path_install -+ if test "x$ac_ct_RANLIB" = x; then -+ RANLIB=":" - else -- # As a last resort, use the slow shell script. We don't cache a -- # path for INSTALL within a source directory, because that will -- # break other packages using the cache if that directory is -- # removed, or if the path is relative. -- INSTALL=$ac_install_sh -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 --echo "$as_me:$LINENO: result: $INSTALL" >&5 --echo "${ECHO_T}$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' - - - ac_ext=c -@@ -3375,15 +3892,15 @@ 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 --echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 --echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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" -@@ -3410,35 +3927,35 @@ cat >>conftest.$ac_ext <<_ACEOF - #endif - Syntax error - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_c_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then - : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. - continue - fi -+ - rm -f conftest.err conftest.$ac_ext - -- # OK, works on sane cases. Now check whether non-existent headers -+ # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -3448,34 +3965,34 @@ cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_c_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then - # Broken: success on invalid input. - continue - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. - ac_preproc_ok=: - break - fi -+ - rm -f conftest.err conftest.$ac_ext - - done -@@ -3493,8 +4010,8 @@ fi - else - ac_cv_prog_CPP=$CPP - fi --echo "$as_me:$LINENO: result: $CPP" >&5 --echo "${ECHO_T}$CPP" >&6 -+{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 -+$as_echo "$CPP" >&6; } - ac_preproc_ok=false - for ac_c_preproc_warn_flag in '' yes - do -@@ -3517,35 +4034,35 @@ cat >>conftest.$ac_ext <<_ACEOF - #endif - Syntax error - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_c_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then - : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. - continue - fi -+ - rm -f conftest.err conftest.$ac_ext - -- # OK, works on sane cases. Now check whether non-existent headers -+ # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -3555,34 +4072,34 @@ cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_c_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then - # Broken: success on invalid input. - continue - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. - ac_preproc_ok=: - break - fi -+ - rm -f conftest.err conftest.$ac_ext - - done -@@ -3591,11 +4108,13 @@ rm -f conftest.err conftest.$ac_ext - if $ac_preproc_ok; then - : - else -- { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check - See \`config.log' for more details." >&5 --echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -+$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - - ac_ext=c -@@ -3605,26 +4124,723 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ - ac_compiler_gnu=$ac_cv_c_compiler_gnu - - --echo "$as_me:$LINENO: checking for egrep" >&5 --echo $ECHO_N "checking for egrep... $ECHO_C" >&6 --if test "${ac_cv_prog_egrep+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- if echo a | (grep -E '(a|b)') >/dev/null 2>&1 -- then ac_cv_prog_egrep='grep -E' -- else ac_cv_prog_egrep='egrep' -+{ $as_echo "$as_me:$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 -+ ac_count=`expr $ac_count + 1` -+ 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -+$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+else -+ ac_cv_path_GREP=$GREP -+fi -+ -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -+$as_echo "$ac_cv_path_GREP" >&6; } -+ GREP="$ac_cv_path_GREP" -+ -+ -+{ $as_echo "$as_me:$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 -+ ac_count=`expr $ac_count + 1` -+ 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -+$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} -+ { (exit 1); exit 1; }; } -+ fi -+else -+ ac_cv_path_EGREP=$EGREP -+fi -+ -+ fi -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -+$as_echo "$ac_cv_path_EGREP" >&6; } -+ EGREP="$ac_cv_path_EGREP" -+ -+ -+{ $as_echo "$as_me:$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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+#include -+#include -+#include -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_header_stdc=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ 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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* 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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* 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 >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* 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 -+rm -f 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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ : -+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 -+ -+( exit $ac_status ) -+ac_cv_header_stdc=no -+fi -+rm -rf conftest.dSYM -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+ -+ - fi --echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 --echo "${ECHO_T}$ac_cv_prog_egrep" >&6 -- EGREP=$ac_cv_prog_egrep -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -+$as_echo "$ac_cv_header_stdc" >&6; } -+if test $ac_cv_header_stdc = yes; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define STDC_HEADERS 1 -+_ACEOF -+ -+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` -+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -+$as_echo_n "checking for $ac_header... " >&6; } -+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -+ $as_echo_n "(cached) " >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+ -+#include <$ac_header> -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ eval "$as_ac_Header=yes" -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ eval "$as_ac_Header=no" -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ac_res=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -+$as_echo "$ac_res" >&6; } -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+ -+done -+ -+ -+ -+ if test "${ac_cv_header_minix_config_h+set}" = set; then -+ { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 -+$as_echo_n "checking for minix/config.h... " >&6; } -+if test "${ac_cv_header_minix_config_h+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -+$as_echo "$ac_cv_header_minix_config_h" >&6; } -+else -+ # Is the header compilable? -+{ $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 -+$as_echo_n "checking minix/config.h usability... " >&6; } -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+#include -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_header_compiler=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_header_compiler=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -+$as_echo "$ac_header_compiler" >&6; } -+ -+# Is the header present? -+{ $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 -+$as_echo_n "checking minix/config.h presence... " >&6; } -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then -+ ac_header_preproc=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_header_preproc=no -+fi -+ -+rm -f conftest.err conftest.$ac_ext -+{ $as_echo "$as_me:$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:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} -+ ac_header_preproc=yes -+ ;; -+ no:yes:* ) -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 -+$as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} -+ ( cat <<\_ASBOX -+## ------------------------------------- ## -+## Report this to eddie.wai@broadcom.com ## -+## ------------------------------------- ## -+_ASBOX -+ ) | sed "s/^/$as_me: WARNING: /" >&2 -+ ;; -+esac -+{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 -+$as_echo_n "checking for minix/config.h... " >&6; } -+if test "${ac_cv_header_minix_config_h+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+else -+ ac_cv_header_minix_config_h=$ac_header_preproc -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -+$as_echo "$ac_cv_header_minix_config_h" >&6; } -+ -+fi -+if test "x$ac_cv_header_minix_config_h" = x""yes; then -+ MINIX=yes -+else -+ MINIX= -+fi -+ -+ -+ if test "$MINIX" = yes; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define _POSIX_SOURCE 1 -+_ACEOF -+ -+ -+cat >>confdefs.h <<\_ACEOF -+#define _POSIX_1_SOURCE 2 -+_ACEOF -+ -+ -+cat >>confdefs.h <<\_ACEOF -+#define _MINIX 1 -+_ACEOF -+ -+ fi -+ -+ -+ -+ { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 -+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -+if test "${ac_cv_safe_to_define___extensions__+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+# define __EXTENSIONS__ 1 -+ $ac_includes_default -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_safe_to_define___extensions__=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cv_safe_to_define___extensions__=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 -+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } -+ test $ac_cv_safe_to_define___extensions__ = yes && -+ cat >>confdefs.h <<\_ACEOF -+#define __EXTENSIONS__ 1 -+_ACEOF -+ -+ cat >>confdefs.h <<\_ACEOF -+#define _ALL_SOURCE 1 -+_ACEOF -+ -+ cat >>confdefs.h <<\_ACEOF -+#define _GNU_SOURCE 1 -+_ACEOF -+ -+ cat >>confdefs.h <<\_ACEOF -+#define _POSIX_PTHREAD_SEMANTICS 1 -+_ACEOF -+ -+ cat >>confdefs.h <<\_ACEOF -+#define _TANDEM_SOURCE 1 -+_ACEOF -+ -+ -+# 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:$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:$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' - - if test $ac_cv_c_compiler_gnu = yes; then -- echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 --echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 -+$as_echo_n "checking whether $CC needs -traditional... " >&6; } - if test "${ac_cv_prog_gcc_traditional+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_pattern="Autoconf.*'x'" - cat >conftest.$ac_ext <<_ACEOF -@@ -3663,8 +4879,8 @@ rm -f conftest* - - fi - fi --echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 --echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 -+$as_echo "$ac_cv_prog_gcc_traditional" >&6; } - if test $ac_cv_prog_gcc_traditional = yes; then - CC="$CC -traditional" - fi -@@ -3672,10 +4888,10 @@ fi - - - # Checks for typedefs, structures, and compiler characteristics. --echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 --echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -+$as_echo_n "checking for an ANSI C-conforming const... " >&6; } - if test "${ac_cv_c_const+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -3691,10 +4907,10 @@ main () - #ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; -- const charset x; -+ const charset cs; - /* SunOS 4.1.1 cc rejects this. */ -- char const *const *ccp; -- char **p; -+ char const *const *pcpcc; -+ char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; -@@ -3703,16 +4919,17 @@ main () - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; -- ccp = &g + (g ? g-g : 0); -+ pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ -- ++ccp; -- p = (char**) ccp; -- ccp = (char const *const *) p; -+ ++pcpcc; -+ ppc = (char**) pcpcc; -+ pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; -+ if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; -@@ -3731,7 +4948,9 @@ main () - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -+ if (!foo) return 0; - } -+ return !cs[0] && !zero.x; - #endif - - ; -@@ -3739,50 +4958,47 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_cv_c_const=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_c_const=no -+ ac_cv_c_const=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 --echo "${ECHO_T}$ac_cv_c_const" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -+$as_echo "$ac_cv_c_const" >&6; } - if test $ac_cv_c_const = no; then - - cat >>confdefs.h <<\_ACEOF --#define const -+#define const /**/ - _ACEOF - - fi - --echo "$as_me:$LINENO: checking for inline" >&5 --echo $ECHO_N "checking for inline... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for inline" >&5 -+$as_echo_n "checking for inline... " >&6; } - if test "${ac_cv_c_inline+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_cv_c_inline=no - for ac_kw in inline __inline__ __inline; do -@@ -3800,39 +5016,38 @@ $ac_kw foo_t foo () {return 0; } - - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_c_inline=$ac_kw; break -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_c_inline=$ac_kw - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ test "$ac_cv_c_inline" != no && break - done - - fi --echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 --echo "${ECHO_T}$ac_cv_c_inline" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 -+$as_echo "$ac_cv_c_inline" >&6; } - - - case $ac_cv_c_inline in -@@ -3850,250 +5065,13 @@ _ACEOF - ;; - esac - --echo "$as_me:$LINENO: checking for ANSI C header files" >&5 --echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 --if test "${ac_cv_header_stdc+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --#include --#include --#include --#include -- --int --main () --{ -- -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_header_stdc=yes --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --ac_cv_header_stdc=no --fi --rm -f 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 >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* 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 >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* 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 >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --#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)) -- exit(2); -- exit (0); --} --_ACEOF --rm -f conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- : --else -- echo "$as_me: program exited with status $ac_status" >&5 --echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --( exit $ac_status ) --ac_cv_header_stdc=no --fi --rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext --fi --fi --fi --echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 --echo "${ECHO_T}$ac_cv_header_stdc" >&6 --if test $ac_cv_header_stdc = yes; then -- --cat >>confdefs.h <<\_ACEOF --#define STDC_HEADERS 1 --_ACEOF -- --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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` --echo "$as_me:$LINENO: checking for $ac_header" >&5 --echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 --if eval "test \"\${$as_ac_Header+set}\" = set"; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_includes_default -- --#include <$ac_header> --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- eval "$as_ac_Header=yes" --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --eval "$as_ac_Header=no" --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --fi --echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 --echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 --if test `eval echo '${'$as_ac_Header'}'` = yes; then -- cat >>confdefs.h <<_ACEOF --#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 --_ACEOF -- --fi -- --done -- -- --echo "$as_me:$LINENO: checking for off_t" >&5 --echo $ECHO_N "checking for off_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for off_t" >&5 -+$as_echo_n "checking for off_t... " >&6; } - if test "${ac_cv_type_off_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_off_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4103,63 +5081,101 @@ $ac_includes_default - int - main () - { --if ((off_t *) 0) -- return 0; - if (sizeof (off_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((off_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_off_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_off_t=no -+ ac_cv_type_off_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 --echo "${ECHO_T}$ac_cv_type_off_t" >&6 --if test $ac_cv_type_off_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 -+$as_echo "$ac_cv_type_off_t" >&6; } -+if test "x$ac_cv_type_off_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF --#define off_t long -+#define off_t long int - _ACEOF - - fi - --echo "$as_me:$LINENO: checking for size_t" >&5 --echo $ECHO_N "checking for size_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 -+$as_echo_n "checking for size_t... " >&6; } - if test "${ac_cv_type_size_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_size_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4169,63 +5185,101 @@ $ac_includes_default - int - main () - { --if ((size_t *) 0) -- return 0; - if (sizeof (size_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((size_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_size_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_size_t=no -+ ac_cv_type_size_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 --echo "${ECHO_T}$ac_cv_type_size_t" >&6 --if test $ac_cv_type_size_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -+$as_echo "$ac_cv_type_size_t" >&6; } -+if test "x$ac_cv_type_size_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF --#define size_t unsigned -+#define size_t unsigned int - _ACEOF - - fi - --echo "$as_me:$LINENO: checking for int8_t" >&5 --echo $ECHO_N "checking for int8_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for int8_t" >&5 -+$as_echo_n "checking for int8_t... " >&6; } - if test "${ac_cv_type_int8_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_int8_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4235,48 +5289,85 @@ $ac_includes_default - int - main () - { --if ((int8_t *) 0) -- return 0; - if (sizeof (int8_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((int8_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_int8_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_int8_t=no -+ ac_cv_type_int8_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 --echo "${ECHO_T}$ac_cv_type_int8_t" >&6 --if test $ac_cv_type_int8_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -+$as_echo "$ac_cv_type_int8_t" >&6; } -+if test "x$ac_cv_type_int8_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_INT8_T 1 -@@ -4285,12 +5376,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for uint8_t" >&5 --echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for uint8_t" >&5 -+$as_echo_n "checking for uint8_t... " >&6; } - if test "${ac_cv_type_uint8_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_uint8_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4300,48 +5392,85 @@ $ac_includes_default - int - main () - { --if ((uint8_t *) 0) -- return 0; - if (sizeof (uint8_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((uint8_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_uint8_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_uint8_t=no -+ ac_cv_type_uint8_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 --echo "${ECHO_T}$ac_cv_type_uint8_t" >&6 --if test $ac_cv_type_uint8_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 -+$as_echo "$ac_cv_type_uint8_t" >&6; } -+if test "x$ac_cv_type_uint8_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_UINT8_T 1 -@@ -4350,12 +5479,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for int16_t" >&5 --echo $ECHO_N "checking for int16_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for int16_t" >&5 -+$as_echo_n "checking for int16_t... " >&6; } - if test "${ac_cv_type_int16_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_int16_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4365,48 +5495,85 @@ $ac_includes_default - int - main () - { --if ((int16_t *) 0) -- return 0; - if (sizeof (int16_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((int16_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_int16_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_int16_t=no -+ ac_cv_type_int16_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 --echo "${ECHO_T}$ac_cv_type_int16_t" >&6 --if test $ac_cv_type_int16_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -+$as_echo "$ac_cv_type_int16_t" >&6; } -+if test "x$ac_cv_type_int16_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_INT16_T 1 -@@ -4415,12 +5582,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for uint16_t" >&5 --echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for uint16_t" >&5 -+$as_echo_n "checking for uint16_t... " >&6; } - if test "${ac_cv_type_uint16_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_uint16_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4430,48 +5598,85 @@ $ac_includes_default - int - main () - { --if ((uint16_t *) 0) -- return 0; - if (sizeof (uint16_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((uint16_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_uint16_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_uint16_t=no -+ ac_cv_type_uint16_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 --echo "${ECHO_T}$ac_cv_type_uint16_t" >&6 --if test $ac_cv_type_uint16_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 -+$as_echo "$ac_cv_type_uint16_t" >&6; } -+if test "x$ac_cv_type_uint16_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_UINT16_T 1 -@@ -4480,12 +5685,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for int32_t" >&5 --echo $ECHO_N "checking for int32_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for int32_t" >&5 -+$as_echo_n "checking for int32_t... " >&6; } - if test "${ac_cv_type_int32_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_int32_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4495,48 +5701,85 @@ $ac_includes_default - int - main () - { --if ((int32_t *) 0) -- return 0; - if (sizeof (int32_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((int32_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_int32_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_int32_t=no -+ ac_cv_type_int32_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 --echo "${ECHO_T}$ac_cv_type_int32_t" >&6 --if test $ac_cv_type_int32_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -+$as_echo "$ac_cv_type_int32_t" >&6; } -+if test "x$ac_cv_type_int32_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_INT32_T 1 -@@ -4545,12 +5788,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for uint32_t" >&5 --echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 -+$as_echo_n "checking for uint32_t... " >&6; } - if test "${ac_cv_type_uint32_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_uint32_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4560,48 +5804,85 @@ $ac_includes_default - int - main () - { --if ((uint32_t *) 0) -- return 0; - if (sizeof (uint32_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((uint32_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_uint32_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_uint32_t=no -+ ac_cv_type_uint32_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 --echo "${ECHO_T}$ac_cv_type_uint32_t" >&6 --if test $ac_cv_type_uint32_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 -+$as_echo "$ac_cv_type_uint32_t" >&6; } -+if test "x$ac_cv_type_uint32_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_UINT32_T 1 -@@ -4610,12 +5891,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for int64_t" >&5 --echo $ECHO_N "checking for int64_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for int64_t" >&5 -+$as_echo_n "checking for int64_t... " >&6; } - if test "${ac_cv_type_int64_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_int64_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4625,48 +5907,85 @@ $ac_includes_default - int - main () - { --if ((int64_t *) 0) -- return 0; - if (sizeof (int64_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((int64_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_int64_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_int64_t=no -+ ac_cv_type_int64_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5 --echo "${ECHO_T}$ac_cv_type_int64_t" >&6 --if test $ac_cv_type_int64_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_int64_t" >&5 -+$as_echo "$ac_cv_type_int64_t" >&6; } -+if test "x$ac_cv_type_int64_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_INT64_T 1 -@@ -4675,12 +5994,13 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for uint64_t" >&5 --echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 -+$as_echo_n "checking for uint64_t... " >&6; } - if test "${ac_cv_type_uint64_t+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_type_uint64_t=no -+cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4690,48 +6010,85 @@ $ac_includes_default - int - main () - { --if ((uint64_t *) 0) -- return 0; - if (sizeof (uint64_t)) -- return 0; -+ return 0; - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+$ac_includes_default -+int -+main () -+{ -+if (sizeof ((uint64_t))) -+ return 0; -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_uint64_t=yes -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_type_uint64_t=no -+ ac_cv_type_uint64_t=yes - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5 --echo "${ECHO_T}$ac_cv_type_uint64_t" >&6 --if test $ac_cv_type_uint64_t = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5 -+$as_echo "$ac_cv_type_uint64_t" >&6; } -+if test "x$ac_cv_type_uint64_t" = x""yes; then - - cat >>confdefs.h <<_ACEOF - #define HAVE_UINT64_T 1 -@@ -4740,73 +6097,15 @@ _ACEOF - - fi - --echo "$as_me:$LINENO: checking for short" >&5 --echo $ECHO_N "checking for short... $ECHO_C" >&6 --if test "${ac_cv_type_short+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_includes_default --int --main () --{ --if ((short *) 0) -- return 0; --if (sizeof (short)) -- return 0; -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_short=yes --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --ac_cv_type_short=no --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --fi --echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 --echo "${ECHO_T}$ac_cv_type_short" >&6 -- --echo "$as_me:$LINENO: checking size of short" >&5 --echo $ECHO_N "checking size of short... $ECHO_C" >&6 -+# The cast to long int works around a bug in the HP C Compiler -+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -+# This bug is HP SR number 8606223364. -+{ $as_echo "$as_me:$LINENO: checking size of short" >&5 -+$as_echo_n "checking size of short... " >&6; } - if test "${ac_cv_sizeof_short+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- if test "$ac_cv_type_short" = yes; then -- # The cast to unsigned long works around a bug in the HP C Compiler -- # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -- # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -- # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. - cat >conftest.$ac_ext <<_ACEOF -@@ -4819,7 +6118,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (short))) >= 0)]; - test_array [0] = 0 - - ; -@@ -4827,27 +6126,23 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -@@ -4860,7 +6155,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (short))) <= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -4868,46 +6163,43 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo=`expr $ac_mid + 1` -- if test $ac_lo -le $ac_mid; then -- ac_lo= ac_hi= -- break -- fi -- ac_mid=`expr 2 '*' $ac_mid + 1` -+ ac_lo=`expr $ac_mid + 1` -+ if test $ac_lo -le $ac_mid; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid + 1` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --cat >conftest.$ac_ext <<_ACEOF -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -4917,7 +6209,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (short))) < 0)]; - test_array [0] = 0 - - ; -@@ -4925,27 +6217,23 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -@@ -4958,7 +6246,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (short))) >= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -4966,50 +6254,49 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_hi=`expr '(' $ac_mid ')' - 1` -- if test $ac_mid -le $ac_hi; then -- ac_lo= ac_hi= -- break -- fi -- ac_mid=`expr 2 '*' $ac_mid` -+ ac_hi=`expr '(' $ac_mid ')' - 1` -+ if test $ac_mid -le $ac_hi; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo= ac_hi= -+ ac_lo= ac_hi= - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # Binary search between lo and hi bounds. - while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` -@@ -5023,7 +6310,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (short))) <= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5031,52 +6318,48 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo=`expr '(' $ac_mid ')' + 1` -+ ac_lo=`expr '(' $ac_mid ')' + 1` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - case $ac_lo in - ?*) ac_cv_sizeof_short=$ac_lo;; --'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -+'') if test "$ac_cv_type_short" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (short) - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute sizeof (short), 77 -+$as_echo "$as_me: error: cannot compute sizeof (short) - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } ;; -+ { (exit 77); exit 77; }; }; } -+ else -+ ac_cv_sizeof_short=0 -+ fi ;; - esac - else -- if test "$cross_compiling" = yes; then -- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling --See \`config.log' for more details." >&5 --echo "$as_me: error: cannot run test program while cross compiling --See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } --else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -5084,8 +6367,8 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - $ac_includes_default --long longval () { return (long) (sizeof (short)); } --unsigned long ulongval () { return (long) (sizeof (short)); } -+static long int longval () { return (long int) (sizeof (short)); } -+static unsigned long int ulongval () { return (long int) (sizeof (short)); } - #include - #include - int -@@ -5094,133 +6377,94 @@ main () - - FILE *f = fopen ("conftest.val", "w"); - if (! f) -- exit (1); -- if (((long) (sizeof (short))) < 0) -+ return 1; -+ if (((long int) (sizeof (short))) < 0) - { -- long i = longval (); -- if (i != ((long) (sizeof (short)))) -- exit (1); -- fprintf (f, "%ld\n", i); -+ long int i = longval (); -+ if (i != ((long int) (sizeof (short)))) -+ return 1; -+ fprintf (f, "%ld", i); - } - else - { -- unsigned long i = ulongval (); -- if (i != ((long) (sizeof (short)))) -- exit (1); -- fprintf (f, "%lu\n", i); -+ unsigned long int i = ulongval (); -+ if (i != ((long int) (sizeof (short)))) -+ return 1; -+ fprintf (f, "%lu", i); - } -- exit (ferror (f) || fclose (f) != 0); -+ /* Do not output a trailing newline, as this causes \r\n confusion -+ on some platforms. */ -+ return ferror (f) || fclose (f) != 0; - - ; - return 0; - } - _ACEOF - rm -f conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>&5 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` - else -- echo "$as_me: program exited with status $ac_status" >&5 --echo "$as_me: failed program was:" >&5 -+ $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 - - ( exit $ac_status ) --{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -+if test "$ac_cv_type_short" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (short) - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute sizeof (short), 77 -+$as_echo "$as_me: error: cannot compute sizeof (short) - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } --fi --rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+ { (exit 77); exit 77; }; }; } -+ else -+ ac_cv_sizeof_short=0 -+ fi - fi -+rm -rf conftest.dSYM -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext - fi - rm -f conftest.val --else -- ac_cv_sizeof_short=0 - fi --fi --echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 --echo "${ECHO_T}$ac_cv_sizeof_short" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -+$as_echo "$ac_cv_sizeof_short" >&6; } -+ -+ -+ - cat >>confdefs.h <<_ACEOF - #define SIZEOF_SHORT $ac_cv_sizeof_short - _ACEOF - - --echo "$as_me:$LINENO: checking for int" >&5 --echo $ECHO_N "checking for int... $ECHO_C" >&6 --if test "${ac_cv_type_int+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_includes_default --int --main () --{ --if ((int *) 0) -- return 0; --if (sizeof (int)) -- return 0; -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_int=yes --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --ac_cv_type_int=no --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --fi --echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 --echo "${ECHO_T}$ac_cv_type_int" >&6 -- --echo "$as_me:$LINENO: checking size of int" >&5 --echo $ECHO_N "checking size of int... $ECHO_C" >&6 -+# The cast to long int works around a bug in the HP C Compiler -+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -+# This bug is HP SR number 8606223364. -+{ $as_echo "$as_me:$LINENO: checking size of int" >&5 -+$as_echo_n "checking size of int... " >&6; } - if test "${ac_cv_sizeof_int+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- if test "$ac_cv_type_int" = yes; then -- # The cast to unsigned long works around a bug in the HP C Compiler -- # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -- # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -- # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. - cat >conftest.$ac_ext <<_ACEOF -@@ -5233,7 +6477,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= 0)]; - test_array [0] = 0 - - ; -@@ -5241,27 +6485,23 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -@@ -5274,7 +6514,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5282,46 +6522,43 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo=`expr $ac_mid + 1` -- if test $ac_lo -le $ac_mid; then -- ac_lo= ac_hi= -- break -- fi -- ac_mid=`expr 2 '*' $ac_mid + 1` -+ ac_lo=`expr $ac_mid + 1` -+ if test $ac_lo -le $ac_mid; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid + 1` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --cat >conftest.$ac_ext <<_ACEOF -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -5331,7 +6568,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (int))) < 0)]; - test_array [0] = 0 - - ; -@@ -5339,27 +6576,23 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -@@ -5372,7 +6605,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5380,50 +6613,49 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_hi=`expr '(' $ac_mid ')' - 1` -- if test $ac_mid -le $ac_hi; then -- ac_lo= ac_hi= -- break -- fi -- ac_mid=`expr 2 '*' $ac_mid` -+ ac_hi=`expr '(' $ac_mid ')' - 1` -+ if test $ac_mid -le $ac_hi; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo= ac_hi= -+ ac_lo= ac_hi= - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # Binary search between lo and hi bounds. - while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` -@@ -5437,7 +6669,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5445,52 +6677,48 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo=`expr '(' $ac_mid ')' + 1` -+ ac_lo=`expr '(' $ac_mid ')' + 1` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - case $ac_lo in - ?*) ac_cv_sizeof_int=$ac_lo;; --'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -+'') if test "$ac_cv_type_int" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute sizeof (int), 77 -+$as_echo "$as_me: error: cannot compute sizeof (int) - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } ;; -+ { (exit 77); exit 77; }; }; } -+ else -+ ac_cv_sizeof_int=0 -+ fi ;; - esac - else -- if test "$cross_compiling" = yes; then -- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling --See \`config.log' for more details." >&5 --echo "$as_me: error: cannot run test program while cross compiling --See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } --else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -5498,8 +6726,8 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - $ac_includes_default --long longval () { return (long) (sizeof (int)); } --unsigned long ulongval () { return (long) (sizeof (int)); } -+static long int longval () { return (long int) (sizeof (int)); } -+static unsigned long int ulongval () { return (long int) (sizeof (int)); } - #include - #include - int -@@ -5508,133 +6736,94 @@ main () - - FILE *f = fopen ("conftest.val", "w"); - if (! f) -- exit (1); -- if (((long) (sizeof (int))) < 0) -+ return 1; -+ if (((long int) (sizeof (int))) < 0) - { -- long i = longval (); -- if (i != ((long) (sizeof (int)))) -- exit (1); -- fprintf (f, "%ld\n", i); -+ long int i = longval (); -+ if (i != ((long int) (sizeof (int)))) -+ return 1; -+ fprintf (f, "%ld", i); - } - else - { -- unsigned long i = ulongval (); -- if (i != ((long) (sizeof (int)))) -- exit (1); -- fprintf (f, "%lu\n", i); -+ unsigned long int i = ulongval (); -+ if (i != ((long int) (sizeof (int)))) -+ return 1; -+ fprintf (f, "%lu", i); - } -- exit (ferror (f) || fclose (f) != 0); -+ /* Do not output a trailing newline, as this causes \r\n confusion -+ on some platforms. */ -+ return ferror (f) || fclose (f) != 0; - - ; - return 0; - } - _ACEOF - rm -f conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>&5 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` - else -- echo "$as_me: program exited with status $ac_status" >&5 --echo "$as_me: failed program was:" >&5 -+ $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 - - ( exit $ac_status ) --{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -+if test "$ac_cv_type_int" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute sizeof (int), 77 -+$as_echo "$as_me: error: cannot compute sizeof (int) - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } --fi --rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+ { (exit 77); exit 77; }; }; } -+ else -+ ac_cv_sizeof_int=0 -+ fi - fi -+rm -rf conftest.dSYM -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext - fi - rm -f conftest.val --else -- ac_cv_sizeof_int=0 - fi --fi --echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 --echo "${ECHO_T}$ac_cv_sizeof_int" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -+$as_echo "$ac_cv_sizeof_int" >&6; } -+ -+ -+ - cat >>confdefs.h <<_ACEOF - #define SIZEOF_INT $ac_cv_sizeof_int - _ACEOF - - --echo "$as_me:$LINENO: checking for long" >&5 --echo $ECHO_N "checking for long... $ECHO_C" >&6 --if test "${ac_cv_type_long+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 --else -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_includes_default --int --main () --{ --if ((long *) 0) -- return 0; --if (sizeof (long)) -- return 0; -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- ac_cv_type_long=yes --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --ac_cv_type_long=no --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --fi --echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 --echo "${ECHO_T}$ac_cv_type_long" >&6 -- --echo "$as_me:$LINENO: checking size of long" >&5 --echo $ECHO_N "checking size of long... $ECHO_C" >&6 -+# The cast to long int works around a bug in the HP C Compiler -+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -+# This bug is HP SR number 8606223364. -+{ $as_echo "$as_me:$LINENO: checking size of long" >&5 -+$as_echo_n "checking size of long... " >&6; } - if test "${ac_cv_sizeof_long+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- if test "$ac_cv_type_long" = yes; then -- # The cast to unsigned long works around a bug in the HP C Compiler -- # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -- # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -- # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. - cat >conftest.$ac_ext <<_ACEOF -@@ -5647,7 +6836,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= 0)]; - test_array [0] = 0 - - ; -@@ -5655,27 +6844,23 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -@@ -5688,7 +6873,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5696,46 +6881,43 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo=`expr $ac_mid + 1` -- if test $ac_lo -le $ac_mid; then -- ac_lo= ac_hi= -- break -- fi -- ac_mid=`expr 2 '*' $ac_mid + 1` -+ ac_lo=`expr $ac_mid + 1` -+ if test $ac_lo -le $ac_mid; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid + 1` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --cat >conftest.$ac_ext <<_ACEOF -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -5745,7 +6927,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (long))) < 0)]; - test_array [0] = 0 - - ; -@@ -5753,27 +6935,23 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -@@ -5786,7 +6964,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5794,50 +6972,49 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_hi=`expr '(' $ac_mid ')' - 1` -- if test $ac_mid -le $ac_hi; then -- ac_lo= ac_hi= -- break -- fi -- ac_mid=`expr 2 '*' $ac_mid` -+ ac_hi=`expr '(' $ac_mid ')' - 1` -+ if test $ac_mid -le $ac_hi; then -+ ac_lo= ac_hi= -+ break -+ fi -+ ac_mid=`expr 2 '*' $ac_mid` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo= ac_hi= -+ ac_lo= ac_hi= - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # Binary search between lo and hi bounds. - while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` -@@ -5851,7 +7028,7 @@ $ac_includes_default - int - main () - { --static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -+static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; - test_array [0] = 0 - - ; -@@ -5859,52 +7036,48 @@ test_array [0] = 0 - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_lo=`expr '(' $ac_mid ')' + 1` -+ ac_lo=`expr '(' $ac_mid ')' + 1` - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - case $ac_lo in - ?*) ac_cv_sizeof_long=$ac_lo;; --'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -+'') if test "$ac_cv_type_long" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute sizeof (long), 77 -+$as_echo "$as_me: error: cannot compute sizeof (long) - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } ;; -+ { (exit 77); exit 77; }; }; } -+ else -+ ac_cv_sizeof_long=0 -+ fi ;; - esac - else -- if test "$cross_compiling" = yes; then -- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling --See \`config.log' for more details." >&5 --echo "$as_me: error: cannot run test program while cross compiling --See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } --else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -5912,8 +7085,8 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - $ac_includes_default --long longval () { return (long) (sizeof (long)); } --unsigned long ulongval () { return (long) (sizeof (long)); } -+static long int longval () { return (long int) (sizeof (long)); } -+static unsigned long int ulongval () { return (long int) (sizeof (long)); } - #include - #include - int -@@ -5922,233 +7095,404 @@ main () - - FILE *f = fopen ("conftest.val", "w"); - if (! f) -- exit (1); -- if (((long) (sizeof (long))) < 0) -+ return 1; -+ if (((long int) (sizeof (long))) < 0) - { -- long i = longval (); -- if (i != ((long) (sizeof (long)))) -- exit (1); -- fprintf (f, "%ld\n", i); -+ long int i = longval (); -+ if (i != ((long int) (sizeof (long)))) -+ return 1; -+ fprintf (f, "%ld", i); - } - else - { -- unsigned long i = ulongval (); -- if (i != ((long) (sizeof (long)))) -- exit (1); -- fprintf (f, "%lu\n", i); -+ unsigned long int i = ulongval (); -+ if (i != ((long int) (sizeof (long)))) -+ return 1; -+ fprintf (f, "%lu", i); - } -- exit (ferror (f) || fclose (f) != 0); -+ /* Do not output a trailing newline, as this causes \r\n confusion -+ on some platforms. */ -+ return ferror (f) || fclose (f) != 0; - - ; - return 0; - } - _ACEOF - rm -f conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>&5 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` - else -- echo "$as_me: program exited with status $ac_status" >&5 --echo "$as_me: failed program was:" >&5 -+ $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 - - ( exit $ac_status ) --{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -+if test "$ac_cv_type_long" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) - See \`config.log' for more details." >&5 --echo "$as_me: error: cannot compute sizeof (long), 77 -+$as_echo "$as_me: error: cannot compute sizeof (long) - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } --fi --rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+ { (exit 77); exit 77; }; }; } -+ else -+ ac_cv_sizeof_long=0 -+ fi - fi -+rm -rf conftest.dSYM -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext - fi - rm -f conftest.val --else -- ac_cv_sizeof_long=0 - fi --fi --echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 --echo "${ECHO_T}$ac_cv_sizeof_long" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -+$as_echo "$ac_cv_sizeof_long" >&6; } -+ -+ -+ - cat >>confdefs.h <<_ACEOF - #define SIZEOF_LONG $ac_cv_sizeof_long - _ACEOF - - - --echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 --echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 -+ -+ { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 -+$as_echo_n "checking whether byte ordering is bigendian... " >&6; } - if test "${ac_cv_c_bigendian+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- # See if sys/param.h defines the BYTE_ORDER macro. --cat >conftest.$ac_ext <<_ACEOF -+ ac_cv_c_bigendian=unknown -+ # See if we're dealing with a universal compiler. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#ifndef __APPLE_CC__ -+ not a universal capable compiler -+ #endif -+ typedef int dummy; -+ -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ -+ # Check for potential -arch flags. It is not universal unless -+ # there are some -arch flags. Note that *ppc* also matches -+ # ppc64. This check is also rather less than ideal. -+ case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in #( -+ *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;; -+ esac -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ if test $ac_cv_c_bigendian = unknown; then -+ # See if sys/param.h defines the BYTE_ORDER macro. -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include --#include -+ #include - - int - main () - { --#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN -- bogus endian macros --#endif -+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ -+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ -+ && LITTLE_ENDIAN) -+ bogus endian macros -+ #endif - - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - # It does; now see whether it defined to BIG_ENDIAN or not. --cat >conftest.$ac_ext <<_ACEOF -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include --#include -+ #include - - int - main () - { - #if BYTE_ORDER != BIG_ENDIAN -- not big endian --#endif -+ not big endian -+ #endif - - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_cv_c_bigendian=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_c_bigendian=no -+ ac_cv_c_bigendian=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --# It does not; compile a test program. --if test "$cross_compiling" = yes; then -- # try to guess the endianness by grepping values into an object file -- ac_cv_c_bigendian=unknown -- cat >conftest.$ac_ext <<_ACEOF -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ fi -+ if test $ac_cv_c_bigendian = unknown; then -+ # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ --short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; --short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; --void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } --short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; --short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; --void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } -+#include -+ - int - main () - { -- _ascii (); _ebcdic (); -+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) -+ bogus endian macros -+ #endif -+ - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ # It does; now see whether it defined to _BIG_ENDIAN or not. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include -+ -+int -+main () -+{ -+#ifndef _BIG_ENDIAN -+ not big endian -+ #endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_cv_c_bigendian=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cv_c_bigendian=no - fi --if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then -- if test "$ac_cv_c_bigendian" = unknown; then -- ac_cv_c_bigendian=no -- else -- # finding both strings is unlikely to happen, but who knows? -- ac_cv_c_bigendian=unknown -- fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ - fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ fi -+ if test $ac_cv_c_bigendian = unknown; then -+ # Compile a test program. -+ if test "$cross_compiling" = yes; then -+ # Try to guess by grepping values from an object file. -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+short int ascii_mm[] = -+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -+ short int ascii_ii[] = -+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -+ int use_ascii (int i) { -+ return ascii_mm[i] + ascii_ii[i]; -+ } -+ short int ebcdic_ii[] = -+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -+ short int ebcdic_mm[] = -+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -+ int use_ebcdic (int i) { -+ return ebcdic_mm[i] + ebcdic_ii[i]; -+ } -+ extern int foo; -+ -+int -+main () -+{ -+return use_ascii (foo) == use_ebcdic (foo); -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then -+ ac_cv_c_bigendian=yes -+ fi -+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then -+ if test "$ac_cv_c_bigendian" = unknown; then -+ ac_cv_c_bigendian=no -+ else -+ # finding both strings is unlikely to happen, but who knows? -+ ac_cv_c_bigendian=unknown -+ fi -+ fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -6156,70 +7500,94 @@ _ACEOF - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ -+$ac_includes_default - int - main () - { -- /* Are we little or big endian? From Harbison&Steele. */ -- union -- { -- long l; -- char c[sizeof (long)]; -- } u; -- u.l = 1; -- exit (u.c[sizeof (long) - 1] == 1); -+ -+ /* Are we little or big endian? From Harbison&Steele. */ -+ union -+ { -+ long int l; -+ char c[sizeof (long int)]; -+ } u; -+ u.l = 1; -+ return u.c[sizeof (long int) - 1] == 1; -+ -+ ; -+ return 0; - } - _ACEOF - rm -f conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>&5 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_bigendian=no - else -- echo "$as_me: program exited with status $ac_status" >&5 --echo "$as_me: failed program was:" >&5 -+ $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 - - ( exit $ac_status ) - ac_cv_c_bigendian=yes - fi --rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+rm -rf conftest.dSYM -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext - fi -+ -+ -+ fi - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --fi --echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 --echo "${ECHO_T}$ac_cv_c_bigendian" >&6 --case $ac_cv_c_bigendian in -- yes) -- ENDIAN=BIG -- ;; -- no) -- ENDIAN=LITTLE -- ;; -- *) -- { { echo "$as_me:$LINENO: error: unknown endianness --presetting ac_cv_c_bigendian=no (or yes) will help" >&5 --echo "$as_me: error: unknown endianness --presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 -+$as_echo "$ac_cv_c_bigendian" >&6; } -+ case $ac_cv_c_bigendian in #( -+ yes) -+ ENDIAN=BIG -+;; #( -+ no) -+ ENDIAN=LITTLE -+ ;; #( -+ universal) -+ -+cat >>confdefs.h <<\_ACEOF -+#define AC_APPLE_UNIVERSAL_BUILD 1 -+_ACEOF -+ -+ ;; #( -+ *) -+ { { $as_echo "$as_me:$LINENO: error: unknown endianness -+ presetting ac_cv_c_bigendian=no (or yes) will help" >&5 -+$as_echo "$as_me: error: unknown endianness -+ presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} - { (exit 1); exit 1; }; } ;; --esac -+ esac - - - - - - # libtool stuff --# Check whether --enable-shared or --disable-shared was given. -+# Check whether --enable-shared was given. - if test "${enable_shared+set}" = set; then -- enableval="$enable_shared" -- p=${PACKAGE-default} -+ enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; -@@ -6238,12 +7606,12 @@ if test "${enable_shared+set}" = set; then - esac - else - enable_shared=yes --fi; -+fi - --# Check whether --enable-static or --disable-static was given. -+ -+# Check whether --enable-static was given. - if test "${enable_static+set}" = set; then -- enableval="$enable_static" -- p=${PACKAGE-default} -+ enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; -@@ -6262,12 +7630,12 @@ if test "${enable_static+set}" = set; then - esac - else - enable_static=yes --fi; -+fi - --# Check whether --enable-fast-install or --disable-fast-install was given. -+ -+# Check whether --enable-fast-install was given. - if test "${enable_fast_install+set}" = set; then -- enableval="$enable_fast_install" -- p=${PACKAGE-default} -+ enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; -@@ -6286,66 +7654,96 @@ if test "${enable_fast_install+set}" = set; then - esac - else - enable_fast_install=yes --fi; -+fi -+ - - # Make sure we can run config.sub. --$ac_config_sub sun4 >/dev/null 2>&1 || -- { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 --echo "$as_me: error: cannot run $ac_config_sub" >&2;} -+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || -+ { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -+$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } - --echo "$as_me:$LINENO: checking build system type" >&5 --echo $ECHO_N "checking build system type... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking build system type" >&5 -+$as_echo_n "checking build system type... " >&6; } - if test "${ac_cv_build+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- ac_cv_build_alias=$build_alias --test -z "$ac_cv_build_alias" && -- ac_cv_build_alias=`$ac_config_guess` --test -z "$ac_cv_build_alias" && -- { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 --echo "$as_me: error: cannot guess build type; you must specify one" >&2;} -+ 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -+$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } --ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || -- { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 --echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} -+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || -+ { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - - fi --echo "$as_me:$LINENO: result: $ac_cv_build" >&5 --echo "${ECHO_T}$ac_cv_build" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -+$as_echo "$ac_cv_build" >&6; } -+case $ac_cv_build in -+*-*-*) ;; -+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -+$as_echo "$as_me: error: invalid value of canonical build" >&2;} -+ { (exit 1); exit 1; }; };; -+esac - build=$ac_cv_build --build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` --build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` --build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -+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 - - --echo "$as_me:$LINENO: checking host system type" >&5 --echo $ECHO_N "checking host system type... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking host system type" >&5 -+$as_echo_n "checking host system type... " >&6; } - if test "${ac_cv_host+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- ac_cv_host_alias=$host_alias --test -z "$ac_cv_host_alias" && -- ac_cv_host_alias=$ac_cv_build_alias --ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || -- { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 --echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} -+ 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } -+fi - - fi --echo "$as_me:$LINENO: result: $ac_cv_host" >&5 --echo "${ECHO_T}$ac_cv_host" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -+$as_echo "$ac_cv_host" >&6; } -+case $ac_cv_host in -+*-*-*) ;; -+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -+$as_echo "$as_me: error: invalid value of canonical host" >&2;} -+ { (exit 1); exit 1; }; };; -+esac - host=$ac_cv_host --host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` --host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` --host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -+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 - - --echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 --echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 "${lt_cv_path_SED+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - # 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. -@@ -6398,22 +7796,22 @@ fi - - SED=$lt_cv_path_SED - --echo "$as_me:$LINENO: result: $SED" >&5 --echo "${ECHO_T}$SED" >&6 -+{ $as_echo "$as_me:$LINENO: result: $SED" >&5 -+$as_echo "$SED" >&6; } - - --# Check whether --with-gnu-ld or --without-gnu-ld was given. -+# 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 -+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes - else - with_gnu_ld=no --fi; -+fi -+ - ac_prog=ld - if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. -- echo "$as_me:$LINENO: checking for ld used by $CC" >&5 --echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -@@ -6442,14 +7840,14 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 - ;; - esac - elif test "$with_gnu_ld" = yes; then -- echo "$as_me:$LINENO: checking for GNU ld" >&5 --echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 -+$as_echo_n "checking for GNU ld... " >&6; } - else -- echo "$as_me:$LINENO: checking for non-GNU ld" >&5 --echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -@@ -6479,19 +7877,19 @@ fi - - LD="$lt_cv_path_LD" - if test -n "$LD"; then -- echo "$as_me:$LINENO: result: $LD" >&5 --echo "${ECHO_T}$LD" >&6 -+ { $as_echo "$as_me:$LINENO: result: $LD" >&5 -+$as_echo "$LD" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi --test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 --echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} -+test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -+$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } --echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 --echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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 &1 &5 --echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 -+$as_echo "$lt_cv_prog_gnu_ld" >&6; } - with_gnu_ld=$lt_cv_prog_gnu_ld - - --echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 --echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_ld_reload_flag='-r' - fi --echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 --echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 -+{ $as_echo "$as_me:$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 - "" | " "*) ;; -@@ -6533,10 +7931,10 @@ case $host_os in - ;; - esac - --echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 --echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 -+$as_echo_n "checking for BSD-compatible nm... " >&6; } - if test "${lt_cv_path_NM+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$NM"; then - # Let the user override the test. -@@ -6582,25 +7980,25 @@ else - test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm - fi - fi --echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 --echo "${ECHO_T}$lt_cv_path_NM" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -+$as_echo "$lt_cv_path_NM" >&6; } - NM="$lt_cv_path_NM" - --echo "$as_me:$LINENO: checking whether ln -s works" >&5 --echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - else -- echo "$as_me:$LINENO: result: no, using $LN_S" >&5 --echo "${ECHO_T}no, using $LN_S" >&6 -+ { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -+$as_echo "no, using $LN_S" >&6; } - fi - --echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 --echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 -+$as_echo_n "checking how to recognise dependent libraries... " >&6; } - if test "${lt_cv_deplibs_check_method+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_file_magic_cmd='$MAGIC_CMD' - lt_cv_file_magic_test_file= -@@ -6773,8 +8171,8 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - esac - - fi --echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 --echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -+$as_echo "$lt_cv_deplibs_check_method" >&6; } - 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 -@@ -6791,11 +8189,11 @@ LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - # Allow CC to be a program name with arguments. - compiler=$CC - --# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -+# Check whether --enable-libtool-lock was given. - if test "${enable_libtool_lock+set}" = set; then -- enableval="$enable_libtool_lock" -+ enableval=$enable_libtool_lock; -+fi - --fi; - test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - - # Some flags need to be propagated to the compiler or linker for good -@@ -6807,7 +8205,7 @@ ia64-*-hpux*) - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) -@@ -6822,11 +8220,11 @@ ia64-*-hpux*) - ;; - *-*-irix6*) - # Find out which ABI we are using. -- echo '#line 6825 "configure"' > conftest.$ac_ext -+ echo '#line 8223 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in -@@ -6863,7 +8261,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.o` in - *32-bit*) -@@ -6907,10 +8305,10 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" -- echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 --echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' -@@ -6934,35 +8332,36 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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 - lt_cv_cc_needs_belf=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --lt_cv_cc_needs_belf=no -+ lt_cv_cc_needs_belf=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' -@@ -6971,8 +8370,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ - ac_compiler_gnu=$ac_cv_c_compiler_gnu - - fi --echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 --echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 -+{ $as_echo "$as_me:$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" -@@ -6984,7 +8383,7 @@ sparc*-*solaris*) - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.o` in - *64-bit*) -@@ -7007,19 +8406,21 @@ need_locks="$enable_libtool_lock" - - for ac_header in dlfcn.h - do --as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` --if eval "test \"\${$as_ac_Header+set}\" = set"; then -- echo "$as_me:$LINENO: checking for $ac_header" >&5 --echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 --if eval "test \"\${$as_ac_Header+set}\" = set"; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -+ { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -+$as_echo_n "checking for $ac_header... " >&6; } -+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -+ $as_echo_n "(cached) " >&6 - fi --echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 --echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -+ac_res=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -+$as_echo "$ac_res" >&6; } - else - # Is the header compilable? --echo "$as_me:$LINENO: checking $ac_header usability" >&5 --echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -+$as_echo_n "checking $ac_header usability... " >&6; } - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -7030,41 +8431,38 @@ $ac_includes_default - #include <$ac_header> - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_header_compiler=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_header_compiler=no -+ ac_header_compiler=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 --echo "${ECHO_T}$ac_header_compiler" >&6 -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -+$as_echo "$ac_header_compiler" >&6; } - - # Is the header present? --echo "$as_me:$LINENO: checking $ac_header presence" >&5 --echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -+$as_echo_n "checking $ac_header presence... " >&6; } - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -7073,101 +8471,107 @@ cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include <$ac_header> - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_c_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_c_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || -+ test ! -s conftest.err -+ }; then - ac_header_preproc=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no - fi -+ - rm -f conftest.err conftest.$ac_ext --echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 --echo "${ECHO_T}$ac_header_preproc" >&6 -+{ $as_echo "$as_me:$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: ) -- { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 --echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} -- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 --echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) -- { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 --echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} -- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 --echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} -- { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 --echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} -- { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 --echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} -- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 --echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} -- { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 --echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} -- ( -- cat <<\_ASBOX -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -+$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -+$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} -+ ( cat <<\_ASBOX - ## ------------------------------------- ## - ## Report this to eddie.wai@broadcom.com ## - ## ------------------------------------- ## - _ASBOX -- ) | -- sed "s/^/$as_me: WARNING: /" >&2 -+ ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; - esac --echo "$as_me:$LINENO: checking for $ac_header" >&5 --echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 --if eval "test \"\${$as_ac_Header+set}\" = set"; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -+$as_echo_n "checking for $ac_header... " >&6; } -+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -+ $as_echo_n "(cached) " >&6 - else - eval "$as_ac_Header=\$ac_header_preproc" - fi --echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 --echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -+ac_res=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -+$as_echo "$ac_res" >&6; } - - fi --if test `eval echo '${'$as_ac_Header'}'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF --#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi - - done - --ac_ext=cc -+ac_ext=cpp - ac_cpp='$CXXCPP $CPPFLAGS' - ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' - ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' - ac_compiler_gnu=$ac_cv_cxx_compiler_gnu --if test -n "$ac_tool_prefix"; then -- for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -+if test -z "$CXX"; then -+ if test -n "$CCC"; then -+ CXX=$CCC -+ else -+ if test -n "$ac_tool_prefix"; then -+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_CXX+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -@@ -7178,38 +8582,40 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - - fi - fi - CXX=$ac_cv_prog_CXX - if test -n "$CXX"; then -- echo "$as_me:$LINENO: result: $CXX" >&5 --echo "${ECHO_T}$CXX" >&6 -+ { $as_echo "$as_me:$LINENO: result: $CXX" >&5 -+$as_echo "$CXX" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$CXX" && break - done - fi - if test -z "$CXX"; then - ac_ct_CXX=$CXX -- for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_prog", so it can be a program name with args. - set dummy $ac_prog; ac_word=$2 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -@@ -7220,57 +8626,87 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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_CXX="$ac_prog" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - - fi - fi - ac_ct_CXX=$ac_cv_prog_ac_ct_CXX - if test -n "$ac_ct_CXX"; then -- echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 --echo "${ECHO_T}$ac_ct_CXX" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -+$as_echo "$ac_ct_CXX" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$ac_ct_CXX" && break - done --test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - -- CXX=$ac_ct_CXX -+ if test "x$ac_ct_CXX" = x; then -+ CXX="g++" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 -+ CXX=$ac_ct_CXX -+ fi - fi - -- -+ fi -+fi - # Provide some information about the compiler. --echo "$as_me:$LINENO:" \ -- "checking for C++ compiler version" >&5 --ac_compiler=`set X $ac_compile; echo $2` --{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 -- (eval $ac_compiler --version &5) 2>&5 -+$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 -+set X $ac_compile -+ac_compiler=$2 -+{ (ac_try="$ac_compiler --version >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } --{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 -- (eval $ac_compiler -v &5) 2>&5 -+{ (ac_try="$ac_compiler -v >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } --{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 -- (eval $ac_compiler -V &5) 2>&5 -+{ (ac_try="$ac_compiler -V >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - --echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 --echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_cxx_compiler_gnu+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -7291,50 +8727,54 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_cxx_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_compiler_gnu=no -+ ac_compiler_gnu=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - - fi --echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 --echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 --GXX=`test $ac_compiler_gnu = yes && echo yes` -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -+if test $ac_compiler_gnu = yes; then -+ GXX=yes -+else -+ GXX= -+fi - ac_test_CXXFLAGS=${CXXFLAGS+set} - ac_save_CXXFLAGS=$CXXFLAGS --CXXFLAGS="-g" --echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 --echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -+$as_echo_n "checking whether $CXX accepts -g... " >&6; } - if test "${ac_cv_prog_cxx_g+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else -- cat >conftest.$ac_ext <<_ACEOF -+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag -+ ac_cxx_werror_flag=yes -+ ac_cv_prog_cxx_g=no -+ CXXFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext -@@ -7350,38 +8790,121 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_cxx_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_prog_cxx_g=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ CXXFLAGS="" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ : -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag -+ CXXFLAGS="-g" -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_prog_cxx_g=no -+ -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag - fi --echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 --echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -+$as_echo "$ac_cv_prog_cxx_g" >&6; } - if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS - elif test $ac_cv_prog_cxx_g = yes; then -@@ -7397,113 +8920,7 @@ else - CXXFLAGS= - fi - fi --for ac_declaration in \ -- '' \ -- 'extern "C" void std::exit (int) throw (); using std::exit;' \ -- 'extern "C" void std::exit (int); using std::exit;' \ -- 'extern "C" void exit (int) throw ();' \ -- 'extern "C" void exit (int);' \ -- 'void exit (int);' --do -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_declaration --#include --int --main () --{ --exit (42); -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_cxx_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- : --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --continue --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -- cat >conftest.$ac_ext <<_ACEOF --/* confdefs.h. */ --_ACEOF --cat confdefs.h >>conftest.$ac_ext --cat >>conftest.$ac_ext <<_ACEOF --/* end confdefs.h. */ --$ac_declaration --int --main () --{ --exit (42); -- ; -- return 0; --} --_ACEOF --rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -- ac_status=$? -- grep -v '^ *+' conftest.er1 >conftest.err -- rm -f conftest.er1 -- cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_cxx_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- break --else -- echo "$as_me: failed program was:" >&5 --sed 's/^/| /' conftest.$ac_ext >&5 -- --fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext --done --rm -f conftest* --if test -n "$ac_declaration"; then -- echo '#ifdef __cplusplus' >>confdefs.h -- echo $ac_declaration >>confdefs.h -- echo '#endif' >>confdefs.h --fi -- --ac_ext=cc -+ac_ext=cpp - ac_cpp='$CXXCPP $CPPFLAGS' - ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' - ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -@@ -7511,10 +8928,10 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - depcc="$CXX" am_compiler_list= - --echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 --echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -+$as_echo_n "checking dependency style of $depcc... " >&6; } - if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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 -@@ -7601,8 +9018,8 @@ else - fi - - fi --echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 --echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 -+{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } - CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - -@@ -7623,16 +9040,16 @@ fi - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then -- ac_ext=cc -+ ac_ext=cpp - ac_cpp='$CXXCPP $CPPFLAGS' - ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' - ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' - ac_compiler_gnu=$ac_cv_cxx_compiler_gnu --echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 --echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -+$as_echo_n "checking how to run the C++ preprocessor... " >&6; } - if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" -@@ -7659,35 +9076,35 @@ cat >>conftest.$ac_ext <<_ACEOF - #endif - Syntax error - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_cxx_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ }; then - : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. - continue - fi -+ - rm -f conftest.err conftest.$ac_ext - -- # OK, works on sane cases. Now check whether non-existent headers -+ # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -7697,34 +9114,34 @@ cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_cxx_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ }; then - # Broken: success on invalid input. - continue - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. - ac_preproc_ok=: - break - fi -+ - rm -f conftest.err conftest.$ac_ext - - done -@@ -7742,8 +9159,8 @@ fi - else - ac_cv_prog_CXXCPP=$CXXCPP - fi --echo "$as_me:$LINENO: result: $CXXCPP" >&5 --echo "${ECHO_T}$CXXCPP" >&6 -+{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5 -+$as_echo "$CXXCPP" >&6; } - ac_preproc_ok=false - for ac_cxx_preproc_warn_flag in '' yes - do -@@ -7766,35 +9183,35 @@ cat >>conftest.$ac_ext <<_ACEOF - #endif - Syntax error - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_cxx_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ }; then - : - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. - continue - fi -+ - rm -f conftest.err conftest.$ac_ext - -- # OK, works on sane cases. Now check whether non-existent headers -+ # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -7804,34 +9221,34 @@ cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - #include - _ACEOF --if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 -- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } >/dev/null; then -- if test -s conftest.err; then -- ac_cpp_err=$ac_cxx_preproc_warn_flag -- ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag -- else -- ac_cpp_err= -- fi --else -- ac_cpp_err=yes --fi --if test -z "$ac_cpp_err"; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } >/dev/null && { -+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ }; then - # Broken: success on invalid input. - continue - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. - ac_preproc_ok=: - break - fi -+ - rm -f conftest.err conftest.$ac_ext - - done -@@ -7840,14 +9257,16 @@ rm -f conftest.err conftest.$ac_ext - if $ac_preproc_ok; then - : - else -- { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check - See \`config.log' for more details." >&5 --echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -+$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - --ac_ext=cc -+ac_ext=cpp - ac_cpp='$CXXCPP $CPPFLAGS' - ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' - ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -@@ -7861,14 +9280,14 @@ ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' - ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' - ac_compiler_gnu=$ac_cv_f77_compiler_gnu - if test -n "$ac_tool_prefix"; then -- for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -+ for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn - 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_F77+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$F77"; then - ac_cv_prog_F77="$F77" # Let the user override the test. -@@ -7879,38 +9298,40 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_F77="$ac_tool_prefix$ac_prog" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - - fi - fi - F77=$ac_cv_prog_F77 - if test -n "$F77"; then -- echo "$as_me:$LINENO: result: $F77" >&5 --echo "${ECHO_T}$F77" >&6 -+ { $as_echo "$as_me:$LINENO: result: $F77" >&5 -+$as_echo "$F77" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$F77" && break - done - fi - if test -z "$F77"; then - ac_ct_F77=$F77 -- for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -+ for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn - do - # Extract the first word of "$ac_prog", so it can be a program name with args. - set dummy $ac_prog; ac_word=$2 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_ac_ct_F77+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$ac_ct_F77"; then - ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. -@@ -7921,50 +9342,80 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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_F77="$ac_prog" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - - fi - fi - ac_ct_F77=$ac_cv_prog_ac_ct_F77 - if test -n "$ac_ct_F77"; then -- echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 --echo "${ECHO_T}$ac_ct_F77" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -+$as_echo "$ac_ct_F77" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - test -n "$ac_ct_F77" && break - done - -- F77=$ac_ct_F77 -+ if test "x$ac_ct_F77" = x; then -+ F77="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 -+ F77=$ac_ct_F77 -+ fi - fi - - - # Provide some information about the compiler. --echo "$as_me:7951:" \ -- "checking for Fortran 77 compiler version" >&5 --ac_compiler=`set X $ac_compile; echo $2` --{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 -- (eval $ac_compiler --version &5) 2>&5 -+$as_echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 -+set X $ac_compile -+ac_compiler=$2 -+{ (ac_try="$ac_compiler --version >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } --{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 -- (eval $ac_compiler -v &5) 2>&5 -+{ (ac_try="$ac_compiler -v >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } --{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 -- (eval $ac_compiler -V &5) 2>&5 -+{ (ac_try="$ac_compiler -V >&5" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - rm -f a.out - -@@ -7972,10 +9423,10 @@ rm -f a.out - # input file. (Note that this only needs to work for GNU compilers.) - ac_save_ext=$ac_ext - ac_ext=F --echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 --echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -+$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } - if test "${ac_cv_f77_compiler_gnu+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - program main -@@ -7986,48 +9437,45 @@ else - end - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_f77_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_f77_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_compiler_gnu=no -+ ac_compiler_gnu=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_f77_compiler_gnu=$ac_compiler_gnu - - fi --echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 --echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -+$as_echo "$ac_cv_f77_compiler_gnu" >&6; } - ac_ext=$ac_save_ext - ac_test_FFLAGS=${FFLAGS+set} - ac_save_FFLAGS=$FFLAGS - FFLAGS= --echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 --echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -+$as_echo_n "checking whether $F77 accepts -g... " >&6; } - if test "${ac_cv_prog_f77_g+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - FFLAGS=-g - cat >conftest.$ac_ext <<_ACEOF -@@ -8036,39 +9484,36 @@ cat >conftest.$ac_ext <<_ACEOF - end - _ACEOF - rm -f conftest.$ac_objext --if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -- (eval $ac_compile) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_f77_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest.$ac_objext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_f77_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then - ac_cv_prog_f77_g=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_prog_f77_g=no -+ ac_cv_prog_f77_g=no - fi --rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - - fi --echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 --echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -+$as_echo "$ac_cv_prog_f77_g" >&6; } - if test "$ac_test_FFLAGS" = set; then - FFLAGS=$ac_save_FFLAGS - elif test $ac_cv_prog_f77_g = yes; then -@@ -8085,7 +9530,11 @@ else - fi - fi - --G77=`test $ac_compiler_gnu = yes && echo yes` -+if test $ac_compiler_gnu = yes; then -+ G77=yes -+else -+ G77= -+fi - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' - ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -@@ -8097,10 +9546,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! - - # find the maximum length of command line arguments --echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 --echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - i=0 - teststring="ABCD" -@@ -8206,21 +9655,21 @@ else - fi - - if test -n $lt_cv_sys_max_cmd_len ; then -- echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 --echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 -+ { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -+$as_echo "$lt_cv_sys_max_cmd_len" >&6; } - else -- echo "$as_me:$LINENO: result: none" >&5 --echo "${ECHO_T}none" >&6 -+ { $as_echo "$as_me:$LINENO: result: none" >&5 -+$as_echo "none" >&6; } - fi - - - - - # Check for command to grab the raw symbol name followed by C symbol from nm. --echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 --echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - - # These are sane defaults that work on at least a few old systems. -@@ -8325,14 +9774,14 @@ EOF - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { (eval echo "$as_me:$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=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then -@@ -8387,7 +9836,7 @@ EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi -@@ -8422,17 +9871,17 @@ 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 -- echo "$as_me:$LINENO: result: failed" >&5 --echo "${ECHO_T}failed" >&6 -+ { $as_echo "$as_me:$LINENO: result: failed" >&5 -+$as_echo "failed" >&6; } - else -- echo "$as_me:$LINENO: result: ok" >&5 --echo "${ECHO_T}ok" >&6 -+ { $as_echo "$as_me:$LINENO: result: ok" >&5 -+$as_echo "ok" >&6; } - fi - --echo "$as_me:$LINENO: checking for objdir" >&5 --echo $ECHO_N "checking for objdir... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 -+$as_echo_n "checking for objdir... " >&6; } - if test "${lt_cv_objdir+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - rm -f .libs 2>/dev/null - mkdir .libs 2>/dev/null -@@ -8444,8 +9893,8 @@ else - fi - rmdir .libs 2>/dev/null - fi --echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 --echo "${ECHO_T}$lt_cv_objdir" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -+$as_echo "$lt_cv_objdir" >&6; } - objdir=$lt_cv_objdir - - -@@ -8496,10 +9945,10 @@ with_gnu_ld="$lt_cv_prog_gnu_ld" - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. - set dummy ${ac_tool_prefix}ar; ac_word=$2 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_AR+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -@@ -8510,34 +9959,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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}ar" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $AR" >&5 --echo "${ECHO_T}$AR" >&6 -+ { $as_echo "$as_me:$LINENO: result: $AR" >&5 -+$as_echo "$AR" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -+ - fi - if test -z "$ac_cv_prog_AR"; then - ac_ct_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. - set dummy ar; ac_word=$2 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -8548,27 +9999,37 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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="ar" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - -- test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" - fi - fi - ac_ct_AR=$ac_cv_prog_ac_ct_AR - if test -n "$ac_ct_AR"; then -- echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 --echo "${ECHO_T}$ac_ct_AR" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -+$as_echo "$ac_ct_AR" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -- AR=$ac_ct_AR -+ if test "x$ac_ct_AR" = x; then -+ AR="false" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 - else - AR="$ac_cv_prog_AR" - fi -@@ -8576,10 +10037,10 @@ fi - 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_RANLIB+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -@@ -8590,34 +10051,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $RANLIB" >&5 --echo "${ECHO_T}$RANLIB" >&6 -+ { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 -+$as_echo "$RANLIB" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -8628,27 +10091,37 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - -- test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" - fi - fi - ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB - if test -n "$ac_ct_RANLIB"; then -- echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 --echo "${ECHO_T}$ac_ct_RANLIB" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -+$as_echo "$ac_ct_RANLIB" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -- RANLIB=$ac_ct_RANLIB -+ if test "x$ac_ct_RANLIB" = x; then -+ RANLIB=":" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 -@@ -8656,10 +10129,10 @@ 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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_prog_STRIP+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -@@ -8670,34 +10143,36 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $STRIP" >&5 --echo "${ECHO_T}$STRIP" >&6 -+ { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 -+$as_echo "$STRIP" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 --echo "$as_me:$LINENO: checking for $ac_word" >&5 --echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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. -@@ -8708,27 +10183,37 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then -+ 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" -- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi - done - done -+IFS=$as_save_IFS - -- test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" - fi - fi - ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP - if test -n "$ac_ct_STRIP"; then -- echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 --echo "${ECHO_T}$ac_ct_STRIP" >&6 -+ { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -+$as_echo "$ac_ct_STRIP" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - -- STRIP=$ac_ct_STRIP -+ if test "x$ac_ct_STRIP" = x; then -+ STRIP=":" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:$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 -@@ -8787,10 +10272,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - case $deplibs_check_method in - file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then -- echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 --echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - case $MAGIC_CMD in - [\\/*] | ?:[\\/]*) -@@ -8840,19 +10325,19 @@ fi - - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if test -n "$MAGIC_CMD"; then -- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 --echo "${ECHO_T}$MAGIC_CMD" >&6 -+ { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -+$as_echo "$MAGIC_CMD" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: checking for file" >&5 --echo $ECHO_N "checking for file... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking for file" >&5 -+$as_echo_n "checking for file... " >&6; } - if test "${lt_cv_path_MAGIC_CMD+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - case $MAGIC_CMD in - [\\/*] | ?:[\\/]*) -@@ -8902,11 +10387,11 @@ fi - - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if test -n "$MAGIC_CMD"; then -- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 --echo "${ECHO_T}$MAGIC_CMD" >&6 -+ { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -+$as_echo "$MAGIC_CMD" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - - else -@@ -8921,21 +10406,21 @@ esac - enable_dlopen=yes - enable_win32_dll=no - --# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -+# Check whether --enable-libtool-lock was given. - if test "${enable_libtool_lock+set}" = set; then -- enableval="$enable_libtool_lock" -+ enableval=$enable_libtool_lock; -+fi - --fi; - test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - - --# Check whether --with-pic or --without-pic was given. -+# Check whether --with-pic was given. - if test "${with_pic+set}" = set; then -- withval="$with_pic" -- pic_mode="$withval" -+ withval=$with_pic; pic_mode="$withval" - else - pic_mode=default --fi; -+fi -+ - test -z "$pic_mode" && pic_mode=default - - # Use C for the default configuration in the libtool script -@@ -8993,10 +10478,10 @@ if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag=' -fno-builtin' - - --echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 --echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext -@@ -9011,11 +10496,11 @@ else - -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:9014: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:10499: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 -- echo "$as_me:9018: \$? = $ac_status" >&5 -+ echo "$as_me:10503: \$? = $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. -@@ -9028,8 +10513,8 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 --echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 -+{ $as_echo "$as_me:$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" -@@ -9043,8 +10528,8 @@ lt_prog_compiler_wl= - lt_prog_compiler_pic= - lt_prog_compiler_static= - --echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 --echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+$as_echo_n "checking for $compiler option to produce PIC... " >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl='-Wl,' -@@ -9253,18 +10738,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - esac - fi - --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -+$as_echo "$lt_prog_compiler_pic" >&6; } - - # - # Check to make sure the PIC flag actually works. - # - if test -n "$lt_prog_compiler_pic"; then - --echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 --echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_prog_compiler_pic_works+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext -@@ -9279,11 +10764,11 @@ else - -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:9282: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:10767: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 -- echo "$as_me:9286: \$? = $ac_status" >&5 -+ echo "$as_me:10771: \$? = $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. -@@ -9296,8 +10781,8 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -+$as_echo "$lt_prog_compiler_pic_works" >&6; } - - if test x"$lt_prog_compiler_pic_works" = xyes; then - case $lt_prog_compiler_pic in -@@ -9324,10 +10809,10 @@ esac - # Check to make sure the static flag actually works. - # - wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" --echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 --echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_prog_compiler_static_works+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" -@@ -9352,8 +10837,8 @@ else - LDFLAGS="$save_LDFLAGS" - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 --echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -+$as_echo "$lt_prog_compiler_static_works" >&6; } - - if test x"$lt_prog_compiler_static_works" = xyes; then - : -@@ -9362,10 +10847,10 @@ else - fi - - --echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 --echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_prog_compiler_c_o=no - $rm -r conftest 2>/dev/null -@@ -9383,11 +10868,11 @@ else - -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:9386: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:10871: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 -- echo "$as_me:9390: \$? = $ac_status" >&5 -+ echo "$as_me:10875: \$? = $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 -@@ -9409,34 +10894,34 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 --echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 -+{ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 --echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $hard_links" >&5 --echo "${ECHO_T}$hard_links" >&6 -+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 -+$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then -- { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 --echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} -+ { $as_echo "$as_me:$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 - --echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 --echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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= -@@ -9851,27 +11336,26 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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 - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -9879,11 +11363,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -9912,27 +11399,26 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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 - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -9940,11 +11426,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -10393,8 +11882,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - esac - fi - --echo "$as_me:$LINENO: result: $ld_shlibs" >&5 --echo "${ECHO_T}$ld_shlibs" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -+$as_echo "$ld_shlibs" >&6; } - test "$ld_shlibs" = no && can_build_shared=no - - # -@@ -10414,15 +11903,15 @@ x|xyes) - # 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. -- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 --echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest -@@ -10440,7 +11929,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - if { (eval echo "$as_me:$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=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc=no -@@ -10452,16 +11941,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - cat conftest.err 1>&5 - fi - $rm conftest* -- echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 --echo "${ECHO_T}$archive_cmds_need_lc" >&6 -+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -+$as_echo "$archive_cmds_need_lc" >&6; } - ;; - esac - fi - ;; - esac - --echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 --echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+$as_echo_n "checking dynamic linker characteristics... " >&6; } - library_names_spec= - libname_spec='lib$name' - soname_spec= -@@ -10852,11 +12341,11 @@ linux*) - libsuff= - case "$host_cpu" in - x86_64*|s390x*|powerpc64*) -- echo '#line 10855 "configure"' > conftest.$ac_ext -+ echo '#line 12344 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *64-bit*) -@@ -11069,8 +12558,8 @@ uts4*) - dynamic_linker=no - ;; - esac --echo "$as_me:$LINENO: result: $dynamic_linker" >&5 --echo "${ECHO_T}$dynamic_linker" >&6 -+{ $as_echo "$as_me:$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" -@@ -11078,8 +12567,8 @@ if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - fi - --echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 --echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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" || \ -@@ -11103,8 +12592,8 @@ else - # directories. - hardcode_action=unsupported - fi --echo "$as_me:$LINENO: result: $hardcode_action" >&5 --echo "${ECHO_T}$hardcode_action" >&6 -+{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 -+$as_echo "$hardcode_action" >&6; } - - if test "$hardcode_action" = relink; then - # Fast installation is not supported -@@ -11117,29 +12606,29 @@ fi - - striplib= - old_striplib= --echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 --echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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" -- echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+ { $as_echo "$as_me:$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" -- echo "$as_me:$LINENO: result: yes" >&5 --echo "${ECHO_T}yes" >&6 -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi - ;; - *) -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - ;; - esac - fi -@@ -11171,10 +12660,10 @@ else - - darwin*) - # if libdl is installed we need to link against it -- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 --echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS - LIBS="-ldl $LIBS" -@@ -11185,57 +12674,58 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - --/* Override any gcc2 internal prototype to avoid an error. */ -+/* 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 --/* We use char because int might match the return type of a gcc2 -- builtin and then its argument prototype would still apply. */ - char dlopen (); - int - main () - { --dlopen (); -+return dlopen (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_lib_dl_dlopen=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_lib_dl_dlopen=no -+ ac_cv_lib_dl_dlopen=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi --echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 --echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 --if test $ac_cv_lib_dl_dlopen = yes; then -+{ $as_echo "$as_me:$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 - -@@ -11248,10 +12738,10 @@ fi - ;; - - *) -- echo "$as_me:$LINENO: checking for shl_load" >&5 --echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 -+$as_echo_n "checking for shl_load... " >&6; } - if test "${ac_cv_func_shl_load+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -11276,75 +12766,70 @@ cat >>conftest.$ac_ext <<_ACEOF - - #undef shl_load - --/* Override any gcc2 internal prototype to avoid an error. */ --#ifdef __cplusplus --extern "C" --{ --#endif --/* We use char because int might match the return type of a gcc2 -+/* 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 (); - /* 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_shl_load) || defined (__stub___shl_load) -+#if defined __stub_shl_load || defined __stub___shl_load - choke me --#else --char (*f) () = shl_load; --#endif --#ifdef __cplusplus --} - #endif - - int - main () - { --return f != shl_load; -+return shl_load (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_func_shl_load=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_func_shl_load=no -+ ac_cv_func_shl_load=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 --echo "${ECHO_T}$ac_cv_func_shl_load" >&6 --if test $ac_cv_func_shl_load = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -+$as_echo "$ac_cv_func_shl_load" >&6; } -+if test "x$ac_cv_func_shl_load" = x""yes; then - lt_cv_dlopen="shl_load" - else -- echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 --echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS - LIBS="-ldld $LIBS" -@@ -11355,63 +12840,64 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - --/* Override any gcc2 internal prototype to avoid an error. */ -+/* 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 --/* We use char because int might match the return type of a gcc2 -- builtin and then its argument prototype would still apply. */ - char shl_load (); - int - main () - { --shl_load (); -+return shl_load (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_lib_dld_shl_load=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_lib_dld_shl_load=no -+ ac_cv_lib_dld_shl_load=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi --echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 --echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 --if test $ac_cv_lib_dld_shl_load = yes; then -+{ $as_echo "$as_me:$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="-dld" - else -- echo "$as_me:$LINENO: checking for dlopen" >&5 --echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 -+$as_echo_n "checking for dlopen... " >&6; } - if test "${ac_cv_func_dlopen+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -11436,75 +12922,70 @@ cat >>conftest.$ac_ext <<_ACEOF - - #undef dlopen - --/* Override any gcc2 internal prototype to avoid an error. */ --#ifdef __cplusplus --extern "C" --{ --#endif --/* We use char because int might match the return type of a gcc2 -+/* 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 (); - /* 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_dlopen) || defined (__stub___dlopen) -+#if defined __stub_dlopen || defined __stub___dlopen - choke me --#else --char (*f) () = dlopen; --#endif --#ifdef __cplusplus --} - #endif - - int - main () - { --return f != dlopen; -+return dlopen (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_func_dlopen=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_func_dlopen=no -+ ac_cv_func_dlopen=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - fi --echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 --echo "${ECHO_T}$ac_cv_func_dlopen" >&6 --if test $ac_cv_func_dlopen = yes; then -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -+$as_echo "$ac_cv_func_dlopen" >&6; } -+if test "x$ac_cv_func_dlopen" = x""yes; then - lt_cv_dlopen="dlopen" - else -- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 --echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS - LIBS="-ldl $LIBS" -@@ -11515,63 +12996,64 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - --/* Override any gcc2 internal prototype to avoid an error. */ -+/* 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 --/* We use char because int might match the return type of a gcc2 -- builtin and then its argument prototype would still apply. */ - char dlopen (); - int - main () - { --dlopen (); -+return dlopen (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_lib_dl_dlopen=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_lib_dl_dlopen=no -+ ac_cv_lib_dl_dlopen=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi --echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 --echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 --if test $ac_cv_lib_dl_dlopen = yes; then -+{ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 --echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS - LIBS="-lsvld $LIBS" -@@ -11582,63 +13064,64 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - --/* Override any gcc2 internal prototype to avoid an error. */ -+/* 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 --/* We use char because int might match the return type of a gcc2 -- builtin and then its argument prototype would still apply. */ - char dlopen (); - int - main () - { --dlopen (); -+return dlopen (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_lib_svld_dlopen=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_lib_svld_dlopen=no -+ ac_cv_lib_svld_dlopen=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi --echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 --echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 --if test $ac_cv_lib_svld_dlopen = yes; then -+{ $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 --echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS - LIBS="-ldld $LIBS" -@@ -11649,57 +13132,58 @@ cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - --/* Override any gcc2 internal prototype to avoid an error. */ -+/* 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 --/* We use char because int might match the return type of a gcc2 -- builtin and then its argument prototype would still apply. */ - char dld_link (); - int - main () - { --dld_link (); -+return dld_link (); - ; - return 0; - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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_cv_lib_dld_dld_link=yes - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - --ac_cv_lib_dld_dld_link=no -+ ac_cv_lib_dld_dld_link=no - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi --echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 --echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 --if test $ac_cv_lib_dld_dld_link = yes; then -+{ $as_echo "$as_me:$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="-dld" - fi - -@@ -11738,10 +13222,10 @@ fi - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - -- echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 --echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -@@ -11749,7 +13233,7 @@ else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <&5 - (eval $ac_link) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? -@@ -11833,15 +13317,15 @@ rm -fr conftest* - - - fi --echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 --echo "${ECHO_T}$lt_cv_dlopen_self" >&6 -+{ $as_echo "$as_me:$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\" -- echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 --echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -@@ -11849,7 +13333,7 @@ else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <&5 - (eval $ac_link) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? -@@ -11933,8 +13417,8 @@ rm -fr conftest* - - - fi --echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 --echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -+$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS="$save_CPPFLAGS" -@@ -11956,13 +13440,13 @@ fi - - - # Report which library types will actually be built --echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 --echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 --echo "$as_me:$LINENO: result: $can_build_shared" >&5 --echo "${ECHO_T}$can_build_shared" >&6 -+{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -+$as_echo_n "checking if libtool supports shared libraries... " >&6; } -+{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 -+$as_echo "$can_build_shared" >&6; } - --echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 --echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -@@ -11982,15 +13466,15 @@ aix4* | aix5*) - fi - ;; - esac --echo "$as_me:$LINENO: result: $enable_shared" >&5 --echo "${ECHO_T}$enable_shared" >&6 -+{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 -+$as_echo "$enable_shared" >&6; } - --echo "$as_me:$LINENO: checking whether to build static libraries" >&5 --echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 --echo "$as_me:$LINENO: result: $enable_static" >&5 --echo "${ECHO_T}$enable_static" >&6 -+{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 -+$as_echo "$enable_static" >&6; } - - # The else clause should only fire when bootstrapping the - # libtool distribution, otherwise you forgot to ship ltmain.sh -@@ -12081,8 +13565,8 @@ if test -f "$ltmain"; then - cfgfile="${ofile}T" - trap "$rm \"$cfgfile\"; exit 1" 1 2 15 - $rm -f "$cfgfile" -- { echo "$as_me:$LINENO: creating $ofile" >&5 --echo "$as_me: creating $ofile" >&6;} -+ { $as_echo "$as_me:$LINENO: creating $ofile" >&5 -+$as_echo "$as_me: creating $ofile" >&6;} - - cat <<__EOF__ >> "$cfgfile" - #! $SHELL -@@ -12485,26 +13969,26 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - CC="$lt_save_CC" - - --# Check whether --with-tags or --without-tags was given. -+# Check whether --with-tags was given. - if test "${with_tags+set}" = set; then -- withval="$with_tags" -- tagnames="$withval" --fi; -+ withval=$with_tags; tagnames="$withval" -+fi -+ - - if test -f "$ltmain" && test -n "$tagnames"; then - if test ! -f "${ofile}"; then -- { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 --echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 -+$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} - fi - - if test -z "$LTCC"; then - eval "`$SHELL ${ofile} --config | grep '^LTCC='`" - if test -z "$LTCC"; then -- { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 --echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 -+$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} - else -- { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 --echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 -+$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} - fi - fi - if test -z "$LTCFLAGS"; then -@@ -12521,16 +14005,16 @@ echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} - # Check whether tagname contains only valid characters - case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in - "") ;; -- *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 --echo "$as_me: error: invalid tag name: $tagname" >&2;} -+ *) { { $as_echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 -+$as_echo "$as_me: error: invalid tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } - ;; - esac - - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null - then -- { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 --echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} -+ { { $as_echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 -+$as_echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} - { (exit 1); exit 1; }; } - fi - -@@ -12543,7 +14027,7 @@ echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} - if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then -- ac_ext=cc -+ ac_ext=cpp - ac_cpp='$CXXCPP $CPPFLAGS' - ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' - ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -@@ -12662,18 +14146,18 @@ if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - --# Check whether --with-gnu-ld or --without-gnu-ld was given. -+# 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 -+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes - else - with_gnu_ld=no --fi; -+fi -+ - ac_prog=ld - if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. -- echo "$as_me:$LINENO: checking for ld used by $CC" >&5 --echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -@@ -12702,14 +14186,14 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 - ;; - esac - elif test "$with_gnu_ld" = yes; then -- echo "$as_me:$LINENO: checking for GNU ld" >&5 --echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 -+$as_echo_n "checking for GNU ld... " >&6; } - else -- echo "$as_me:$LINENO: checking for non-GNU ld" >&5 --echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR -@@ -12739,19 +14223,19 @@ fi - - LD="$lt_cv_path_LD" - if test -n "$LD"; then -- echo "$as_me:$LINENO: result: $LD" >&5 --echo "${ECHO_T}$LD" >&6 -+ { $as_echo "$as_me:$LINENO: result: $LD" >&5 -+$as_echo "$LD" >&6; } - else -- echo "$as_me:$LINENO: result: no" >&5 --echo "${ECHO_T}no" >&6 -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } - fi --test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 --echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} -+test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -+$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } --echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 --echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $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 &1 &5 --echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 -+$as_echo "$lt_cv_prog_gnu_ld" >&6; } - with_gnu_ld=$lt_cv_prog_gnu_ld - - -@@ -12814,8 +14298,8 @@ else - fi - - # PORTME: fill in a description of your system's C++ link characteristics --echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 --echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) -@@ -12927,27 +14411,26 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_cxx_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+ $as_test_x conftest$ac_exeext -+ }; then - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -12955,11 +14438,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -12989,27 +14475,26 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_cxx_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_cxx_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+ $as_test_x conftest$ac_exeext -+ }; then - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -13017,11 +14502,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -13752,8 +15240,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - ld_shlibs_CXX=no - ;; - esac --echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 --echo "${ECHO_T}$ld_shlibs_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -+$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - GCC_CXX="$GXX" -@@ -13773,7 +15261,7 @@ EOF - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. -@@ -13892,8 +15380,8 @@ lt_prog_compiler_wl_CXX= - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX= - --echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 --echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+$as_echo_n "checking for $compiler option to produce PIC... " >&6; } - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then -@@ -14166,18 +15654,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - esac - fi - --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -+$as_echo "$lt_prog_compiler_pic_CXX" >&6; } - - # - # Check to make sure the PIC flag actually works. - # - if test -n "$lt_prog_compiler_pic_CXX"; then - --echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 --echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } - if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext -@@ -14192,11 +15680,11 @@ else - -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:14195: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:15683: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 -- echo "$as_me:14199: \$? = $ac_status" >&5 -+ echo "$as_me:15687: \$? = $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. -@@ -14209,8 +15697,8 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -+$as_echo "$lt_prog_compiler_pic_works_CXX" >&6; } - - if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in -@@ -14237,10 +15725,10 @@ esac - # Check to make sure the static flag actually works. - # - wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" --echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 --echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_prog_compiler_static_works_CXX+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_static_works_CXX=no - save_LDFLAGS="$LDFLAGS" -@@ -14265,8 +15753,8 @@ else - LDFLAGS="$save_LDFLAGS" - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 --echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 -+$as_echo "$lt_prog_compiler_static_works_CXX" >&6; } - - if test x"$lt_prog_compiler_static_works_CXX" = xyes; then - : -@@ -14275,10 +15763,10 @@ else - fi - - --echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 --echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_CXX+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_prog_compiler_c_o_CXX=no - $rm -r conftest 2>/dev/null -@@ -14296,11 +15784,11 @@ else - -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:14299: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:15787: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 -- echo "$as_me:14303: \$? = $ac_status" >&5 -+ echo "$as_me:15791: \$? = $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 -@@ -14322,34 +15810,34 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 --echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } - - - hard_links="nottested" - if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user -- echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 --echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $hard_links" >&5 --echo "${ECHO_T}$hard_links" >&6 -+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 -+$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then -- { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 --echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} -+ { $as_echo "$as_me:$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 - --echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 --echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in -@@ -14373,8 +15861,8 @@ echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared librar - ;; - esac - --echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 --echo "${ECHO_T}$ld_shlibs_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -+$as_echo "$ld_shlibs_CXX" >&6; } - test "$ld_shlibs_CXX" = no && can_build_shared=no - - # -@@ -14394,15 +15882,15 @@ x|xyes) - # 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. -- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 --echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest -@@ -14420,7 +15908,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_CXX=no -@@ -14432,16 +15920,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - cat conftest.err 1>&5 - fi - $rm conftest* -- echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 --echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 -+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -+$as_echo "$archive_cmds_need_lc_CXX" >&6; } - ;; - esac - fi - ;; - esac - --echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 --echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+$as_echo_n "checking dynamic linker characteristics... " >&6; } - library_names_spec= - libname_spec='lib$name' - soname_spec= -@@ -14832,11 +16320,11 @@ linux*) - libsuff= - case "$host_cpu" in - x86_64*|s390x*|powerpc64*) -- echo '#line 14835 "configure"' > conftest.$ac_ext -+ echo '#line 16323 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *64-bit*) -@@ -15049,8 +16537,8 @@ uts4*) - dynamic_linker=no - ;; - esac --echo "$as_me:$LINENO: result: $dynamic_linker" >&5 --echo "${ECHO_T}$dynamic_linker" >&6 -+{ $as_echo "$as_me:$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" -@@ -15058,8 +16546,8 @@ if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - fi - --echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 --echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+$as_echo_n "checking how to hardcode library paths into programs... " >&6; } - hardcode_action_CXX= - if test -n "$hardcode_libdir_flag_spec_CXX" || \ - test -n "$runpath_var_CXX" || \ -@@ -15083,8 +16571,8 @@ else - # directories. - hardcode_action_CXX=unsupported - fi --echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 --echo "${ECHO_T}$hardcode_action_CXX" >&6 -+{ $as_echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -+$as_echo "$hardcode_action_CXX" >&6; } - - if test "$hardcode_action_CXX" = relink; then - # Fast installation is not supported -@@ -15612,13 +17100,13 @@ done - cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - --echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 --echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 --echo "$as_me:$LINENO: result: $can_build_shared" >&5 --echo "${ECHO_T}$can_build_shared" >&6 -+{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -+$as_echo_n "checking if libtool supports shared libraries... " >&6; } -+{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 -+$as_echo "$can_build_shared" >&6; } - --echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 --echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -@@ -15637,15 +17125,15 @@ aix4* | aix5*) - fi - ;; - esac --echo "$as_me:$LINENO: result: $enable_shared" >&5 --echo "${ECHO_T}$enable_shared" >&6 -+{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 -+$as_echo "$enable_shared" >&6; } - --echo "$as_me:$LINENO: checking whether to build static libraries" >&5 --echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 --echo "$as_me:$LINENO: result: $enable_static" >&5 --echo "${ECHO_T}$enable_static" >&6 -+{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 -+$as_echo "$enable_static" >&6; } - - GCC_F77="$G77" - LD_F77="$LD" -@@ -15654,8 +17142,8 @@ lt_prog_compiler_wl_F77= - lt_prog_compiler_pic_F77= - lt_prog_compiler_static_F77= - --echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 --echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+$as_echo_n "checking for $compiler option to produce PIC... " >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl_F77='-Wl,' -@@ -15864,18 +17352,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - esac - fi - --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -+$as_echo "$lt_prog_compiler_pic_F77" >&6; } - - # - # Check to make sure the PIC flag actually works. - # - if test -n "$lt_prog_compiler_pic_F77"; then - --echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 --echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } - if test "${lt_prog_compiler_pic_works_F77+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_pic_works_F77=no - ac_outfile=conftest.$ac_objext -@@ -15890,11 +17378,11 @@ else - -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:15893: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:17381: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 -- echo "$as_me:15897: \$? = $ac_status" >&5 -+ echo "$as_me:17385: \$? = $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. -@@ -15907,8 +17395,8 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -+$as_echo "$lt_prog_compiler_pic_works_F77" >&6; } - - if test x"$lt_prog_compiler_pic_works_F77" = xyes; then - case $lt_prog_compiler_pic_F77 in -@@ -15935,10 +17423,10 @@ esac - # Check to make sure the static flag actually works. - # - wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" --echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 --echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_prog_compiler_static_works_F77+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_static_works_F77=no - save_LDFLAGS="$LDFLAGS" -@@ -15963,8 +17451,8 @@ else - LDFLAGS="$save_LDFLAGS" - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 --echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 -+$as_echo "$lt_prog_compiler_static_works_F77" >&6; } - - if test x"$lt_prog_compiler_static_works_F77" = xyes; then - : -@@ -15973,10 +17461,10 @@ else - fi - - --echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 --echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_F77+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_prog_compiler_c_o_F77=no - $rm -r conftest 2>/dev/null -@@ -15994,11 +17482,11 @@ else - -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:15997: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:17485: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 -- echo "$as_me:16001: \$? = $ac_status" >&5 -+ echo "$as_me:17489: \$? = $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 -@@ -16020,34 +17508,34 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 --echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -+$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } - - - hard_links="nottested" - if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user -- echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 --echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $hard_links" >&5 --echo "${ECHO_T}$hard_links" >&6 -+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 -+$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then -- { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 --echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} -+ { $as_echo "$as_me:$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 - --echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 --echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_F77= -@@ -16452,27 +17940,26 @@ _LT_EOF - end - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_f77_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_f77_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+ $as_test_x conftest$ac_exeext -+ }; then - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -16480,11 +17967,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -16503,27 +17993,26 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - end - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_f77_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_f77_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+ $as_test_x conftest$ac_exeext -+ }; then - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -16531,11 +18020,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -16984,8 +18476,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - esac - fi - --echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 --echo "${ECHO_T}$ld_shlibs_F77" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -+$as_echo "$ld_shlibs_F77" >&6; } - test "$ld_shlibs_F77" = no && can_build_shared=no - - # -@@ -17005,15 +18497,15 @@ x|xyes) - # 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. -- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 --echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest -@@ -17031,7 +18523,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_F77=no -@@ -17043,16 +18535,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - cat conftest.err 1>&5 - fi - $rm conftest* -- echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 --echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 -+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -+$as_echo "$archive_cmds_need_lc_F77" >&6; } - ;; - esac - fi - ;; - esac - --echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 --echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+$as_echo_n "checking dynamic linker characteristics... " >&6; } - library_names_spec= - libname_spec='lib$name' - soname_spec= -@@ -17443,11 +18935,11 @@ linux*) - libsuff= - case "$host_cpu" in - x86_64*|s390x*|powerpc64*) -- echo '#line 17446 "configure"' > conftest.$ac_ext -+ echo '#line 18938 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *64-bit*) -@@ -17660,8 +19152,8 @@ uts4*) - dynamic_linker=no - ;; - esac --echo "$as_me:$LINENO: result: $dynamic_linker" >&5 --echo "${ECHO_T}$dynamic_linker" >&6 -+{ $as_echo "$as_me:$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" -@@ -17669,8 +19161,8 @@ if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - fi - --echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 --echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+$as_echo_n "checking how to hardcode library paths into programs... " >&6; } - hardcode_action_F77= - if test -n "$hardcode_libdir_flag_spec_F77" || \ - test -n "$runpath_var_F77" || \ -@@ -17694,8 +19186,8 @@ else - # directories. - hardcode_action_F77=unsupported - fi --echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 --echo "${ECHO_T}$hardcode_action_F77" >&6 -+{ $as_echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -+$as_echo "$hardcode_action_F77" >&6; } - - if test "$hardcode_action_F77" = relink; then - # Fast installation is not supported -@@ -18135,7 +19627,6 @@ CC="$lt_save_CC" - if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - - -- - # Source file extension for Java test sources. - ac_ext=java - -@@ -18203,10 +19694,10 @@ if test "$GCC" = yes; then - lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' - - --echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 --echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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 -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext -@@ -18221,11 +19712,11 @@ else - -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:18224: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:19715: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 -- echo "$as_me:18228: \$? = $ac_status" >&5 -+ echo "$as_me:19719: \$? = $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. -@@ -18238,8 +19729,8 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 --echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 -+{ $as_echo "$as_me:$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_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" -@@ -18253,8 +19744,8 @@ lt_prog_compiler_wl_GCJ= - lt_prog_compiler_pic_GCJ= - lt_prog_compiler_static_GCJ= - --echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 --echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -+$as_echo_n "checking for $compiler option to produce PIC... " >&6; } - - if test "$GCC" = yes; then - lt_prog_compiler_wl_GCJ='-Wl,' -@@ -18463,18 +19954,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - esac - fi - --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -+$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } - - # - # Check to make sure the PIC flag actually works. - # - if test -n "$lt_prog_compiler_pic_GCJ"; then - --echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 --echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } - if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_pic_works_GCJ=no - ac_outfile=conftest.$ac_objext -@@ -18489,11 +19980,11 @@ else - -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:18492: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:19983: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 -- echo "$as_me:18496: \$? = $ac_status" >&5 -+ echo "$as_me:19987: \$? = $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. -@@ -18506,8 +19997,8 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 --echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -+$as_echo "$lt_prog_compiler_pic_works_GCJ" >&6; } - - if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then - case $lt_prog_compiler_pic_GCJ in -@@ -18534,10 +20025,10 @@ esac - # Check to make sure the static flag actually works. - # - wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" --echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 --echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_prog_compiler_static_works_GCJ+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_prog_compiler_static_works_GCJ=no - save_LDFLAGS="$LDFLAGS" -@@ -18562,8 +20053,8 @@ else - LDFLAGS="$save_LDFLAGS" - - fi --echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 --echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 -+$as_echo "$lt_prog_compiler_static_works_GCJ" >&6; } - - if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then - : -@@ -18572,10 +20063,10 @@ else - fi - - --echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 --echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_GCJ+set}" = set; then -- echo $ECHO_N "(cached) $ECHO_C" >&6 -+ $as_echo_n "(cached) " >&6 - else - lt_cv_prog_compiler_c_o_GCJ=no - $rm -r conftest 2>/dev/null -@@ -18593,11 +20084,11 @@ else - -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:18596: $lt_compile\"" >&5) -+ (eval echo "\"\$as_me:20087: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 -- echo "$as_me:18600: \$? = $ac_status" >&5 -+ echo "$as_me:20091: \$? = $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 -@@ -18619,34 +20110,34 @@ else - $rm conftest* - - fi --echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 --echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 -+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -+$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } - - - hard_links="nottested" - if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user -- echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 --echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 -+ { $as_echo "$as_me:$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 -- echo "$as_me:$LINENO: result: $hard_links" >&5 --echo "${ECHO_T}$hard_links" >&6 -+ { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 -+$as_echo "$hard_links" >&6; } - if test "$hard_links" = no; then -- { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 --echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} -+ { $as_echo "$as_me:$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 - --echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 --echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -+{ $as_echo "$as_me:$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_GCJ= -@@ -19061,27 +20552,26 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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 - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -19089,11 +20579,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -19122,27 +20615,26 @@ main () - } - _ACEOF - rm -f conftest.$ac_objext conftest$ac_exeext --if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 -- (eval $ac_link) 2>conftest.er1 -+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:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); } && -- { ac_try='test -z "$ac_c_werror_flag" -- || test ! -s conftest.err' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; } && -- { ac_try='test -s conftest$ac_exeext' -- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ 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 - - aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'` -@@ -19150,11 +20642,14 @@ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File S - if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } - }'`; fi - else -- echo "$as_me: failed program was:" >&5 -+ $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+ - fi --rm -f conftest.err conftest.$ac_objext \ -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - -@@ -19603,8 +21098,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - esac - fi - --echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 --echo "${ECHO_T}$ld_shlibs_GCJ" >&6 -+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -+$as_echo "$ld_shlibs_GCJ" >&6; } - test "$ld_shlibs_GCJ" = no && can_build_shared=no - - # -@@ -19624,15 +21119,15 @@ x|xyes) - # 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. -- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 --echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 -+ { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest -@@ -19650,7 +21145,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_GCJ=no -@@ -19662,16 +21157,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& - cat conftest.err 1>&5 - fi - $rm conftest* -- echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 --echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 -+ { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -+$as_echo "$archive_cmds_need_lc_GCJ" >&6; } - ;; - esac - fi - ;; - esac - --echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 --echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -+$as_echo_n "checking dynamic linker characteristics... " >&6; } - library_names_spec= - libname_spec='lib$name' - soname_spec= -@@ -20062,11 +21557,11 @@ linux*) - libsuff= - case "$host_cpu" in - x86_64*|s390x*|powerpc64*) -- echo '#line 20065 "configure"' > conftest.$ac_ext -+ echo '#line 21560 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? -- echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *64-bit*) -@@ -20279,8 +21774,8 @@ uts4*) - dynamic_linker=no - ;; - esac --echo "$as_me:$LINENO: result: $dynamic_linker" >&5 --echo "${ECHO_T}$dynamic_linker" >&6 -+{ $as_echo "$as_me:$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" -@@ -20288,8 +21783,8 @@ if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" - fi - --echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 --echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -+{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -+$as_echo_n "checking how to hardcode library paths into programs... " >&6; } - hardcode_action_GCJ= - if test -n "$hardcode_libdir_flag_spec_GCJ" || \ - test -n "$runpath_var_GCJ" || \ -@@ -20313,8 +21808,8 @@ else - # directories. - hardcode_action_GCJ=unsupported - fi --echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 --echo "${ECHO_T}$hardcode_action_GCJ" >&6 -+{ $as_echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -+$as_echo "$hardcode_action_GCJ" >&6; } - - if test "$hardcode_action_GCJ" = relink; then - # Fast installation is not supported -@@ -20753,7 +22248,6 @@ CC="$lt_save_CC" - RC) - - -- - # Source file extension for RC test sources. - ac_ext=rc - -@@ -21232,8 +22726,8 @@ CC="$lt_save_CC" - ;; - - *) -- { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 --echo "$as_me: error: Unsupported tag name: $tagname" >&2;} -+ { { $as_echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 -+$as_echo "$as_me: error: Unsupported tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } - ;; - esac -@@ -21252,8 +22746,8 @@ echo "$as_me: error: Unsupported tag name: $tagname" >&2;} - chmod +x "$ofile" - else - rm -f "${ofile}T" -- { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 --echo "$as_me: error: unable to update list of available tagged configurations." >&2;} -+ { { $as_echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 -+$as_echo "$as_me: error: unable to update list of available tagged configurations." >&2;} - { (exit 1); exit 1; }; } - fi - fi -@@ -21291,13 +22785,13 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - CFLAGS="-O2 -Wall" - ## check for --enable-debug first before checking CFLAGS before - ## so that we don't mix -O and -g --# Check whether --enable-debug or --disable-debug was given. -+# Check whether --enable-debug was given. - if test "${enable_debug+set}" = set; then -- enableval="$enable_debug" -- if eval "test x$enable_debug = xyes"; then -+ enableval=$enable_debug; if eval "test x$enable_debug = xyes"; then - CFLAGS="${CFLAGS} -g -O0" - fi --fi; -+fi -+ - - - if test x$debug = xtrue; then -@@ -21309,12 +22803,13 @@ else - fi - - -- ac_config_commands="$ac_config_commands default" -+ac_config_commands="$ac_config_commands default" - - - - -- ac_config_files="$ac_config_files Makefile src/Makefile src/apps/Makefile src/apps/dhcpc/Makefile src/apps/brcm-iscsi/Makefile src/uip/Makefile src/unix/Makefile src/unix/libs/Makefile" -+ac_config_files="$ac_config_files Makefile src/Makefile src/apps/Makefile src/apps/dhcpc/Makefile src/apps/brcm-iscsi/Makefile src/uip/Makefile src/unix/Makefile src/unix/libs/Makefile" -+ - 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 -@@ -21333,39 +22828,59 @@ _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, don't put newlines in cache variables' values. -+# 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:$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= ;; #( -+ *) $as_unset $ac_var ;; -+ esac ;; -+ esac -+ done -+ - (set) 2>&1 | -- case `(ac_space=' '; set | grep ac_space) 2>&1` in -- *ac_space=\ *) -+ 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 \ -- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" -+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; -- esac; --} | -+ esac | -+ sort -+) | - sed ' -+ /^ac_cv_env_/b end - t clear -- : clear -+ :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end -- /^ac_cv_env/!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" && echo "updating cache $cache_file" -+ 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:$LINENO: updating cache $cache_file" >&5 -+$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else -- echo "not updating unwritable cache $cache_file" -+ { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi - fi - rm -f confcache -@@ -21374,32 +22889,18 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix - # Let make expand exec_prefix. - test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - --# VPATH may cause trouble with some makes, so we remove $(srcdir), --# ${srcdir} and @srcdir@ 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[ ]*=/{ --s/:*\$(srcdir):*/:/; --s/:*\${srcdir}:*/:/; --s/:*@srcdir@:*/:/; --s/^\([^=]*=[ ]*\):*/\1/; --s/:*$//; --s/^[^=]*=[ ]*$//; --}' --fi -- - 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_i=`echo "$ac_i" | -- sed 's/\$U\././;s/\.o$//;s/\.obj$//'` -- # 2. Add them. -- ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" -- ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' -+ 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. -+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" -+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' - done - LIBOBJS=$ac_libobjs - -@@ -21407,40 +22908,42 @@ LTLIBOBJS=$ac_ltlibobjs - - - if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then -- { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -+ { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. - Usually this means the macro was only invoked conditionally." >&5 --echo "$as_me: error: conditional \"AMDEP\" was never defined. -+$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. - Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } - fi - if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then -- { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -+ { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. - Usually this means the macro was only invoked conditionally." >&5 --echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -+$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. - Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } - fi -+ - if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then -- { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -+ { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. - Usually this means the macro was only invoked conditionally." >&5 --echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -+$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. - Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } - fi - if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then -- { { echo "$as_me:$LINENO: error: conditional \"DEBUG\" was never defined. -+ { { $as_echo "$as_me:$LINENO: error: conditional \"DEBUG\" was never defined. - Usually this means the macro was only invoked conditionally." >&5 --echo "$as_me: error: conditional \"DEBUG\" was never defined. -+$as_echo "$as_me: error: conditional \"DEBUG\" was never defined. - Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } - fi - - : ${CONFIG_STATUS=./config.status} -+ac_write_fail=0 - ac_clean_files_save=$ac_clean_files - ac_clean_files="$ac_clean_files $CONFIG_STATUS" --{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 --echo "$as_me: creating $CONFIG_STATUS" >&6;} --cat >$CONFIG_STATUS <<_ACEOF -+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - #! $SHELL - # Generated by $as_me. - # Run this file to recreate the current configuration. -@@ -21453,22 +22956,78 @@ ac_cs_silent=false - SHELL=\${CONFIG_SHELL-$SHELL} - _ACEOF - --cat >>$CONFIG_STATUS <<\_ACEOF -+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - ## --------------------- ## - ## M4sh Initialization. ## - ## --------------------- ## - --# Be Bourne compatible -+# 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=: -- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which -+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' --elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then -- set -o posix -+ setopt NO_GLOB_SUBST -+else -+ case `(set -o) 2>/dev/null` in -+ *posix*) set -o posix ;; -+esac -+ -+fi -+ -+ -+ -+ -+# PATH needs CR -+# 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_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 -+if (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 --DUALCASE=1; export DUALCASE # for MKS sh - - # Support unset when possible. - if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then -@@ -21478,33 +23037,60 @@ else - 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); exit 1; } -+fi -+ - # Work around bugs in pre-3.0 UWIN ksh. --$as_unset ENV MAIL MAILPATH -+for as_var in ENV MAIL MAILPATH -+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -+done - PS1='$ ' - PS2='> ' - PS4='+ ' - - # NLS nuisances. --for as_var in \ -- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ -- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ -- LC_TELEPHONE LC_TIME --do -- if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then -- eval $as_var=C; export $as_var -- else -- $as_unset $as_var -- fi --done -+LC_ALL=C -+export LC_ALL -+LANGUAGE=C -+export LANGUAGE - - # Required to use basename. --if expr a : '\(a\)' >/dev/null 2>&1; then -+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 -+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename - else - as_basename=false -@@ -21512,159 +23098,122 @@ fi - - - # Name of the executable. --as_me=`$as_basename "$0" || -+as_me=`$as_basename -- "$0" || - $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ -- X"$0" : 'X\(/\)$' \| \ -- . : '\(.\)' 2>/dev/null || --echo X/"$0" | -- sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } -- /^X\/\(\/\/\)$/{ s//\1/; q; } -- /^X\/\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ X"$0" : 'X\(/\)' \| . 2>/dev/null || -+$as_echo X/"$0" | -+ sed '/^.*\/\([^/][^/]*\)\/*$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\/\)$/{ -+ s//\1/ -+ q -+ } -+ /^X\/\(\/\).*/{ -+ s//\1/ -+ q -+ } -+ s/.*/./; q'` - -+# CDPATH. -+$as_unset CDPATH - --# PATH needs CR, and LINENO needs CR and PATH. --# 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 - --# The user is always right. --if test "${PATH_SEPARATOR+set}" != set; then -- echo "#! /bin/sh" >conf$$.sh -- echo "exit 0" >>conf$$.sh -- chmod +x conf$$.sh -- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then -- PATH_SEPARATOR=';' -- else -- PATH_SEPARATOR=: -- fi -- rm -f conf$$.sh --fi - -- -- as_lineno_1=$LINENO -- as_lineno_2=$LINENO -- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` -- test "x$as_lineno_1" != "x$as_lineno_2" && -- test "x$as_lineno_3" = "x$as_lineno_2" || { -- # Find who we are. Look in the path if we contain no path at all -- # relative or not. -- 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 -- -- ;; -- 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 -- { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 --echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} -- { (exit 1); exit 1; }; } -- fi -- case $CONFIG_SHELL in -- '') -- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR --for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH --do -- IFS=$as_save_IFS -- test -z "$as_dir" && as_dir=. -- for as_base in sh bash ksh sh5; do -- case $as_dir in -- /*) -- if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO -- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && -- test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then -- $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } -- $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } -- CONFIG_SHELL=$as_dir/$as_base -- export CONFIG_SHELL -- exec "$CONFIG_SHELL" "$0" ${1+"$@"} -- fi;; -- esac -- done --done --;; -- esac -+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a -- # line-number line before each line; the second 'sed' does the real -- # work. The second script uses 'N' to pair each line-number line -- # with the numbered line, and appends trailing '-' during -- # substitution so that $LINENO is not a special case at line end. -+ # line-number line after each line using $LINENO; the second 'sed' -+ # does the real work. The second script uses 'N' to pair each -+ # line-number line with the line containing $LINENO, and appends -+ # trailing '-' during substitution so that $LINENO is not a special -+ # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the -- # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) -- sed '=' <$as_myself | -+ # scripts with optimization help from Paolo Bonzini. Blame Lee -+ # E. McMahon (1931-1989) for sed's syntax. :-) -+ sed -n ' -+ p -+ /[$]LINENO/= -+ ' <$as_myself | - sed ' -+ s/[$]LINENO.*/&-/ -+ t lineno -+ b -+ :lineno - N -- s,$,-, -- : loop -- s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, -+ :loop -+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop -- s,-$,, -- s,^['$as_cr_digits']*\n,, -+ s/-\n.*// - ' >$as_me.lineno && -- chmod +x $as_me.lineno || -- { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 --echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} -+ chmod +x "$as_me.lineno" || -+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); 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 sensible to this). -- . ./$as_me.lineno -+ # original and so on. Autoconf is especially sensitive to this). -+ . "./$as_me.lineno" - # Exit status is that of the last command. - exit - } - - --case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in -- *c*,-n*) ECHO_N= ECHO_C=' --' ECHO_T=' ' ;; -- *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; -- *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then -+ as_dirname=dirname -+else -+ as_dirname=false -+fi -+ -+ECHO_C= ECHO_N= ECHO_T= -+case `echo -n x` in -+-n*) -+ case `echo 'x\c'` in -+ *c*) ECHO_T=' ';; # ECHO_T is single tab character. -+ *) ECHO_C='\c';; -+ esac;; -+*) -+ ECHO_N='-n';; - esac -- --if expr a : '\(a\)' >/dev/null 2>&1; then -+if expr a : '\(a\)' >/dev/null 2>&1 && -+ test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr - else - as_expr=false - fi - - rm -f conf$$ conf$$.exe conf$$.file --echo >conf$$.file --if ln -s conf$$.file conf$$ 2>/dev/null; then -- # We could just check for DJGPP; but this test a) works b) is more generic -- # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). -- if test -f conf$$.exe; then -- # Don't use ln at all; we don't have any links -- as_ln_s='cp -p' -- else -+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 --elif ln conf$$.file conf$$ 2>/dev/null; then -- as_ln_s=ln - else - as_ln_s='cp -p' - fi --rm -f conf$$ conf$$.exe conf$$.file -+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=: -@@ -21673,7 +23222,28 @@ else - as_mkdir_p=false - fi - --as_executable_p="test -f" -+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'" -@@ -21682,31 +23252,14 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - --# IFS --# We need space, tab and new line, in precisely that order. --as_nl=' --' --IFS=" $as_nl" -- --# CDPATH. --$as_unset CDPATH -- - exec 6>&1 - --# Open the log real soon, to keep \$[0] and so on meaningful, and to -+# 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. Logging --version etc. is OK. --exec 5>>config.log --{ -- echo -- sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX --## Running $as_me. ## --_ASBOX --} >&5 --cat >&5 <<_CSEOF -- --This file was extended by iscsiuio $as_me 0.7.8.1b, which was --generated by GNU Autoconf 2.59. Invocation command line was -+# values after options handling. -+ac_log=" -+This file was extended by iscsiuio $as_me 0.7.8.2, which was -+generated by GNU Autoconf 2.63. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS -@@ -21714,45 +23267,45 @@ generated by GNU Autoconf 2.59. Invocation command line was - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - --_CSEOF --echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 --echo >&5 -+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. --if test -n "$ac_config_files"; then -- echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS --fi -+config_files="$ac_config_files" -+config_headers="$ac_config_headers" -+config_commands="$ac_config_commands" - --if test -n "$ac_config_headers"; then -- echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS --fi -- --if test -n "$ac_config_links"; then -- echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS --fi -- --if test -n "$ac_config_commands"; then -- echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS --fi -- --cat >>$CONFIG_STATUS <<\_ACEOF -+_ACEOF - -+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - ac_cs_usage="\ - \`$as_me' instantiates files from templates according to the - current configuration. - --Usage: $0 [OPTIONS] [FILE]... -+Usage: $0 [OPTION]... [FILE]... - - -h, --help print this help, then exit -- -V, --version print version number, then exit -- -q, --quiet do not print progress messages -+ -V, --version print version number and configuration settings, 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 -+ --file=FILE[:TEMPLATE] -+ instantiate the configuration file FILE -+ --header=FILE[:TEMPLATE] -+ instantiate the configuration header FILE - - Configuration files: - $config_files -@@ -21764,83 +23317,83 @@ Configuration commands: - $config_commands - - Report bugs to ." --_ACEOF - --cat >>$CONFIG_STATUS <<_ACEOF -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_cs_version="\\ --iscsiuio config.status 0.7.8.1b --configured by $0, generated by GNU Autoconf 2.59, -- with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -+iscsiuio config.status 0.7.8.2 -+configured by $0, generated by GNU Autoconf 2.63, -+ with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - --Copyright (C) 2003 Free Software Foundation, Inc. -+Copyright (C) 2008 Free Software Foundation, Inc. - This config.status script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it." --srcdir=$srcdir --INSTALL="$INSTALL" -+ -+ac_pwd='$ac_pwd' -+srcdir='$srcdir' -+INSTALL='$INSTALL' -+AWK='$AWK' -+test -n "\$AWK" || AWK=awk - _ACEOF - --cat >>$CONFIG_STATUS <<\_ACEOF --# If no file are specified by the user, then we need to provide default --# value. By we need to know if files were specified by the user. -+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_option=`expr "X$1" : 'X\([^=]*\)='` -+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; -- -*) -+ *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; -- *) # This is not an option, so the user has probably given explicit -- # arguments. -- ac_option=$1 -- ac_need_defaults=false;; - esac - - case $ac_option in - # Handling of the options. --_ACEOF --cat >>$CONFIG_STATUS <<\_ACEOF - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; -- --version | --vers* | -V ) -- echo "$ac_cs_version"; exit 0 ;; -- --he | --h) -- # Conflict between --help and --header -- { { echo "$as_me:$LINENO: error: ambiguous option: $1 --Try \`$0 --help' for more information." >&5 --echo "$as_me: error: ambiguous option: $1 --Try \`$0 --help' for more information." >&2;} -- { (exit 1); exit 1; }; };; -- --help | --hel | -h ) -- echo "$ac_cs_usage"; exit 0 ;; -- --debug | --d* | -d ) -+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) -+ $as_echo "$ac_cs_version"; exit ;; -+ --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift -- CONFIG_FILES="$CONFIG_FILES $ac_optarg" -+ case $ac_optarg in -+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; -+ esac -+ CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift -- CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" -+ case $ac_optarg in -+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; -+ esac -+ CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" - ac_need_defaults=false;; -+ --he | --h) -+ # Conflict between --help and --header -+ { $as_echo "$as_me: error: ambiguous option: $1 -+Try \`$0 --help' for more information." >&2 -+ { (exit 1); exit 1; }; };; -+ --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. -- -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 --Try \`$0 --help' for more information." >&5 --echo "$as_me: error: unrecognized option: $1 --Try \`$0 --help' for more information." >&2;} -+ -*) { $as_echo "$as_me: error: unrecognized option: $1 -+Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - -- *) ac_config_targets="$ac_config_targets $1" ;; -+ *) ac_config_targets="$ac_config_targets $1" -+ ac_need_defaults=false ;; - - esac - shift -@@ -21854,48 +23407,62 @@ if $ac_cs_silent; then - fi - - _ACEOF --cat >>$CONFIG_STATUS <<_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - if \$ac_cs_recheck; then -- echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 -- exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -+ 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 - --cat >>$CONFIG_STATUS <<_ACEOF -+_ACEOF -+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - # --# INIT-COMMANDS section. -+# INIT-COMMANDS - # -- - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - - - _ACEOF - -+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -- --cat >>$CONFIG_STATUS <<\_ACEOF -+# Handling of arguments. - for ac_config_target in $ac_config_targets - do -- case "$ac_config_target" in -- # Handling of arguments. -- "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; -- "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; -- "src/apps/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/Makefile" ;; -- "src/apps/dhcpc/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/dhcpc/Makefile" ;; -- "src/apps/brcm-iscsi/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/apps/brcm-iscsi/Makefile" ;; -- "src/uip/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/uip/Makefile" ;; -- "src/unix/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/unix/Makefile" ;; -- "src/unix/libs/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/unix/libs/Makefile" ;; -- "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; -- "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; -- "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; -- *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 --echo "$as_me: error: invalid argument: $ac_config_target" >&2;} -+ case $ac_config_target in -+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; -+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; -+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; -+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; -+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; -+ "src/apps/Makefile") CONFIG_FILES="$CONFIG_FILES src/apps/Makefile" ;; -+ "src/apps/dhcpc/Makefile") CONFIG_FILES="$CONFIG_FILES src/apps/dhcpc/Makefile" ;; -+ "src/apps/brcm-iscsi/Makefile") CONFIG_FILES="$CONFIG_FILES src/apps/brcm-iscsi/Makefile" ;; -+ "src/uip/Makefile") CONFIG_FILES="$CONFIG_FILES src/uip/Makefile" ;; -+ "src/unix/Makefile") CONFIG_FILES="$CONFIG_FILES src/unix/Makefile" ;; -+ "src/unix/libs/Makefile") CONFIG_FILES="$CONFIG_FILES src/unix/libs/Makefile" ;; -+ -+ *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - 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 -@@ -21907,744 +23474,635 @@ if $ac_need_defaults; then - fi - - # Have a temporary directory for convenience. Make it in the build tree --# simply because there is no reason to put it here, and in addition, -+# simply because there is no reason against having it here, and in addition, - # creating and moving files from /tmp can sometimes cause problems. --# Create a temporary directory, and hook for its removal unless debugging. -+# 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 || - { -- trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 -+ tmp= -+ trap 'exit_status=$? -+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -+' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 - } -- - # Create a (secure) tmp directory for tmp files. - - { -- tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && -+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" - } || - { -- tmp=./confstat$$-$RANDOM -- (umask 077 && mkdir $tmp) -+ tmp=./conf$$-$RANDOM -+ (umask 077 && mkdir "$tmp") - } || - { -- echo "$me: cannot create a temporary directory in ." >&2 -+ $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } - } - --_ACEOF -- --cat >>$CONFIG_STATUS <<_ACEOF -+# 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 - --# --# CONFIG_FILES section. --# - --# No need to generate the scripts if there are no CONFIG_FILES. --# This happens for instance when ./config.status config.h --if test -n "\$CONFIG_FILES"; then -- # Protect against being on the right side of a sed subst in config.status. -- sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; -- s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF --s,@SHELL@,$SHELL,;t t --s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t --s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t --s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t --s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t --s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t --s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t --s,@exec_prefix@,$exec_prefix,;t t --s,@prefix@,$prefix,;t t --s,@program_transform_name@,$program_transform_name,;t t --s,@bindir@,$bindir,;t t --s,@sbindir@,$sbindir,;t t --s,@libexecdir@,$libexecdir,;t t --s,@datadir@,$datadir,;t t --s,@sysconfdir@,$sysconfdir,;t t --s,@sharedstatedir@,$sharedstatedir,;t t --s,@localstatedir@,$localstatedir,;t t --s,@libdir@,$libdir,;t t --s,@includedir@,$includedir,;t t --s,@oldincludedir@,$oldincludedir,;t t --s,@infodir@,$infodir,;t t --s,@mandir@,$mandir,;t t --s,@build_alias@,$build_alias,;t t --s,@host_alias@,$host_alias,;t t --s,@target_alias@,$target_alias,;t t --s,@DEFS@,$DEFS,;t t --s,@ECHO_C@,$ECHO_C,;t t --s,@ECHO_N@,$ECHO_N,;t t --s,@ECHO_T@,$ECHO_T,;t t --s,@LIBS@,$LIBS,;t t --s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t --s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t --s,@INSTALL_DATA@,$INSTALL_DATA,;t t --s,@CYGPATH_W@,$CYGPATH_W,;t t --s,@PACKAGE@,$PACKAGE,;t t --s,@VERSION@,$VERSION,;t t --s,@ACLOCAL@,$ACLOCAL,;t t --s,@AUTOCONF@,$AUTOCONF,;t t --s,@AUTOMAKE@,$AUTOMAKE,;t t --s,@AUTOHEADER@,$AUTOHEADER,;t t --s,@MAKEINFO@,$MAKEINFO,;t t --s,@install_sh@,$install_sh,;t t --s,@STRIP@,$STRIP,;t t --s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t --s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t --s,@mkdir_p@,$mkdir_p,;t t --s,@AWK@,$AWK,;t t --s,@SET_MAKE@,$SET_MAKE,;t t --s,@am__leading_dot@,$am__leading_dot,;t t --s,@AMTAR@,$AMTAR,;t t --s,@am__tar@,$am__tar,;t t --s,@am__untar@,$am__untar,;t t --s,@BASH@,$BASH,;t t --s,@CC@,$CC,;t t --s,@CFLAGS@,$CFLAGS,;t t --s,@LDFLAGS@,$LDFLAGS,;t t --s,@CPPFLAGS@,$CPPFLAGS,;t t --s,@ac_ct_CC@,$ac_ct_CC,;t t --s,@EXEEXT@,$EXEEXT,;t t --s,@OBJEXT@,$OBJEXT,;t t --s,@DEPDIR@,$DEPDIR,;t t --s,@am__include@,$am__include,;t t --s,@am__quote@,$am__quote,;t t --s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t --s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t --s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t --s,@CCDEPMODE@,$CCDEPMODE,;t t --s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t --s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t --s,@RANLIB@,$RANLIB,;t t --s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t --s,@CPP@,$CPP,;t t --s,@EGREP@,$EGREP,;t t --s,@ENDIAN@,$ENDIAN,;t t --s,@build@,$build,;t t --s,@build_cpu@,$build_cpu,;t t --s,@build_vendor@,$build_vendor,;t t --s,@build_os@,$build_os,;t t --s,@host@,$host,;t t --s,@host_cpu@,$host_cpu,;t t --s,@host_vendor@,$host_vendor,;t t --s,@host_os@,$host_os,;t t --s,@SED@,$SED,;t t --s,@LN_S@,$LN_S,;t t --s,@ECHO@,$ECHO,;t t --s,@AR@,$AR,;t t --s,@ac_ct_AR@,$ac_ct_AR,;t t --s,@CXX@,$CXX,;t t --s,@CXXFLAGS@,$CXXFLAGS,;t t --s,@ac_ct_CXX@,$ac_ct_CXX,;t t --s,@CXXDEPMODE@,$CXXDEPMODE,;t t --s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t --s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t --s,@CXXCPP@,$CXXCPP,;t t --s,@F77@,$F77,;t t --s,@FFLAGS@,$FFLAGS,;t t --s,@ac_ct_F77@,$ac_ct_F77,;t t --s,@LIBTOOL@,$LIBTOOL,;t t --s,@DEBUG_TRUE@,$DEBUG_TRUE,;t t --s,@DEBUG_FALSE@,$DEBUG_FALSE,;t t --s,@LIBOBJS@,$LIBOBJS,;t t --s,@LTLIBOBJS@,$LTLIBOBJS,;t t --CEOF -+ac_cr=' ' -+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 - -- cat >>$CONFIG_STATUS <<\_ACEOF -- # Split the substitutions into bite-sized pieces for seds with -- # small command number limits, like on Digital OSF/1 and HP-UX. -- ac_max_sed_lines=48 -- ac_sed_frag=1 # Number of current file. -- ac_beg=1 # First line for current file. -- ac_end=$ac_max_sed_lines # Line after last line for current file. -- ac_more_lines=: -- ac_sed_cmds= -- while $ac_more_lines; do -- if test $ac_beg -gt 1; then -- sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag -- else -- sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag -- fi -- if test ! -s $tmp/subs.frag; then -- ac_more_lines=false -- else -- # The purpose of the label and of the branching condition is to -- # speed up the sed processing (if there are no `@' at all, there -- # is no need to browse any of the substitutions). -- # These are the two extra sed commands mentioned above. -- (echo ':t -- /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed -- if test -z "$ac_sed_cmds"; then -- ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" -- else -- ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" -- fi -- ac_sed_frag=`expr $ac_sed_frag + 1` -- ac_beg=$ac_end -- ac_end=`expr $ac_end + $ac_max_sed_lines` -- fi -- done -- if test -z "$ac_sed_cmds"; then -- ac_sed_cmds=cat -+ -+{ -+ echo "cat >conf$$subs.awk <<_ACEOF" && -+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && -+ echo "_ACEOF" -+} >conf$$subs.sh || -+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} -+ { (exit 1); exit 1; }; } -+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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} -+ { (exit 1); exit 1; }; } -+ -+ 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} -+ { (exit 1); exit 1; }; } -+ 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_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -+$as_echo "$as_me: error: could not setup config files machinery" >&2;} -+ { (exit 1); exit 1; }; } -+_ACEOF -+ -+# VPATH may cause trouble with some makes, so we remove $(srcdir), -+# ${srcdir} and @srcdir@ 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[ ]*=/{ -+s/:*\$(srcdir):*/:/ -+s/:*\${srcdir}:*/:/ -+s/:*@srcdir@:*/:/ -+s/^\([^=]*=[ ]*\):*/\1/ -+s/:*$// -+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 --cat >>$CONFIG_STATUS <<\_ACEOF --for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue -- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". -- case $ac_file in -- - | *:- | *:-:* ) # input from stdin -- cat >$tmp/stdin -- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -- *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -- * ) ac_file_in=$ac_file.in ;; -+ -+# 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_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -+$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} -+ { (exit 1); exit 1; }; } -+ 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -+$as_echo "$as_me: error: could not setup config headers machinery" >&2;} -+ { (exit 1); exit 1; }; } -+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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} -+ { (exit 1); exit 1; }; };; -+ :[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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} -+ { (exit 1); exit 1; }; };; -+ esac -+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac -+ ac_file_inputs="$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:$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_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -+$as_echo "$as_me: error: could not create $ac_file" >&2;} -+ { (exit 1); exit 1; }; } ;; -+ esac -+ ;; - esac - -- # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. -- ac_dir=`(dirname "$ac_file") 2>/dev/null || -+ 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 || --echo X"$ac_file" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- { if $as_mkdir_p; then -- mkdir -p "$ac_dir" -- else -- as_dir="$ac_dir" -+ 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" -+ case $as_dir in #( -+ -*) as_dir=./$as_dir;; -+ esac -+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= -- while test ! -d "$as_dir"; do -- as_dirs="$as_dir $as_dirs" -- as_dir=`(dirname "$as_dir") 2>/dev/null || -+ 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 || --echo X"$as_dir" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ 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 ! -n "$as_dirs" || mkdir $as_dirs -- fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 --echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -+ test -z "$as_dirs" || eval "mkdir $as_dirs" -+ } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } -- - ac_builddir=. - --if test "$ac_dir" != .; then -- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -- # A "../" for each directory in $ac_dir_suffix. -- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` --else -- ac_dir_suffix= ac_top_builddir= --fi -+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 -- .) # No --srcdir option. We are building in place. -+ .) # We are building in place. - ac_srcdir=. -- if test -z "$ac_top_builddir"; then -- ac_top_srcdir=. -- else -- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -- fi ;; -- [\\/]* | ?:[\\/]* ) # Absolute path. -+ 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 ;; -- *) # Relative path. -- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -- ac_top_srcdir=$ac_top_builddir$srcdir ;; --esac -+ 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 - --# Do not use `cd foo && pwd` to compute absolute paths, because --# the directories may not exist. --case `pwd` in --.) ac_abs_builddir="$ac_dir";; --*) -- case "$ac_dir" in -- .) ac_abs_builddir=`pwd`;; -- [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -- *) ac_abs_builddir=`pwd`/"$ac_dir";; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_top_builddir=${ac_top_builddir}.;; --*) -- case ${ac_top_builddir}. in -- .) ac_abs_top_builddir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -- *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_srcdir=$ac_srcdir;; --*) -- case $ac_srcdir in -- .) ac_abs_srcdir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -- *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_top_srcdir=$ac_top_srcdir;; --*) -- case $ac_top_srcdir in -- .) ac_abs_top_srcdir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -- *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -- esac;; --esac - -+ case $ac_mode in -+ :F) -+ # -+ # CONFIG_FILE -+ # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; -- *) ac_INSTALL=$ac_top_builddir$INSTALL ;; -+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -+_ACEOF - -- if test x"$ac_file" != x-; then -- { echo "$as_me:$LINENO: creating $ac_file" >&5 --echo "$as_me: creating $ac_file" >&6;} -- rm -f "$ac_file" -- fi -- # 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. */ -- if test x"$ac_file" = x-; then -- configure_input= -- else -- configure_input="$ac_file. " -- fi -- configure_input=$configure_input"Generated from `echo $ac_file_in | -- sed 's,.*/,,'` by configure." -+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= - -- # First look for the input files in the build tree, otherwise in the -- # src tree. -- ac_file_inputs=`IFS=: -- for f in $ac_file_in; do -- case $f in -- -) echo $tmp/stdin ;; -- [\\/$]*) -- # Absolute (can't be DOS-style, as IFS=:) -- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 --echo "$as_me: error: cannot find input file: $f" >&2;} -- { (exit 1); exit 1; }; } -- echo "$f";; -- *) # Relative -- if test -f "$f"; then -- # Build tree -- echo "$f" -- elif test -f "$srcdir/$f"; then -- # Source tree -- echo "$srcdir/$f" -- else -- # /dev/null tree -- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 --echo "$as_me: error: cannot find input file: $f" >&2;} -- { (exit 1); exit 1; }; } -- fi;; -- esac -- done` || { (exit 1); exit 1; } -+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:$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 --cat >>$CONFIG_STATUS <<_ACEOF -- sed "$ac_vpsub -+ -+# 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 -+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - :t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b --s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t --s,@abs_top_builddir@,$ac_abs_top_builddir,;t t --s,@INSTALL@,$ac_INSTALL,;t t --" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out -- rm -f $tmp/stdin -- if test x"$ac_file" != x-; then -- mv $tmp/out $ac_file -- else -- cat $tmp/out -- rm -f $tmp/out -- fi -+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 -+$ac_datarootdir_hack -+" -+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ -+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -+$as_echo "$as_me: error: could not create $ac_file" >&2;} -+ { (exit 1); exit 1; }; } - --done --_ACEOF --cat >>$CONFIG_STATUS <<\_ACEOF -+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:$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;} - --# --# CONFIG_HEADER section. --# -- --# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where --# NAME is the cpp macro being defined and VALUE is the value it is being given. --# --# ac_d sets the value in "#define NAME VALUE" lines. --ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' --ac_dB='[ ].*$,\1#\2' --ac_dC=' ' --ac_dD=',;t' --# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". --ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' --ac_uB='$,\1#\2define\3' --ac_uC=' ' --ac_uD=',;t' -- --for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue -- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". -+ rm -f "$tmp/stdin" - case $ac_file in -- - | *:- | *:-:* ) # input from stdin -- cat >$tmp/stdin -- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -- *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` -- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; -- * ) ac_file_in=$ac_file.in ;; -- esac -- -- test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 --echo "$as_me: creating $ac_file" >&6;} -- -- # First look for the input files in the build tree, otherwise in the -- # src tree. -- ac_file_inputs=`IFS=: -- for f in $ac_file_in; do -- case $f in -- -) echo $tmp/stdin ;; -- [\\/$]*) -- # Absolute (can't be DOS-style, as IFS=:) -- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 --echo "$as_me: error: cannot find input file: $f" >&2;} -+ -) cat "$tmp/out" && rm -f "$tmp/out";; -+ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; -+ esac \ -+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -+$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } -- # Do quote $f, to prevent DOS paths from being IFS'd. -- echo "$f";; -- *) # Relative -- if test -f "$f"; then -- # Build tree -- echo "$f" -- elif test -f "$srcdir/$f"; then -- # Source tree -- echo "$srcdir/$f" -- else -- # /dev/null tree -- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 --echo "$as_me: error: cannot find input file: $f" >&2;} -- { (exit 1); exit 1; }; } -- fi;; -- esac -- done` || { (exit 1); exit 1; } -- # Remove the trailing spaces. -- sed 's/[ ]*$//' $ac_file_inputs >$tmp/in -- --_ACEOF -- --# Transform confdefs.h into two sed scripts, `conftest.defines' and --# `conftest.undefs', that substitutes the proper values into --# config.h.in to produce config.h. The first handles `#define' --# templates, and the second `#undef' templates. --# And first: Protect against being on the right side of a sed subst in --# config.status. Protect against being in an unquoted here document --# in config.status. --rm -f conftest.defines conftest.undefs --# Using a here document instead of a string reduces the quoting nightmare. --# Putting comments in sed scripts is not portable. --# --# `end' is used to avoid that the second main sed command (meant for --# 0-ary CPP macros) applies to n-ary macro definitions. --# See the Autoconf documentation for `clear'. --cat >confdef2sed.sed <<\_ACEOF --s/[\\&,]/\\&/g --s,[\\$`],\\&,g --t clear --: clear --s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp --t end --s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp --: end --_ACEOF --# If some macros were called several times there might be several times --# the same #defines, which is useless. Nevertheless, we may not want to --# sort them, since we want the *last* AC-DEFINE to be honored. --uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines --sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs --rm -f confdef2sed.sed -- --# This sed command replaces #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. --cat >>conftest.undefs <<\_ACEOF --s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, --_ACEOF -- --# Break up conftest.defines because some shells have a limit on the size --# of here documents, and old seds have small limits too (100 cmds). --echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS --echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS --echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS --echo ' :' >>$CONFIG_STATUS --rm -f conftest.tail --while grep . conftest.defines >/dev/null --do -- # Write a limited-size here document to $tmp/defines.sed. -- echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS -- # Speed up: don't consider the non `#define' lines. -- echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS -- # Work around the forget-to-reset-the-flag bug. -- echo 't clr' >>$CONFIG_STATUS -- echo ': clr' >>$CONFIG_STATUS -- sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS -- echo 'CEOF -- sed -f $tmp/defines.sed $tmp/in >$tmp/out -- rm -f $tmp/in -- mv $tmp/out $tmp/in --' >>$CONFIG_STATUS -- sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail -- rm -f conftest.defines -- mv conftest.tail conftest.defines --done --rm -f conftest.defines --echo ' fi # grep' >>$CONFIG_STATUS --echo >>$CONFIG_STATUS -- --# Break up conftest.undefs because some shells have a limit on the size --# of here documents, and old seds have small limits too (100 cmds). --echo ' # Handle all the #undef templates' >>$CONFIG_STATUS --rm -f conftest.tail --while grep . conftest.undefs >/dev/null --do -- # Write a limited-size here document to $tmp/undefs.sed. -- echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS -- # Speed up: don't consider the non `#undef' -- echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS -- # Work around the forget-to-reset-the-flag bug. -- echo 't clr' >>$CONFIG_STATUS -- echo ': clr' >>$CONFIG_STATUS -- sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS -- echo 'CEOF -- sed -f $tmp/undefs.sed $tmp/in >$tmp/out -- rm -f $tmp/in -- mv $tmp/out $tmp/in --' >>$CONFIG_STATUS -- sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail -- rm -f conftest.undefs -- mv conftest.tail conftest.undefs --done --rm -f conftest.undefs -- --cat >>$CONFIG_STATUS <<\_ACEOF -- # 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. */ -- if test x"$ac_file" = x-; then -- echo "/* Generated by configure. */" >$tmp/config.h -- else -- echo "/* $ac_file. Generated by configure. */" >$tmp/config.h -- fi -- cat $tmp/in >>$tmp/config.h -- rm -f $tmp/in -+ ;; -+ :H) -+ # -+ # CONFIG_HEADER -+ # - if test x"$ac_file" != x-; then -- if diff $ac_file $tmp/config.h >/dev/null 2>&1; then -- { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 --echo "$as_me: $ac_file is unchanged" >&6;} -+ { -+ $as_echo "/* $configure_input */" \ -+ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" -+ } >"$tmp/config.h" \ -+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -+$as_echo "$as_me: error: could not create $ac_file" >&2;} -+ { (exit 1); exit 1; }; } -+ if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then -+ { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -+$as_echo "$as_me: $ac_file is unchanged" >&6;} - else -- ac_dir=`(dirname "$ac_file") 2>/dev/null || --$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -- X"$ac_file" : 'X\(//\)[^/]' \| \ -- X"$ac_file" : 'X\(//\)$' \| \ -- X"$ac_file" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$ac_file" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- { if $as_mkdir_p; then -- mkdir -p "$ac_dir" -- else -- as_dir="$ac_dir" -- as_dirs= -- while test ! -d "$as_dir"; do -- as_dirs="$as_dir $as_dirs" -- as_dir=`(dirname "$as_dir") 2>/dev/null || --$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -- X"$as_dir" : 'X\(//\)[^/]' \| \ -- X"$as_dir" : 'X\(//\)$' \| \ -- X"$as_dir" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$as_dir" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- done -- test ! -n "$as_dirs" || mkdir $as_dirs -- fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 --echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -- { (exit 1); exit 1; }; }; } -- -- rm -f $ac_file -- mv $tmp/config.h $ac_file -+ rm -f "$ac_file" -+ mv "$tmp/config.h" "$ac_file" \ -+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -+$as_echo "$as_me: error: could not create $ac_file" >&2;} -+ { (exit 1); exit 1; }; } - fi - else -- cat $tmp/config.h -- rm -f $tmp/config.h -+ $as_echo "/* $configure_input */" \ -+ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ -+ || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -+$as_echo "$as_me: error: could not create -" >&2;} -+ { (exit 1); exit 1; }; } - fi --# Compute $ac_file's index in $config_headers. -+# Compute "$ac_file"'s index in $config_headers. - _am_stamp_count=1 - for _am_header in $config_headers :; do - case $_am_header in -- $ac_file | $ac_file:* ) -+ "$ac_file" | "$ac_file":* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac - done --echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || --$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -- X$ac_file : 'X\(//\)[^/]' \| \ -- X$ac_file : 'X\(//\)$' \| \ -- X$ac_file : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X$ac_file | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'`/stamp-h$_am_stamp_count --done --_ACEOF --cat >>$CONFIG_STATUS <<\_ACEOF -+echo "timestamp for "$ac_file"" >`$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'`/stamp-h$_am_stamp_count -+ ;; - --# --# CONFIG_COMMANDS section. --# --for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue -- ac_dest=`echo "$ac_file" | sed 's,:.*,,'` -- ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` -- ac_dir=`(dirname "$ac_dest") 2>/dev/null || --$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -- X"$ac_dest" : 'X\(//\)[^/]' \| \ -- X"$ac_dest" : 'X\(//\)$' \| \ -- X"$ac_dest" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$ac_dest" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- { if $as_mkdir_p; then -- mkdir -p "$ac_dir" -- else -- as_dir="$ac_dir" -- as_dirs= -- while test ! -d "$as_dir"; do -- as_dirs="$as_dir $as_dirs" -- as_dir=`(dirname "$as_dir") 2>/dev/null || --$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ -- X"$as_dir" : 'X\(//\)[^/]' \| \ -- X"$as_dir" : 'X\(//\)$' \| \ -- X"$as_dir" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$as_dir" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- done -- test ! -n "$as_dirs" || mkdir $as_dirs -- fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 --echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} -- { (exit 1); exit 1; }; }; } -+ :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 -+$as_echo "$as_me: executing $ac_file commands" >&6;} -+ ;; -+ esac - -- ac_builddir=. - --if test "$ac_dir" != .; then -- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` -- # A "../" for each directory in $ac_dir_suffix. -- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` --else -- ac_dir_suffix= ac_top_builddir= --fi -- --case $srcdir in -- .) # No --srcdir option. We are building in place. -- ac_srcdir=. -- if test -z "$ac_top_builddir"; then -- ac_top_srcdir=. -- else -- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` -- fi ;; -- [\\/]* | ?:[\\/]* ) # Absolute path. -- ac_srcdir=$srcdir$ac_dir_suffix; -- ac_top_srcdir=$srcdir ;; -- *) # Relative path. -- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix -- ac_top_srcdir=$ac_top_builddir$srcdir ;; --esac -- --# Do not use `cd foo && pwd` to compute absolute paths, because --# the directories may not exist. --case `pwd` in --.) ac_abs_builddir="$ac_dir";; --*) -- case "$ac_dir" in -- .) ac_abs_builddir=`pwd`;; -- [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; -- *) ac_abs_builddir=`pwd`/"$ac_dir";; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_top_builddir=${ac_top_builddir}.;; --*) -- case ${ac_top_builddir}. in -- .) ac_abs_top_builddir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; -- *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_srcdir=$ac_srcdir;; --*) -- case $ac_srcdir in -- .) ac_abs_srcdir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; -- *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; -- esac;; --esac --case $ac_abs_builddir in --.) ac_abs_top_srcdir=$ac_top_srcdir;; --*) -- case $ac_top_srcdir in -- .) ac_abs_top_srcdir=$ac_abs_builddir;; -- [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; -- *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; -- esac;; --esac -- -- -- { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 --echo "$as_me: executing $ac_dest commands" >&6;} -- case $ac_dest in -- depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do -+ case $ac_file$ac_mode in -+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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. -@@ -22654,18 +24112,29 @@ echo "$as_me: executing $ac_dest commands" >&6;} - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then -- dirpart=`(dirname "$mf") 2>/dev/null || -+ dirpart=`$as_dirname -- "$mf" || - $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ -- X"$mf" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$mf" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ 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 -@@ -22687,60 +24156,91 @@ echo X"$mf" | - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue -- fdir=`(dirname "$file") 2>/dev/null || -+ fdir=`$as_dirname -- "$file" || - $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ -- X"$file" : 'X\(/\)' \| \ -- . : '\(.\)' 2>/dev/null || --echo X"$file" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -- { if $as_mkdir_p; then -- mkdir -p $dirpart/$fdir -- else -- as_dir=$dirpart/$fdir -+ 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 -+ case $as_dir in #( -+ -*) as_dir=./$as_dir;; -+ esac -+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= -- while test ! -d "$as_dir"; do -- as_dirs="$as_dir $as_dirs" -- as_dir=`(dirname "$as_dir") 2>/dev/null || -+ 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 || --echo X"$as_dir" | -- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } -- /^X\(\/\/\)[^/].*/{ s//\1/; q; } -- /^X\(\/\/\)$/{ s//\1/; q; } -- /^X\(\/\).*/{ s//\1/; q; } -- s/.*/./; q'` -+ 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 ! -n "$as_dirs" || mkdir $as_dirs -- fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 --echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} -+ test -z "$as_dirs" || eval "mkdir $as_dirs" -+ } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } -- - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done - ;; -- default ) echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h ;; -+ "default":C) echo 'char *build_date = "'`date`'";' > src/unix/build_date.c && echo 'char *build_date;'> src/unix/build_date.h ;; -+ - esac --done --_ACEOF -+done # for ac_tag - --cat >>$CONFIG_STATUS <<\_ACEOF - - { (exit 0); exit 0; } - _ACEOF - chmod +x $CONFIG_STATUS - ac_clean_files=$ac_clean_files_save - -+test $ac_write_fail = 0 || -+ { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} -+ { (exit 1); exit 1; }; } -+ - - # configure is writing to config.log, and then calls config.status. - # config.status does its own redirection, appending to config.log. -@@ -22762,4 +24262,8 @@ if test "$no_create" != yes; then - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } - fi -+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then -+ { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -+fi - --- -1.8.3.1 - diff --git a/0064-ISCSIUIO-Removed-the-auto-generated-COPYING-file.patch b/0064-ISCSIUIO-Removed-the-auto-generated-COPYING-file.patch deleted file mode 100644 index 60918a8..0000000 --- a/0064-ISCSIUIO-Removed-the-auto-generated-COPYING-file.patch +++ /dev/null @@ -1,701 +0,0 @@ -From 5f2f3d74b2503e313b7909a3b436071a0757e582 Mon Sep 17 00:00:00 2001 -From: Eddie Wai -Date: Fri, 9 Aug 2013 18:32:44 -0700 -Subject: [PATCH] ISCSIUIO: Removed the auto-generated COPYING file - -The automake generated COPYING file in the iscsiuio folder -unintentionally suggested that the iscsiuio source might be -released as GPL licensed instead of the intended 4-clause BSD -license. - -The patch is to remove the COPYING file. - -Signed-off-by: Eddie Wai ---- - iscsiuio/COPYING | 674 ------------------------------------------------------- - 1 file changed, 674 deletions(-) - delete mode 100644 iscsiuio/COPYING - -diff --git a/iscsiuio/COPYING b/iscsiuio/COPYING -deleted file mode 100644 -index 94a9ed0..0000000 ---- a/iscsiuio/COPYING -+++ /dev/null -@@ -1,674 +0,0 @@ -- GNU GENERAL PUBLIC LICENSE -- Version 3, 29 June 2007 -- -- Copyright (C) 2007 Free Software Foundation, Inc. -- Everyone is permitted to copy and distribute verbatim copies -- of this license document, but changing it is not allowed. -- -- Preamble -- -- The GNU General Public License is a free, copyleft license for --software and other kinds of works. -- -- The licenses for most software and other practical works are designed --to take away your freedom to share and change the works. By contrast, --the GNU General Public License is intended to guarantee your freedom to --share and change all versions of a program--to make sure it remains free --software for all its users. We, the Free Software Foundation, use the --GNU General Public License for most of our software; it applies also to --any other work released this way by its authors. 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 --them 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 prevent others from denying you --these rights or asking you to surrender the rights. Therefore, you have --certain responsibilities if you distribute copies of the software, or if --you modify it: responsibilities to respect the freedom of others. -- -- For example, if you distribute copies of such a program, whether --gratis or for a fee, you must pass on to the recipients the same --freedoms that you received. 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. -- -- Developers that use the GNU GPL protect your rights with two steps: --(1) assert copyright on the software, and (2) offer you this License --giving you legal permission to copy, distribute and/or modify it. -- -- For the developers' and authors' protection, the GPL clearly explains --that there is no warranty for this free software. For both users' and --authors' sake, the GPL requires that modified versions be marked as --changed, so that their problems will not be attributed erroneously to --authors of previous versions. -- -- Some devices are designed to deny users access to install or run --modified versions of the software inside them, although the manufacturer --can do so. This is fundamentally incompatible with the aim of --protecting users' freedom to change the software. The systematic --pattern of such abuse occurs in the area of products for individuals to --use, which is precisely where it is most unacceptable. Therefore, we --have designed this version of the GPL to prohibit the practice for those --products. If such problems arise substantially in other domains, we --stand ready to extend this provision to those domains in future versions --of the GPL, as needed to protect the freedom of users. -- -- Finally, every program is threatened constantly by software patents. --States should not allow patents to restrict development and use of --software on general-purpose computers, but in those that do, we wish to --avoid the special danger that patents applied to a free program could --make it effectively proprietary. To prevent this, the GPL assures that --patents cannot be used to render the program non-free. -- -- The precise terms and conditions for copying, distribution and --modification follow. -- -- TERMS AND CONDITIONS -- -- 0. Definitions. -- -- "This License" refers to version 3 of the GNU General Public License. -- -- "Copyright" also means copyright-like laws that apply to other kinds of --works, such as semiconductor masks. -- -- "The Program" refers to any copyrightable work licensed under this --License. Each licensee is addressed as "you". "Licensees" and --"recipients" may be individuals or organizations. -- -- To "modify" a work means to copy from or adapt all or part of the work --in a fashion requiring copyright permission, other than the making of an --exact copy. The resulting work is called a "modified version" of the --earlier work or a work "based on" the earlier work. -- -- A "covered work" means either the unmodified Program or a work based --on the Program. -- -- To "propagate" a work means to do anything with it that, without --permission, would make you directly or secondarily liable for --infringement under applicable copyright law, except executing it on a --computer or modifying a private copy. Propagation includes copying, --distribution (with or without modification), making available to the --public, and in some countries other activities as well. -- -- To "convey" a work means any kind of propagation that enables other --parties to make or receive copies. Mere interaction with a user through --a computer network, with no transfer of a copy, is not conveying. -- -- An interactive user interface displays "Appropriate Legal Notices" --to the extent that it includes a convenient and prominently visible --feature that (1) displays an appropriate copyright notice, and (2) --tells the user that there is no warranty for the work (except to the --extent that warranties are provided), that licensees may convey the --work under this License, and how to view a copy of this License. If --the interface presents a list of user commands or options, such as a --menu, a prominent item in the list meets this criterion. -- -- 1. Source Code. -- -- The "source code" for a work means the preferred form of the work --for making modifications to it. "Object code" means any non-source --form of a work. -- -- A "Standard Interface" means an interface that either is an official --standard defined by a recognized standards body, or, in the case of --interfaces specified for a particular programming language, one that --is widely used among developers working in that language. -- -- The "System Libraries" of an executable work include anything, other --than the work as a whole, that (a) is included in the normal form of --packaging a Major Component, but which is not part of that Major --Component, and (b) serves only to enable use of the work with that --Major Component, or to implement a Standard Interface for which an --implementation is available to the public in source code form. A --"Major Component", in this context, means a major essential component --(kernel, window system, and so on) of the specific operating system --(if any) on which the executable work runs, or a compiler used to --produce the work, or an object code interpreter used to run it. -- -- The "Corresponding Source" for a work in object code form means all --the source code needed to generate, install, and (for an executable --work) run the object code and to modify the work, including scripts to --control those activities. However, it does not include the work's --System Libraries, or general-purpose tools or generally available free --programs which are used unmodified in performing those activities but --which are not part of the work. For example, Corresponding Source --includes interface definition files associated with source files for --the work, and the source code for shared libraries and dynamically --linked subprograms that the work is specifically designed to require, --such as by intimate data communication or control flow between those --subprograms and other parts of the work. -- -- The Corresponding Source need not include anything that users --can regenerate automatically from other parts of the Corresponding --Source. -- -- The Corresponding Source for a work in source code form is that --same work. -- -- 2. Basic Permissions. -- -- All rights granted under this License are granted for the term of --copyright on the Program, and are irrevocable provided the stated --conditions are met. This License explicitly affirms your unlimited --permission to run the unmodified Program. The output from running a --covered work is covered by this License only if the output, given its --content, constitutes a covered work. This License acknowledges your --rights of fair use or other equivalent, as provided by copyright law. -- -- You may make, run and propagate covered works that you do not --convey, without conditions so long as your license otherwise remains --in force. You may convey covered works to others for the sole purpose --of having them make modifications exclusively for you, or provide you --with facilities for running those works, provided that you comply with --the terms of this License in conveying all material for which you do --not control copyright. Those thus making or running the covered works --for you must do so exclusively on your behalf, under your direction --and control, on terms that prohibit them from making any copies of --your copyrighted material outside their relationship with you. -- -- Conveying under any other circumstances is permitted solely under --the conditions stated below. Sublicensing is not allowed; section 10 --makes it unnecessary. -- -- 3. Protecting Users' Legal Rights From Anti-Circumvention Law. -- -- No covered work shall be deemed part of an effective technological --measure under any applicable law fulfilling obligations under article --11 of the WIPO copyright treaty adopted on 20 December 1996, or --similar laws prohibiting or restricting circumvention of such --measures. -- -- When you convey a covered work, you waive any legal power to forbid --circumvention of technological measures to the extent such circumvention --is effected by exercising rights under this License with respect to --the covered work, and you disclaim any intention to limit operation or --modification of the work as a means of enforcing, against the work's --users, your or third parties' legal rights to forbid circumvention of --technological measures. -- -- 4. Conveying Verbatim Copies. -- -- You may convey 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; --keep intact all notices stating that this License and any --non-permissive terms added in accord with section 7 apply to the code; --keep intact all notices of the absence of any warranty; and give all --recipients a copy of this License along with the Program. -- -- You may charge any price or no price for each copy that you convey, --and you may offer support or warranty protection for a fee. -- -- 5. Conveying Modified Source Versions. -- -- You may convey a work based on the Program, or the modifications to --produce it from the Program, in the form of source code under the --terms of section 4, provided that you also meet all of these conditions: -- -- a) The work must carry prominent notices stating that you modified -- it, and giving a relevant date. -- -- b) The work must carry prominent notices stating that it is -- released under this License and any conditions added under section -- 7. This requirement modifies the requirement in section 4 to -- "keep intact all notices". -- -- c) You must license the entire work, as a whole, under this -- License to anyone who comes into possession of a copy. This -- License will therefore apply, along with any applicable section 7 -- additional terms, to the whole of the work, and all its parts, -- regardless of how they are packaged. This License gives no -- permission to license the work in any other way, but it does not -- invalidate such permission if you have separately received it. -- -- d) If the work has interactive user interfaces, each must display -- Appropriate Legal Notices; however, if the Program has interactive -- interfaces that do not display Appropriate Legal Notices, your -- work need not make them do so. -- -- A compilation of a covered work with other separate and independent --works, which are not by their nature extensions of the covered work, --and which are not combined with it such as to form a larger program, --in or on a volume of a storage or distribution medium, is called an --"aggregate" if the compilation and its resulting copyright are not --used to limit the access or legal rights of the compilation's users --beyond what the individual works permit. Inclusion of a covered work --in an aggregate does not cause this License to apply to the other --parts of the aggregate. -- -- 6. Conveying Non-Source Forms. -- -- You may convey a covered work in object code form under the terms --of sections 4 and 5, provided that you also convey the --machine-readable Corresponding Source under the terms of this License, --in one of these ways: -- -- a) Convey the object code in, or embodied in, a physical product -- (including a physical distribution medium), accompanied by the -- Corresponding Source fixed on a durable physical medium -- customarily used for software interchange. -- -- b) Convey the object code in, or embodied in, a physical product -- (including a physical distribution medium), accompanied by a -- written offer, valid for at least three years and valid for as -- long as you offer spare parts or customer support for that product -- model, to give anyone who possesses the object code either (1) a -- copy of the Corresponding Source for all the software in the -- product that is covered by this License, on a durable physical -- medium customarily used for software interchange, for a price no -- more than your reasonable cost of physically performing this -- conveying of source, or (2) access to copy the -- Corresponding Source from a network server at no charge. -- -- c) Convey individual copies of the object code with a copy of the -- written offer to provide the Corresponding Source. This -- alternative is allowed only occasionally and noncommercially, and -- only if you received the object code with such an offer, in accord -- with subsection 6b. -- -- d) Convey the object code by offering access from a designated -- place (gratis or for a charge), and offer equivalent access to the -- Corresponding Source in the same way through the same place at no -- further charge. You need not require recipients to copy the -- Corresponding Source along with the object code. If the place to -- copy the object code is a network server, the Corresponding Source -- may be on a different server (operated by you or a third party) -- that supports equivalent copying facilities, provided you maintain -- clear directions next to the object code saying where to find the -- Corresponding Source. Regardless of what server hosts the -- Corresponding Source, you remain obligated to ensure that it is -- available for as long as needed to satisfy these requirements. -- -- e) Convey the object code using peer-to-peer transmission, provided -- you inform other peers where the object code and Corresponding -- Source of the work are being offered to the general public at no -- charge under subsection 6d. -- -- A separable portion of the object code, whose source code is excluded --from the Corresponding Source as a System Library, need not be --included in conveying the object code work. -- -- A "User Product" is either (1) a "consumer product", which means any --tangible personal property which is normally used for personal, family, --or household purposes, or (2) anything designed or sold for incorporation --into a dwelling. In determining whether a product is a consumer product, --doubtful cases shall be resolved in favor of coverage. For a particular --product received by a particular user, "normally used" refers to a --typical or common use of that class of product, regardless of the status --of the particular user or of the way in which the particular user --actually uses, or expects or is expected to use, the product. A product --is a consumer product regardless of whether the product has substantial --commercial, industrial or non-consumer uses, unless such uses represent --the only significant mode of use of the product. -- -- "Installation Information" for a User Product means any methods, --procedures, authorization keys, or other information required to install --and execute modified versions of a covered work in that User Product from --a modified version of its Corresponding Source. The information must --suffice to ensure that the continued functioning of the modified object --code is in no case prevented or interfered with solely because --modification has been made. -- -- If you convey an object code work under this section in, or with, or --specifically for use in, a User Product, and the conveying occurs as --part of a transaction in which the right of possession and use of the --User Product is transferred to the recipient in perpetuity or for a --fixed term (regardless of how the transaction is characterized), the --Corresponding Source conveyed under this section must be accompanied --by the Installation Information. But this requirement does not apply --if neither you nor any third party retains the ability to install --modified object code on the User Product (for example, the work has --been installed in ROM). -- -- The requirement to provide Installation Information does not include a --requirement to continue to provide support service, warranty, or updates --for a work that has been modified or installed by the recipient, or for --the User Product in which it has been modified or installed. Access to a --network may be denied when the modification itself materially and --adversely affects the operation of the network or violates the rules and --protocols for communication across the network. -- -- Corresponding Source conveyed, and Installation Information provided, --in accord with this section must be in a format that is publicly --documented (and with an implementation available to the public in --source code form), and must require no special password or key for --unpacking, reading or copying. -- -- 7. Additional Terms. -- -- "Additional permissions" are terms that supplement the terms of this --License by making exceptions from one or more of its conditions. --Additional permissions that are applicable to the entire Program shall --be treated as though they were included in this License, to the extent --that they are valid under applicable law. If additional permissions --apply only to part of the Program, that part may be used separately --under those permissions, but the entire Program remains governed by --this License without regard to the additional permissions. -- -- When you convey a copy of a covered work, you may at your option --remove any additional permissions from that copy, or from any part of --it. (Additional permissions may be written to require their own --removal in certain cases when you modify the work.) You may place --additional permissions on material, added by you to a covered work, --for which you have or can give appropriate copyright permission. -- -- Notwithstanding any other provision of this License, for material you --add to a covered work, you may (if authorized by the copyright holders of --that material) supplement the terms of this License with terms: -- -- a) Disclaiming warranty or limiting liability differently from the -- terms of sections 15 and 16 of this License; or -- -- b) Requiring preservation of specified reasonable legal notices or -- author attributions in that material or in the Appropriate Legal -- Notices displayed by works containing it; or -- -- c) Prohibiting misrepresentation of the origin of that material, or -- requiring that modified versions of such material be marked in -- reasonable ways as different from the original version; or -- -- d) Limiting the use for publicity purposes of names of licensors or -- authors of the material; or -- -- e) Declining to grant rights under trademark law for use of some -- trade names, trademarks, or service marks; or -- -- f) Requiring indemnification of licensors and authors of that -- material by anyone who conveys the material (or modified versions of -- it) with contractual assumptions of liability to the recipient, for -- any liability that these contractual assumptions directly impose on -- those licensors and authors. -- -- All other non-permissive additional terms are considered "further --restrictions" within the meaning of section 10. If the Program as you --received it, or any part of it, contains a notice stating that it is --governed by this License along with a term that is a further --restriction, you may remove that term. If a license document contains --a further restriction but permits relicensing or conveying under this --License, you may add to a covered work material governed by the terms --of that license document, provided that the further restriction does --not survive such relicensing or conveying. -- -- If you add terms to a covered work in accord with this section, you --must place, in the relevant source files, a statement of the --additional terms that apply to those files, or a notice indicating --where to find the applicable terms. -- -- Additional terms, permissive or non-permissive, may be stated in the --form of a separately written license, or stated as exceptions; --the above requirements apply either way. -- -- 8. Termination. -- -- You may not propagate or modify a covered work except as expressly --provided under this License. Any attempt otherwise to propagate or --modify it is void, and will automatically terminate your rights under --this License (including any patent licenses granted under the third --paragraph of section 11). -- -- However, if you cease all violation of this License, then your --license from a particular copyright holder is reinstated (a) --provisionally, unless and until the copyright holder explicitly and --finally terminates your license, and (b) permanently, if the copyright --holder fails to notify you of the violation by some reasonable means --prior to 60 days after the cessation. -- -- Moreover, your license from a particular copyright holder is --reinstated permanently if the copyright holder notifies you of the --violation by some reasonable means, this is the first time you have --received notice of violation of this License (for any work) from that --copyright holder, and you cure the violation prior to 30 days after --your receipt of the notice. -- -- Termination of your rights under this section does not terminate the --licenses of parties who have received copies or rights from you under --this License. If your rights have been terminated and not permanently --reinstated, you do not qualify to receive new licenses for the same --material under section 10. -- -- 9. Acceptance Not Required for Having Copies. -- -- You are not required to accept this License in order to receive or --run a copy of the Program. Ancillary propagation of a covered work --occurring solely as a consequence of using peer-to-peer transmission --to receive a copy likewise does not require acceptance. However, --nothing other than this License grants you permission to propagate or --modify any covered work. These actions infringe copyright if you do --not accept this License. Therefore, by modifying or propagating a --covered work, you indicate your acceptance of this License to do so. -- -- 10. Automatic Licensing of Downstream Recipients. -- -- Each time you convey a covered work, the recipient automatically --receives a license from the original licensors, to run, modify and --propagate that work, subject to this License. You are not responsible --for enforcing compliance by third parties with this License. -- -- An "entity transaction" is a transaction transferring control of an --organization, or substantially all assets of one, or subdividing an --organization, or merging organizations. If propagation of a covered --work results from an entity transaction, each party to that --transaction who receives a copy of the work also receives whatever --licenses to the work the party's predecessor in interest had or could --give under the previous paragraph, plus a right to possession of the --Corresponding Source of the work from the predecessor in interest, if --the predecessor has it or can get it with reasonable efforts. -- -- You may not impose any further restrictions on the exercise of the --rights granted or affirmed under this License. For example, you may --not impose a license fee, royalty, or other charge for exercise of --rights granted under this License, and you may not initiate litigation --(including a cross-claim or counterclaim in a lawsuit) alleging that --any patent claim is infringed by making, using, selling, offering for --sale, or importing the Program or any portion of it. -- -- 11. Patents. -- -- A "contributor" is a copyright holder who authorizes use under this --License of the Program or a work on which the Program is based. The --work thus licensed is called the contributor's "contributor version". -- -- A contributor's "essential patent claims" are all patent claims --owned or controlled by the contributor, whether already acquired or --hereafter acquired, that would be infringed by some manner, permitted --by this License, of making, using, or selling its contributor version, --but do not include claims that would be infringed only as a --consequence of further modification of the contributor version. For --purposes of this definition, "control" includes the right to grant --patent sublicenses in a manner consistent with the requirements of --this License. -- -- Each contributor grants you a non-exclusive, worldwide, royalty-free --patent license under the contributor's essential patent claims, to --make, use, sell, offer for sale, import and otherwise run, modify and --propagate the contents of its contributor version. -- -- In the following three paragraphs, a "patent license" is any express --agreement or commitment, however denominated, not to enforce a patent --(such as an express permission to practice a patent or covenant not to --sue for patent infringement). To "grant" such a patent license to a --party means to make such an agreement or commitment not to enforce a --patent against the party. -- -- If you convey a covered work, knowingly relying on a patent license, --and the Corresponding Source of the work is not available for anyone --to copy, free of charge and under the terms of this License, through a --publicly available network server or other readily accessible means, --then you must either (1) cause the Corresponding Source to be so --available, or (2) arrange to deprive yourself of the benefit of the --patent license for this particular work, or (3) arrange, in a manner --consistent with the requirements of this License, to extend the patent --license to downstream recipients. "Knowingly relying" means you have --actual knowledge that, but for the patent license, your conveying the --covered work in a country, or your recipient's use of the covered work --in a country, would infringe one or more identifiable patents in that --country that you have reason to believe are valid. -- -- If, pursuant to or in connection with a single transaction or --arrangement, you convey, or propagate by procuring conveyance of, a --covered work, and grant a patent license to some of the parties --receiving the covered work authorizing them to use, propagate, modify --or convey a specific copy of the covered work, then the patent license --you grant is automatically extended to all recipients of the covered --work and works based on it. -- -- A patent license is "discriminatory" if it does not include within --the scope of its coverage, prohibits the exercise of, or is --conditioned on the non-exercise of one or more of the rights that are --specifically granted under this License. You may not convey a covered --work if you are a party to an arrangement with a third party that is --in the business of distributing software, under which you make payment --to the third party based on the extent of your activity of conveying --the work, and under which the third party grants, to any of the --parties who would receive the covered work from you, a discriminatory --patent license (a) in connection with copies of the covered work --conveyed by you (or copies made from those copies), or (b) primarily --for and in connection with specific products or compilations that --contain the covered work, unless you entered into that arrangement, --or that patent license was granted, prior to 28 March 2007. -- -- Nothing in this License shall be construed as excluding or limiting --any implied license or other defenses to infringement that may --otherwise be available to you under applicable patent law. -- -- 12. No Surrender of Others' Freedom. -- -- If 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 convey a --covered work so as to satisfy simultaneously your obligations under this --License and any other pertinent obligations, then as a consequence you may --not convey it at all. For example, if you agree to terms that obligate you --to collect a royalty for further conveying from those to whom you convey --the Program, the only way you could satisfy both those terms and this --License would be to refrain entirely from conveying the Program. -- -- 13. Use with the GNU Affero General Public License. -- -- Notwithstanding any other provision of this License, you have --permission to link or combine any covered work with a work licensed --under version 3 of the GNU Affero General Public License into a single --combined work, and to convey the resulting work. The terms of this --License will continue to apply to the part which is the covered work, --but the special requirements of the GNU Affero General Public License, --section 13, concerning interaction through a network will apply to the --combination as such. -- -- 14. Revised Versions of this License. -- -- The Free Software Foundation may publish revised and/or new versions of --the GNU 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 that a certain numbered version of the GNU General --Public License "or any later version" applies to it, you have the --option of following the terms and conditions either of that numbered --version or of any later version published by the Free Software --Foundation. If the Program does not specify a version number of the --GNU General Public License, you may choose any version ever published --by the Free Software Foundation. -- -- If the Program specifies that a proxy can decide which future --versions of the GNU General Public License can be used, that proxy's --public statement of acceptance of a version permanently authorizes you --to choose that version for the Program. -- -- Later license versions may give you additional or different --permissions. However, no additional obligations are imposed on any --author or copyright holder as a result of your choosing to follow a --later version. -- -- 15. Disclaimer of Warranty. -- -- 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. -- -- 16. Limitation of Liability. -- -- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING --WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS --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. -- -- 17. Interpretation of Sections 15 and 16. -- -- If the disclaimer of warranty and limitation of liability provided --above cannot be given local legal effect according to their terms, --reviewing courts shall apply local law that most closely approximates --an absolute waiver of all civil liability in connection with the --Program, unless a warranty or assumption of liability accompanies a --copy of the Program in return for a fee. -- -- 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 --state 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 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 . -- --Also add information on how to contact you by electronic and paper mail. -- -- If the program does terminal interaction, make it output a short --notice like this when it starts in an interactive mode: -- -- Copyright (C) -- This program 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, your program's commands --might be different; for a GUI interface, you would use an "about box". -- -- You should also get your employer (if you work as a programmer) or school, --if any, to sign a "copyright disclaimer" for the program, if necessary. --For more information on this, and how to apply and follow the GNU GPL, see --. -- -- The GNU 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 Lesser General --Public License instead of this License. But first, please read --. --- -1.8.3.1 - diff --git a/0068-iscsiuio-fix-compilation.patch b/0068-iscsiuio-fix-compilation.patch deleted file mode 100644 index 74055ae..0000000 --- a/0068-iscsiuio-fix-compilation.patch +++ /dev/null @@ -1,23 +0,0 @@ -From a877c9dc79ef2c759cc96db8ff5de2e5be8087d9 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Fri, 31 Jan 2014 23:28:22 -0600 -Subject: [PATCH] iscsiuio: fix compilation - -Add missing $(AM_CFLAGS) to lib_iscsi_uip_a_CFLAGS. ---- - iscsiuio/src/uip/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/iscsiuio/src/uip/Makefile.am b/iscsiuio/src/uip/Makefile.am -index 65c1286..16170d7 100644 ---- a/iscsiuio/src/uip/Makefile.am -+++ b/iscsiuio/src/uip/Makefile.am -@@ -15,4 +15,4 @@ lib_iscsi_uip_a_SOURCES = uip.c \ - ipv6_ndpc.c \ - ipv6.c - --lib_iscsi_uip_a_CFLAGS = -DBYTE_ORDER=@ENDIAN@ -+lib_iscsi_uip_a_CFLAGS = -DBYTE_ORDER=@ENDIAN@ $(AM_CFLAGS) --- -1.8.3.1 - diff --git a/0069-Add-missing-DESTDIR.patch b/0069-Add-missing-DESTDIR.patch deleted file mode 100644 index fe7a50d..0000000 --- a/0069-Add-missing-DESTDIR.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 9ef01a7d13358e96627ae1d263fea5537c4ed6f7 Mon Sep 17 00:00:00 2001 -From: Lee Duncan -Date: Wed, 29 Jan 2014 11:21:49 +0100 -Subject: [PATCH] Add missing DESTDIR - -Several Makefile targets are missing DESTDIR, making it -hard for packagers. - -Signed-off-by: Lee Duncan -Signed-off-by: Hannes Reinecke ---- - Makefile | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/Makefile b/Makefile -index 88b3529..79bad84 100644 ---- a/Makefile -+++ b/Makefile -@@ -124,7 +124,7 @@ install_iface: $(IFACEFILES) - $(INSTALL) -m 644 $^ $(DESTDIR)$(etcdir)/iscsi/ifaces - - install_etc: $(ETCFILES) -- if [ ! -f /etc/iscsi/iscsid.conf ]; then \ -+ if [ ! -f $(DESTDIR)/etc/iscsi/iscsid.conf ]; then \ - $(INSTALL) -d $(DESTDIR)$(etcdir)/iscsi ; \ - $(INSTALL) -m 644 $^ $(DESTDIR)$(etcdir)/iscsi ; \ - fi -@@ -137,11 +137,11 @@ install_kernel: - $(MAKE) -C kernel install_kernel - - install_iname: -- if [ ! -f /etc/iscsi/initiatorname.iscsi ]; then \ -+ if [ ! -f $(DESTDIR)/etc/iscsi/initiatorname.iscsi ]; then \ - echo "InitiatorName=`$(DESTDIR)/sbin/iscsi-iname`" > $(DESTDIR)/etc/iscsi/initiatorname.iscsi ; \ - echo "***************************************************" ; \ - echo "Setting InitiatorName to `cat $(DESTDIR)/etc/iscsi/initiatorname.iscsi`" ; \ -- echo "To override edit /etc/iscsi/initiatorname.iscsi" ; \ -+ echo "To override edit $(DESTDIR)/etc/iscsi/initiatorname.iscsi" ; \ - echo "***************************************************" ; \ - fi - --- -1.8.3.1 - diff --git a/0070-iscsi-tools-set-non-negotiated-params-early.patch b/0070-iscsi-tools-set-non-negotiated-params-early.patch deleted file mode 100644 index 2815696..0000000 --- a/0070-iscsi-tools-set-non-negotiated-params-early.patch +++ /dev/null @@ -1,236 +0,0 @@ -From ea05be3ff043efd44256283d968fa1bb9a371568 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Thu, 13 Feb 2014 12:37:09 -0600 -Subject: [PATCH] iscsi tools: set non negotiated params early. - -This patch has the iscsi tools pass down the non-negotiated -iscsi settings before doing iscsi login. This allows the -drivers to get info that might be neede to setup the session -early. - -This patch also adds the missing discovery_sess param to -the non negotiated params. ---- - usr/discovery.c | 15 +++++++++-- - usr/initiator.c | 22 +++++++++++----- - usr/initiator.h | 1 + - usr/initiator_common.c | 69 ++++++++++++++++++++++++++++++++++++++++++++------ - 4 files changed, 91 insertions(+), 16 deletions(-) - -diff --git a/usr/discovery.c b/usr/discovery.c -index afce6c0..635ec8d 100644 ---- a/usr/discovery.c -+++ b/usr/discovery.c -@@ -1403,6 +1403,17 @@ redirect_reconnect: - iscsi_copy_operational_params(&session->conn[0], &config->session_conf, - &config->conn_conf); - -+ if (t->caps & CAP_TEXT_NEGO) { -+ log_debug(2, "%s discovery set params\n", __FUNCTION__); -+ rc = iscsi_session_set_params(conn); -+ if (rc) { -+ log_error("Could not set iscsi params for conn %d:%d " -+ "(err %d)\n", session->id, conn->id, rc); -+ rc = ISCSI_ERR_INTERNAL; -+ goto login_failed; -+ } -+ } -+ - if ((session->t->caps & CAP_LOGIN_OFFLOAD)) - goto start_conn; - -@@ -1509,8 +1520,8 @@ redirect_reconnect: - return 0; - - start_conn: -- log_debug(2, "%s discovery set params\n", __FUNCTION__); -- rc = iscsi_session_set_params(conn); -+ log_debug(2, "%s discovery set neg params\n", __FUNCTION__); -+ rc = iscsi_session_set_neg_params(conn); - if (rc) { - log_error("Could not set iscsi params for conn %d:%d (err " - "%d)\n", session->id, conn->id, rc); -diff --git a/usr/initiator.c b/usr/initiator.c -index 79d1779..05a5b19 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -1048,12 +1048,7 @@ setup_full_feature_phase(iscsi_conn_t *conn) - - actor_delete(&conn->login_timer); - -- if (iscsi_session_set_params(conn)) { -- iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); -- return; -- } -- -- if (iscsi_host_set_params(session)) { -+ if (iscsi_session_set_neg_params(conn)) { - iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); - return; - } -@@ -1507,6 +1502,11 @@ static void setup_offload_login_phase(iscsi_conn_t *conn) - return; - } - -+ if (iscsi_session_set_neg_params(conn)) { -+ iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); -+ return; -+ } -+ - if (iscsi_host_set_params(session)) { - iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); - return; -@@ -1618,6 +1618,16 @@ static void session_conn_poll(void *data) - return; - } - -+ if (iscsi_session_set_params(conn)) { -+ iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); -+ return; -+ } -+ -+ if (iscsi_host_set_params(session)) { -+ iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); -+ return; -+ } -+ - if (iscsi_login_begin(session, c)) { - iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); - return; -diff --git a/usr/initiator.h b/usr/initiator.h -index 680640c..c34625b 100644 ---- a/usr/initiator.h -+++ b/usr/initiator.h -@@ -344,6 +344,7 @@ extern void free_initiator(void); - extern void iscsi_initiator_init(void); - - /* initiator code common to discovery and normal sessions */ -+extern int iscsi_session_set_neg_params(struct iscsi_conn *conn); - extern int iscsi_session_set_params(struct iscsi_conn *conn); - extern int iscsi_host_set_params(struct iscsi_session *session); - extern int iscsi_host_set_net_params(struct iface_rec *iface, -diff --git a/usr/initiator_common.c b/usr/initiator_common.c -index e2e87a1..109e8d7 100644 ---- a/usr/initiator_common.c -+++ b/usr/initiator_common.c -@@ -345,9 +345,9 @@ void iscsi_session_init_params(struct iscsi_session *session) - } - } - --#define MAX_SESSION_PARAMS 35 -+#define MAX_SESSION_NEG_PARAMS 16 - --int iscsi_session_set_params(struct iscsi_conn *conn) -+int iscsi_session_set_neg_params(struct iscsi_conn *conn) - { - struct iscsi_session *session = conn->session; - int i, rc; -@@ -357,7 +357,7 @@ int iscsi_session_set_params(struct iscsi_conn *conn) - int type; - void *value; - int conn_only; -- } conntbl[MAX_SESSION_PARAMS] = { -+ } conntbl[MAX_SESSION_NEG_PARAMS] = { - { - .param = ISCSI_PARAM_MAX_RECV_DLENGTH, - .value = &conn->max_recv_dlength, -@@ -434,15 +434,58 @@ int iscsi_session_set_params(struct iscsi_conn *conn) - .type = ISCSI_INT, - .conn_only = 1, - }, { -- .param = ISCSI_PARAM_TARGET_NAME, -- .conn_only = 0, -- .type = ISCSI_STRING, -- .value = session->target_name, -- }, { - .param = ISCSI_PARAM_TPGT, - .value = &session->portal_group_tag, - .type = ISCSI_INT, - .conn_only = 0, -+ }, -+ }; -+ -+ iscsi_session_init_params(session); -+ -+ /* Entered full-feature phase! */ -+ for (i = 0; i < MAX_SESSION_NEG_PARAMS; i++) { -+ if (conn->id != 0 && !conntbl[i].conn_only) -+ continue; -+ -+ if (!(session->param_mask & (1ULL << conntbl[i].param))) -+ continue; -+ -+ rc = ipc->set_param(session->t->handle, session->id, -+ conn->id, conntbl[i].param, conntbl[i].value, -+ conntbl[i].type); -+ if (rc && rc != -ENOSYS) { -+ log_error("can't set operational parameter %d for " -+ "connection %d:%d, retcode %d (%d)", -+ conntbl[i].param, session->id, conn->id, -+ rc, errno); -+ return EPERM; -+ } -+ -+ print_param_value(conntbl[i].param, conntbl[i].value, -+ conntbl[i].type); -+ } -+ -+ return 0; -+} -+ -+#define MAX_SESSION_PARAMS 20 -+ -+int iscsi_session_set_params(struct iscsi_conn *conn) -+{ -+ struct iscsi_session *session = conn->session; -+ int i, rc; -+ struct connparam { -+ int param; -+ int type; -+ void *value; -+ int conn_only; -+ } conntbl[MAX_SESSION_PARAMS] = { -+ { -+ .param = ISCSI_PARAM_TARGET_NAME, -+ .conn_only = 0, -+ .type = ISCSI_STRING, -+ .value = session->target_name, - }, { - .param = ISCSI_PARAM_PERSISTENT_ADDRESS, - .value = session->nrec.conn[conn->id].address, -@@ -512,22 +555,32 @@ int iscsi_session_set_params(struct iscsi_conn *conn) - .param = ISCSI_PARAM_IFACE_NAME, - .value = session->nrec.iface.name, - .type = ISCSI_STRING, -+ .conn_only = 0, - }, { - .param = ISCSI_PARAM_INITIATOR_NAME, - .value = session->initiator_name, - .type = ISCSI_STRING, -+ .conn_only = 0, - }, { - .param = ISCSI_PARAM_BOOT_ROOT, - .value = session->nrec.session.boot_root, - .type = ISCSI_STRING, -+ .conn_only = 0, - }, { - .param = ISCSI_PARAM_BOOT_NIC, - .value = session->nrec.session.boot_nic, - .type = ISCSI_STRING, -+ .conn_only = 0, - }, { - .param = ISCSI_PARAM_BOOT_TARGET, - .value = session->nrec.session.boot_target, - .type = ISCSI_STRING, -+ .conn_only = 0, -+ }, { -+ .param = ISCSI_PARAM_DISCOVERY_SESS, -+ .value = &session->type, -+ .type = ISCSI_INT, -+ .conn_only = 0, - }, - }; - --- -1.8.3.1 - diff --git a/0071-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch b/0071-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch deleted file mode 100644 index 6d588cd..0000000 --- a/0071-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch +++ /dev/null @@ -1,30 +0,0 @@ -From f2ecc22d3cb0473b117a33e048a5a56cd8e9e46d Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 24 Feb 2014 03:14:17 -0500 -Subject: [PATCH] iscsiadm: Fix the hostno check for stats submode of host mode - -This fixes the condition where hostno value of 0 was being treated -as invalid. - -Signed-off-by: Chris Leech -Signed-off-by: Adheer Chandravanshi ---- - usr/iscsiadm.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 3cde8d1..36617ab 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -3470,7 +3470,7 @@ main(int argc, char **argv) - ¶ms); - break; - case MODE_HOST_STATS: -- if (!host_no) { -+ if (host_no > MAX_HOST_NO) { - log_error("STATS mode requires host no"); - rc = ISCSI_ERR_INVAL; - break; --- -1.9.3 - diff --git a/0072-iscsiadm-Fix-the-compile-time-warning.patch b/0072-iscsiadm-Fix-the-compile-time-warning.patch deleted file mode 100644 index 3d54151..0000000 --- a/0072-iscsiadm-Fix-the-compile-time-warning.patch +++ /dev/null @@ -1,31 +0,0 @@ -From b1526306e413f0874d608637cd2a9f6571ea4d32 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Mon, 24 Feb 2014 03:14:18 -0500 -Subject: [PATCH] iscsiadm: Fix the compile time warning - -This fixes the following compile time warning message: - -iscsiadm.c:2248: warning: passing argument 1 of 'print_host_stats' from incompatible pointer type - -Signed-off-by: Adheer Chandravanshi ---- - usr/iscsiadm.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 36617ab..389f4b8 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -2245,7 +2245,8 @@ static int exec_host_stats_op(int op, int info_level, uint32_t host_no) - goto exit_host_stats; - } - -- print_host_stats(req_buf + sizeof(struct iscsi_uevent)); -+ print_host_stats((struct iscsi_offload_host_stats *)(req_buf + -+ sizeof(struct iscsi_uevent))); - - ipc->ctldev_close(); - --- -1.9.3 - diff --git a/0074-iscsid-Fix-handling-of-iscsi-async-events.patch b/0074-iscsid-Fix-handling-of-iscsi-async-events.patch deleted file mode 100644 index b9a27d1..0000000 --- a/0074-iscsid-Fix-handling-of-iscsi-async-events.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 36a8b41de43749d91dfd52f9c8ad4a454c9a8f15 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Fri, 14 Mar 2014 01:41:29 -0500 -Subject: [PATCH] iscsid: Fix handling of iscsi async events. - -When iscsi targets send 32 or more iscsi async event pdus the -initiator will run out of memory for events and this message: - -BUG: iscsid: Can not allocate memory for receive context. - -will be logged non stop. iscsid will then not be able to -complate any more requests because it is stuck in a endless loop -printing that message. - -This fixes the problem by having iscsid handle an event after it -has read it in from netlink or the mgmt ipc. Previously we would -queue all events then handle them. ---- - usr/event_poll.c | 5 ++++- - usr/netlink.c | 2 +- - 2 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/usr/event_poll.c b/usr/event_poll.c -index f36fec1..939f1a2 100644 ---- a/usr/event_poll.c -+++ b/usr/event_poll.c -@@ -165,8 +165,11 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) - "exiting", res, errno); - break; - } -- } else -+ } -+ -+ if (res >= 0) - actor_poll(); -+ - reap_proc(); - /* - * flush sysfs cache since kernel objs may -diff --git a/usr/netlink.c b/usr/netlink.c -index 1c4b5cc..532d9ef 100644 ---- a/usr/netlink.c -+++ b/usr/netlink.c -@@ -1615,8 +1615,8 @@ static int ctldev_handle(void) - - ev_context = ipc_ev_clbk->get_ev_context(conn, ev_size); - if (!ev_context) { -- /* retry later */ - log_error("Can not allocate memory for receive context."); -+ drop_data(nlh); - return -ENOMEM; - } - --- -1.9.3 - diff --git a/0075-be2iscsi-Fix-MaxXmitDataLenght-of-the-driver.patch b/0075-be2iscsi-Fix-MaxXmitDataLenght-of-the-driver.patch deleted file mode 100644 index 2666f57..0000000 --- a/0075-be2iscsi-Fix-MaxXmitDataLenght-of-the-driver.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 5f28b8b73fbdb8c1e7fbe4a0e40dd2857b74b685 Mon Sep 17 00:00:00 2001 -From: John Soni Jose -Date: Fri, 21 Mar 2014 11:51:09 +0530 -Subject: [PATCH] be2iscsi: Fix MaxXmitDataLenght of the driver. - - Issue : - During login negotiation if the MaxRecvDataSegmenLen given by the - target is 0, then MRDSL default value of 8K should be considered. - Some old targets close the CXN if the PDU received size is greater - than the MaxRecvDataSegmentLen set during negotiation. - - Fix : - When target is not sending MaxRecvDataSegmentLen in the negotiated - params the value is 0. be2iscsi was setting max_xmit_dlength to 64k - in this case. This fix sets the MaxRecvDataSegmentLen=8k if during - negotiation the MaxRecvDataSegmentLen=0 - -Signed-off-by: John Soni Jose -Signed-off-by: Jayamohan Kallickal ---- - usr/be2iscsi.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/usr/be2iscsi.c b/usr/be2iscsi.c -index ce8b719..ba4c29f 100644 ---- a/usr/be2iscsi.c -+++ b/usr/be2iscsi.c -@@ -33,10 +33,6 @@ void be2iscsi_create_conn(struct iscsi_conn *conn) - if (conn->max_xmit_dlength > 65536) - conn->max_xmit_dlength = 65536; - -- if (!conn_rec->iscsi.MaxXmitDataSegmentLength || -- conn_rec->iscsi.MaxXmitDataSegmentLength > 65536) -- conn_rec->iscsi.MaxXmitDataSegmentLength = 65536; -- - session->erl = 0; - session->initial_r2t_en = 1; - } --- -1.9.3 - diff --git a/0076-Fix-StatSN-in-Open-iSCSI-Stack.patch b/0076-Fix-StatSN-in-Open-iSCSI-Stack.patch deleted file mode 100644 index 0f623fd..0000000 --- a/0076-Fix-StatSN-in-Open-iSCSI-Stack.patch +++ /dev/null @@ -1,61 +0,0 @@ -From e696b94743d880c30c6e4e39c753e4d652845e85 Mon Sep 17 00:00:00 2001 -From: John Soni Jose -Date: Fri, 21 Mar 2014 11:51:19 +0530 -Subject: [PATCH] Fix StatSN in Open-iSCSI Stack. - - When LIO target is used, STATSN in login response can be in - the range 0x0 - 0xFFFFFFFF. Open-iSCSI Stack had the type - as ISCSI_INT for StatSN, so StatSN used to get reset to 0. - - Adding new type ISCSI_UINT feild to fix this issue. - -Signed-off-by: John Soni Jose -Signed-off-by: Jayamohan Kallickal ---- - usr/initiator_common.c | 2 +- - usr/iscsi_ipc.h | 1 + - usr/netlink.c | 3 +++ - 3 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/usr/initiator_common.c b/usr/initiator_common.c -index 109e8d7..50f8d41 100644 ---- a/usr/initiator_common.c -+++ b/usr/initiator_common.c -@@ -431,7 +431,7 @@ int iscsi_session_set_neg_params(struct iscsi_conn *conn) - }, { - .param = ISCSI_PARAM_EXP_STATSN, - .value = &conn->exp_statsn, -- .type = ISCSI_INT, -+ .type = ISCSI_UINT, - .conn_only = 1, - }, { - .param = ISCSI_PARAM_TPGT, -diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h -index 9d26d54..5087b5c 100644 ---- a/usr/iscsi_ipc.h -+++ b/usr/iscsi_ipc.h -@@ -30,6 +30,7 @@ - - enum { - ISCSI_INT, -+ ISCSI_UINT, - ISCSI_STRING, - }; - -diff --git a/usr/netlink.c b/usr/netlink.c -index 532d9ef..b0dfb03 100644 ---- a/usr/netlink.c -+++ b/usr/netlink.c -@@ -716,6 +716,9 @@ kset_param(uint64_t transport_handle, uint32_t sid, uint32_t cid, - case ISCSI_INT: - sprintf(param_str, "%d", *((int *)value)); - break; -+ case ISCSI_UINT: -+ sprintf(param_str, "%u", *((unsigned int *)value)); -+ break; - case ISCSI_STRING: - if (!strlen(value)) - return 0; --- -1.9.3 - diff --git a/0077-iscsid-retry-login-for-ISCSI_ERR_HOST_NOT_FOUND.patch b/0077-iscsid-retry-login-for-ISCSI_ERR_HOST_NOT_FOUND.patch deleted file mode 100644 index 67d4dd2..0000000 --- a/0077-iscsid-retry-login-for-ISCSI_ERR_HOST_NOT_FOUND.patch +++ /dev/null @@ -1,207 +0,0 @@ -From c0e509e7535372cd5d655bc5a20d3d2bae45df84 Mon Sep 17 00:00:00 2001 -From: Mike Christie -Date: Wed, 7 May 2014 14:38:13 -0500 -Subject: [PATCH] iscsid: retry login for ISCSI_ERR_HOST_NOT_FOUND - -If a driver is being loaded then the scsi_host might not yet -be added. This has iscsid retry login if the host is not yet -in sysfs. ---- - usr/initiator.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 100 insertions(+), 11 deletions(-) - -diff --git a/usr/initiator.c b/usr/initiator.c -index 05a5b19..b4b8957 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -55,10 +55,19 @@ - - #define PROC_DIR "/proc" - -+struct login_task_retry_info { -+ actor_t retry_actor; -+ queue_task_t *qtask; -+ node_rec_t *rec; -+ int retry_count; -+}; -+ - static void iscsi_login_timedout(void *data); - static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, - struct iscsi_conn *conn, unsigned long tmo, - int event); -+static int queue_session_login_task_retry(struct login_task_retry_info *info, -+ node_rec_t *rec, queue_task_t *qtask); - - static int iscsi_ev_context_alloc(iscsi_conn_t *conn) - { -@@ -324,14 +333,17 @@ session_release(iscsi_session_t *session) - } - - static iscsi_session_t* --__session_create(node_rec_t *rec, struct iscsi_transport *t) -+__session_create(node_rec_t *rec, struct iscsi_transport *t, int *rc) - { - iscsi_session_t *session; -- int hostno, rc = 0; -+ int hostno; -+ -+ *rc = 0; - - session = calloc(1, sizeof (*session)); - if (session == NULL) { - log_debug(1, "can not allocate memory for session"); -+ *rc = ISCSI_ERR_NOMEM; - return NULL; - } - log_debug(2, "Allocted session %p", session); -@@ -356,8 +368,8 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t) - session->initiator_name = dconfig->initiator_name; - else { - log_error("No initiator name set. Cannot create session."); -- free(session); -- return NULL; -+ *rc = ISCSI_ERR_INVAL; -+ goto free_session; - } - - if (strlen(session->nrec.iface.alias)) -@@ -386,8 +398,8 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t) - - iscsi_session_init_params(session); - -- hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, &rc); -- if (!rc) { -+ hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, rc); -+ if (!*rc) { - /* - * if the netdev or mac was set, then we are going to want - * to want to bind the all the conns/eps to a specific host -@@ -395,10 +407,18 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t) - */ - session->conn[0].bind_ep = 1; - session->hostno = hostno; -+ } else if (*rc == ISCSI_ERR_HOST_NOT_FOUND) { -+ goto free_session; -+ } else { -+ *rc = 0; - } - - list_add_tail(&session->list, &t->sessions); - return session; -+ -+free_session: -+ free(session); -+ return NULL; - } - - static void iscsi_flush_context_pool(struct iscsi_session *session) -@@ -1862,8 +1882,7 @@ static int session_is_running(node_rec_t *rec) - return 0; - } - --int --session_login_task(node_rec_t *rec, queue_task_t *qtask) -+static int __session_login_task(node_rec_t *rec, queue_task_t *qtask) - { - iscsi_session_t *session; - iscsi_conn_t *conn; -@@ -1930,8 +1949,10 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) - rec->conn[0].iscsi.OFMarker = 0; - } - -- session = __session_create(rec, t); -- if (!session) -+ session = __session_create(rec, t, &rc); -+ if (rc == ISCSI_ERR_HOST_NOT_FOUND) -+ return rc; -+ else if (!session) - return ISCSI_ERR_LOGIN; - - /* FIXME: login all connections! marked as "automatic" */ -@@ -1979,6 +2000,74 @@ session_login_task(node_rec_t *rec, queue_task_t *qtask) - return ISCSI_SUCCESS; - } - -+int -+session_login_task(node_rec_t *rec, queue_task_t *qtask) -+{ -+ int rc; -+ -+ rc = __session_login_task(rec, qtask); -+ if (rc == ISCSI_ERR_HOST_NOT_FOUND) { -+ rc = queue_session_login_task_retry(NULL, rec, qtask); -+ if (rc) -+ return rc; -+ /* -+ * we are going to internally retry. Will return final rc -+ * when completed -+ */ -+ return ISCSI_SUCCESS; -+ } -+ return rc; -+} -+ -+static void session_login_task_retry(void *data) -+{ -+ struct login_task_retry_info *info = data; -+ int rc; -+ -+ rc = __session_login_task(info->rec, info->qtask); -+ if (rc == ISCSI_ERR_HOST_NOT_FOUND) { -+ if (info->retry_count == 5) { -+ /* give up */ -+ goto write_rsp; -+ } -+ -+ rc = queue_session_login_task_retry(info, info->rec, -+ info->qtask); -+ if (rc) -+ goto write_rsp; -+ /* we are going to internally retry */ -+ return; -+ } else if (rc) { -+ /* hard error - no retry */ -+ goto write_rsp; -+ } else -+ /* successfully started login operation */ -+ goto free; -+write_rsp: -+ mgmt_ipc_write_rsp(info->qtask, rc); -+free: -+ free(info); -+} -+ -+static int queue_session_login_task_retry(struct login_task_retry_info *info, -+ node_rec_t *rec, queue_task_t *qtask) -+{ -+ if (!info) { -+ info = malloc(sizeof(*info)); -+ if (!info) -+ return ISCSI_ERR_NOMEM; -+ memset(info, 0, sizeof(*info)); -+ info->qtask = qtask; -+ info->rec = rec; -+ } -+ -+ info->retry_count++; -+ log_debug(4, "queue session setup attempt in %d secs, retries %d\n", -+ 3, info->retry_count); -+ actor_timer(&info->retry_actor, 3000, session_login_task_retry, info); -+ return 0; -+} -+ - static int - sync_conn(iscsi_session_t *session, uint32_t cid) - { -@@ -2006,7 +2095,7 @@ iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid) - if (!t) - return ISCSI_ERR_TRANS_NOT_FOUND; - -- session = __session_create(rec, t); -+ session = __session_create(rec, t, &err); - if (!session) - return ISCSI_ERR_LOGIN; - --- -1.9.3 - diff --git a/0078-iscsid-Fix-double-close-of-mgmt-ipc-fd.patch b/0078-iscsid-Fix-double-close-of-mgmt-ipc-fd.patch deleted file mode 100644 index aa20acf..0000000 --- a/0078-iscsid-Fix-double-close-of-mgmt-ipc-fd.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 134f8dcbcdd76bf2418c64de1b4e3dca6163773d Mon Sep 17 00:00:00 2001 -From: Duane Northcutt -Date: Wed, 14 May 2014 11:23:23 -0700 -Subject: [PATCH] iscsid: Fix double close of mgmt ipc fd - -Ran into a problem where iscsiadm was closing an already closed fd -(returning EBADF. Seems like the close() in line 466 is redundant as -it is done in mgmt_ipc_destroy_queue_task(). Could also assign -qtask->mgmt_ipc_fd to NULL, but it seems better to do it this way. ---- - usr/mgmt_ipc.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c -index a82c063..ee037d9 100644 ---- a/usr/mgmt_ipc.c -+++ b/usr/mgmt_ipc.c -@@ -463,7 +463,6 @@ mgmt_ipc_write_rsp(queue_task_t *qtask, int err) - qtask->rsp.err = err; - if (write(qtask->mgmt_ipc_fd, &qtask->rsp, sizeof(qtask->rsp)) < 0) - log_error("IPC qtask write failed: %s", strerror(errno)); -- close(qtask->mgmt_ipc_fd); - mgmt_ipc_destroy_queue_task(qtask); - } - --- -1.9.3 - diff --git a/0079-iscsiadm-Initialize-param_count-in-set_host_chap_inf.patch b/0079-iscsiadm-Initialize-param_count-in-set_host_chap_inf.patch deleted file mode 100644 index 52dae88..0000000 --- a/0079-iscsiadm-Initialize-param_count-in-set_host_chap_inf.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 5762ac0a9520d10e727b539403eacb7ab092e45f Mon Sep 17 00:00:00 2001 -From: Manish Rangankar -Date: Thu, 17 Jul 2014 05:27:20 -0400 -Subject: [PATCH] iscsiadm: Initialize param_count in set_host_chap_info - -Signed-off-by: Manish Rangankar -Signed-off-by: Vikas Chaudhary ---- - usr/iscsiadm.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 389f4b8..f886d39 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -1503,7 +1503,7 @@ static int set_host_chap_info(uint32_t host_no, uint64_t chap_index, - struct iovec *iovs = NULL; - struct iovec *iov = NULL; - int type; -- int param_count; -+ int param_count = 0; - int param_used; - int rc = 0; - int fd, i = 0; --- -1.9.3 - diff --git a/0081-iscsiadm-make-iface.ipaddress-optional-in-iface-conf.patch b/0081-iscsiadm-make-iface.ipaddress-optional-in-iface-conf.patch deleted file mode 100644 index cc5bd6b..0000000 --- a/0081-iscsiadm-make-iface.ipaddress-optional-in-iface-conf.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 96eaaacaeac39625508e6ec8022bb5e565c36a7c Mon Sep 17 00:00:00 2001 -From: Anish Bhatt -Date: Fri, 25 Jul 2014 12:42:27 -0700 -Subject: [PATCH] iscsiadm : make iface.ipaddress optional in iface configs for - transports that don't have a hard requirement on it. - -v2: cxgb4i changed to NOT_REQ as set ipaddress is not supported -Signed-off-by: Anish Bhatt ---- - usr/initiator_common.c | 15 ++++++++++++--- - usr/transport.c | 8 ++++---- - usr/transport.h | 6 ++++++ - 3 files changed, 22 insertions(+), 7 deletions(-) - -diff --git a/usr/initiator_common.c b/usr/initiator_common.c -index 50f8d41..8ff993d 100644 ---- a/usr/initiator_common.c -+++ b/usr/initiator_common.c -@@ -685,9 +685,18 @@ int iscsi_host_set_net_params(struct iface_rec *iface, - - /* if we need to set the ip addr then set all the iface net settings */ - if (!iface_is_bound_by_ipaddr(iface)) { -- log_warning("Please set the iface.ipaddress for iface %s, " -- "then retry the login command.\n", iface->name); -- return EINVAL; -+ if (t->template->set_host_ip == SET_HOST_IP_REQ) { -+ log_warning("Please set the iface.ipaddress for iface " -+ "%s, then retry the login command.\n", -+ iface->name); -+ return EINVAL; -+ } else if (t->template->set_host_ip == SET_HOST_IP_OPT) { -+ log_info("Optional iface.ipaddress for iface %s " -+ "not set.\n", iface->name); -+ return 0; -+ } else { -+ return EINVAL; -+ } - } - - /* these type of drivers need the netdev upd */ -diff --git a/usr/transport.c b/usr/transport.c -index 2f38519..630f163 100644 ---- a/usr/transport.c -+++ b/usr/transport.c -@@ -58,7 +58,7 @@ struct iscsi_transport_template iscsi_iser = { - - struct iscsi_transport_template cxgb3i = { - .name = "cxgb3i", -- .set_host_ip = 1, -+ .set_host_ip = SET_HOST_IP_OPT, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -@@ -67,7 +67,7 @@ struct iscsi_transport_template cxgb3i = { - - struct iscsi_transport_template cxgb4i = { - .name = "cxgb4i", -- .set_host_ip = 1, -+ .set_host_ip = SET_HOST_IP_NOT_REQ, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -@@ -76,7 +76,7 @@ struct iscsi_transport_template cxgb4i = { - - struct iscsi_transport_template bnx2i = { - .name = "bnx2i", -- .set_host_ip = 1, -+ .set_host_ip = SET_HOST_IP_REQ, - .use_boot_info = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, -@@ -94,7 +94,7 @@ struct iscsi_transport_template be2iscsi = { - - struct iscsi_transport_template qla4xxx = { - .name = "qla4xxx", -- .set_host_ip = 0, -+ .set_host_ip = SET_HOST_IP_NOT_REQ, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -diff --git a/usr/transport.h b/usr/transport.h -index 388e4b1..73041fa 100644 ---- a/usr/transport.h -+++ b/usr/transport.h -@@ -20,6 +20,12 @@ - #include "types.h" - #include "config.h" - -+enum set_host_ip_opts { -+ SET_HOST_IP_NOT_REQ, /* iface.ipaddress is not supported */ -+ SET_HOST_IP_REQ, /* iface.ipaddress must be specified */ -+ SET_HOST_IP_OPT, /* iface.ipaddress is not required */ -+}; -+ - struct iscsi_transport; - struct iscsi_conn; - --- -1.9.3 - diff --git a/0082-Remove-unused-variable-path.patch b/0082-Remove-unused-variable-path.patch deleted file mode 100644 index ed1ded1..0000000 --- a/0082-Remove-unused-variable-path.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 21a7923de5b2f968643c2ffd96e5c9fb1b201fa3 Mon Sep 17 00:00:00 2001 -From: Hannes Reinecke -Date: Tue, 1 Jul 2014 11:14:26 +0200 -Subject: [PATCH] Remove unused variable 'path' - -Signed-off-by: Hannes Reinecke ---- - usr/sysfs.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/usr/sysfs.c b/usr/sysfs.c -index 7f31c1a..d00c925 100644 ---- a/usr/sysfs.c -+++ b/usr/sysfs.c -@@ -671,7 +671,6 @@ int sysfs_set_param(char *id, char *subsys, char *attr_name, - char devpath[PATH_SIZE]; - size_t sysfs_len; - char path_full[PATH_SIZE]; -- const char *path; - int rc = 0, fd; - - if (!sysfs_lookup_devpath_by_subsys_id(devpath, sizeof(devpath), -@@ -684,7 +683,6 @@ int sysfs_set_param(char *id, char *subsys, char *attr_name, - sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full)); - if(sysfs_len >= sizeof(path_full)) - sysfs_len = sizeof(path_full) - 1; -- path = &path_full[sysfs_len]; - strlcat(path_full, devpath, sizeof(path_full)); - strlcat(path_full, "/", sizeof(path_full)); - strlcat(path_full, attr_name, sizeof(path_full)); --- -1.9.3 - diff --git a/0083-Parse-origin-value-from-iBFT.patch b/0083-Parse-origin-value-from-iBFT.patch deleted file mode 100644 index dc5a695..0000000 --- a/0083-Parse-origin-value-from-iBFT.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 78e24f50ab754f35f4aa208ade7c9fd794d82036 Mon Sep 17 00:00:00 2001 -From: Hannes Reinecke -Date: Tue, 1 Jul 2014 11:14:57 +0200 -Subject: [PATCH] Parse 'origin' value from iBFT - -iBFT has an 'origin' field which indicates the origin of the -network address. If that is set to '3' it indicates that -DHCP has been used; there is no need to evaluate the 'dhcp' -field here. -In fact. latest iPXE sets the 'origin' field, but not the -'dhcp' field. - -Signed-off-by: Hannes Reinecke ---- - include/fw_context.h | 1 + - utils/fwparam_ibft/fw_entry.c | 8 +++++--- - utils/fwparam_ibft/fwparam_ibft_sysfs.c | 2 ++ - utils/fwparam_ibft/fwparam_sysfs.c | 2 ++ - 4 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/include/fw_context.h b/include/fw_context.h -index 6563d68..295b54d 100644 ---- a/include/fw_context.h -+++ b/include/fw_context.h -@@ -48,6 +48,7 @@ struct boot_context { - char initiatorname[TARGET_NAME_MAXLEN + 1]; - - /* network settings */ -+ char origin[2]; - char dhcp[NI_MAXHOST]; - char iface[IF_NAMESIZE]; - char mac[18]; -diff --git a/utils/fwparam_ibft/fw_entry.c b/utils/fwparam_ibft/fw_entry.c -index b6f05c1..295e905 100644 ---- a/utils/fwparam_ibft/fw_entry.c -+++ b/utils/fwparam_ibft/fw_entry.c -@@ -192,10 +192,12 @@ static void dump_network(struct boot_context *context) - if (strlen(context->mac)) - printf("%s = %s\n", IFACE_HWADDR, context->mac); - /* -- * If this has a valid address then DHCP was used (broadcom sends -- * 0.0.0.0). -+ * If the 'origin' field is '3' then DHCP is used. -+ * Otherwise evaluate the 'dhcp' field, if this has a valid -+ * address then DHCP was used (broadcom sends 0.0.0.0). - */ -- if (strlen(context->dhcp) && strcmp(context->dhcp, "0.0.0.0")) -+ if ((strlen(context->origin) && !strcmp(context->origin, "3")) || -+ (strlen(context->dhcp) && strcmp(context->dhcp, "0.0.0.0"))) - printf("%s = DHCP\n", IFACE_BOOT_PROTO); - else - printf("%s = STATIC\n", IFACE_BOOT_PROTO); -diff --git a/utils/fwparam_ibft/fwparam_ibft_sysfs.c b/utils/fwparam_ibft/fwparam_ibft_sysfs.c -index 9185c85..2dc6f6d 100644 ---- a/utils/fwparam_ibft/fwparam_ibft_sysfs.c -+++ b/utils/fwparam_ibft/fwparam_ibft_sysfs.c -@@ -201,6 +201,8 @@ static int fill_nic_context(char *id, struct boot_context *context) - sizeof(context->secondary_dns)); - sysfs_get_str(id, IBFT_SUBSYS, "dhcp", context->dhcp, - sizeof(context->dhcp)); -+ sysfs_get_str(id, IBFT_SUBSYS, "origin", context->origin, -+ sizeof(context->origin)); - return 0; - } - -diff --git a/utils/fwparam_ibft/fwparam_sysfs.c b/utils/fwparam_ibft/fwparam_sysfs.c -index 2f37b59..09dd9fd 100644 ---- a/utils/fwparam_ibft/fwparam_sysfs.c -+++ b/utils/fwparam_ibft/fwparam_sysfs.c -@@ -217,6 +217,8 @@ static int fill_nic_context(char *subsys, char *id, - sizeof(context->secondary_dns)); - sysfs_get_str(id, subsys, "dhcp", context->dhcp, - sizeof(context->dhcp)); -+ sysfs_get_str(id, subsys, "origin", context->origin, -+ sizeof(context->origin)); - return 0; - } - --- -1.9.3 - diff --git a/0084-isns-Add-docs-for-deregistering-discovery-domains.patch b/0084-isns-Add-docs-for-deregistering-discovery-domains.patch deleted file mode 100644 index b5f0adc..0000000 --- a/0084-isns-Add-docs-for-deregistering-discovery-domains.patch +++ /dev/null @@ -1,63 +0,0 @@ -From c9d830bcd05af46df5345476a99f3086094cf44c Mon Sep 17 00:00:00 2001 -From: Lee Duncan -Date: Thu, 4 Sep 2014 10:01:53 -0700 -Subject: [PATCH] isns: Add docs for deregistering discovery domains. - -Without this update to the isnsadm help message and -man page, it can be difficult to figure out how to -deregister a registered discovery domain. ---- - utils/open-isns/doc/isnsadm.8 | 16 ++++++++++++++++ - utils/open-isns/isnsadm.c | 2 ++ - 2 files changed, 18 insertions(+) - -diff --git a/utils/open-isns/doc/isnsadm.8 b/utils/open-isns/doc/isnsadm.8 -index c3e2b83..88ec4cf 100644 ---- a/utils/open-isns/doc/isnsadm.8 -+++ b/utils/open-isns/doc/isnsadm.8 -@@ -25,6 +25,10 @@ isnsadm \- iSNS client utility - .PP - .B isnsadm - .RB [ ... ] -+.RI --dd-deregister " dd-id attr=value -+.PP -+.B isnsadm -+.RB [ ... ] - .RI --enroll " client-name attr=value - .PP - .B isnsadm -@@ -452,6 +456,18 @@ Note, in order to add members to an existing domain, you must - specify the domain's numeric ID. The domain's symbolic name - is not a valid handle when referring to a discovery domain. - .\"--------------------------- -+.SS Discovery Domain Deregistration mode -+In this mode, you can deregister a discoery domain previously registered. -+Only the node which registered a discovery domain in the first place is -+permitted to remove it, or any of its members. (Control -+nodes are not bound by this restriction). -+.PP -+In Discovery Domain deregistration mode, the argument list consists of -+the Discovery Domain ID, followed by a list of -+.IB attr = value -+pairs. Discovery Domain Deregistration supports the same set of attributes as -+query mode. -+.\"--------------------------- - .SS Client Enrollment - This mode only works when the server recognizes the client - as having control node capabilities, which is possible in -diff --git a/utils/open-isns/isnsadm.c b/utils/open-isns/isnsadm.c -index fadd87d..db34f8f 100644 ---- a/utils/open-isns/isnsadm.c -+++ b/utils/open-isns/isnsadm.c -@@ -272,6 +272,8 @@ usage(int exval, const char *msg) - "\nThe following actions are supported:\n" - " --register Register one or more objects\n" - " --deregister Deregister an object (and children)\n" -+ " --dd-register Register a Discovery Domain (and members)\n" -+ " --dd-deregister Deregister a Discovery Domain (and members)\n" - " --query Query iSNS server for objects\n" - " --list List all objects of a given type\n" - " --enroll Create a new policy object for a client\n" --- -1.9.3 - diff --git a/0114-fix-regression-in-iscsi_tcp-iface-binding.patch b/0114-fix-regression-in-iscsi_tcp-iface-binding.patch deleted file mode 100644 index ff4da71..0000000 --- a/0114-fix-regression-in-iscsi_tcp-iface-binding.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 2966a9262df88fcfa971f988f93a9bf168600331 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Sun, 11 Jan 2015 21:36:24 -0800 -Subject: [PATCH] fix regression in iscsi_tcp iface binding - -The changes in "retry login for ISCSI_ERR_HOST_NOT_FOUND" caused -sessions using the iscsi_tcp transport bound to a network iface to fail -to connect due to the host lookup failing (iscsi_tcp hosts are -dynamically allocated per-session). - -This marks transports that use a host fixed to a hardware offload device -with "bind_ep_required" and only requires a host lookup before starting -the connection if this flag is set. - -Signed-off-by: Chris Leech ---- - usr/initiator.c | 30 ++++++++++++++++-------------- - usr/transport.c | 6 ++++++ - usr/transport.h | 1 + - 3 files changed, 23 insertions(+), 14 deletions(-) - -diff --git a/usr/initiator.c b/usr/initiator.c -index f54b708..1aadc9b 100644 ---- a/usr/initiator.c -+++ b/usr/initiator.c -@@ -398,20 +398,22 @@ __session_create(node_rec_t *rec, struct iscsi_transport *t, int *rc) - - iscsi_session_init_params(session); - -- hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, rc); -- if (!*rc) { -- /* -- * if the netdev or mac was set, then we are going to want -- * to want to bind the all the conns/eps to a specific host -- * if offload is used. -- */ -- session->conn[0].bind_ep = 1; -- session->hostno = hostno; -- } else if (*rc == ISCSI_ERR_HOST_NOT_FOUND) { -- goto free_session; -- } else { -- *rc = 0; -- } -+ if (t->template->bind_ep_required) { -+ hostno = iscsi_sysfs_get_host_no_from_hwinfo(&rec->iface, rc); -+ if (!*rc) { -+ /* -+ * if the netdev or mac was set, then we are going to want -+ * to want to bind the all the conns/eps to a specific host -+ * if offload is used. -+ */ -+ session->conn[0].bind_ep = 1; -+ session->hostno = hostno; -+ } else if (*rc == ISCSI_ERR_HOST_NOT_FOUND) { -+ goto free_session; -+ } else { -+ *rc = 0; -+ } -+ } - - list_add_tail(&session->list, &t->sessions); - return session; -diff --git a/usr/transport.c b/usr/transport.c -index 630f163..e778a6e 100644 ---- a/usr/transport.c -+++ b/usr/transport.c -@@ -59,6 +59,7 @@ struct iscsi_transport_template iscsi_iser = { - struct iscsi_transport_template cxgb3i = { - .name = "cxgb3i", - .set_host_ip = SET_HOST_IP_OPT, -+ .bind_ep_required = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -@@ -68,6 +69,7 @@ struct iscsi_transport_template cxgb3i = { - struct iscsi_transport_template cxgb4i = { - .name = "cxgb4i", - .set_host_ip = SET_HOST_IP_NOT_REQ, -+ .bind_ep_required = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -@@ -78,6 +80,7 @@ struct iscsi_transport_template bnx2i = { - .name = "bnx2i", - .set_host_ip = SET_HOST_IP_REQ, - .use_boot_info = 1, -+ .bind_ep_required = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -@@ -86,6 +89,7 @@ struct iscsi_transport_template bnx2i = { - - struct iscsi_transport_template be2iscsi = { - .name = "be2iscsi", -+ .bind_ep_required = 1, - .create_conn = be2iscsi_create_conn, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, -@@ -95,6 +99,7 @@ struct iscsi_transport_template be2iscsi = { - struct iscsi_transport_template qla4xxx = { - .name = "qla4xxx", - .set_host_ip = SET_HOST_IP_NOT_REQ, -+ .bind_ep_required = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -@@ -102,6 +107,7 @@ struct iscsi_transport_template qla4xxx = { - - struct iscsi_transport_template ocs = { - .name = "ocs", -+ .bind_ep_required = 1, - .ep_connect = ktransport_ep_connect, - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, -diff --git a/usr/transport.h b/usr/transport.h -index 73041fa..831403b 100644 ---- a/usr/transport.h -+++ b/usr/transport.h -@@ -38,6 +38,7 @@ struct iscsi_transport_template { - */ - uint8_t set_host_ip; - uint8_t use_boot_info; -+ uint8_t bind_ep_required; - int (*ep_connect) (struct iscsi_conn *conn, int non_blocking); - int (*ep_poll) (struct iscsi_conn *conn, int timeout_ms); - void (*ep_disconnect) (struct iscsi_conn *conn); --- -2.1.0 - diff --git a/0130-guard-against-NULL-ptr-during-discovery-from-unexpec.patch b/0130-guard-against-NULL-ptr-during-discovery-from-unexpec.patch deleted file mode 100644 index fb9d7ec..0000000 --- a/0130-guard-against-NULL-ptr-during-discovery-from-unexpec.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 46bc7ff0091af95735c03995be7d6002b03944dd Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 17 Nov 2014 21:34:06 -0800 -Subject: [PATCH] guard against NULL ptr during discovery from unexpected event - -When demand loading drivers during discovery, iscsiadm can receive an -unexpected netlink event, like a link up, when looking for a discovery -session login status. That could expose krecv_conn_state to a -connection without a valid recv_context pointer. -Guard against that to prevent the NULL dereference. - -Signed-off-by: Chris Leech ---- - usr/netlink.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/usr/netlink.c b/usr/netlink.c -index 1c4b5cc..18be5e5 100644 ---- a/usr/netlink.c -+++ b/usr/netlink.c -@@ -1035,6 +1035,10 @@ static int krecv_conn_state(struct iscsi_conn *conn, uint32_t *state) - /* fatal handling error or conn error */ - goto exit; - -+ /* unexpected event without a receive context */ -+ if (!conn->recv_context) -+ return -EAGAIN; -+ - *state = *(enum iscsi_conn_state *)conn->recv_context->data; - - ipc_ev_clbk->put_ev_context(conn->recv_context); --- -1.9.3 - diff --git a/0131-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch b/0131-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch deleted file mode 100644 index 64ce02b..0000000 --- a/0131-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 8de8ce551cbdb1250b696a5eedc5cff2b68e71e8 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 24 Feb 2014 03:14:17 -0500 -Subject: [PATCH] iscsiadm: Fix the hostno check for stats submode of host mode - -This fixes the condition where hostno value of 0 was being treated -as invalid. - -Signed-off-by: Chris Leech -Signed-off-by: Adheer Chandravanshi ---- - usr/iscsiadm.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 3cde8d1..36617ab 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -3470,7 +3470,7 @@ main(int argc, char **argv) - ¶ms); - break; - case MODE_HOST_STATS: -- if (!host_no) { -+ if (host_no > MAX_HOST_NO) { - log_error("STATS mode requires host no"); - rc = ISCSI_ERR_INVAL; - break; --- -1.8.3.1 - diff --git a/0132-iscsiadm-Fix-the-compile-time-warning.patch b/0132-iscsiadm-Fix-the-compile-time-warning.patch deleted file mode 100644 index b6fc868..0000000 --- a/0132-iscsiadm-Fix-the-compile-time-warning.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0e6cb00eac013c270741ee2bdb9427ccc62ad705 Mon Sep 17 00:00:00 2001 -From: Adheer Chandravanshi -Date: Mon, 24 Feb 2014 03:14:18 -0500 -Subject: [PATCH] iscsiadm: Fix the compile time warning - -This fixes the following compile time warning message: - -iscsiadm.c:2248: warning: passing argument 1 of 'print_host_stats' from incompatible pointer type - -Signed-off-by: Adheer Chandravanshi ---- - usr/iscsiadm.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index 36617ab..389f4b8 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -2245,7 +2245,8 @@ static int exec_host_stats_op(int op, int info_level, uint32_t host_no) - goto exit_host_stats; - } - -- print_host_stats(req_buf + sizeof(struct iscsi_uevent)); -+ print_host_stats((struct iscsi_offload_host_stats *)(req_buf + -+ sizeof(struct iscsi_uevent))); - - ipc->ctldev_close(); - --- -1.8.3.1 - diff --git a/0140-add-discovery-as-a-valid-mode-in-iscsiadm.8.patch b/0140-add-discovery-as-a-valid-mode-in-iscsiadm.8.patch deleted file mode 100644 index bfff999..0000000 --- a/0140-add-discovery-as-a-valid-mode-in-iscsiadm.8.patch +++ /dev/null @@ -1,36 +0,0 @@ -From f6e152e735231fe5cb1075b6d1c27ed1b248bdbd Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Wed, 24 Sep 2014 15:35:24 -0700 -Subject: [PATCH] add discovery as a valid mode in iscsiadm.8 - ---- - doc/iscsiadm.8 | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index 9a945d1..05793b2 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -174,13 +174,13 @@ for session mode). - .TP - \fB\-m, \-\-mode \fIop\fR - specify the mode. \fIop\fR --must be one of \fIdiscoverydb\fR, \fInode\fR, \fIfw\fR, \fIhost\fR \fIiface\fR or \fIsession\fR. -+must be one of \fIdiscovery\fR, \fIdiscoverydb\fR, \fInode\fR, \fIfw\fR, \fIhost\fR \fIiface\fR or \fIsession\fR. - .IP --If no other options are specified: for \fIdiscoverydb\fR and \fInode\fR, all --of their respective records are displayed; for \fIsession\fR, all active --sessions and connections are displayed; for \fIfw\fR, all boot firmware --values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; and --for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. -+If no other options are specified: for \fIdiscovery\fR, \fIdiscoverydb\fR and -+\fInode\fR, all of their respective records are displayed; for \fIsession\fR, -+all active sessions and connections are displayed; for \fIfw\fR, all boot -+firmware values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; -+and for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. - - .TP - \fB\-n\fR, \fB\-\-name=\fIname\fR --- -1.9.3 - diff --git a/0143-idmb_rec_write-check-for-tpgt-first.patch b/0143-idmb_rec_write-check-for-tpgt-first.patch deleted file mode 100644 index cdc958a..0000000 --- a/0143-idmb_rec_write-check-for-tpgt-first.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 24a4d8156786dfd91dcc17b2472653e963ebd028 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 13 Aug 2013 10:59:44 -0700 -Subject: idmb_rec_write, check for tpgt first - -Factor out the check for a tpgt to a single place, before going crazy on -the rec files. Makes flow of this function easier to follow, and preps -for splitting it up. ---- - usr/idbm.c | 18 +++++------------- - 1 file changed, 5 insertions(+), 13 deletions(-) - -diff --git a/usr/idbm.c b/usr/idbm.c -index 1e4f8c8..0a88699 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -1849,6 +1849,10 @@ static int idbm_rec_write(node_rec_t *rec) - if (rc) - goto free_portal; - -+ if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) -+ /* drop down to old style portal as config */ -+ goto open_conf; -+ - rc = stat(portal, &statb); - if (rc) { - rc = 0; -@@ -1857,23 +1861,11 @@ static int idbm_rec_write(node_rec_t *rec) - * set the tgpt. In new versions you must pass all the info in - * from the start - */ -- if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) -- /* drop down to old style portal as config */ -- goto open_conf; -- else -- goto mkdir_portal; -+ goto mkdir_portal; - } - - if (!S_ISDIR(statb.st_mode)) { - /* -- * older iscsiadm versions had you create the config then set -- * set the tgpt. In new versions you must pass all the info in -- * from the start -- */ -- if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) -- /* drop down to old style portal as config */ -- goto open_conf; -- /* - * Old style portal as a file, but with tpgt. Let's update it. - */ - if (unlink(portal)) { --- -1.8.1.4 - diff --git a/0144-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch b/0144-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch deleted file mode 100644 index 358b50c..0000000 --- a/0144-iscsid-add-initrd-option-to-set-run-from-initrd-hint.patch +++ /dev/null @@ -1,61 +0,0 @@ -From b1799fe84ed94a19bba6bcd7284ce8b038be4ffe Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 10 Dec 2012 13:20:47 -0800 -Subject: iscsid: add --initrd option to set run from initrd hint for systemd - -See http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons - -Signed-off-by: Chris Leech ---- - usr/iscsid.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/usr/iscsid.c b/usr/iscsid.c -index b4bb65b..7d71085 100644 ---- a/usr/iscsid.c -+++ b/usr/iscsid.c -@@ -61,6 +61,7 @@ static pid_t log_pid; - static gid_t gid; - static int daemonize = 1; - static int mgmt_ipc_fd; -+static int initrd = 0; - - static struct option const long_options[] = { - {"config", required_argument, NULL, 'c'}, -@@ -73,6 +74,7 @@ static struct option const long_options[] = { - {"pid", required_argument, NULL, 'p'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, -+ {"initrd", no_argument, &initrd, 1}, - {NULL, 0, NULL, 0}, - }; - -@@ -95,6 +97,7 @@ Open-iSCSI initiator daemon.\n\ - -p, --pid=pidfile use pid file (default " PID_FILE ").\n\ - -h, --help display this help and exit\n\ - -v, --version display version and exit\n\ -+ --initrd run from initrd\n\ - "); - } - exit(status); -@@ -383,12 +386,17 @@ int main(int argc, char *argv[]) - case 'h': - usage(0); - break; -+ case 0: -+ break; - default: - usage(1); - break; - } - } - -+ if (initrd) -+ argv[0][0] = '@'; -+ - /* initialize logger */ - log_pid = log_init(program_name, DEFAULT_AREA_SIZE, - daemonize ? log_do_log_daemon : log_do_log_std, NULL); --- -1.7.11.7 - diff --git a/0145-idbm_rec_write-seperate-old-and-new-style-writes.patch b/0145-idbm_rec_write-seperate-old-and-new-style-writes.patch deleted file mode 100644 index d138233..0000000 --- a/0145-idbm_rec_write-seperate-old-and-new-style-writes.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 954a9492b5ed1de5907ad2a7d7cc0ae6215d8fac Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 13 Aug 2013 11:34:31 -0700 -Subject: idbm_rec_write, seperate old and new style writes - -Duplicates a small bit of code, but easier to understand and extened. ---- - usr/idbm.c | 116 +++++++++++++++++++++++++++++++++++++++++-------------------- - 1 file changed, 79 insertions(+), 37 deletions(-) - -diff --git a/usr/idbm.c b/usr/idbm.c -index 0a88699..cb6ffd1 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -1808,7 +1808,7 @@ mkdir_portal: - return f; - } - --static int idbm_rec_write(node_rec_t *rec) -+static int idbm_rec_write_new(node_rec_t *rec) - { - struct stat statb; - FILE *f; -@@ -1820,38 +1820,8 @@ static int idbm_rec_write(node_rec_t *rec) - log_error("Could not alloc portal\n"); - return ISCSI_ERR_NOMEM; - } -- -- snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); -- if (access(portal, F_OK) != 0) { -- if (mkdir(portal, 0660) != 0) { -- log_error("Could not make %s: %s\n", portal, -- strerror(errno)); -- rc = ISCSI_ERR_IDBM; -- goto free_portal; -- } -- } -- -- snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); -- if (access(portal, F_OK) != 0) { -- if (mkdir(portal, 0660) != 0) { -- log_error("Could not make %s: %s\n", portal, -- strerror(errno)); -- rc = ISCSI_ERR_IDBM; -- goto free_portal; -- } -- } -- - snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, - rec->name, rec->conn[0].address, rec->conn[0].port); -- log_debug(5, "Looking for config file %s", portal); -- -- rc = idbm_lock(); -- if (rc) -- goto free_portal; -- -- if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) -- /* drop down to old style portal as config */ -- goto open_conf; - - rc = stat(portal, &statb); - if (rc) { -@@ -1872,11 +1842,11 @@ static int idbm_rec_write(node_rec_t *rec) - log_error("Could not convert %s: %s\n", portal, - strerror(errno)); - rc = ISCSI_ERR_IDBM; -- goto unlock; -+ goto free_portal; - } - } else { - rc = ISCSI_ERR_INVAL; -- goto unlock; -+ goto free_portal; - } - - mkdir_portal: -@@ -1887,24 +1857,96 @@ mkdir_portal: - log_error("Could not make dir %s: %s\n", - portal, strerror(errno)); - rc = ISCSI_ERR_IDBM; -- goto unlock; -+ goto free_portal; - } - } - - snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR, - rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt, - rec->iface.name); --open_conf: -+/* open_conf: */ - f = fopen(portal, "w"); - if (!f) { - log_error("Could not open %s: %sd\n", portal, strerror(errno)); - rc = ISCSI_ERR_IDBM; -- goto unlock; -+ goto free_portal; - } - - idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); - fclose(f); --unlock: -+free_portal: -+ free(portal); -+ return rc; -+} -+ -+static int idbm_rec_write_old(node_rec_t *rec) -+{ -+ FILE *f; -+ char *portal; -+ int rc = 0; -+ -+ portal = malloc(PATH_MAX); -+ if (!portal) { -+ log_error("Could not alloc portal\n"); -+ return ISCSI_ERR_NOMEM; -+ } -+ snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, -+ rec->name, rec->conn[0].address, rec->conn[0].port); -+ -+ f = fopen(portal, "w"); -+ if (!f) { -+ log_error("Could not open %s: %sd\n", portal, strerror(errno)); -+ rc = ISCSI_ERR_IDBM; -+ goto free_portal; -+ } -+ idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); -+ fclose(f); -+free_portal: -+ free(portal); -+ return rc; -+} -+ -+static int idbm_rec_write(node_rec_t *rec) -+{ -+ char *portal; -+ int rc = 0; -+ -+ portal = malloc(PATH_MAX); -+ if (!portal) { -+ log_error("Could not alloc portal\n"); -+ return ISCSI_ERR_NOMEM; -+ } -+ -+ snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); -+ if (access(portal, F_OK) != 0) { -+ if (mkdir(portal, 0660) != 0) { -+ log_error("Could not make %s: %s\n", portal, -+ strerror(errno)); -+ rc = ISCSI_ERR_IDBM; -+ goto free_portal; -+ } -+ } -+ -+ snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); -+ if (access(portal, F_OK) != 0) { -+ if (mkdir(portal, 0660) != 0) { -+ log_error("Could not make %s: %s\n", portal, -+ strerror(errno)); -+ rc = ISCSI_ERR_IDBM; -+ goto free_portal; -+ } -+ } -+ -+ rc = idbm_lock(); -+ if (rc) -+ goto free_portal; -+ -+ if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) -+ /* old style portal as config */ -+ rc = idbm_rec_write_old(rec); -+ else -+ rc = idbm_rec_write_new(rec); -+ - idbm_unlock(); - free_portal: - free(portal); --- -1.8.1.4 - diff --git a/0146-idbw_rec_write-pick-tpgt-from-existing-record.patch b/0146-idbw_rec_write-pick-tpgt-from-existing-record.patch deleted file mode 100644 index 73966eb..0000000 --- a/0146-idbw_rec_write-pick-tpgt-from-existing-record.patch +++ /dev/null @@ -1,87 +0,0 @@ -From ef61cd4912e90c8202598f2fa4e9f1842a5b5822 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 13 Aug 2013 12:39:07 -0700 -Subject: idbw_rec_write, pick tpgt from existing record - -On a static add (-m node -o new) without a user specified tpgt, looks -for existing new style records with tpgt before creating an old style -record without. If one exists, take the tpgt from it an write an -updated new style record instead. ---- - usr/idbm.c | 40 ++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 40 insertions(+) - -diff --git a/usr/idbm.c b/usr/idbm.c -index cb6ffd1..0410079 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -162,6 +163,8 @@ static struct idbm *db; - _n++; \ - } while(0) - -+static int idbm_remove_disc_to_node_link(node_rec_t *rec, char *portal); -+ - static void - idbm_recinfo_discovery(discovery_rec_t *r, recinfo_t *ri) - { -@@ -2082,12 +2085,49 @@ static int idbm_rec_write_old(node_rec_t *rec) - FILE *f; - char *portal; - int rc = 0; -+ glob_t globbuf; -+ int i; -+ int tpgt = PORTAL_GROUP_TAG_UNKNOWN; - - portal = malloc(PATH_MAX); - if (!portal) { - log_error("Could not alloc portal\n"); - return ISCSI_ERR_NOMEM; - } -+ -+ /* check for newer portal dir with tpgt */ -+ snprintf(portal, PATH_MAX, "%s/%s/%s,%d,*", NODE_CONFIG_DIR, -+ rec->name, rec->conn[0].address, rec->conn[0].port); -+ rc = glob(portal, GLOB_ONLYDIR, NULL, &globbuf); -+ if (!rc) { -+ if (globbuf.gl_pathc > 1) -+ log_warning("multiple tpg records for portal " -+ "%s/%s:%d found", rec->name, -+ rec->conn[0].address, rec->conn[0].port); -+ /* set pattern for sscanf matching of tpgt */ -+ snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%%u", NODE_CONFIG_DIR, -+ rec->name, rec->conn[0].address, rec->conn[0].port); -+ for (i = 0; i < globbuf.gl_pathc; i++) { -+ rc = sscanf(globbuf.gl_pathv[i], portal, &tpgt); -+ if (rc == 1) -+ break; -+ } -+ if (tpgt == PORTAL_GROUP_TAG_UNKNOWN) -+ log_warning("glob match on existing records, " -+ "but no valid tpgt found"); -+ } -+ globfree(&globbuf); -+ rc = 0; -+ -+ /* if a tpgt was selected from an old record, write entry in new format */ -+ if (tpgt != PORTAL_GROUP_TAG_UNKNOWN) { -+ log_warning("using tpgt %u from existing record", tpgt); -+ rec->tpgt = tpgt; -+ rc = idbm_remove_disc_to_node_link(rec, portal); -+ free(portal); -+ return idbm_rec_write_new(rec); -+ } -+ - snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, - rec->name, rec->conn[0].address, rec->conn[0].port); - --- -1.8.3.1 - diff --git a/0147-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch b/0147-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch deleted file mode 100644 index 537a947..0000000 --- a/0147-iscsiadm-iscsid-newroot-command-to-survive-switch_ro.patch +++ /dev/null @@ -1,158 +0,0 @@ -From e5d7c7070358a5db8b849c8c5886e67881fe8906 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Fri, 7 Dec 2012 17:01:42 -0800 -Subject: [PATCH 47/47] iscsiadm, iscsid: newroot command to survive - switch_root - -When started from initramfs, iscsid needs to be able to chroot itself -to the runtime filesystem before the switch_root occurs. In the -initramfs "iscsiadm --newroot {root fs mount before switch}" should be -called before the switch_root. - -Signed-off-by: Chris Leech ---- - usr/iscsiadm.c | 30 ++++++++++++++++++++++++++++++ - usr/mgmt_ipc.c | 11 +++++++++++ - usr/mgmt_ipc.h | 6 +++++- - 3 files changed, 46 insertions(+), 1 deletion(-) - -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index da0a3ec..af6d607 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -117,6 +117,7 @@ static struct option const long_options[] = - {"interval", required_argument, NULL, 'i'}, - {"flashnode_idx", optional_argument, NULL, 'x'}, - {"portal_type", optional_argument, NULL, 'A'}, -+ {"newroot", required_argument, NULL, 0}, - {NULL, 0, NULL, 0}, - }; - static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:ux:A:"; -@@ -137,6 +138,7 @@ iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ - iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ - iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ] | [ -C flashnode [ -o operation ] [ -A portal_type ] [ -x flashnode_idx ] [ -n name ] [ -v value ] ] ]\n\ -+iscsiadm --newroot switch_root_path\n\ - iscsiadm -k priority\n"); - } - exit(status); -@@ -278,6 +280,22 @@ static void kill_iscsid(int priority) - } - } - -+static void do_newroot(char *newroot) -+{ -+ iscsiadm_req_t req; -+ iscsiadm_rsp_t rsp; -+ int rc; -+ -+ memset(&req, 0, sizeof(req)); -+ req.command = MGMT_IPC_NEWROOT; -+ strncpy(req.u.newroot.path, newroot, PATH_MAX); -+ rc = iscsid_exec_req(&req, &rsp, 0); -+ if (rc) { -+ iscsi_err_print_msg(rc); -+ log_error("Could not send NEWROOT command"); -+ } -+} -+ - /* - * TODO: we can display how the ifaces are related to node records. - * And we can add a scsi_host mode which would display how -@@ -2800,6 +2818,7 @@ main(int argc, char **argv) - { - char *ip = NULL, *name = NULL, *value = NULL; - char *targetname = NULL, *group_session_mgmt_mode = NULL; -+ char *newroot = NULL; - int ch, longindex, mode=-1, port=-1, do_login=0, do_rescan=0; - int rc=0, sid=-1, op=OP_NOOP, type=-1, do_logout=0, do_stats=0; - int do_login_all=0, do_logout_all=0, info_level=-1, num_ifaces = 0; -@@ -2837,6 +2856,12 @@ main(int argc, char **argv) - while ((ch = getopt_long(argc, argv, short_options, - long_options, &longindex)) >= 0) { - switch (ch) { -+ case 0: -+ if (long_options[longindex].flag != 0) -+ break; -+ if (!strcmp(long_options[longindex].name, "newroot")) -+ newroot = optarg; -+ break; - case 'k': - killiscsid = atoi(optarg); - if (killiscsid < 0) { -@@ -2989,6 +3014,11 @@ main(int argc, char **argv) - goto free_ifaces; - } - -+ if (newroot) { -+ do_newroot(newroot); -+ goto free_ifaces; -+ } -+ - if (mode < 0) - usage(ISCSI_ERR_INVAL); - -diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c -index 87bd346..5cb7143 100644 ---- a/usr/mgmt_ipc.c -+++ b/usr/mgmt_ipc.c -@@ -226,6 +226,16 @@ mgmt_ipc_immediate_stop(queue_task_t *qtask) - } - - static int -+mgmt_ipc_newroot(queue_task_t *qtask) -+{ -+ char *newroot = qtask->req.u.newroot.path; -+ if (chdir(newroot) || chroot(".") || chdir("/")) -+ return ISCSI_ERR; -+ mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS); -+ return ISCSI_SUCCESS; -+} -+ -+static int - mgmt_ipc_conn_remove(queue_task_t *qtask) - { - return ISCSI_ERR; -@@ -534,6 +544,7 @@ static mgmt_ipc_fn_t * mgmt_ipc_functions[__MGMT_IPC_MAX_COMMAND] = { - [MGMT_IPC_NOTIFY_DEL_NODE] = mgmt_ipc_notify_del_node, - [MGMT_IPC_NOTIFY_ADD_PORTAL] = mgmt_ipc_notify_add_portal, - [MGMT_IPC_NOTIFY_DEL_PORTAL] = mgmt_ipc_notify_del_portal, -+[MGMT_IPC_NEWROOT] = mgmt_ipc_newroot, - }; - - void mgmt_ipc_handle(int accept_fd) -diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h -index 55972ed..102ffff 100644 ---- a/usr/mgmt_ipc.h -+++ b/usr/mgmt_ipc.h -@@ -22,6 +22,7 @@ - #include "types.h" - #include "iscsi_if.h" - #include "config.h" -+#include "limits.h" - - #define ISCSIADM_NAMESPACE "ISCSIADM_ABSTRACT_NAMESPACE" - #define PEERUSER_MAX 64 -@@ -46,6 +47,7 @@ typedef enum iscsiadm_cmd { - MGMT_IPC_NOTIFY_DEL_NODE = 17, - MGMT_IPC_NOTIFY_ADD_PORTAL = 18, - MGMT_IPC_NOTIFY_DEL_PORTAL = 19, -+ MGMT_IPC_NEWROOT = 20, - - __MGMT_IPC_MAX_COMMAND - } iscsiadm_cmd_e; -@@ -75,8 +77,10 @@ typedef struct iscsiadm_req { - int param; - /* TODO: make this variable len to support */ - char value[IFNAMSIZ + 1]; -- - } set_host_param; -+ struct ipc_msg_newroot { -+ char path[PATH_MAX + 1]; -+ } newroot; - } u; - } iscsiadm_req_t; - --- -1.8.1.4 - diff --git a/0147-iscsiuio-systemd-socket-activation-support.patch b/0147-iscsiuio-systemd-socket-activation-support.patch deleted file mode 100644 index 896eba9..0000000 --- a/0147-iscsiuio-systemd-socket-activation-support.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 8003178db245b43d04b27b559d5541ced24ec13f Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Wed, 19 Dec 2012 21:39:06 -0800 -Subject: [PATCH] iscsiuio systemd socket activation support - ---- - iscsiuio/src/unix/iscsid_ipc.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/iscsiuio/src/unix/iscsid_ipc.c b/iscsiuio/src/unix/iscsid_ipc.c -index e22de0d..4908cb7 100644 ---- a/iscsiuio/src/unix/iscsid_ipc.c -+++ b/iscsiuio/src/unix/iscsid_ipc.c -@@ -948,6 +948,30 @@ static void *iscsid_loop(void *arg) - pthread_exit(NULL); - } - -+#define SD_SOCKET_FDS_START 3 -+ -+static int ipc_systemd(void) -+{ -+ char *env; -+ -+ env = getenv("LISTEN_PID"); -+ -+ if (!env || (strtoul(env, NULL, 10) != getpid())) -+ return -EINVAL; -+ -+ env = getenv("LISTEN_FDS"); -+ -+ if (!env) -+ return -EINVAL; -+ -+ if (strtoul(env, NULL, 10) != 1) { -+ LOG_ERR("Did not receive exactly one IPC socket from systemd"); -+ return -EINVAL; -+ } -+ -+ return SD_SOCKET_FDS_START; -+} -+ - /****************************************************************************** - * Initialize/Cleanup routines - ******************************************************************************/ -@@ -961,6 +985,10 @@ int iscsid_init() - int rc, addr_len; - struct sockaddr_un addr; - -+ iscsid_opts.fd = ipc_systemd(); -+ if (iscsid_opts.fd >= 0) -+ return 0; -+ - iscsid_opts.fd = socket(AF_LOCAL, SOCK_STREAM, 0); - if (iscsid_opts.fd < 0) { - LOG_ERR(PFX "Can not create IPC socket"); --- -1.8.3.1 - diff --git a/0148-iscsiadm-param-parsing-for-advanced-node-creation.patch b/0148-iscsiadm-param-parsing-for-advanced-node-creation.patch deleted file mode 100644 index a39833b..0000000 --- a/0148-iscsiadm-param-parsing-for-advanced-node-creation.patch +++ /dev/null @@ -1,337 +0,0 @@ -From b58f3b48a36821d10a3377acfcbf18113fba0c9d Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 18 Dec 2012 11:27:00 -0800 -Subject: [PATCH 48/48] iscsiadm: --param parsing for advanced node creation - -Share parse_param and apply_param code from iscsistart, allow using multiple ---param options to set arbitrary fields in node mode. - -Signed-off-by: Chris Leech ---- - usr/Makefile | 2 +- - usr/iscsi_param.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - usr/iscsi_param.h | 7 ++++ - usr/iscsiadm.c | 16 ++++++++-- - usr/iscsistart.c | 91 ++-------------------------------------------------- - 5 files changed, 120 insertions(+), 91 deletions(-) - create mode 100644 usr/iscsi_param.c - create mode 100644 usr/iscsi_param.h - -diff --git a/usr/Makefile b/usr/Makefile -index 3d8ee22..a7e80c0 100644 ---- a/usr/Makefile -+++ b/usr/Makefile -@@ -40,7 +40,7 @@ SYSDEPS_SRCS = $(wildcard ../utils/sysdeps/*.o) - ISCSI_LIB_SRCS = iscsi_util.o io.o auth.o iscsi_timer.o login.o log.o md5.o \ - sha1.o iface.o idbm.o sysfs.o host.o session_info.o iscsi_sysfs.o \ - iscsi_net_util.o iscsid_req.o transport.o iser.o cxgbi.o be2iscsi.o \ -- initiator_common.o iscsi_err.o flashnode.o uip_mgmt_ipc.o \ -+ initiator_common.o iscsi_err.o iscsi_param.o flashnode.o uip_mgmt_ipc.o \ - $(IPC_OBJ) $(SYSDEPS_SRCS) - # core initiator files - INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o kern_err_table.o -diff --git a/usr/iscsi_param.c b/usr/iscsi_param.c -new file mode 100644 -index 0000000..c075e8f ---- /dev/null -+++ b/usr/iscsi_param.c -@@ -0,0 +1,95 @@ -+#include -+#include "log.h" -+#include "config.h" -+#include "idbm.h" -+#include "list.h" -+#include "iface.h" -+#include "idbm_fields.h" -+#include "iscsi_err.h" -+ -+int apply_params(struct list_head *user_params, struct node_rec *rec) -+{ -+ struct user_param *param; -+ int rc; -+ -+ /* Must init this so we can check if user overrode them */ -+ rec->session.initial_login_retry_max = -1; -+ rec->conn[0].timeo.noop_out_interval = -1; -+ rec->conn[0].timeo.noop_out_timeout = -1; -+ -+ list_for_each_entry(param, user_params, list) { -+ /* -+ * user may not have passed in all params that were set by -+ * ibft/iscsi_boot, so clear out values that might conflict -+ * with user overrides -+ */ -+ if (!strcmp(param->name, IFACE_NETNAME)) { -+ /* overriding netname so MAC will be for old netdev */ -+ memset(rec->iface.hwaddress, 0, -+ sizeof(rec->iface.hwaddress)); -+ } else if (!strcmp(param->name, IFACE_HWADDR)) { -+ /* overriding MAC so netdev will be for old MAC */ -+ memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev)); -+ } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) { -+ /* -+ * switching drivers so all old binding info is no -+ * longer valid. Old values were either for offload -+ * and we are switching to software or the reverse, -+ * or switching types of cards (bnx2i to cxgb3i). -+ */ -+ memset(&rec->iface, 0, sizeof(rec->iface)); -+ iface_setup_defaults(&rec->iface); -+ } -+ } -+ -+ rc = idbm_node_set_rec_from_param(user_params, rec, 0); -+ if (rc) -+ return rc; -+ -+ /* -+ * For root boot we could not change this in older versions so -+ * if user did not override then use the defaults. -+ * -+ * Increase to account for boot using static setup. -+ */ -+ if (rec->session.initial_login_retry_max == -1) -+ rec->session.initial_login_retry_max = 30; -+ /* we used to not be able to answer so turn off */ -+ if (rec->conn[0].timeo.noop_out_interval == -1) -+ rec->conn[0].timeo.noop_out_interval = 0; -+ if (rec->conn[0].timeo.noop_out_timeout == -1) -+ rec->conn[0].timeo.noop_out_timeout = 0; -+ -+ return 0; -+} -+ -+int parse_param(struct list_head *user_params, char *param_str) -+{ -+ struct user_param *param; -+ char *name, *value; -+ -+ name = param_str; -+ -+ value = strchr(param_str, '='); -+ if (!value) { -+ log_error("Invalid --param %s. Missing value.", param_str); -+ return ISCSI_ERR_INVAL; -+ } -+ *value = '\0'; -+ -+ value++; -+ if (!strlen(value)) { -+ log_error("Invalid --param %s. Missing value.", param_str); -+ return ISCSI_ERR_INVAL; -+ } -+ -+ param = idbm_alloc_user_param(name, value); -+ if (!param) { -+ log_error("Could not allocate memory for param."); -+ return ISCSI_ERR_NOMEM; -+ } -+ -+ list_add(¶m->list, user_params); -+ return 0; -+} -+ -diff --git a/usr/iscsi_param.h b/usr/iscsi_param.h -new file mode 100644 -index 0000000..8b7956c ---- /dev/null -+++ b/usr/iscsi_param.h -@@ -0,0 +1,7 @@ -+#ifndef ISCSI_PARAM_H -+#define ISCSI_PARAM_H -+ -+extern int parse_param(struct list_head *user_params, char *param_str); -+extern int apply_params(struct list_head *user_params, struct node_rec *rec); -+ -+#endif -diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c -index af6d607..2003d48 100644 ---- a/usr/iscsiadm.c -+++ b/usr/iscsiadm.c -@@ -53,6 +53,7 @@ - #include "iscsi_err.h" - #include "iscsi_ipc.h" - #include "iscsi_timer.h" -+#include "iscsi_param.h" - #include "flashnode.h" - - static char program_name[] = "iscsiadm"; -@@ -118,6 +119,7 @@ static struct option const long_options[] = - {"flashnode_idx", optional_argument, NULL, 'x'}, - {"portal_type", optional_argument, NULL, 'A'}, - {"newroot", required_argument, NULL, 0}, -+ {"param", required_argument, NULL, 0}, - {NULL, 0, NULL, 0}, - }; - static char *short_options = "RlDVhm:a:b:c:C:p:P:T:H:i:I:U:k:L:d:r:n:v:o:sSt:ux:A:"; -@@ -133,7 +135,7 @@ iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p - [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ] \n\ - iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ] \n\ - iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] \ --[ [ -o operation ] [ -n name ] [ -v value ] ]\n\ -+[ [ -o operation ] [ -n name ] [ -v value ] ] [ --param=NAME=VALUE ]\n\ - iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ - iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]\n\ - iscsiadm -m fw [ -d debug_level ] [ -l ]\n\ -@@ -2834,9 +2836,11 @@ main(int argc, char **argv) - uint32_t host_no = -1; - struct user_param *param; - struct list_head params; -+ struct list_head user_params; - - INIT_LIST_HEAD(¶ms); - INIT_LIST_HEAD(&ifaces); -+ INIT_LIST_HEAD(&user_params); - /* do not allow ctrl-c for now... */ - memset(&sa_old, 0, sizeof(struct sigaction)); - memset(&sa_new, 0, sizeof(struct sigaction)); -@@ -2859,8 +2863,14 @@ main(int argc, char **argv) - case 0: - if (long_options[longindex].flag != 0) - break; -- if (!strcmp(long_options[longindex].name, "newroot")) -+ if (!strcmp(long_options[longindex].name, "newroot")) { - newroot = optarg; -+ break; -+ } -+ if (!strcmp(long_options[longindex].name, "param")) { -+ parse_param(&user_params, optarg); -+ break; -+ } - break; - case 'k': - killiscsid = atoi(optarg); -@@ -3169,6 +3179,8 @@ main(int argc, char **argv) - goto out; - } - -+ apply_params(&user_params, rec); -+ - rc = exec_node_op(op, do_login, do_logout, do_show, - do_rescan, do_stats, info_level, rec, - ¶ms); -diff --git a/usr/iscsistart.c b/usr/iscsistart.c -index 6924d49..85be35b 100644 ---- a/usr/iscsistart.c -+++ b/usr/iscsistart.c -@@ -50,6 +50,7 @@ - #include "iscsid_req.h" - #include "iscsi_err.h" - #include "iface.h" -+#include "iscsi_param.h" - - /* global config info */ - /* initiator needs initiator name/alias */ -@@ -131,99 +132,13 @@ static int stop_event_loop(void) - return rc; - } - --static int apply_params(struct node_rec *rec) --{ -- struct user_param *param; -- int rc; -- -- /* Must init this so we can check if user overrode them */ -- rec->session.initial_login_retry_max = -1; -- rec->conn[0].timeo.noop_out_interval = -1; -- rec->conn[0].timeo.noop_out_timeout = -1; -- -- list_for_each_entry(param, &user_params, list) { -- /* -- * user may not have passed in all params that were set by -- * ibft/iscsi_boot, so clear out values that might conflict -- * with user overrides -- */ -- if (!strcmp(param->name, IFACE_NETNAME)) { -- /* overriding netname so MAC will be for old netdev */ -- memset(rec->iface.hwaddress, 0, -- sizeof(rec->iface.hwaddress)); -- } else if (!strcmp(param->name, IFACE_HWADDR)) { -- /* overriding MAC so netdev will be for old MAC */ -- memset(rec->iface.netdev, 0, sizeof(rec->iface.netdev)); -- } else if (!strcmp(param->name, IFACE_TRANSPORTNAME)) { -- /* -- * switching drivers so all old binding info is no -- * longer valid. Old values were either for offload -- * and we are switching to software or the reverse, -- * or switching types of cards (bnx2i to cxgb3i). -- */ -- memset(&rec->iface, 0, sizeof(rec->iface)); -- iface_setup_defaults(&rec->iface); -- } -- } -- -- rc = idbm_node_set_rec_from_param(&user_params, rec, 0); -- if (rc) -- return rc; -- -- /* -- * For root boot we could not change this in older versions so -- * if user did not override then use the defaults. -- * -- * Increase to account for boot using static setup. -- */ -- if (rec->session.initial_login_retry_max == -1) -- rec->session.initial_login_retry_max = 30; -- /* we used to not be able to answer so turn off */ -- if (rec->conn[0].timeo.noop_out_interval == -1) -- rec->conn[0].timeo.noop_out_interval = 0; -- if (rec->conn[0].timeo.noop_out_timeout == -1) -- rec->conn[0].timeo.noop_out_timeout = 0; -- -- return 0; --} -- --static int parse_param(char *param_str) --{ -- struct user_param *param; -- char *name, *value; -- -- name = param_str; -- -- value = strchr(param_str, '='); -- if (!value) { -- log_error("Invalid --param %s. Missing value.", param_str); -- return ISCSI_ERR_INVAL; -- } -- *value = '\0'; -- -- value++; -- if (!strlen(value)) { -- log_error("Invalid --param %s. Missing value.", param_str); -- return ISCSI_ERR_INVAL; -- } -- -- param = idbm_alloc_user_param(name, value); -- if (!param) { -- log_error("Could not allocate memory for param."); -- return ISCSI_ERR_NOMEM; -- } -- -- list_add(¶m->list, &user_params); -- return 0; --} -- - static int login_session(struct node_rec *rec) - { - iscsiadm_req_t req; - iscsiadm_rsp_t rsp; - int rc, retries = 0; - -- rc = apply_params(rec); -+ rc = apply_params(&user_params, rec); - if (rc) - return rc; - -@@ -426,7 +341,7 @@ int main(int argc, char *argv[]) - fw_free_targets(&targets); - exit(0); - case 'P': -- err = parse_param(optarg); -+ err = parse_param(&user_params, optarg); - if (err) - exit(err); - break; --- -1.8.1.4 - diff --git a/0149-update-systemd-service-files-add-iscsi.service-for-s.patch b/0149-update-systemd-service-files-add-iscsi.service-for-s.patch deleted file mode 100644 index 966bb9f..0000000 --- a/0149-update-systemd-service-files-add-iscsi.service-for-s.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 1c3b1d23e0b3f17399ffd4463cafad813b0444d5 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Wed, 19 Dec 2012 15:07:36 -0800 -Subject: update systemd service files, add iscsi.service for starting - sessions on boot - -Signed-off-by: Chris Leech ---- - etc/systemd/iscsi.service | 19 +++++++++++++++++++ - etc/systemd/iscsi_mark_root_nodes | 14 ++++++++++++++ - etc/systemd/iscsid.service | 7 +++++-- - etc/systemd/iscsid.socket | 2 +- - 4 files changed, 39 insertions(+), 3 deletions(-) - create mode 100644 etc/systemd/iscsi.service - create mode 100755 etc/systemd/iscsi_mark_root_nodes - -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -new file mode 100644 -index 0000000..bbd52fd ---- /dev/null -+++ b/etc/systemd/iscsi.service -@@ -0,0 +1,19 @@ -+[Unit] -+Description=Login and scanning of iSCSI devices -+Documentation=man:iscsid(8) man:iscsiadm(8) -+DefaultDependencies=no -+Conflicts=shutdown.target -+After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service -+Before=remote-fs-pre.target -+ConditionPathExists=/etc/iscsi/initiatorname.iscsi -+ -+[Service] -+Type=oneshot -+RemainAfterExit=true -+ExecStart=/usr/libexec/iscsi_mark_root_nodes -+ExecStart=/sbin/iscsiadm -m node --loginall=automatic -+ExecStop=/bin/sync -+ExecStop=/sbin/iscsiadm -m node --logoutall=automatic -+ -+[Install] -+WantedBy=sysinit.target -diff --git a/etc/systemd/iscsi_mark_root_nodes b/etc/systemd/iscsi_mark_root_nodes -new file mode 100755 -index 0000000..c68475c ---- /dev/null -+++ b/etc/systemd/iscsi_mark_root_nodes -@@ -0,0 +1,14 @@ -+#!/bin/bash -+ -+ISCSIADM=/sbin/iscsiadm -+SESSION_FILE=/run/initramfs/iscsi.sessions -+ -+if [ ! -f $SESSION_FILE ] ; then -+ exit 0 -+fi -+ -+while read t num i target; do -+ ip=${i%:*} -+ $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot -+done < $SESSION_FILE -+ -diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service -index 028e0b3..653dd08 100644 ---- a/etc/systemd/iscsid.service -+++ b/etc/systemd/iscsid.service -@@ -1,7 +1,10 @@ - [Unit] - Description=Open-iSCSI --Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) --After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service -+Documentation=man:iscsid(8) man:iscsiadm(8) -+DefaultDependencies=no -+Conflicts=shutdown.target -+After=network.target iscsiuio.service -+Before=remote-fs-pre.target - - [Service] - Type=forking -diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket -index 832451d..58a8d12 100644 ---- a/etc/systemd/iscsid.socket -+++ b/etc/systemd/iscsid.socket -@@ -1,6 +1,6 @@ - [Unit] - Description=Open-iSCSI iscsid Socket --Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) -+Documentation=man:iscsid(8) man:iscsiadm(8) - - [Socket] - ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE --- -1.7.11.7 - diff --git a/0150-iscsi-boot-related-service-file-updates.patch b/0150-iscsi-boot-related-service-file-updates.patch deleted file mode 100644 index 19450ee..0000000 --- a/0150-iscsi-boot-related-service-file-updates.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 8f79529354b4023c371e00091f11bdd523497639 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 19 Aug 2013 07:18:25 -0700 -Subject: iscsi boot related service file updates - -make sure iscsid gets started if there are any boot sessions running -add reload target to fix double session problem when restarting from NM -don't rely on session list passed from initrd, never got fully implemented ---- - etc/systemd/iscsi-mark-root-nodes | 13 +++++++++++++ - etc/systemd/iscsi.service | 3 ++- - etc/systemd/iscsi_mark_root_nodes | 14 -------------- - 3 files changed, 15 insertions(+), 15 deletions(-) - create mode 100644 etc/systemd/iscsi-mark-root-nodes - delete mode 100644 etc/systemd/iscsi_mark_root_nodes - -diff --git a/etc/systemd/iscsi-mark-root-nodes b/etc/systemd/iscsi-mark-root-nodes -new file mode 100644 -index 0000000..157be62 ---- /dev/null -+++ b/etc/systemd/iscsi-mark-root-nodes -@@ -0,0 +1,13 @@ -+#!/bin/bash -+ -+ISCSIADM=/sbin/iscsiadm -+ -+$ISCSIADM -m session >/dev/null 2>&1 || exit 0 -+ -+$ISCSIADM -m session | while read t num i target; do -+ ip=${i%:*} -+ $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot -+done -+ -+systemctl start iscsid.service -+ -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -index 7b4efee..d5712bd 100644 ---- a/etc/systemd/iscsi.service -+++ b/etc/systemd/iscsi.service -@@ -10,10 +10,11 @@ ConditionDirectoryNotEmpty=/var/lib/iscsi/nodes - [Service] - Type=oneshot - RemainAfterExit=true --ExecStart=/usr/libexec/iscsi_mark_root_nodes -+ExecStart=/usr/libexec/iscsi-mark-root-nodes - ExecStart=/sbin/iscsiadm -m node --loginall=automatic - ExecStop=/bin/sync - ExecStop=/sbin/iscsiadm -m node --logoutall=automatic -+ExecReload=/sbin/iscsiadm -m node --loginall=automatic - - [Install] - WantedBy=sysinit.target -diff --git a/etc/systemd/iscsi_mark_root_nodes b/etc/systemd/iscsi_mark_root_nodes -deleted file mode 100644 -index c68475c..0000000 ---- a/etc/systemd/iscsi_mark_root_nodes -+++ /dev/null -@@ -1,14 +0,0 @@ --#!/bin/bash -- --ISCSIADM=/sbin/iscsiadm --SESSION_FILE=/run/initramfs/iscsi.sessions -- --if [ ! -f $SESSION_FILE ] ; then -- exit 0 --fi -- --while read t num i target; do -- ip=${i%:*} -- $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot --done < $SESSION_FILE -- --- -1.8.1.4 - diff --git a/0151-update-initscripts-and-docs.patch b/0151-update-initscripts-and-docs.patch deleted file mode 100644 index e2d4cdc..0000000 --- a/0151-update-initscripts-and-docs.patch +++ /dev/null @@ -1,130 +0,0 @@ -From c255c2cd43afeaefa428237a3200f02fb238d89e Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 19 Nov 2012 16:37:13 -0800 -Subject: update initscripts and docs - ---- - README | 9 +++------ - etc/iscsid.conf | 23 +++++++++++------------ - usr/idbm.c | 4 ++++ - 3 files changed, 18 insertions(+), 18 deletions(-) - -diff --git a/README b/README -index ec22098..2a8319a 100644 ---- a/README -+++ b/README -@@ -74,11 +74,6 @@ the cache sync command will fail. - - iscsiadm's -P 3 option will not print out scsi devices. - - iscsid will not automatically online devices. - --You need to enable "Cryptographic API" under "Cryptographic options" in the --kernel config. And you must enable "CRC32c CRC algorithm" even if --you do not use header or data digests. They are the kernel options, --CONFIG_CRYPTO and CONFIG_CRYPTO_CRC32C, respectively. -- - By default the kernel's iSCSI modules will be used. Running: - - make -@@ -997,7 +992,7 @@ Red Hat or Fedora: - ----------------- - To start open-iscsi in Red Hat/Fedora you can do: - -- service open-iscsi start -+ service iscsi start - - To get open-iscsi to automatically start at run time you may have to - run: -@@ -1205,6 +1200,8 @@ iscsid will only perform rediscovery when it gets a SCN from the server. - # linux-isns (SLES's iSNS server) where it sometimes does not send SCN - # events in the proper format, so they may not get handled. - -+To set the startup value, so that nodes are not logged into automatically -+use the value "manual". - - Example: - -------- -diff --git a/etc/iscsid.conf b/etc/iscsid.conf -index ef76dc0..ac1d231 100644 ---- a/etc/iscsid.conf -+++ b/etc/iscsid.conf -@@ -17,10 +17,10 @@ - # maintainers. - # - # Default for Fedora and RHEL. (uncomment to activate). --# iscsid.startup = /etc/rc.d/init.d/iscsid force-start -+iscsid.startup = /etc/rc.d/init.d/iscsid force-start - # - # Default for upstream open-iscsi scripts (uncomment to activate). --iscsid.startup = /sbin/iscsid -+# iscsid.startup = /sbin/iscsid - - - ############################# -@@ -36,8 +36,8 @@ iscsid.startup = /sbin/iscsid - # To request that the iscsi initd scripts startup a session set to "automatic". - # node.startup = automatic - # --# To manually startup the session set to "manual". The default is manual. --node.startup = manual -+# To manually startup the session set to "manual". The default is automatic. -+node.startup = automatic - - # For "automatic" startup nodes, setting this to "Yes" will try logins on each - # available iface until one succeeds, and then stop. The default "No" will try -@@ -259,28 +259,27 @@ node.conn[0].iscsi.MaxXmitDataSegmentLength = 0 - discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768 - - # To allow the targets to control the setting of the digest checking, --# with the initiator requesting a preference of enabling the checking, uncomment# one or both of the following lines: -+# with the initiator requesting a preference of enabling the checking, uncomment -+# the following lines (Data digests are not supported.): - #node.conn[0].iscsi.HeaderDigest = CRC32C,None --#node.conn[0].iscsi.DataDigest = CRC32C,None -+ - # - # To allow the targets to control the setting of the digest checking, - # with the initiator requesting a preference of disabling the checking, --# uncomment one or both of the following lines: -+# uncomment the following line: - #node.conn[0].iscsi.HeaderDigest = None,CRC32C --#node.conn[0].iscsi.DataDigest = None,CRC32C - # - # To enable CRC32C digest checking for the header and/or data part of --# iSCSI PDUs, uncomment one or both of the following lines: -+# iSCSI PDUs, uncomment the following line: - #node.conn[0].iscsi.HeaderDigest = CRC32C --#node.conn[0].iscsi.DataDigest = CRC32C - # - # To disable digest checking for the header and/or data part of --# iSCSI PDUs, uncomment one or both of the following lines: -+# iSCSI PDUs, uncomment the following line: - #node.conn[0].iscsi.HeaderDigest = None --#node.conn[0].iscsi.DataDigest = None - # - # The default is to never use DataDigests or HeaderDigests. - # -+node.conn[0].iscsi.HeaderDigest = None - - # For multipath configurations, you may want more than one session to be - # created on each iface record. If node.session.nr_sessions is greater -diff --git a/usr/idbm.c b/usr/idbm.c -index 4d30aa9..a1d7d37 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -399,9 +399,13 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) - IDBM_SHOW, "None", "CRC32C", "CRC32C,None", - "None,CRC32C", num, 1); - sprintf(key, CONN_DATA_DIGEST, i); -+ -+#if 0 -+We do not support data digests - __recinfo_int_o4(key, ri, r, conn[i].iscsi.DataDigest, IDBM_SHOW, - "None", "CRC32C", "CRC32C,None", - "None,CRC32C", num, 1); -+#endif - sprintf(key, CONN_IFMARKER, i); - __recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW, - "No", "Yes", num, 1); --- -1.7.11.7 - diff --git a/0152-use-var-for-config.patch b/0152-use-var-for-config.patch deleted file mode 100644 index dc5a73c..0000000 --- a/0152-use-var-for-config.patch +++ /dev/null @@ -1,239 +0,0 @@ -From 8c287d6b8c1edf51c2f91878d72822d33aa8348b Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 19 Nov 2012 16:38:45 -0800 -Subject: use var for config - ---- - README | 33 ++++++++++++++++----------------- - doc/iscsiadm.8 | 8 ++++---- - usr/idbm.c | 6 +++--- - usr/idbm.h | 13 +++++++------ - usr/iface.h | 4 +++- - 5 files changed, 33 insertions(+), 31 deletions(-) - -diff --git a/README b/README -index 0ac4529..e7c7bf5 100644 ---- a/README -+++ b/README -@@ -156,8 +156,7 @@ Usage: iscsid [OPTION] - - Open-iSCSI persistent configuration is stored in a number of - directories under a configuration root directory, using a flat-file --format. This configuration root directory is /etc/iscsi by default, --but may also commonly be in /var/lib/iscsi. -+format. This configuration root directory is /var/lib/iscsi by default. - - Configuration is contained in directories for: - -@@ -475,7 +474,7 @@ a scsi_host per HBA port). - To manage both types of initiator stacks, iscsiadm uses the interface (iface) - structure. For each HBA port or for software iscsi for each network - device (ethX) or NIC, that you wish to bind sessions to you must create --a iface config /etc/iscsi/ifaces. -+a iface config /var/lib/iscsi/ifaces. - - Prep: - -@@ -509,29 +508,29 @@ Running: - iface0 qla4xxx,00:c0:dd:08:63:e8,20.15.0.7,default,iqn.2005-06.com.redhat:madmax - iface1 qla4xxx,00:c0:dd:08:63:ea,20.15.0.9,default,iqn.2005-06.com.redhat:madmax - --Will report iface configurations that are setup in /etc/iscsi/ifaces. -+Will report iface configurations that are setup in /var/lib/iscsi/ifaces. - The format is: - - iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname - - For software iscsi, you can create the iface configs by hand, but it is - reccomended that you use iscsiadm's iface mode. There is a iface.example in --/etc/iscsi/ifaces which can be used as a template for the daring. -+/var/lib/iscsi/ifaces which can be used as a template for the daring. - - For each network object you wish to bind a session to you must create --a seperate iface config in /etc/iscsi/ifaces and each iface config file -+a seperate iface config in /var/lib/iscsi/ifaces and each iface config file - must have a unique name which is less than or equal to 64 characters. - - Example: - - If you have NIC1 with MAC address 00:0F:1F:92:6B:BF and NIC2 with - MAC address 00:C0:DD:08:63:E7 and you wanted to do software iscsi over --TCP/IP. Then in /etc/iscsi/ifaces/iface0 you would enter: -+TCP/IP. Then in /var/lib/iscsi/ifaces/iface0 you would enter: - - iface.transport_name = tcp - iface.hwaddress = 00:0F:1F:92:6B:BF - --and in /etc/iscsi/ifaces/iface1 you would enter: -+and in /var/lib/iscsi/ifaces/iface1 you would enter: - - iface.transport_name = tcp - iface.hwaddress = 00:C0:DD:08:63:E7 -@@ -581,7 +580,7 @@ cxgb3i.00:07:43:05:97:07 cxgb3i,00:07:43:05:97:07,,, - qla4xxx.00:0e:1e:04:8b:2e qla4xxx,00:0e:1e:04:8b:2e,,, - - --Will report iface configurations that are setup in /etc/iscsi/ifaces. -+Will report iface configurations that are setup in /var/lib/iscsi/ifaces. - The format is: - - iface_name transport_name,hwaddress,ipaddress,net_ifacename,initiatorname -@@ -667,7 +666,7 @@ need a seperate network connection to the target for discovery purposes. - *This will be fixed in the next version of open-iscsi* - - For compatibility reasons, when you run iscsiadm to do discovery, it --will check for interfaces in /etc/iscsi/iscsi/ifaces that are using -+will check for interfaces in /var/lib/iscsi/ifaces that are using - tcp for the iface.transport and it will bind the portals that are discovered - so that they will be logged in through those ifaces. This behavior can also - be overriden by passing in the interfaces you want to use. For the case -@@ -685,7 +684,7 @@ we do not bind a session to a iface, then you can use the special iface - - iscsiadm -m discoverydb -t st -p ip:port -I default --discover -P 1 - --And if you did not define any interfaces in /etc/iscsi/ifaces and do -+And if you did not define any interfaces in /var/lib/iscsi/ifaces and do - not pass anything into iscsiadm, running iscsiadm will do the default - behavior, where we allow the network subsystem to decide which - device to use. -@@ -727,7 +726,7 @@ To now log into targets it is the same as with sofware iscsi. See section - - ./iscsiadm -m discoverydb -t st -p 192.168.1.1:3260 --discover - -- This will search /etc/iscsi/send_targets for a record with the -+ This will search /var/lib/iscsi/send_targets for a record with the - ID [portal = 192.168.1.1:3260 and type = sendtargets. If found it - will perform discovery using the settings stored in the record. - If a record does not exist, it will be created using the iscsid.conf -@@ -736,7 +735,7 @@ To now log into targets it is the same as with sofware iscsi. See section - The argument to -p may also be a hostname instead of an address. - ./iscsiadm -m discoverydb -t st -p smoehost --discover - -- For the ifaces, iscsiadm will first search /etc/iscsi/ifaces for -+ For the ifaces, iscsiadm will first search /var/lib/iscsi/ifaces for - interfaces using software iscsi. If any are found then nodes found - during discovery will be setup so that they can logged in through - those interfaces. To specify a specific iface, pass the -@@ -792,7 +791,7 @@ To now log into targets it is the same as with sofware iscsi. See section - This command will perform discovery, but not manipulate the node DB. - - - SendTargets iSCSI Discovery with a specific interface. If you -- wish to only use a subset of the interfaces in /etc/iscsi/ifaces -+ wish to only use a subset of the interfaces in /var/lib/iscsi/ifaces - then you can pass them in during discovery: - - ./iscsiadm -m discoverydb -t sendtargets -p 192.168.1.1:3260 \ -@@ -1193,8 +1192,8 @@ where targetname is the name of the target and ip_address:port is the address - and port of the portal. tpgt, is the portal group tag of - the portal, and is not used in iscsiadm commands except for static - record creation. And iface name is the name of the iscsi interface --defined in /etc/iscsi/ifaces. If no interface was defined in --/etc/iscsi/ifaces or passed in, the default behavior is used. -+defined in /var/lib/iscsi/ifaces. If no interface was defined in -+/var/lib/iscsi/ifaces or passed in, the default behavior is used. - Default here is iscsi_tcp/tcp to be used over which ever NIC the - network layer decides is best. - -@@ -1309,7 +1308,7 @@ If set, iscsid will perform discovery to the address every - discovery.isns.discoveryd_poll_inval or - discovery.sendtargets.discoveryd_poll_inval seconds, - and it will log into any portals found from the discovery source using --the ifaces in /etc/iscsi/ifaces. -+the ifaces in /var/lib/iscsi/ifaces. - - Note that for iSNS the poll_interval does not have to be set. If not set, - iscsid will only perform rediscovery when it gets a SCN from the server. -diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8 -index 05793b2..334520a 100644 ---- a/doc/iscsiadm.8 -+++ b/doc/iscsiadm.8 -@@ -103,7 +103,7 @@ This option is only valid for ping submode. - .TP - \fB\-I\fR, \fB\-\-interface=\fI[iface]\fR - The interface argument specifies the iSCSI interface to use for the operation. --iSCSI interfaces (iface) are defined in /etc/iscsi/ifaces. For hardware -+iSCSI interfaces (iface) are defined in /var/lib/iscsi/ifaces. For hardware - iSCSI (qla4xxx) the iface config must have the hardware address - (iface.hwaddress = port's MAC address) - and the driver/transport_name (iface.transport_name). The iface's name is -@@ -180,7 +180,7 @@ If no other options are specified: for \fIdiscovery\fR, \fIdiscoverydb\fR and - \fInode\fR, all of their respective records are displayed; for \fIsession\fR, - all active sessions and connections are displayed; for \fIfw\fR, all boot - firmware values are displayed; for \fIhost\fR, all iSCSI hosts are displayed; --and for \fIiface\fR, all ifaces setup in /etc/iscsi/ifaces are displayed. -+and for \fIiface\fR, all ifaces setup in /var/lib/iscsi/ifaces are displayed. - - .TP - \fB\-n\fR, \fB\-\-name=\fIname\fR -@@ -565,10 +565,10 @@ The configuration file read by \fBiscsid\fR and \fBiscsiadm\fR on startup. - The file containing the iSCSI InitiatorName and InitiatorAlias read by - \fBiscsid\fR and \fBiscsiadm\fR on startup. - .TP --/etc/iscsi/nodes/ -+/var/lib/iscsi/nodes/ - This directory contains the nodes with their targets. - .TP --/etc/iscsi/send_targets -+/var/lib/iscsi/send_targets - This directory contains the portals. - - .SH "SEE ALSO" -diff --git a/usr/idbm.c b/usr/idbm.c -index ce9fb6a..c3c8de5 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -2919,9 +2919,9 @@ free_info: - int idbm_init(idbm_get_config_file_fn *fn) - { - /* make sure root db dir is there */ -- if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) { -- if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) { -- log_error("Could not make %s %d\n", ISCSI_CONFIG_ROOT, -+ if (access(ISCSIVAR, F_OK) != 0) { -+ if (mkdir(ISCSIVAR, 0660) != 0) { -+ log_error("Could not make %s %d\n", ISCSIVAR, - errno); - return errno; - } -diff --git a/usr/idbm.h b/usr/idbm.h -index b9020fe..b89ddff 100644 ---- a/usr/idbm.h -+++ b/usr/idbm.h -@@ -29,12 +29,13 @@ - #include "list.h" - #include "flashnode.h" - --#define NODE_CONFIG_DIR ISCSI_CONFIG_ROOT"nodes" --#define SLP_CONFIG_DIR ISCSI_CONFIG_ROOT"slp" --#define ISNS_CONFIG_DIR ISCSI_CONFIG_ROOT"isns" --#define STATIC_CONFIG_DIR ISCSI_CONFIG_ROOT"static" --#define FW_CONFIG_DIR ISCSI_CONFIG_ROOT"fw" --#define ST_CONFIG_DIR ISCSI_CONFIG_ROOT"send_targets" -+#define ISCSIVAR "/var/lib/iscsi/" -+#define NODE_CONFIG_DIR ISCSIVAR"nodes" -+#define SLP_CONFIG_DIR ISCSIVAR"slp" -+#define ISNS_CONFIG_DIR ISCSIVAR"isns" -+#define STATIC_CONFIG_DIR ISCSIVAR"static" -+#define FW_CONFIG_DIR ISCSIVAR"fw" -+#define ST_CONFIG_DIR ISCSIVAR"send_targets" - #define ST_CONFIG_NAME "st_config" - #define ISNS_CONFIG_NAME "isns_config" - -diff --git a/usr/iface.h b/usr/iface.h -index 01f7074..f396918 100644 ---- a/usr/iface.h -+++ b/usr/iface.h -@@ -20,7 +20,9 @@ - #ifndef ISCSI_IFACE_H - #define ISCSI_IFACE_H - --#define IFACE_CONFIG_DIR ISCSI_CONFIG_ROOT"ifaces" -+#include "idbm.h" -+ -+#define IFACE_CONFIG_DIR ISCSIVAR"ifaces" - - struct iface_rec; - struct list_head; --- -1.9.3 - diff --git a/0153-use-red-hat-for-name.patch b/0153-use-red-hat-for-name.patch deleted file mode 100644 index 8888200..0000000 --- a/0153-use-red-hat-for-name.patch +++ /dev/null @@ -1,25 +0,0 @@ -From bf7f9118ab2f1a5302dafa198d3351f6f977b7bd Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 19 Nov 2012 16:40:04 -0800 -Subject: use red hat for name - ---- - utils/iscsi-iname.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/utils/iscsi-iname.c b/utils/iscsi-iname.c -index 6347edc..cb2f6c8 100644 ---- a/utils/iscsi-iname.c -+++ b/utils/iscsi-iname.c -@@ -73,7 +73,7 @@ main(int argc, char *argv[]) - exit(0); - } - } else { -- prefix = "iqn.2005-03.org.open-iscsi"; -+ prefix = "iqn.1994-05.com.redhat"; - } - - /* try to feed some entropy from the pool to MD5 in order to get --- -1.7.11.7 - diff --git a/0154-add-libiscsi.patch b/0154-add-libiscsi.patch deleted file mode 100644 index 0cc713a..0000000 --- a/0154-add-libiscsi.patch +++ /dev/null @@ -1,4009 +0,0 @@ -From 793dbd33535efd3ef1170487624f2b95168a0ec7 Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Mon, 26 Jan 2015 12:57:11 -0800 -Subject: [PATCH] libiscsi - ---- - Makefile | 2 + - libiscsi/Makefile | 61 ++ - libiscsi/libiscsi.c | 617 +++++++++++ - libiscsi/libiscsi.doxy | 1473 +++++++++++++++++++++++++++ - libiscsi/libiscsi.h | 344 +++++++ - libiscsi/no_date_footer.html | 6 + - libiscsi/pylibiscsi.c | 709 +++++++++++++ - libiscsi/setup.py | 9 + - libiscsi/tests/test_discovery_firmware.c | 53 + - libiscsi/tests/test_discovery_sendtargets.c | 60 ++ - libiscsi/tests/test_get_auth.c | 70 ++ - libiscsi/tests/test_get_initiator_name.c | 38 + - libiscsi/tests/test_get_network_config.c | 45 + - libiscsi/tests/test_login.c | 52 + - libiscsi/tests/test_logout.c | 51 + - libiscsi/tests/test_params.c | 103 ++ - libiscsi/tests/test_set_auth.c | 58 ++ - usr/Makefile | 2 +- - usr/discovery.c | 5 + - usr/idbm.c | 6 +- - usr/idbm.h | 3 + - usr/iscsi_ipc.h | 2 + - 22 files changed, 3765 insertions(+), 4 deletions(-) - create mode 100644 libiscsi/Makefile - create mode 100644 libiscsi/libiscsi.c - create mode 100644 libiscsi/libiscsi.doxy - create mode 100644 libiscsi/libiscsi.h - create mode 100644 libiscsi/no_date_footer.html - create mode 100644 libiscsi/pylibiscsi.c - create mode 100644 libiscsi/setup.py - create mode 100644 libiscsi/tests/test_discovery_firmware.c - create mode 100644 libiscsi/tests/test_discovery_sendtargets.c - create mode 100644 libiscsi/tests/test_get_auth.c - create mode 100644 libiscsi/tests/test_get_initiator_name.c - create mode 100644 libiscsi/tests/test_get_network_config.c - create mode 100644 libiscsi/tests/test_login.c - create mode 100644 libiscsi/tests/test_logout.c - create mode 100644 libiscsi/tests/test_params.c - create mode 100644 libiscsi/tests/test_set_auth.c - -diff --git a/Makefile b/Makefile -index f8a393b..05411e1 100644 ---- a/Makefile -+++ b/Makefile -@@ -33,6 +33,7 @@ user: utils/open-isns/Makefile iscsiuio/Makefile - $(MAKE) -C usr - $(MAKE) -C utils - $(MAKE) -C iscsiuio -+ $(MAKE) -C libiscsi - @echo - @echo "Compilation complete Output file" - @echo "----------------------------------- ----------------" -@@ -61,6 +62,7 @@ kernel: force - force: ; - - clean: -+ $(MAKE) -C libiscsi clean - $(MAKE) -C utils/sysdeps clean - $(MAKE) -C utils/fwparam_ibft clean - $(MAKE) -C utils clean -diff --git a/libiscsi/Makefile b/libiscsi/Makefile -new file mode 100644 -index 0000000..317a7ec ---- /dev/null -+++ b/libiscsi/Makefile -@@ -0,0 +1,61 @@ -+# This Makefile will work only with GNU make. -+ -+OSNAME=$(shell uname -s) -+OPTFLAGS ?= -O2 -g -+WARNFLAGS ?= -Wall -Wstrict-prototypes -+CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I../include -I../usr \ -+ -D$(OSNAME) -fPIC -D_GNU_SOURCE -fvisibility=hidden -+LIB = libiscsi.so.0 -+TESTS = tests/test_discovery_sendtargets tests/test_discovery_firmware -+TESTS += tests/test_login tests/test_logout tests/test_params -+TESTS += tests/test_get_network_config tests/test_get_initiator_name -+TESTS += tests/test_set_auth tests/test_get_auth -+ -+COMMON_SRCS = sysdeps.o -+# sources shared between iscsid, iscsiadm and iscsistart -+ISCSI_LIB_SRCS = netlink.o transport.o cxgbi.o be2iscsi.o iscsi_timer.o initiator_common.o iscsi_err.o session_info.o iscsi_util.o io.o auth.o discovery.o login.o log.o md5.o sha1.o iface.o idbm.o sysfs.o iscsi_sysfs.o iscsi_net_util.o iscsid_req.o iser.o uip_mgmt_ipc.o -+FW_PARAM_SRCS = fw_entry.o prom_lex.o prom_parse.tab.o fwparam_ppc.o fwparam_sysfs.o -+ -+# sources shared with the userspace utils, note we build these separately -+# to get PIC versions. -+COMMON_OBJS = $(patsubst %.o, common-objs/%.o, $(COMMON_SRCS)) -+USR_OBJS = $(patsubst %.o, usr-objs/%.o, $(ISCSI_LIB_SRCS) strings.o) -+FW_OBJS = $(patsubst %.o, fw-objs/%.o, $(FW_PARAM_SRCS)) -+ -+# Flags for the tests -+tests/% : CFLAGS = $(OPTFLAGS) $(WARNFLAGS) -I. -+ -+all: lib tests html -+ -+lib: $(LIB) -+tests: $(TESTS) -+ -+common-objs/%.o: ../utils/sysdeps/%.c -+ mkdir -p common-objs -+ $(CC) $(CFLAGS) -c $< -o $@ -+ -+usr-objs/%.o: ../usr/%.c -+ mkdir -p usr-objs -+ $(CC) $(CFLAGS) -c $< -o $@ -+ -+fw-objs/%.o: ../utils/fwparam_ibft/%.c -+ mkdir -p fw-objs -+ $(CC) $(CFLAGS) -c $< -o $@ -+ -+$(LIB): $(COMMON_OBJS) $(FW_OBJS) $(USR_OBJS) libiscsi.o -+ $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIB) $^ -o $@ -+ ln -s -f $(LIB) libiscsi.so -+ -+$(TESTS): $(FW_OBJS) $(COMMON_OBJS) $(USR_OBJS) $(LIB) -+ -+html: libiscsi.h libiscsi.doxy -+ doxygen libiscsi.doxy -+ -+clean: -+ rm -rf *.o common-objs usr-objs fw-objs libuip-objs libiscsi.so* \ -+ .depend *~ html $(TESTS) tests/*~ -+ -+depend: -+ gcc $(CFLAGS) -M `ls *.c` > .depend -+ -+-include .depend ../usr/.depend -diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c -new file mode 100644 -index 0000000..064e4b5 ---- /dev/null -+++ b/libiscsi/libiscsi.c -@@ -0,0 +1,617 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "libiscsi.h" -+#include "idbm.h" -+#include "discovery.h" -+#include "log.h" -+#include "sysfs.h" -+#include "iscsi_sysfs.h" -+#include "session_info.h" -+#include "iscsi_util.h" -+#include "sysdeps.h" -+#include "iface.h" -+#include "iscsi_proto.h" -+#include "fw_context.h" -+#include "iscsid_req.h" -+#include "iscsi_err.h" -+ -+#define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; } -+ -+/* UGLY, not thread safe :( */ -+static int sysfs_initialized = 0; -+ -+struct libiscsi_context { -+ char error_str[256]; -+ /* For get_parameter_helper() */ -+ const char *parameter; -+ char *value; -+}; -+ -+static void libiscsi_log(int prio, void *priv, const char *fmt, va_list ap) -+{ -+ struct libiscsi_context *context = priv; -+ -+ if (prio > LOG_ERR) /* We are only interested in errors (or worse) */ -+ return; -+ -+ vsnprintf(context->error_str, sizeof(context->error_str), fmt, ap); -+} -+ -+struct libiscsi_context *libiscsi_init(void) -+{ -+ struct libiscsi_context *context; -+ -+ context = calloc(1, sizeof *context); -+ if (!context) -+ return NULL; -+ -+ log_init("libiscsi", 1024, libiscsi_log, context); -+ if (!sysfs_initialized) { -+ sysfs_init(); -+ sysfs_initialized = 1; -+ } -+ increase_max_files(); -+ if (idbm_init(NULL)) { -+ sysfs_cleanup(); -+ free(context); -+ return NULL; -+ } -+ -+ iface_setup_host_bindings(); -+ -+ return context; -+} -+ -+void libiscsi_cleanup(struct libiscsi_context *context) -+{ -+ idbm_terminate(); -+ free_transports(); -+ sysfs_cleanup(); -+ free(context); -+} -+ -+static void free_iface_list(struct list_head *ifaces) -+{ -+ struct iface_rec *iface, *tmp_iface; -+ -+ list_for_each_entry_safe(iface, tmp_iface, ifaces, list) { -+ list_del(&iface->list); -+ free(iface); -+ } -+} -+ -+static void free_rec_list(struct list_head *rec_list) -+{ -+ struct node_rec *rec, *tmp; -+ -+ list_for_each_entry_safe(rec, tmp, rec_list, list) { -+ list_del(&rec->list); -+ free(rec); -+ } -+} -+ -+int libiscsi_discover_sendtargets(struct libiscsi_context *context, -+ const char *address, int port, -+ const struct libiscsi_auth_info *auth_info, -+ int *nr_found, struct libiscsi_node **found_nodes) -+{ -+ struct discovery_rec drec; -+ LIST_HEAD(bound_rec_list); -+ struct node_rec *rec; -+ int rc = 0, found = 0; -+ -+ INIT_LIST_HEAD(&bound_rec_list); -+ -+ if (nr_found) -+ *nr_found = 0; -+ if (found_nodes) -+ *found_nodes = NULL; -+ -+ CHECK(libiscsi_verify_auth_info(context, auth_info)) -+ -+ /* Fill the drec struct with all needed info */ -+ memset(&drec, 0, sizeof drec); -+ idbm_sendtargets_defaults(&drec.u.sendtargets); -+ drec.type = DISCOVERY_TYPE_SENDTARGETS; -+ strlcpy(drec.address, address, sizeof(drec.address)); -+ drec.port = port ? port : ISCSI_LISTEN_PORT; -+ switch(auth_info ? auth_info->method : libiscsi_auth_none) { -+ case libiscsi_auth_chap: -+ drec.u.sendtargets.auth.authmethod = AUTH_METHOD_CHAP; -+ strlcpy(drec.u.sendtargets.auth.username, -+ auth_info->chap.username, AUTH_STR_MAX_LEN); -+ strlcpy((char *)drec.u.sendtargets.auth.password, -+ auth_info->chap.password, AUTH_STR_MAX_LEN); -+ drec.u.sendtargets.auth.password_length = -+ strlen((char *)drec.u.sendtargets.auth.password); -+ strlcpy(drec.u.sendtargets.auth.username_in, -+ auth_info->chap.reverse_username, AUTH_STR_MAX_LEN); -+ strlcpy((char *)drec.u.sendtargets.auth.password_in, -+ auth_info->chap.reverse_password, AUTH_STR_MAX_LEN); -+ drec.u.sendtargets.auth.password_in_length = -+ strlen((char *)drec.u.sendtargets.auth.password_in); -+ break; -+ } -+ -+ CHECK(idbm_add_discovery(&drec)) -+ -+ CHECK(idbm_bind_ifaces_to_nodes(discovery_sendtargets, -+ &drec, NULL, &bound_rec_list)) -+ -+ /* now add/update records */ -+ list_for_each_entry(rec, &bound_rec_list, list) { -+ CHECK(idbm_add_node(rec, &drec, 1 /* overwrite */)) -+ found++; -+ } -+ -+ if (nr_found) -+ *nr_found = found; -+ -+ if (found_nodes && found) { -+ *found_nodes = calloc(found, sizeof **found_nodes); -+ if (*found_nodes == NULL) { -+ snprintf(context->error_str, -+ sizeof(context->error_str), strerror(ENOMEM)); -+ rc = ENOMEM; -+ goto leave; -+ } -+ found = 0; -+ list_for_each_entry(rec, &bound_rec_list, list) { -+ strlcpy((*found_nodes)[found].name, rec->name, -+ LIBISCSI_VALUE_MAXLEN); -+ (*found_nodes)[found].tpgt = rec->tpgt; -+ strlcpy((*found_nodes)[found].address, -+ rec->conn[0].address, NI_MAXHOST); -+ (*found_nodes)[found].port = rec->conn[0].port; -+ strlcpy((*found_nodes)[found].iface, -+ rec->iface.name, LIBISCSI_VALUE_MAXLEN); -+ found++; -+ } -+ } -+ -+leave: -+ free_rec_list(&bound_rec_list); -+ return rc; -+} -+ -+int libiscsi_discover_firmware(struct libiscsi_context *context, -+ int *nr_found, struct libiscsi_node **found_nodes) -+{ -+ struct list_head targets, ifaces, rec_list; -+ discovery_rec_t drec; -+ int rc = 0; -+ -+ INIT_LIST_HEAD(&targets); -+ INIT_LIST_HEAD(&ifaces); -+ INIT_LIST_HEAD(&rec_list); -+ -+ if (nr_found) { -+ *nr_found = 0; -+ } -+ -+ if (found_nodes) { -+ *found_nodes = NULL; -+ } -+ -+ rc = fw_get_targets(&targets); -+ if (rc) { -+ log_error("%s: Could not get list of targets from firmware " -+ "(err %d).\n", __func__, rc); -+ return rc; -+ } -+ -+ CHECK(iface_create_ifaces_from_boot_contexts(&ifaces, &targets)); -+ -+ memset(&drec, 0, sizeof(drec)); -+ drec.type = DISCOVERY_TYPE_FW; -+ rc = idbm_bind_ifaces_to_nodes(discovery_fw, &drec, &ifaces, &rec_list); -+ if (rc) { -+ log_error("%s: Could not determine target nodes from firmware " -+ "(err %d).\n", __func__, rc); -+ goto leave; -+ } -+ -+ int node_count = 0; -+ struct list_head *pos; -+ list_for_each(pos, &rec_list) { -+ ++node_count; -+ } -+ -+ struct libiscsi_node* new_nodes; -+ /* allocate enough space for all the nodes */ -+ new_nodes = calloc(node_count, sizeof *new_nodes); -+ if (new_nodes == NULL) { -+ rc = ENOMEM; -+ log_error("%s: %s.\n", __func__, strerror(ENOMEM)); -+ goto leave; -+ } -+ -+ struct node_rec *rec; -+ struct libiscsi_node *new_node = new_nodes; -+ /* in one loop, add nodes to idbm and create libiscsi_node entries */ -+ list_for_each_entry(rec, &rec_list, list) { -+ CHECK(idbm_add_node(rec, NULL, 1 /* overwrite */)); -+ -+ strlcpy(new_node->name, rec->name, LIBISCSI_VALUE_MAXLEN); -+ new_node->tpgt = rec->tpgt; -+ strlcpy(new_node->address, rec->conn[0].address, NI_MAXHOST); -+ new_node->port = rec->conn[0].port; -+ strlcpy(new_node->iface, rec->iface.name, LIBISCSI_VALUE_MAXLEN); -+ -+ ++new_node; -+ } -+ -+ /* update output parameters */ -+ if (nr_found) { -+ *nr_found = node_count; -+ } -+ if (found_nodes) { -+ *found_nodes = new_nodes; -+ } -+ -+leave: -+ fw_free_targets(&targets); -+ -+ free_iface_list(&ifaces); -+ free_rec_list(&rec_list); -+ -+ return rc; -+} -+ -+int libiscsi_verify_auth_info(struct libiscsi_context *context, -+ const struct libiscsi_auth_info *auth_info) -+{ -+ switch(auth_info ? auth_info->method : libiscsi_auth_none) { -+ case libiscsi_auth_none: -+ break; -+ case libiscsi_auth_chap: -+ if (!auth_info->chap.username[0]) { -+ strcpy(context->error_str, "Empty username"); -+ return EINVAL; -+ } -+ if (!auth_info->chap.password[0]) { -+ strcpy(context->error_str, "Empty password"); -+ return EINVAL; -+ } -+ if (auth_info->chap.reverse_username[0] && -+ !auth_info->chap.reverse_password[0]) { -+ strcpy(context->error_str, "Empty reverse password"); -+ return EINVAL; -+ } -+ break; -+ default: -+ sprintf(context->error_str, -+ "Invalid authentication method: %d", -+ (int)auth_info->method); -+ return EINVAL; -+ } -+ return 0; -+} -+ -+int libiscsi_node_set_auth(struct libiscsi_context *context, -+ const struct libiscsi_node *node, -+ const struct libiscsi_auth_info *auth_info) -+{ -+ int rc = 0; -+ -+ CHECK(libiscsi_verify_auth_info(context, auth_info)) -+ -+ switch(auth_info ? auth_info->method : libiscsi_auth_none) { -+ case libiscsi_auth_none: -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.authmethod", "None")) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.username", "")) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.password", "")) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.username_in", "")) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.password_in", "")) -+ break; -+ -+ case libiscsi_auth_chap: -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.authmethod", "CHAP")) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.username", -+ auth_info->chap.username)) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.password", -+ auth_info->chap.password)) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.username_in", -+ auth_info->chap.reverse_username)) -+ CHECK(libiscsi_node_set_parameter(context, node, -+ "node.session.auth.password_in", -+ auth_info->chap.reverse_password)) -+ break; -+ } -+leave: -+ return rc; -+} -+ -+int libiscsi_node_get_auth(struct libiscsi_context *context, -+ const struct libiscsi_node *node, -+ struct libiscsi_auth_info *auth_info) -+{ -+ int rc = 0; -+ char value[LIBISCSI_VALUE_MAXLEN]; -+ -+ memset(auth_info, 0, sizeof *auth_info); -+ -+ CHECK(libiscsi_node_get_parameter(context, node, -+ "node.session.auth.authmethod", value)) -+ -+ if (!strcmp(value, "None")) { -+ auth_info->method = libiscsi_auth_none; -+ } else if (!strcmp(value, "CHAP")) { -+ auth_info->method = libiscsi_auth_chap; -+ CHECK(libiscsi_node_get_parameter(context, node, -+ "node.session.auth.username", -+ auth_info->chap.username)) -+ CHECK(libiscsi_node_get_parameter(context, node, -+ "node.session.auth.password", -+ auth_info->chap.password)) -+ CHECK(libiscsi_node_get_parameter(context, node, -+ "node.session.auth.username_in", -+ auth_info->chap.reverse_username)) -+ CHECK(libiscsi_node_get_parameter(context, node, -+ "node.session.auth.password_in", -+ auth_info->chap.reverse_password)) -+ } else { -+ snprintf(context->error_str, sizeof(context->error_str), -+ "unknown authentication method: %s", value); -+ rc = EINVAL; -+ } -+leave: -+ return rc; -+} -+ -+static void node_to_rec(const struct libiscsi_node *node, -+ struct node_rec *rec) -+{ -+ memset(rec, 0, sizeof *rec); -+ idbm_node_setup_defaults(rec); -+ strlcpy(rec->name, node->name, TARGET_NAME_MAXLEN); -+ rec->tpgt = node->tpgt; -+ strlcpy(rec->conn[0].address, node->address, NI_MAXHOST); -+ rec->conn[0].port = node->port; -+} -+ -+int login_helper(void *data, node_rec_t *rec) -+{ -+ char *iface = (char*)data; -+ if (strcmp(iface, rec->iface.name)) -+ /* different iface, skip it */ -+ return -1; -+ -+ int rc = iscsid_req_by_rec(MGMT_IPC_SESSION_LOGIN, rec); -+ if (rc) { -+ iscsi_err_print_msg(rc); -+ rc = ENOTCONN; -+ } -+ return rc; -+} -+ -+int libiscsi_node_login(struct libiscsi_context *context, -+ const struct libiscsi_node *node) -+{ -+ int nr_found = 0, rc; -+ -+ CHECK(idbm_for_each_iface(&nr_found, (void*)node->iface, login_helper, -+ (char *)node->name, node->tpgt, -+ (char *)node->address, node->port)) -+ if (nr_found == 0) { -+ strcpy(context->error_str, "No such node"); -+ rc = ENODEV; -+ } -+leave: -+ return rc; -+} -+ -+static int logout_helper(void *data, struct session_info *info) -+{ -+ int rc; -+ struct node_rec *rec = data; -+ -+ if (!iscsi_match_session(rec, info)) -+ /* Tell iscsi_sysfs_for_each_session this session was not a -+ match so that it will not increase nr_found. */ -+ return -1; -+ -+ rc = iscsid_req_by_sid(MGMT_IPC_SESSION_LOGOUT, info->sid); -+ if (rc) { -+ iscsi_err_print_msg(rc); -+ rc = EIO; -+ } -+ -+ return rc; -+} -+ -+int libiscsi_node_logout(struct libiscsi_context *context, -+ const struct libiscsi_node *node) -+{ -+ int nr_found = 0, rc; -+ struct node_rec rec; -+ -+ node_to_rec(node, &rec); -+ CHECK(iscsi_sysfs_for_each_session(&rec, &nr_found, logout_helper,0)) -+ if (nr_found == 0) { -+ strcpy(context->error_str, "No matching session"); -+ rc = ENODEV; -+ } -+leave: -+ return rc; -+} -+ -+int libiscsi_node_set_parameter(struct libiscsi_context *context, -+ const struct libiscsi_node *node, -+ const char *parameter, const char *value) -+{ -+ int nr_found = 0, rc; -+ struct user_param *param; -+ struct list_head params; -+ -+ INIT_LIST_HEAD(¶ms); -+ param = idbm_alloc_user_param(parameter, value); -+ if (!param) { -+ rc = ENOMEM; -+ goto leave; -+ } -+ list_add_tail(¶ms, ¶m->list); -+ -+ CHECK(idbm_for_each_iface(&nr_found, ¶ms, idbm_node_set_param, -+ (char *)node->name, node->tpgt, -+ (char *)node->address, node->port)) -+ if (nr_found == 0) { -+ strcpy(context->error_str, "No such node"); -+ rc = ENODEV; -+ } -+ free(param->name); -+ free(param); -+leave: -+ return rc; -+} -+ -+static int get_parameter_helper(void *data, node_rec_t *rec) -+{ -+ struct libiscsi_context *context = data; -+ recinfo_t *info; -+ int i; -+ -+ info = idbm_recinfo_alloc(MAX_KEYS); -+ if (!info) { -+ snprintf(context->error_str, sizeof(context->error_str), -+ strerror(ENOMEM)); -+ return ENOMEM; -+ } -+ -+ idbm_recinfo_node(rec, info); -+ -+ for (i = 0; i < MAX_KEYS; i++) { -+ if (!info[i].visible) -+ continue; -+ -+ if (strcmp(context->parameter, info[i].name)) -+ continue; -+ -+ strlcpy(context->value, info[i].value, LIBISCSI_VALUE_MAXLEN); -+ break; -+ } -+ -+ free(info); -+ -+ if (i == MAX_KEYS) { -+ strcpy(context->error_str, "No such parameter"); -+ return EINVAL; -+ } -+ -+ return 0; -+} -+ -+int libiscsi_node_get_parameter(struct libiscsi_context *context, -+ const struct libiscsi_node *node, const char *parameter, char *value) -+{ -+ int nr_found = 0, rc = 0; -+ -+ context->parameter = parameter; -+ context->value = value; -+ -+ /* Note we assume there is only one interface, if not we will get -+ the value from the last interface iterated over! -+ This (multiple interfaces) can only happen if someone explicitly -+ created ones using iscsiadm. Even then this should not be a problem -+ as most settings should be the same independent of the iface. */ -+ CHECK(idbm_for_each_iface(&nr_found, context, get_parameter_helper, -+ (char *)node->name, node->tpgt, -+ (char *)node->address, node->port)) -+ if (nr_found == 0) { -+ strcpy(context->error_str, "No such node"); -+ rc = ENODEV; -+ } -+leave: -+ return rc; -+} -+ -+const char *libiscsi_get_error_string(struct libiscsi_context *context) -+{ -+ /* Sometimes the core open-iscsi code does not give us an error -+ message */ -+ if (!context->error_str[0]) -+ return "Unknown error"; -+ -+ return context->error_str; -+} -+ -+ -+/************************** Utility functions *******************************/ -+ -+int libiscsi_get_firmware_network_config( -+ struct libiscsi_network_config *config) -+{ -+ struct boot_context fw_entry; -+ -+ if (!sysfs_initialized) { -+ sysfs_init(); -+ sysfs_initialized = 1; -+ } -+ -+ memset(config, 0, sizeof *config); -+ memset(&fw_entry, 0, sizeof fw_entry); -+ if (fw_get_entry(&fw_entry)) -+ return ENODEV; -+ -+ config->dhcp = strlen(fw_entry.dhcp) ? 1 : 0; -+ strlcpy(config->iface_name, fw_entry.iface, LIBISCSI_VALUE_MAXLEN); -+ strlcpy(config->mac_address, fw_entry.mac, LIBISCSI_VALUE_MAXLEN); -+ strlcpy(config->ip_address, fw_entry.ipaddr, LIBISCSI_VALUE_MAXLEN); -+ strlcpy(config->netmask, fw_entry.mask, LIBISCSI_VALUE_MAXLEN); -+ strlcpy(config->gateway, fw_entry.gateway, LIBISCSI_VALUE_MAXLEN); -+ strlcpy(config->primary_dns, fw_entry.primary_dns, LIBISCSI_VALUE_MAXLEN); -+ strlcpy(config->secondary_dns, fw_entry.secondary_dns, LIBISCSI_VALUE_MAXLEN); -+ return 0; -+} -+ -+int libiscsi_get_firmware_initiator_name(char *initiatorname) -+{ -+ struct boot_context fw_entry; -+ -+ if (!sysfs_initialized) { -+ sysfs_init(); -+ sysfs_initialized = 1; -+ } -+ -+ memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN); -+ memset(&fw_entry, 0, sizeof fw_entry); -+ if (fw_get_entry(&fw_entry)) -+ return ENODEV; -+ -+ strlcpy(initiatorname, fw_entry.initiatorname, LIBISCSI_VALUE_MAXLEN); -+ -+ return 0; -+} -diff --git a/libiscsi/libiscsi.doxy b/libiscsi/libiscsi.doxy -new file mode 100644 -index 0000000..7a5ff7f ---- /dev/null -+++ b/libiscsi/libiscsi.doxy -@@ -0,0 +1,1473 @@ -+# Doxyfile 1.5.7.1 -+ -+# This file describes the settings to be used by the documentation system -+# doxygen (www.doxygen.org) for a project -+# -+# All text after a hash (#) is considered a comment and will be ignored -+# The format is: -+# TAG = value [value, ...] -+# For lists items can also be appended using: -+# TAG += value [value, ...] -+# Values that contain spaces should be placed between quotes (" ") -+ -+#--------------------------------------------------------------------------- -+# Project related configuration options -+#--------------------------------------------------------------------------- -+ -+# This tag specifies the encoding used for all characters in the config file -+# that follow. The default is UTF-8 which is also the encoding used for all -+# text before the first occurrence of this tag. Doxygen uses libiconv (or the -+# iconv built into libc) for the transcoding. See -+# http://www.gnu.org/software/libiconv for the list of possible encodings. -+ -+DOXYFILE_ENCODING = UTF-8 -+ -+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -+# by quotes) that should identify the project. -+ -+PROJECT_NAME = libiscsi -+ -+# The PROJECT_NUMBER tag can be used to enter a project or revision number. -+# This could be handy for archiving the generated documentation or -+# if some version control system is used. -+ -+PROJECT_NUMBER = -+ -+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -+# base path where the generated documentation will be put. -+# If a relative path is entered, it will be relative to the location -+# where doxygen was started. If left blank the current directory will be used. -+ -+OUTPUT_DIRECTORY = -+ -+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -+# 4096 sub-directories (in 2 levels) under the output directory of each output -+# format and will distribute the generated files over these directories. -+# Enabling this option can be useful when feeding doxygen a huge amount of -+# source files, where putting all generated files in the same directory would -+# otherwise cause performance problems for the file system. -+ -+CREATE_SUBDIRS = NO -+ -+# The OUTPUT_LANGUAGE tag is used to specify the language in which all -+# documentation generated by doxygen is written. Doxygen will use this -+# information to generate all constant output in the proper language. -+# The default language is English, other supported languages are: -+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, -+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), -+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, -+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, -+# Spanish, Swedish, and Ukrainian. -+ -+OUTPUT_LANGUAGE = English -+ -+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -+# include brief member descriptions after the members that are listed in -+# the file and class documentation (similar to JavaDoc). -+# Set to NO to disable this. -+ -+BRIEF_MEMBER_DESC = YES -+ -+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -+# the brief description of a member or function before the detailed description. -+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -+# brief descriptions will be completely suppressed. -+ -+REPEAT_BRIEF = NO -+ -+# This tag implements a quasi-intelligent brief description abbreviator -+# that is used to form the text in various listings. Each string -+# in this list, if found as the leading text of the brief description, will be -+# stripped from the text and the result after processing the whole list, is -+# used as the annotated text. Otherwise, the brief description is used as-is. -+# If left blank, the following values are used ("$name" is automatically -+# replaced with the name of the entity): "The $name class" "The $name widget" -+# "The $name file" "is" "provides" "specifies" "contains" -+# "represents" "a" "an" "the" -+ -+ABBREVIATE_BRIEF = -+ -+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -+# Doxygen will generate a detailed section even if there is only a brief -+# description. -+ -+ALWAYS_DETAILED_SEC = YES -+ -+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -+# inherited members of a class in the documentation of that class as if those -+# members were ordinary class members. Constructors, destructors and assignment -+# operators of the base classes will not be shown. -+ -+INLINE_INHERITED_MEMB = NO -+ -+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -+# path before files name in the file list and in the header files. If set -+# to NO the shortest path that makes the file name unique will be used. -+ -+FULL_PATH_NAMES = YES -+ -+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -+# can be used to strip a user-defined part of the path. Stripping is -+# only done if one of the specified strings matches the left-hand part of -+# the path. The tag can be used to show relative paths in the file list. -+# If left blank the directory from which doxygen is run is used as the -+# path to strip. -+ -+STRIP_FROM_PATH = -+ -+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -+# the path mentioned in the documentation of a class, which tells -+# the reader which header file to include in order to use a class. -+# If left blank only the name of the header file containing the class -+# definition is used. Otherwise one should specify the include paths that -+# are normally passed to the compiler using the -I flag. -+ -+STRIP_FROM_INC_PATH = -+ -+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -+# (but less readable) file names. This can be useful is your file systems -+# doesn't support long names like on DOS, Mac, or CD-ROM. -+ -+SHORT_NAMES = NO -+ -+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -+# will interpret the first line (until the first dot) of a JavaDoc-style -+# comment as the brief description. If set to NO, the JavaDoc -+# comments will behave just like regular Qt-style comments -+# (thus requiring an explicit @brief command for a brief description.) -+ -+JAVADOC_AUTOBRIEF = NO -+ -+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -+# interpret the first line (until the first dot) of a Qt-style -+# comment as the brief description. If set to NO, the comments -+# will behave just like regular Qt-style comments (thus requiring -+# an explicit \brief command for a brief description.) -+ -+QT_AUTOBRIEF = NO -+ -+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -+# treat a multi-line C++ special comment block (i.e. a block of //! or /// -+# comments) as a brief description. This used to be the default behaviour. -+# The new default is to treat a multi-line C++ comment block as a detailed -+# description. Set this tag to YES if you prefer the old behaviour instead. -+ -+MULTILINE_CPP_IS_BRIEF = NO -+ -+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -+# member inherits the documentation from any documented member that it -+# re-implements. -+ -+INHERIT_DOCS = YES -+ -+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -+# a new page for each member. If set to NO, the documentation of a member will -+# be part of the file/class/namespace that contains it. -+ -+SEPARATE_MEMBER_PAGES = NO -+ -+# The TAB_SIZE tag can be used to set the number of spaces in a tab. -+# Doxygen uses this value to replace tabs by spaces in code fragments. -+ -+TAB_SIZE = 8 -+ -+# This tag can be used to specify a number of aliases that acts -+# as commands in the documentation. An alias has the form "name=value". -+# For example adding "sideeffect=\par Side Effects:\n" will allow you to -+# put the command \sideeffect (or @sideeffect) in the documentation, which -+# will result in a user-defined paragraph with heading "Side Effects:". -+# You can put \n's in the value part of an alias to insert newlines. -+ -+ALIASES = -+ -+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -+# sources only. Doxygen will then generate output that is more tailored for C. -+# For instance, some of the names that are used will be different. The list -+# of all members will be omitted, etc. -+ -+OPTIMIZE_OUTPUT_FOR_C = YES -+ -+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -+# sources only. Doxygen will then generate output that is more tailored for -+# Java. For instance, namespaces will be presented as packages, qualified -+# scopes will look different, etc. -+ -+OPTIMIZE_OUTPUT_JAVA = NO -+ -+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -+# sources only. Doxygen will then generate output that is more tailored for -+# Fortran. -+ -+OPTIMIZE_FOR_FORTRAN = NO -+ -+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -+# sources. Doxygen will then generate output that is tailored for -+# VHDL. -+ -+OPTIMIZE_OUTPUT_VHDL = NO -+ -+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -+# to include (a tag file for) the STL sources as input, then you should -+# set this tag to YES in order to let doxygen match functions declarations and -+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -+# func(std::string) {}). This also make the inheritance and collaboration -+# diagrams that involve STL classes more complete and accurate. -+ -+BUILTIN_STL_SUPPORT = NO -+ -+# If you use Microsoft's C++/CLI language, you should set this option to YES to -+# enable parsing support. -+ -+CPP_CLI_SUPPORT = NO -+ -+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -+# Doxygen will parse them like normal C++ but will assume all classes use public -+# instead of private inheritance when no explicit protection keyword is present. -+ -+SIP_SUPPORT = NO -+ -+# For Microsoft's IDL there are propget and propput attributes to indicate getter -+# and setter methods for a property. Setting this option to YES (the default) -+# will make doxygen to replace the get and set methods by a property in the -+# documentation. This will only work if the methods are indeed getting or -+# setting a simple type. If this is not the case, or you want to show the -+# methods anyway, you should set this option to NO. -+ -+IDL_PROPERTY_SUPPORT = YES -+ -+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -+# tag is set to YES, then doxygen will reuse the documentation of the first -+# member in the group (if any) for the other members of the group. By default -+# all members of a group must be documented explicitly. -+ -+DISTRIBUTE_GROUP_DOC = NO -+ -+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -+# the same type (for instance a group of public functions) to be put as a -+# subgroup of that type (e.g. under the Public Functions section). Set it to -+# NO to prevent subgrouping. Alternatively, this can be done per class using -+# the \nosubgrouping command. -+ -+SUBGROUPING = YES -+ -+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -+# is documented as struct, union, or enum with the name of the typedef. So -+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -+# with name TypeT. When disabled the typedef will appear as a member of a file, -+# namespace, or class. And the struct will be named TypeS. This can typically -+# be useful for C code in case the coding convention dictates that all compound -+# types are typedef'ed and only the typedef is referenced, never the tag name. -+ -+TYPEDEF_HIDES_STRUCT = NO -+ -+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -+# determine which symbols to keep in memory and which to flush to disk. -+# When the cache is full, less often used symbols will be written to disk. -+# For small to medium size projects (<1000 input files) the default value is -+# probably good enough. For larger projects a too small cache size can cause -+# doxygen to be busy swapping symbols to and from disk most of the time -+# causing a significant performance penality. -+# If the system has enough physical memory increasing the cache will improve the -+# performance by keeping more symbols in memory. Note that the value works on -+# a logarithmic scale so increasing the size by one will rougly double the -+# memory usage. The cache size is given by this formula: -+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -+# corresponding to a cache size of 2^16 = 65536 symbols -+ -+SYMBOL_CACHE_SIZE = 0 -+ -+#--------------------------------------------------------------------------- -+# Build related configuration options -+#--------------------------------------------------------------------------- -+ -+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -+# documentation are documented, even if no documentation was available. -+# Private class members and static file members will be hidden unless -+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES -+ -+EXTRACT_ALL = YES -+ -+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -+# will be included in the documentation. -+ -+EXTRACT_PRIVATE = NO -+ -+# If the EXTRACT_STATIC tag is set to YES all static members of a file -+# will be included in the documentation. -+ -+EXTRACT_STATIC = NO -+ -+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -+# defined locally in source files will be included in the documentation. -+# If set to NO only classes defined in header files are included. -+ -+EXTRACT_LOCAL_CLASSES = YES -+ -+# This flag is only useful for Objective-C code. When set to YES local -+# methods, which are defined in the implementation section but not in -+# the interface are included in the documentation. -+# If set to NO (the default) only methods in the interface are included. -+ -+EXTRACT_LOCAL_METHODS = NO -+ -+# If this flag is set to YES, the members of anonymous namespaces will be -+# extracted and appear in the documentation as a namespace called -+# 'anonymous_namespace{file}', where file will be replaced with the base -+# name of the file that contains the anonymous namespace. By default -+# anonymous namespace are hidden. -+ -+EXTRACT_ANON_NSPACES = NO -+ -+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -+# undocumented members of documented classes, files or namespaces. -+# If set to NO (the default) these members will be included in the -+# various overviews, but no documentation section is generated. -+# This option has no effect if EXTRACT_ALL is enabled. -+ -+HIDE_UNDOC_MEMBERS = NO -+ -+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -+# undocumented classes that are normally visible in the class hierarchy. -+# If set to NO (the default) these classes will be included in the various -+# overviews. This option has no effect if EXTRACT_ALL is enabled. -+ -+HIDE_UNDOC_CLASSES = NO -+ -+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -+# friend (class|struct|union) declarations. -+# If set to NO (the default) these declarations will be included in the -+# documentation. -+ -+HIDE_FRIEND_COMPOUNDS = NO -+ -+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -+# documentation blocks found inside the body of a function. -+# If set to NO (the default) these blocks will be appended to the -+# function's detailed documentation block. -+ -+HIDE_IN_BODY_DOCS = NO -+ -+# The INTERNAL_DOCS tag determines if documentation -+# that is typed after a \internal command is included. If the tag is set -+# to NO (the default) then the documentation will be excluded. -+# Set it to YES to include the internal documentation. -+ -+INTERNAL_DOCS = NO -+ -+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -+# file names in lower-case letters. If set to YES upper-case letters are also -+# allowed. This is useful if you have classes or files whose names only differ -+# in case and if your file system supports case sensitive file names. Windows -+# and Mac users are advised to set this option to NO. -+ -+CASE_SENSE_NAMES = YES -+ -+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -+# will show members with their full class and namespace scopes in the -+# documentation. If set to YES the scope will be hidden. -+ -+HIDE_SCOPE_NAMES = NO -+ -+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -+# will put a list of the files that are included by a file in the documentation -+# of that file. -+ -+SHOW_INCLUDE_FILES = YES -+ -+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -+# is inserted in the documentation for inline members. -+ -+INLINE_INFO = YES -+ -+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -+# will sort the (detailed) documentation of file and class members -+# alphabetically by member name. If set to NO the members will appear in -+# declaration order. -+ -+SORT_MEMBER_DOCS = YES -+ -+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -+# brief documentation of file, namespace and class members alphabetically -+# by member name. If set to NO (the default) the members will appear in -+# declaration order. -+ -+SORT_BRIEF_DOCS = NO -+ -+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -+# hierarchy of group names into alphabetical order. If set to NO (the default) -+# the group names will appear in their defined order. -+ -+SORT_GROUP_NAMES = NO -+ -+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -+# sorted by fully-qualified names, including namespaces. If set to -+# NO (the default), the class list will be sorted only by class name, -+# not including the namespace part. -+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -+# Note: This option applies only to the class list, not to the -+# alphabetical list. -+ -+SORT_BY_SCOPE_NAME = NO -+ -+# The GENERATE_TODOLIST tag can be used to enable (YES) or -+# disable (NO) the todo list. This list is created by putting \todo -+# commands in the documentation. -+ -+GENERATE_TODOLIST = YES -+ -+# The GENERATE_TESTLIST tag can be used to enable (YES) or -+# disable (NO) the test list. This list is created by putting \test -+# commands in the documentation. -+ -+GENERATE_TESTLIST = YES -+ -+# The GENERATE_BUGLIST tag can be used to enable (YES) or -+# disable (NO) the bug list. This list is created by putting \bug -+# commands in the documentation. -+ -+GENERATE_BUGLIST = YES -+ -+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -+# disable (NO) the deprecated list. This list is created by putting -+# \deprecated commands in the documentation. -+ -+GENERATE_DEPRECATEDLIST= YES -+ -+# The ENABLED_SECTIONS tag can be used to enable conditional -+# documentation sections, marked by \if sectionname ... \endif. -+ -+ENABLED_SECTIONS = -+ -+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -+# the initial value of a variable or define consists of for it to appear in -+# the documentation. If the initializer consists of more lines than specified -+# here it will be hidden. Use a value of 0 to hide initializers completely. -+# The appearance of the initializer of individual variables and defines in the -+# documentation can be controlled using \showinitializer or \hideinitializer -+# command in the documentation regardless of this setting. -+ -+MAX_INITIALIZER_LINES = 30 -+ -+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -+# at the bottom of the documentation of classes and structs. If set to YES the -+# list will mention the files that were used to generate the documentation. -+ -+SHOW_USED_FILES = YES -+ -+# If the sources in your project are distributed over multiple directories -+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -+# in the documentation. The default is NO. -+ -+SHOW_DIRECTORIES = NO -+ -+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -+# This will remove the Files entry from the Quick Index and from the -+# Folder Tree View (if specified). The default is YES. -+ -+SHOW_FILES = YES -+ -+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -+# Namespaces page. This will remove the Namespaces entry from the Quick Index -+# and from the Folder Tree View (if specified). The default is YES. -+ -+SHOW_NAMESPACES = YES -+ -+# The FILE_VERSION_FILTER tag can be used to specify a program or script that -+# doxygen should invoke to get the current version for each file (typically from -+# the version control system). Doxygen will invoke the program by executing (via -+# popen()) the command , where is the value of -+# the FILE_VERSION_FILTER tag, and is the name of an input file -+# provided by doxygen. Whatever the program writes to standard output -+# is used as the file version. See the manual for examples. -+ -+FILE_VERSION_FILTER = -+ -+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -+# doxygen. The layout file controls the global structure of the generated output files -+# in an output format independent way. The create the layout file that represents -+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -+# file name after the option, if omitted DoxygenLayout.xml will be used as the name -+# of the layout file. -+ -+LAYOUT_FILE = -+ -+#--------------------------------------------------------------------------- -+# configuration options related to warning and progress messages -+#--------------------------------------------------------------------------- -+ -+# The QUIET tag can be used to turn on/off the messages that are generated -+# by doxygen. Possible values are YES and NO. If left blank NO is used. -+ -+QUIET = YES -+ -+# The WARNINGS tag can be used to turn on/off the warning messages that are -+# generated by doxygen. Possible values are YES and NO. If left blank -+# NO is used. -+ -+WARNINGS = YES -+ -+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -+# automatically be disabled. -+ -+WARN_IF_UNDOCUMENTED = YES -+ -+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -+# potential errors in the documentation, such as not documenting some -+# parameters in a documented function, or documenting parameters that -+# don't exist or using markup commands wrongly. -+ -+WARN_IF_DOC_ERROR = YES -+ -+# This WARN_NO_PARAMDOC option can be abled to get warnings for -+# functions that are documented, but have no documentation for their parameters -+# or return value. If set to NO (the default) doxygen will only warn about -+# wrong or incomplete parameter documentation, but not about the absence of -+# documentation. -+ -+WARN_NO_PARAMDOC = NO -+ -+# The WARN_FORMAT tag determines the format of the warning messages that -+# doxygen can produce. The string should contain the $file, $line, and $text -+# tags, which will be replaced by the file and line number from which the -+# warning originated and the warning text. Optionally the format may contain -+# $version, which will be replaced by the version of the file (if it could -+# be obtained via FILE_VERSION_FILTER) -+ -+WARN_FORMAT = "$file:$line: $text" -+ -+# The WARN_LOGFILE tag can be used to specify a file to which warning -+# and error messages should be written. If left blank the output is written -+# to stderr. -+ -+WARN_LOGFILE = -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the input files -+#--------------------------------------------------------------------------- -+ -+# The INPUT tag can be used to specify the files and/or directories that contain -+# documented source files. You may enter file names like "myfile.cpp" or -+# directories like "/usr/src/myproject". Separate the files or directories -+# with spaces. -+ -+INPUT = -+ -+# This tag can be used to specify the character encoding of the source files -+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -+# also the default input encoding. Doxygen uses libiconv (or the iconv built -+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -+# the list of possible encodings. -+ -+INPUT_ENCODING = UTF-8 -+ -+# If the value of the INPUT tag contains directories, you can use the -+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -+# and *.h) to filter out the source-files in the directories. If left -+# blank the following patterns are tested: -+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 -+ -+FILE_PATTERNS = -+ -+# The RECURSIVE tag can be used to turn specify whether or not subdirectories -+# should be searched for input files as well. Possible values are YES and NO. -+# If left blank NO is used. -+ -+RECURSIVE = NO -+ -+# The EXCLUDE tag can be used to specify files and/or directories that should -+# excluded from the INPUT source files. This way you can easily exclude a -+# subdirectory from a directory tree whose root is specified with the INPUT tag. -+ -+EXCLUDE = -+ -+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -+# directories that are symbolic links (a Unix filesystem feature) are excluded -+# from the input. -+ -+EXCLUDE_SYMLINKS = NO -+ -+# If the value of the INPUT tag contains directories, you can use the -+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -+# certain files from those directories. Note that the wildcards are matched -+# against the file with absolute path, so to exclude all test directories -+# for example use the pattern */test/* -+ -+EXCLUDE_PATTERNS = -+ -+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -+# (namespaces, classes, functions, etc.) that should be excluded from the -+# output. The symbol name can be a fully qualified name, a word, or if the -+# wildcard * is used, a substring. Examples: ANamespace, AClass, -+# AClass::ANamespace, ANamespace::*Test -+ -+EXCLUDE_SYMBOLS = -+ -+# The EXAMPLE_PATH tag can be used to specify one or more files or -+# directories that contain example code fragments that are included (see -+# the \include command). -+ -+EXAMPLE_PATH = -+ -+# If the value of the EXAMPLE_PATH tag contains directories, you can use the -+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -+# and *.h) to filter out the source-files in the directories. If left -+# blank all files are included. -+ -+EXAMPLE_PATTERNS = -+ -+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -+# searched for input files to be used with the \include or \dontinclude -+# commands irrespective of the value of the RECURSIVE tag. -+# Possible values are YES and NO. If left blank NO is used. -+ -+EXAMPLE_RECURSIVE = NO -+ -+# The IMAGE_PATH tag can be used to specify one or more files or -+# directories that contain image that are included in the documentation (see -+# the \image command). -+ -+IMAGE_PATH = -+ -+# The INPUT_FILTER tag can be used to specify a program that doxygen should -+# invoke to filter for each input file. Doxygen will invoke the filter program -+# by executing (via popen()) the command , where -+# is the value of the INPUT_FILTER tag, and is the name of an -+# input file. Doxygen will then use the output that the filter program writes -+# to standard output. If FILTER_PATTERNS is specified, this tag will be -+# ignored. -+ -+INPUT_FILTER = -+ -+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -+# basis. Doxygen will compare the file name with each pattern and apply the -+# filter if there is a match. The filters are a list of the form: -+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -+# is applied to all files. -+ -+FILTER_PATTERNS = -+ -+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -+# INPUT_FILTER) will be used to filter the input files when producing source -+# files to browse (i.e. when SOURCE_BROWSER is set to YES). -+ -+FILTER_SOURCE_FILES = NO -+ -+#--------------------------------------------------------------------------- -+# configuration options related to source browsing -+#--------------------------------------------------------------------------- -+ -+# If the SOURCE_BROWSER tag is set to YES then a list of source files will -+# be generated. Documented entities will be cross-referenced with these sources. -+# Note: To get rid of all source code in the generated output, make sure also -+# VERBATIM_HEADERS is set to NO. -+ -+SOURCE_BROWSER = NO -+ -+# Setting the INLINE_SOURCES tag to YES will include the body -+# of functions and classes directly in the documentation. -+ -+INLINE_SOURCES = NO -+ -+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -+# doxygen to hide any special comment blocks from generated source code -+# fragments. Normal C and C++ comments will always remain visible. -+ -+STRIP_CODE_COMMENTS = YES -+ -+# If the REFERENCED_BY_RELATION tag is set to YES -+# then for each documented function all documented -+# functions referencing it will be listed. -+ -+REFERENCED_BY_RELATION = NO -+ -+# If the REFERENCES_RELATION tag is set to YES -+# then for each documented function all documented entities -+# called/used by that function will be listed. -+ -+REFERENCES_RELATION = NO -+ -+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -+# link to the source code. Otherwise they will link to the documentstion. -+ -+REFERENCES_LINK_SOURCE = YES -+ -+# If the USE_HTAGS tag is set to YES then the references to source code -+# will point to the HTML generated by the htags(1) tool instead of doxygen -+# built-in source browser. The htags tool is part of GNU's global source -+# tagging system (see http://www.gnu.org/software/global/global.html). You -+# will need version 4.8.6 or higher. -+ -+USE_HTAGS = NO -+ -+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -+# will generate a verbatim copy of the header file for each class for -+# which an include is specified. Set to NO to disable this. -+ -+VERBATIM_HEADERS = YES -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the alphabetical class index -+#--------------------------------------------------------------------------- -+ -+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -+# of all compounds will be generated. Enable this if the project -+# contains a lot of classes, structs, unions or interfaces. -+ -+ALPHABETICAL_INDEX = NO -+ -+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -+# in which this list will be split (can be a number in the range [1..20]) -+ -+COLS_IN_ALPHA_INDEX = 5 -+ -+# In case all classes in a project start with a common prefix, all -+# classes will be put under the same header in the alphabetical index. -+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -+# should be ignored while generating the index headers. -+ -+IGNORE_PREFIX = -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the HTML output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -+# generate HTML output. -+ -+GENERATE_HTML = YES -+ -+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -+# If a relative path is entered the value of OUTPUT_DIRECTORY will be -+# put in front of it. If left blank `html' will be used as the default path. -+ -+HTML_OUTPUT = html -+ -+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -+# doxygen will generate files with .html extension. -+ -+HTML_FILE_EXTENSION = .html -+ -+# The HTML_HEADER tag can be used to specify a personal HTML header for -+# each generated HTML page. If it is left blank doxygen will generate a -+# standard header. -+ -+HTML_HEADER = -+ -+# The HTML_FOOTER tag can be used to specify a personal HTML footer for -+# each generated HTML page. If it is left blank doxygen will generate a -+# standard footer. -+ -+HTML_FOOTER = no_date_footer.html -+ -+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -+# style sheet that is used by each HTML page. It can be used to -+# fine-tune the look of the HTML output. If the tag is left blank doxygen -+# will generate a default style sheet. Note that doxygen will try to copy -+# the style sheet file to the HTML output directory, so don't put your own -+# stylesheet in the HTML output directory as well, or it will be erased! -+ -+HTML_STYLESHEET = -+ -+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -+# files or namespaces will be aligned in HTML using tables. If set to -+# NO a bullet list will be used. -+ -+HTML_ALIGN_MEMBERS = YES -+ -+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -+# documentation will contain sections that can be hidden and shown after the -+# page has loaded. For this to work a browser that supports -+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). -+ -+HTML_DYNAMIC_SECTIONS = NO -+ -+# If the GENERATE_DOCSET tag is set to YES, additional index files -+# will be generated that can be used as input for Apple's Xcode 3 -+# integrated development environment, introduced with OSX 10.5 (Leopard). -+# To create a documentation set, doxygen will generate a Makefile in the -+# HTML output directory. Running make will produce the docset in that -+# directory and running "make install" will install the docset in -+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -+# it at startup. -+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. -+ -+GENERATE_DOCSET = NO -+ -+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -+# feed. A documentation feed provides an umbrella under which multiple -+# documentation sets from a single provider (such as a company or product suite) -+# can be grouped. -+ -+DOCSET_FEEDNAME = "Doxygen generated docs" -+ -+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -+# should uniquely identify the documentation set bundle. This should be a -+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -+# will append .docset to the name. -+ -+DOCSET_BUNDLE_ID = org.doxygen.Project -+ -+# If the GENERATE_HTMLHELP tag is set to YES, additional index files -+# will be generated that can be used as input for tools like the -+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -+# of the generated HTML documentation. -+ -+GENERATE_HTMLHELP = NO -+ -+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -+# be used to specify the file name of the resulting .chm file. You -+# can add a path in front of the file if the result should not be -+# written to the html output directory. -+ -+CHM_FILE = -+ -+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -+# be used to specify the location (absolute path including file name) of -+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -+# the HTML help compiler on the generated index.hhp. -+ -+HHC_LOCATION = -+ -+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -+# controls if a separate .chi index file is generated (YES) or that -+# it should be included in the master .chm file (NO). -+ -+GENERATE_CHI = NO -+ -+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -+# is used to encode HtmlHelp index (hhk), content (hhc) and project file -+# content. -+ -+CHM_INDEX_ENCODING = -+ -+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -+# controls whether a binary table of contents is generated (YES) or a -+# normal table of contents (NO) in the .chm file. -+ -+BINARY_TOC = NO -+ -+# The TOC_EXPAND flag can be set to YES to add extra items for group members -+# to the contents of the HTML help documentation and to the tree view. -+ -+TOC_EXPAND = NO -+ -+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -+# are set, an additional index file will be generated that can be used as input for -+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -+# HTML documentation. -+ -+GENERATE_QHP = NO -+ -+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -+# be used to specify the file name of the resulting .qch file. -+# The path specified is relative to the HTML output folder. -+ -+QCH_FILE = -+ -+# The QHP_NAMESPACE tag specifies the namespace to use when generating -+# Qt Help Project output. For more information please see -+# Qt Help Project / Namespace. -+ -+QHP_NAMESPACE = org.doxygen.Project -+ -+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -+# Qt Help Project output. For more information please see -+# Qt Help Project / Virtual Folders. -+ -+QHP_VIRTUAL_FOLDER = doc -+ -+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -+# be used to specify the location of Qt's qhelpgenerator. -+# If non-empty doxygen will try to run qhelpgenerator on the generated -+# .qhp file . -+ -+QHG_LOCATION = -+ -+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -+# top of each HTML page. The value NO (the default) enables the index and -+# the value YES disables it. -+ -+DISABLE_INDEX = NO -+ -+# This tag can be used to set the number of enum values (range [1..20]) -+# that doxygen will group on one line in the generated HTML documentation. -+ -+ENUM_VALUES_PER_LINE = 4 -+ -+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -+# structure should be generated to display hierarchical information. -+# If the tag value is set to FRAME, a side panel will be generated -+# containing a tree-like index structure (just like the one that -+# is generated for HTML Help). For this to work a browser that supports -+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -+# probably better off using the HTML help feature. Other possible values -+# for this tag are: HIERARCHIES, which will generate the Groups, Directories, -+# and Class Hierarchy pages using a tree view instead of an ordered list; -+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which -+# disables this behavior completely. For backwards compatibility with previous -+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE -+# respectively. -+ -+GENERATE_TREEVIEW = NONE -+ -+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -+# used to set the initial width (in pixels) of the frame in which the tree -+# is shown. -+ -+TREEVIEW_WIDTH = 250 -+ -+# Use this tag to change the font size of Latex formulas included -+# as images in the HTML documentation. The default is 10. Note that -+# when you change the font size after a successful doxygen run you need -+# to manually remove any form_*.png images from the HTML output directory -+# to force them to be regenerated. -+ -+FORMULA_FONTSIZE = 10 -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the LaTeX output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -+# generate Latex output. -+ -+GENERATE_LATEX = NO -+ -+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -+# If a relative path is entered the value of OUTPUT_DIRECTORY will be -+# put in front of it. If left blank `latex' will be used as the default path. -+ -+LATEX_OUTPUT = latex -+ -+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -+# invoked. If left blank `latex' will be used as the default command name. -+ -+LATEX_CMD_NAME = latex -+ -+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -+# generate index for LaTeX. If left blank `makeindex' will be used as the -+# default command name. -+ -+MAKEINDEX_CMD_NAME = makeindex -+ -+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -+# LaTeX documents. This may be useful for small projects and may help to -+# save some trees in general. -+ -+COMPACT_LATEX = NO -+ -+# The PAPER_TYPE tag can be used to set the paper type that is used -+# by the printer. Possible values are: a4, a4wide, letter, legal and -+# executive. If left blank a4wide will be used. -+ -+PAPER_TYPE = a4wide -+ -+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -+# packages that should be included in the LaTeX output. -+ -+EXTRA_PACKAGES = -+ -+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -+# the generated latex document. The header should contain everything until -+# the first chapter. If it is left blank doxygen will generate a -+# standard header. Notice: only use this tag if you know what you are doing! -+ -+LATEX_HEADER = -+ -+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -+# is prepared for conversion to pdf (using ps2pdf). The pdf file will -+# contain links (just like the HTML output) instead of page references -+# This makes the output suitable for online browsing using a pdf viewer. -+ -+PDF_HYPERLINKS = YES -+ -+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -+# plain latex in the generated Makefile. Set this option to YES to get a -+# higher quality PDF documentation. -+ -+USE_PDFLATEX = YES -+ -+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -+# command to the generated LaTeX files. This will instruct LaTeX to keep -+# running if errors occur, instead of asking the user for help. -+# This option is also used when generating formulas in HTML. -+ -+LATEX_BATCHMODE = NO -+ -+# If LATEX_HIDE_INDICES is set to YES then doxygen will not -+# include the index chapters (such as File Index, Compound Index, etc.) -+# in the output. -+ -+LATEX_HIDE_INDICES = NO -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the RTF output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -+# The RTF output is optimized for Word 97 and may not look very pretty with -+# other RTF readers or editors. -+ -+GENERATE_RTF = NO -+ -+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -+# If a relative path is entered the value of OUTPUT_DIRECTORY will be -+# put in front of it. If left blank `rtf' will be used as the default path. -+ -+RTF_OUTPUT = rtf -+ -+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -+# RTF documents. This may be useful for small projects and may help to -+# save some trees in general. -+ -+COMPACT_RTF = NO -+ -+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -+# will contain hyperlink fields. The RTF file will -+# contain links (just like the HTML output) instead of page references. -+# This makes the output suitable for online browsing using WORD or other -+# programs which support those fields. -+# Note: wordpad (write) and others do not support links. -+ -+RTF_HYPERLINKS = NO -+ -+# Load stylesheet definitions from file. Syntax is similar to doxygen's -+# config file, i.e. a series of assignments. You only have to provide -+# replacements, missing definitions are set to their default value. -+ -+RTF_STYLESHEET_FILE = -+ -+# Set optional variables used in the generation of an rtf document. -+# Syntax is similar to doxygen's config file. -+ -+RTF_EXTENSIONS_FILE = -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the man page output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -+# generate man pages -+ -+GENERATE_MAN = NO -+ -+# The MAN_OUTPUT tag is used to specify where the man pages will be put. -+# If a relative path is entered the value of OUTPUT_DIRECTORY will be -+# put in front of it. If left blank `man' will be used as the default path. -+ -+MAN_OUTPUT = man -+ -+# The MAN_EXTENSION tag determines the extension that is added to -+# the generated man pages (default is the subroutine's section .3) -+ -+MAN_EXTENSION = .3 -+ -+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -+# then it will generate one additional man file for each entity -+# documented in the real man page(s). These additional files -+# only source the real man page, but without them the man command -+# would be unable to find the correct page. The default is NO. -+ -+MAN_LINKS = NO -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the XML output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_XML tag is set to YES Doxygen will -+# generate an XML file that captures the structure of -+# the code including all documentation. -+ -+GENERATE_XML = NO -+ -+# The XML_OUTPUT tag is used to specify where the XML pages will be put. -+# If a relative path is entered the value of OUTPUT_DIRECTORY will be -+# put in front of it. If left blank `xml' will be used as the default path. -+ -+XML_OUTPUT = xml -+ -+# The XML_SCHEMA tag can be used to specify an XML schema, -+# which can be used by a validating XML parser to check the -+# syntax of the XML files. -+ -+XML_SCHEMA = -+ -+# The XML_DTD tag can be used to specify an XML DTD, -+# which can be used by a validating XML parser to check the -+# syntax of the XML files. -+ -+XML_DTD = -+ -+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -+# dump the program listings (including syntax highlighting -+# and cross-referencing information) to the XML output. Note that -+# enabling this will significantly increase the size of the XML output. -+ -+XML_PROGRAMLISTING = YES -+ -+#--------------------------------------------------------------------------- -+# configuration options for the AutoGen Definitions output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -+# generate an AutoGen Definitions (see autogen.sf.net) file -+# that captures the structure of the code including all -+# documentation. Note that this feature is still experimental -+# and incomplete at the moment. -+ -+GENERATE_AUTOGEN_DEF = NO -+ -+#--------------------------------------------------------------------------- -+# configuration options related to the Perl module output -+#--------------------------------------------------------------------------- -+ -+# If the GENERATE_PERLMOD tag is set to YES Doxygen will -+# generate a Perl module file that captures the structure of -+# the code including all documentation. Note that this -+# feature is still experimental and incomplete at the -+# moment. -+ -+GENERATE_PERLMOD = NO -+ -+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -+# the necessary Makefile rules, Perl scripts and LaTeX code to be able -+# to generate PDF and DVI output from the Perl module output. -+ -+PERLMOD_LATEX = NO -+ -+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -+# nicely formatted so it can be parsed by a human reader. This is useful -+# if you want to understand what is going on. On the other hand, if this -+# tag is set to NO the size of the Perl module output will be much smaller -+# and Perl will parse it just the same. -+ -+PERLMOD_PRETTY = YES -+ -+# The names of the make variables in the generated doxyrules.make file -+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -+# This is useful so different doxyrules.make files included by the same -+# Makefile don't overwrite each other's variables. -+ -+PERLMOD_MAKEVAR_PREFIX = -+ -+#--------------------------------------------------------------------------- -+# Configuration options related to the preprocessor -+#--------------------------------------------------------------------------- -+ -+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -+# evaluate all C-preprocessor directives found in the sources and include -+# files. -+ -+ENABLE_PREPROCESSING = YES -+ -+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -+# names in the source code. If set to NO (the default) only conditional -+# compilation will be performed. Macro expansion can be done in a controlled -+# way by setting EXPAND_ONLY_PREDEF to YES. -+ -+MACRO_EXPANSION = NO -+ -+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -+# then the macro expansion is limited to the macros specified with the -+# PREDEFINED and EXPAND_AS_DEFINED tags. -+ -+EXPAND_ONLY_PREDEF = NO -+ -+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -+# in the INCLUDE_PATH (see below) will be search if a #include is found. -+ -+SEARCH_INCLUDES = YES -+ -+# The INCLUDE_PATH tag can be used to specify one or more directories that -+# contain include files that are not input files but should be processed by -+# the preprocessor. -+ -+INCLUDE_PATH = -+ -+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -+# patterns (like *.h and *.hpp) to filter out the header-files in the -+# directories. If left blank, the patterns specified with FILE_PATTERNS will -+# be used. -+ -+INCLUDE_FILE_PATTERNS = -+ -+# The PREDEFINED tag can be used to specify one or more macro names that -+# are defined before the preprocessor is started (similar to the -D option of -+# gcc). The argument of the tag is a list of macros of the form: name -+# or name=definition (no spaces). If the definition and the = are -+# omitted =1 is assumed. To prevent a macro definition from being -+# undefined via #undef or recursively expanded use the := operator -+# instead of the = operator. -+ -+PREDEFINED = -+ -+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -+# this tag can be used to specify a list of macro names that should be expanded. -+# The macro definition that is found in the sources will be used. -+# Use the PREDEFINED tag if you want to use a different macro definition. -+ -+EXPAND_AS_DEFINED = -+ -+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -+# doxygen's preprocessor will remove all function-like macros that are alone -+# on a line, have an all uppercase name, and do not end with a semicolon. Such -+# function macros are typically used for boiler-plate code, and will confuse -+# the parser if not removed. -+ -+SKIP_FUNCTION_MACROS = YES -+ -+#--------------------------------------------------------------------------- -+# Configuration::additions related to external references -+#--------------------------------------------------------------------------- -+ -+# The TAGFILES option can be used to specify one or more tagfiles. -+# Optionally an initial location of the external documentation -+# can be added for each tagfile. The format of a tag file without -+# this location is as follows: -+# TAGFILES = file1 file2 ... -+# Adding location for the tag files is done as follows: -+# TAGFILES = file1=loc1 "file2 = loc2" ... -+# where "loc1" and "loc2" can be relative or absolute paths or -+# URLs. If a location is present for each tag, the installdox tool -+# does not have to be run to correct the links. -+# Note that each tag file must have a unique name -+# (where the name does NOT include the path) -+# If a tag file is not located in the directory in which doxygen -+# is run, you must also specify the path to the tagfile here. -+ -+TAGFILES = -+ -+# When a file name is specified after GENERATE_TAGFILE, doxygen will create -+# a tag file that is based on the input files it reads. -+ -+GENERATE_TAGFILE = -+ -+# If the ALLEXTERNALS tag is set to YES all external classes will be listed -+# in the class index. If set to NO only the inherited external classes -+# will be listed. -+ -+ALLEXTERNALS = NO -+ -+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -+# in the modules index. If set to NO, only the current project's groups will -+# be listed. -+ -+EXTERNAL_GROUPS = YES -+ -+# The PERL_PATH should be the absolute path and name of the perl script -+# interpreter (i.e. the result of `which perl'). -+ -+PERL_PATH = /usr/bin/perl -+ -+#--------------------------------------------------------------------------- -+# Configuration options related to the dot tool -+#--------------------------------------------------------------------------- -+ -+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -+# or super classes. Setting the tag to NO turns the diagrams off. Note that -+# this option is superseded by the HAVE_DOT option below. This is only a -+# fallback. It is recommended to install and use dot, since it yields more -+# powerful graphs. -+ -+CLASS_DIAGRAMS = YES -+ -+# You can define message sequence charts within doxygen comments using the \msc -+# command. Doxygen will then run the mscgen tool (see -+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -+# documentation. The MSCGEN_PATH tag allows you to specify the directory where -+# the mscgen tool resides. If left empty the tool is assumed to be found in the -+# default search path. -+ -+MSCGEN_PATH = -+ -+# If set to YES, the inheritance and collaboration graphs will hide -+# inheritance and usage relations if the target is undocumented -+# or is not a class. -+ -+HIDE_UNDOC_RELATIONS = YES -+ -+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -+# available from the path. This tool is part of Graphviz, a graph visualization -+# toolkit from AT&T and Lucent Bell Labs. The other options in this section -+# have no effect if this option is set to NO (the default) -+ -+HAVE_DOT = NO -+ -+# By default doxygen will write a font called FreeSans.ttf to the output -+# directory and reference it in all dot files that doxygen generates. This -+# font does not include all possible unicode characters however, so when you need -+# these (or just want a differently looking font) you can specify the font name -+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -+# which can be done by putting it in a standard location or by setting the -+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -+# containing the font. -+ -+DOT_FONTNAME = FreeSans -+ -+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -+# The default size is 10pt. -+ -+DOT_FONTSIZE = 10 -+ -+# By default doxygen will tell dot to use the output directory to look for the -+# FreeSans.ttf font (which doxygen will put there itself). If you specify a -+# different font using DOT_FONTNAME you can set the path where dot -+# can find it using this tag. -+ -+DOT_FONTPATH = -+ -+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -+# will generate a graph for each documented class showing the direct and -+# indirect inheritance relations. Setting this tag to YES will force the -+# the CLASS_DIAGRAMS tag to NO. -+ -+CLASS_GRAPH = YES -+ -+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -+# will generate a graph for each documented class showing the direct and -+# indirect implementation dependencies (inheritance, containment, and -+# class references variables) of the class with other documented classes. -+ -+COLLABORATION_GRAPH = YES -+ -+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -+# will generate a graph for groups, showing the direct groups dependencies -+ -+GROUP_GRAPHS = YES -+ -+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -+# collaboration diagrams in a style similar to the OMG's Unified Modeling -+# Language. -+ -+UML_LOOK = NO -+ -+# If set to YES, the inheritance and collaboration graphs will show the -+# relations between templates and their instances. -+ -+TEMPLATE_RELATIONS = NO -+ -+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -+# tags are set to YES then doxygen will generate a graph for each documented -+# file showing the direct and indirect include dependencies of the file with -+# other documented files. -+ -+INCLUDE_GRAPH = YES -+ -+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -+# documented header file showing the documented files that directly or -+# indirectly include this file. -+ -+INCLUDED_BY_GRAPH = YES -+ -+# If the CALL_GRAPH and HAVE_DOT options are set to YES then -+# doxygen will generate a call dependency graph for every global function -+# or class method. Note that enabling this option will significantly increase -+# the time of a run. So in most cases it will be better to enable call graphs -+# for selected functions only using the \callgraph command. -+ -+CALL_GRAPH = NO -+ -+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -+# doxygen will generate a caller dependency graph for every global function -+# or class method. Note that enabling this option will significantly increase -+# the time of a run. So in most cases it will be better to enable caller -+# graphs for selected functions only using the \callergraph command. -+ -+CALLER_GRAPH = NO -+ -+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -+# will graphical hierarchy of all classes instead of a textual one. -+ -+GRAPHICAL_HIERARCHY = YES -+ -+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -+# then doxygen will show the dependencies a directory has on other directories -+# in a graphical way. The dependency relations are determined by the #include -+# relations between the files in the directories. -+ -+DIRECTORY_GRAPH = YES -+ -+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -+# generated by dot. Possible values are png, jpg, or gif -+# If left blank png will be used. -+ -+DOT_IMAGE_FORMAT = png -+ -+# The tag DOT_PATH can be used to specify the path where the dot tool can be -+# found. If left blank, it is assumed the dot tool can be found in the path. -+ -+DOT_PATH = -+ -+# The DOTFILE_DIRS tag can be used to specify one or more directories that -+# contain dot files that are included in the documentation (see the -+# \dotfile command). -+ -+DOTFILE_DIRS = -+ -+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -+# nodes that will be shown in the graph. If the number of nodes in a graph -+# becomes larger than this value, doxygen will truncate the graph, which is -+# visualized by representing a node as a red box. Note that doxygen if the -+# number of direct children of the root node in a graph is already larger than -+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -+ -+DOT_GRAPH_MAX_NODES = 50 -+ -+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -+# graphs generated by dot. A depth value of 3 means that only nodes reachable -+# from the root by following a path via at most 3 edges will be shown. Nodes -+# that lay further from the root node will be omitted. Note that setting this -+# option to 1 or 2 may greatly reduce the computation time needed for large -+# code bases. Also note that the size of a graph can be further restricted by -+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. -+ -+MAX_DOT_GRAPH_DEPTH = 0 -+ -+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -+# background. This is disabled by default, because dot on Windows does not -+# seem to support this out of the box. Warning: Depending on the platform used, -+# enabling this option may lead to badly anti-aliased labels on the edges of -+# a graph (i.e. they become hard to read). -+ -+DOT_TRANSPARENT = NO -+ -+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -+# files in one run (i.e. multiple -o and -T options on the command line). This -+# makes dot run faster, but since only newer versions of dot (>1.8.10) -+# support this, this feature is disabled by default. -+ -+DOT_MULTI_TARGETS = NO -+ -+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -+# generate a legend page explaining the meaning of the various boxes and -+# arrows in the dot generated graphs. -+ -+GENERATE_LEGEND = YES -+ -+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -+# remove the intermediate dot files that are used to generate -+# the various graphs. -+ -+DOT_CLEANUP = YES -+ -+#--------------------------------------------------------------------------- -+# Configuration::additions related to the search engine -+#--------------------------------------------------------------------------- -+ -+# The SEARCHENGINE tag specifies whether or not a search engine should be -+# used. If set to NO the values of all tags below this one will be ignored. -+ -+SEARCHENGINE = NO -diff --git a/libiscsi/libiscsi.h b/libiscsi/libiscsi.h -new file mode 100644 -index 0000000..756590e ---- /dev/null -+++ b/libiscsi/libiscsi.h -@@ -0,0 +1,344 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#ifndef __LIBISCSI_H -+#define __LIBISCSI_H -+ -+#include -+ -+#ifdef __cplusplus -+extern "C" { -+#endif /* __cplusplus */ -+ -+#if __GNUC__ >= 4 -+#define PUBLIC __attribute__ ((visibility("default"))) -+#else -+#define PUBLIC -+#endif -+ -+/** \brief Maximum length for iSCSI values. -+ * -+ * Maximum length for iSCSI values such as hostnames and parameter values. -+ */ -+#define LIBISCSI_VALUE_MAXLEN 256 -+ -+/** \brief supported authentication methods -+ * -+ * This enum lists all supported authentication methods. -+ */ -+enum libiscsi_auth_t { -+ libiscsi_auth_none /** No authentication */, -+ libiscsi_auth_chap /** CHAP authentication */, -+}; -+ -+/** \brief libiscsi context struct -+ * -+ * Note: even though libiscsi uses a context struct, the underlying open-iscsi -+ * code does not, so libiscsi is not thread safe, not even when using one -+ * context per thread! -+ */ -+struct libiscsi_context; -+ -+/** \brief iSCSI node record -+ * -+ * Struct holding data uniquely identifying an iSCSI node. -+ */ -+struct libiscsi_node { -+ char name[LIBISCSI_VALUE_MAXLEN] /** iSCSI iqn for the node. */; -+ int tpgt /** Portal group number. */; -+ /* Note open-iscsi has some code in place for multiple connections in one -+ node record and thus multiple address / port combi's, but this does not -+ get used anywhere, so we keep things simple and assume one connection */ -+ char address[NI_MAXHOST] /** Portal hostname or IP-address. */; -+ int port /** Portal port number. */; -+ char iface[LIBISCSI_VALUE_MAXLEN] /** Interface to connect through. */; -+}; -+ -+/** \brief libiscsi CHAP authentication information struct -+ * -+ * Struct holding all data needed for CHAP login / authentication. Note that -+ * \e reverse_username may be a 0 length string in which case only forward -+ * authentication will be done. -+ */ -+struct libiscsi_chap_auth_info { -+ char username[LIBISCSI_VALUE_MAXLEN] /** Username */; -+ char password[LIBISCSI_VALUE_MAXLEN] /** Password */; -+ char reverse_username[LIBISCSI_VALUE_MAXLEN] /** Reverse Username */; -+ char reverse_password[LIBISCSI_VALUE_MAXLEN] /** Reverse Password */; -+}; -+ -+/** \brief generic libiscsi authentication information struct -+ * -+ * Struct holding authentication information for discovery and login. -+ */ -+struct libiscsi_auth_info { -+ enum libiscsi_auth_t method /** Authentication method to use */; -+ union { -+ struct libiscsi_chap_auth_info chap /** Chap specific info */; -+ } /** Union holding method depenend info */; -+}; -+ -+/** \brief Initalize libiscsi -+ * -+ * This function creates a libiscsi context and initalizes it. This context -+ * is need to use other libiscsi funtions. -+ * -+ * \return A pointer to the created context, or NULL in case of an error. -+ */ -+PUBLIC struct libiscsi_context *libiscsi_init(void); -+ -+/** \brief Cleanup libiscsi used resource -+ * -+ * This function cleanups any used resources and then destroys the passed -+ * context. After this the passed in context may no longer be used! -+ * -+ * \param context libiscsi context to operate on. -+ */ -+PUBLIC void libiscsi_cleanup(struct libiscsi_context *context); -+ -+/** \brief Discover iSCSI nodes using sendtargets and add them to the node db. -+ * -+ * This function connects to the given address and port and then tries to -+ * discover iSCSI nodes using the sendtargets protocol. Any found nodes are -+ * added to the local iSCSI node database and are returned in a dynamically -+ * allocated array. -+ * -+ * Note that the (optional) authentication info is for authenticating the -+ * discovery, and is not for the found nodes! If the connection(s) to the -+ * node(s) need authentication too, you can set the username / password for -+ * those (which can be different!) using the libiscsi_node_set_auth() function. -+ * -+ * \param context libiscsi context to operate on. -+ * \param address Hostname or IP-address to connect to. -+ * \param port Port to connect to, or 0 for the default port. -+ * \param auth_info Authentication information, or NULL. -+ * \param nr_found The number of found nodes will be returned -+ * through this pointer if not NULL. -+ * \param found_nodes The address of the dynamically allocated array -+ * of found nodes will be returned through this -+ * pointer if not NULL. The caller must free this -+ * array using free(). -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_discover_sendtargets(struct libiscsi_context *context, -+ const char *address, int port, const struct libiscsi_auth_info *auth_info, -+ int *nr_found, struct libiscsi_node **found_nodes); -+ -+/** \brief Read iSCSI node info from firmware and add them to the node db. -+ * -+ * This function discovers iSCSI nodes using firmware (ppc or ibft). Any found -+ * nodes are added to the local iSCSI node database and are returned in a -+ * dynamically allocated array. -+ * -+ * Note that unlike sendtargets discovery, this function will also read -+ * authentication info and store that in the database too. -+ * -+ * Note this function currently is a stub which will always return -EINVAL -+ * (IOW it is not yet implemented) -+ * -+ * \param context libiscsi context to operate on. -+ * \param nr_found The number of found nodes will be returned -+ * through this pointer if not NULL. -+ * \param found_nodes The address of the dynamically allocated array -+ * of found nodes will be returned through this -+ * pointer if not NULL. The caller must free this -+ * array using free(). -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_discover_firmware(struct libiscsi_context *context, -+ int *nr_found, struct libiscsi_node **found_nodes); -+ -+/** \brief Check validity of the given authentication info. -+ * -+ * This function checks the validity of the given authentication info. For -+ * example in case of CHAP, if the username and password are not empty. -+ * -+ * This function is mainly intended for use by language bindings. -+ * -+ * \param context libiscsi context to operate on. -+ * \param auth_info Authentication information to check. -+ * \return 0 on success, otherwise EINVAL. -+ */ -+PUBLIC int libiscsi_verify_auth_info(struct libiscsi_context *context, -+ const struct libiscsi_auth_info *auth_info); -+ -+/** \brief Set the authentication info for the given node. -+ * -+ * This function sets the authentication information for the node described by -+ * the given node record. This will overwrite any existing authentication -+ * information. -+ * -+ * This is the way to specify authentication information for nodes found -+ * through sendtargets discovery. -+ * -+ * Note: -+ * 1) This is a convience wrapper around libiscsi_node_set_parameter(), -+ * setting the node.session.auth.* parameters. -+ * 2) For nodes found through firmware discovery the authentication information -+ * has already been set from the firmware. -+ * 3) \e auth_info may be NULL in which case any existing authinfo will be -+ * cleared. -+ * -+ * \param context libiscsi context to operate on. -+ * \param node iSCSI node to set auth information of -+ * \param auth_info Authentication information, or NULL. -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_node_set_auth(struct libiscsi_context *context, -+ const struct libiscsi_node *node, -+ const struct libiscsi_auth_info *auth_info); -+ -+/** \brief Get the authentication info for the given node. -+ * -+ * This function gets the authentication information for the node described by -+ * the given node record. -+ * -+ * \param context libiscsi context to operate on. -+ * \param node iSCSI node to set auth information of -+ * \param auth_info Pointer to a libiscsi_auth_info struct where -+ * the retreived information will be stored. -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_node_get_auth(struct libiscsi_context *context, -+ const struct libiscsi_node *node, -+ struct libiscsi_auth_info *auth_info); -+ -+/** \brief Login to an iSCSI node. -+ * -+ * Login to the iSCSI node described by the given node record. -+ * -+ * \param context libiscsi context to operate on. -+ * \param node iSCSI node to login to. -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_node_login(struct libiscsi_context *context, -+ const struct libiscsi_node *node); -+ -+/** \brief Logout of an iSCSI node. -+ * -+ * Logout of the iSCSI node described by the given node record. -+ * -+ * \param context libiscsi context to operate on. -+ * \param node iSCSI node to logout from. -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_node_logout(struct libiscsi_context *context, -+ const struct libiscsi_node *node); -+ -+/** \brief Set an iSCSI parameter for the given node -+ * -+ * Set the given nodes iSCSI parameter named by \e parameter to value \e value. -+ * -+ * \param context libiscsi context to operate on. -+ * \param node iSCSI node to change a parameter from. -+ * \param parameter Name of the parameter to set. -+ * \param value Value to set the parameter too. -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_node_set_parameter(struct libiscsi_context *context, -+ const struct libiscsi_node *node, -+ const char *parameter, const char *value); -+ -+/** \brief Get the value of an iSCSI parameter for the given node -+ * -+ * Get the value of the given nodes iSCSI parameter named by \e parameter. -+ * -+ * \param context libiscsi context to operate on. -+ * \param node iSCSI node to change a parameter from. -+ * \param parameter Name of the parameter to get. -+ * \param value The retreived value is stored here, this buffer must be -+ * atleast LIBISCSI_VALUE_MAXLEN bytes large. -+ * \return 0 on success, otherwise a standard error code -+ * (from errno.h). -+ */ -+PUBLIC int libiscsi_node_get_parameter(struct libiscsi_context *context, -+ const struct libiscsi_node *node, const char *parameter, char *value); -+ -+/** \brief Get human readable string describing the last libiscsi error. -+ * -+ * This function can be called to get a human readable error string when a -+ * libiscsi function has returned an error. This function uses a single buffer -+ * per context, thus the result is only valid as long as no other libiscsi -+ * calls are made on the same context after the failing function call. -+ * -+ * \param context libiscsi context to operate on. -+ * -+ * \return human readable string describing the last libiscsi error. -+ */ -+PUBLIC const char *libiscsi_get_error_string(struct libiscsi_context *context); -+ -+ -+/************************** Utility functions *******************************/ -+ -+/** \brief libiscsi network config struct -+ * -+ * libiscsi network config struct. -+ */ -+struct libiscsi_network_config { -+ int dhcp /** Using DHCP? (boolean). */; -+ char iface_name[LIBISCSI_VALUE_MAXLEN] /** Interface name. */; -+ char mac_address[LIBISCSI_VALUE_MAXLEN] /** MAC address. */; -+ char ip_address[LIBISCSI_VALUE_MAXLEN] /** IP address. */; -+ char netmask[LIBISCSI_VALUE_MAXLEN] /** Netmask. */; -+ char gateway[LIBISCSI_VALUE_MAXLEN] /** IP of Default gateway. */; -+ char primary_dns[LIBISCSI_VALUE_MAXLEN] /** IP of the Primary DNS. */; -+ char secondary_dns[LIBISCSI_VALUE_MAXLEN] /** IP of the Secondary DNS. */; -+}; -+ -+/** \brief Get network configuration information from iscsi firmware -+ * -+ * Function can be called to get the network configuration information -+ * (like dhcp, ip, netmask, default gateway, etc.) from the firmware of a -+ * network adapter with iscsi boot firmware. -+ * -+ * Note that not all fields of the returned struct are necessarilly filled, -+ * unset fields contain a 0 length string. -+ * -+ * \param config pointer to a libiscsi_network_config struct to fill. -+ * -+ * \return 0 on success, ENODEV when no iscsi firmware was found. -+ */ -+PUBLIC int libiscsi_get_firmware_network_config( -+ struct libiscsi_network_config *config); -+ -+/** \brief Get the initiator name (iqn) from the iscsi firmware -+ * -+ * Get the initiator name (iqn) from the iscsi firmware. -+ * -+ * \param initiatorname The initiator name is stored here, this buffer must be -+ * atleast LIBISCSI_VALUE_MAXLEN bytes large. -+ * \return 0 on success, ENODEV when no iscsi firmware was found. -+ */ -+PUBLIC int libiscsi_get_firmware_initiator_name(char *initiatorname); -+ -+#undef PUBLIC -+ -+#ifdef __cplusplus -+} -+#endif /* __cplusplus */ -+ -+#endif -diff --git a/libiscsi/no_date_footer.html b/libiscsi/no_date_footer.html -new file mode 100644 -index 0000000..1e0c6c4 ---- /dev/null -+++ b/libiscsi/no_date_footer.html -@@ -0,0 +1,6 @@ -+
-+Generated for $projectname by doxygen -+$doxygenversion
-+ -+ -diff --git a/libiscsi/pylibiscsi.c b/libiscsi/pylibiscsi.c -new file mode 100644 -index 0000000..8800853 ---- /dev/null -+++ b/libiscsi/pylibiscsi.c -@@ -0,0 +1,709 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include "libiscsi.h" -+ -+#if PY_MAJOR_VERSION >= 3 -+#define IS_PY3K -+#define MODINITERROR return NULL -+#define PYNUM_FROMLONG PyLong_FromLong -+#define PYSTR_FROMSTRING PyUnicode_FromString -+#else -+#define MODINITERROR return -+#define PYNUM_FROMLONG PyInt_FromLong -+#define PYSTR_FROMSTRING PyString_FromString -+#endif -+ -+#define RET_TRUE_ELSE_FALSE { Py_RETURN_TRUE; } else { Py_RETURN_FALSE; } -+#define CMP_TO_RICHCMP(cmpfunc) \ -+ int comp_res = cmpfunc(self, other); \ -+ switch (op) { \ -+ case Py_LT: \ -+ if (comp_res < 0) RET_TRUE_ELSE_FALSE \ -+ case Py_LE: \ -+ if (comp_res <= 0) RET_TRUE_ELSE_FALSE \ -+ case Py_EQ: \ -+ if (comp_res == 0) RET_TRUE_ELSE_FALSE \ -+ case Py_NE: \ -+ if (comp_res != 0) RET_TRUE_ELSE_FALSE \ -+ case Py_GT: \ -+ if (comp_res > 0) RET_TRUE_ELSE_FALSE \ -+ default: \ -+ if (comp_res >= 0) RET_TRUE_ELSE_FALSE \ -+ } -+ -+static struct libiscsi_context *context = NULL; -+ -+/****************************** helpers ***********************************/ -+static int check_string(const char *string) -+{ -+ if (strlen(string) >= LIBISCSI_VALUE_MAXLEN) { -+ PyErr_SetString(PyExc_ValueError, "string too long"); -+ return -1; -+ } -+ return 0; -+} -+ -+/********************** PyIscsiChapAuthInfo ***************************/ -+ -+typedef struct { -+ PyObject_HEAD -+ -+ struct libiscsi_auth_info info; -+} PyIscsiChapAuthInfo; -+ -+static int PyIscsiChapAuthInfo_init(PyObject *self, PyObject *args, -+ PyObject *kwds) -+{ -+ int i; -+ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; -+ char *kwlist[] = {"username", "password", "reverse_username", -+ "reverse_password", NULL}; -+ const char *string[4] = { NULL, NULL, NULL, NULL }; -+ -+ if (!PyArg_ParseTupleAndKeywords(args, kwds, -+ "zz|zz:chapAuthInfo.__init__", -+ kwlist, &string[0], &string[1], -+ &string[2], &string[3])) -+ return -1; -+ -+ for (i = 0; i < 4; i++) -+ if (string[i] && check_string(string[i])) -+ return -1; -+ -+ memset (&chap->info, 0, sizeof(chap->info)); -+ chap->info.method = libiscsi_auth_chap; -+ if (string[0]) -+ strcpy(chap->info.chap.username, string[0]); -+ if (string[1]) -+ strcpy(chap->info.chap.password, string[1]); -+ if (string[2]) -+ strcpy(chap->info.chap.reverse_username, string[2]); -+ if (string[3]) -+ strcpy(chap->info.chap.reverse_password, string[3]); -+ -+ if (libiscsi_verify_auth_info(context, &chap->info)) { -+ PyErr_SetString(PyExc_ValueError, -+ libiscsi_get_error_string(context)); -+ return -1; -+ } -+ return 0; -+} -+ -+static PyObject *PyIscsiChapAuthInfo_get(PyObject *self, void *data) -+{ -+ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; -+ const char *attr = (const char *)data; -+ -+ if (!strcmp(attr, "username")) { -+ return PYSTR_FROMSTRING(chap->info.chap.username); -+ } else if (!strcmp(attr, "password")) { -+ return PYSTR_FROMSTRING(chap->info.chap.password); -+ } else if (!strcmp(attr, "reverse_username")) { -+ return PYSTR_FROMSTRING(chap->info.chap.reverse_username); -+ } else if (!strcmp(attr, "reverse_password")) { -+ return PYSTR_FROMSTRING(chap->info.chap.reverse_password); -+ } -+ return NULL; -+} -+ -+static int PyIscsiChapAuthInfo_set(PyObject *self, PyObject *value, void *data) -+{ -+ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; -+ const char *attr = (const char *)data; -+ const char *str; -+ -+ if (!PyArg_Parse(value, "s", &str) || check_string(str)) -+ return -1; -+ -+ if (!strcmp(attr, "username")) { -+ strcpy(chap->info.chap.username, str); -+ } else if (!strcmp(attr, "password")) { -+ strcpy(chap->info.chap.password, str); -+ } else if (!strcmp(attr, "reverse_username")) { -+ strcpy(chap->info.chap.reverse_username, str); -+ } else if (!strcmp(attr, "reverse_password")) { -+ strcpy(chap->info.chap.reverse_password, str); -+ } -+ -+ return 0; -+} -+ -+static int PyIscsiChapAuthInfo_compare(PyIscsiChapAuthInfo *self, -+ PyIscsiChapAuthInfo *other) -+{ -+ int r; -+ -+ r = strcmp(self->info.chap.username, other->info.chap.username); -+ if (r) -+ return r; -+ -+ r = strcmp(self->info.chap.password, other->info.chap.password); -+ if (r) -+ return r; -+ -+ r = strcmp(self->info.chap.reverse_username, -+ other->info.chap.reverse_username); -+ if (r) -+ return r; -+ -+ r = strcmp(self->info.chap.reverse_password, -+ other->info.chap.reverse_password); -+ return r; -+} -+ -+PyObject *PyIscsiChapAuthInfo_richcompare(PyIscsiChapAuthInfo *self, -+ PyIscsiChapAuthInfo *other, -+ int op) -+{ -+ CMP_TO_RICHCMP(PyIscsiChapAuthInfo_compare) -+} -+ -+static PyObject *PyIscsiChapAuthInfo_str(PyObject *self) -+{ -+ PyIscsiChapAuthInfo *chap = (PyIscsiChapAuthInfo *)self; -+ char s[1024], reverse[512] = ""; -+ -+ if (chap->info.chap.reverse_username[0]) -+ snprintf(reverse, sizeof(reverse), ", %s:%s", -+ chap->info.chap.reverse_username, -+ chap->info.chap.reverse_password); -+ -+ snprintf(s, sizeof(s), "%s:%s%s", chap->info.chap.username, -+ chap->info.chap.password, reverse); -+ -+ return PYSTR_FROMSTRING(s); -+} -+ -+static struct PyGetSetDef PyIscsiChapAuthInfo_getseters[] = { -+ {"username", (getter)PyIscsiChapAuthInfo_get, -+ (setter)PyIscsiChapAuthInfo_set, -+ "username", "username"}, -+ {"password", (getter)PyIscsiChapAuthInfo_get, -+ (setter)PyIscsiChapAuthInfo_set, -+ "password", "password"}, -+ {"reverse_username", (getter)PyIscsiChapAuthInfo_get, -+ (setter)PyIscsiChapAuthInfo_set, -+ "reverse_username", "reverse_username"}, -+ {"reverse_password", (getter)PyIscsiChapAuthInfo_get, -+ (setter)PyIscsiChapAuthInfo_set, -+ "reverse_password", "reverse_password"}, -+ {NULL} -+}; -+ -+PyTypeObject PyIscsiChapAuthInfo_Type = { -+ PyVarObject_HEAD_INIT(NULL, 0) -+ .tp_name = "libiscsi.chapAuthInfo", -+ .tp_basicsize = sizeof (PyIscsiChapAuthInfo), -+ .tp_getset = PyIscsiChapAuthInfo_getseters, -+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE -+#ifndef IS_PY3K -+ // Py_TPFLAGS_CHECKTYPES is only needed on Python 2 -+ | Py_TPFLAGS_CHECKTYPES -+#endif -+ , -+ .tp_richcompare = (richcmpfunc)PyIscsiChapAuthInfo_compare, -+ .tp_init = PyIscsiChapAuthInfo_init, -+ .tp_str = PyIscsiChapAuthInfo_str, -+ .tp_new = PyType_GenericNew, -+ .tp_doc = "iscsi chap authentication information.", -+}; -+ -+/***************************** PyIscsiNode ********************************/ -+ -+typedef struct { -+ PyObject_HEAD -+ -+ struct libiscsi_node node; -+} PyIscsiNode; -+ -+static int PyIscsiNode_init(PyObject *self, PyObject *args, PyObject *kwds) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ char *kwlist[] = {"name", "tpgt", "address", "port", "iface", NULL}; -+ const char *name = NULL, *address = NULL, *iface = NULL; -+ int tpgt = -1, port = 3260; -+ -+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|isis:node.__init__", -+ kwlist, &name, &tpgt, &address, -+ &port, &iface)) -+ return -1; -+ if (address == NULL) { -+ PyErr_SetString(PyExc_ValueError, "address not set"); -+ return -1; -+ } -+ if (check_string(name) || check_string(address) || check_string(iface)) -+ return -1; -+ -+ strcpy(node->node.name, name); -+ node->node.tpgt = tpgt; -+ strcpy(node->node.address, address); -+ node->node.port = port; -+ strcpy(node->node.iface, iface); -+ -+ return 0; -+} -+ -+static PyObject *PyIscsiNode_get(PyObject *self, void *data) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ const char *attr = (const char *)data; -+ -+ if (!strcmp(attr, "name")) { -+ return PYSTR_FROMSTRING(node->node.name); -+ } else if (!strcmp(attr, "tpgt")) { -+ return PYNUM_FROMLONG(node->node.tpgt); -+ } else if (!strcmp(attr, "address")) { -+ return PYSTR_FROMSTRING(node->node.address); -+ } else if (!strcmp(attr, "port")) { -+ return PYNUM_FROMLONG(node->node.port); -+ } else if (!strcmp(attr, "iface")) { -+ return PYSTR_FROMSTRING(node->node.iface); -+ } -+ return NULL; -+} -+ -+static int PyIscsiNode_set(PyObject *self, PyObject *value, void *data) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ const char *attr = (const char *)data; -+ const char *str; -+ int i; -+ -+ if (!strcmp(attr, "name")) { -+ if (!PyArg_Parse(value, "s", &str) || check_string(str)) -+ return -1; -+ strcpy(node->node.name, str); -+ } else if (!strcmp(attr, "tpgt")) { -+ if (!PyArg_Parse(value, "i", &i)) -+ return -1; -+ node->node.tpgt = i; -+ } else if (!strcmp(attr, "address")) { -+ if (!PyArg_Parse(value, "s", &str) || check_string(str)) -+ return -1; -+ strcpy(node->node.address, str); -+ } else if (!strcmp(attr, "port")) { -+ if (!PyArg_Parse(value, "i", &i)) -+ return -1; -+ node->node.port = i; -+ } else if (!strcmp(attr, "iface")) { -+ if (!PyArg_Parse(value, "s", &str) || check_string(str)) -+ return -1; -+ strcpy(node->node.iface, str); -+ } -+ -+ return 0; -+} -+ -+static int PyIscsiNode_compare(PyIscsiNode *self, PyIscsiNode *other) -+{ -+ int res; -+ -+ res = strcmp(self->node.name, other->node.name); -+ if (res) -+ return res; -+ -+ if (self->node.tpgt < other->node.tpgt) -+ return -1; -+ if (self->node.tpgt > other->node.tpgt) -+ return -1; -+ -+ res = strcmp(self->node.address, other->node.address); -+ if (res) -+ return res; -+ -+ if (self->node.port < other->node.port) -+ return -1; -+ if (self->node.port > other->node.port) -+ return -1; -+ -+ res = strcmp(self->node.iface, other->node.iface); -+ if (res) -+ return res; -+ -+ return 0; -+} -+ -+PyObject *PyIscsiNode_richcompare(PyIscsiNode *self, PyIscsiNode *other, int op) -+{ -+ CMP_TO_RICHCMP(PyIscsiNode_compare) -+} -+ -+static PyObject *PyIscsiNode_str(PyObject *self) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ char s[1024], tpgt[16] = ""; -+ -+ if (node->node.tpgt != -1) -+ sprintf(tpgt, ",%d", node->node.tpgt); -+ -+ snprintf(s, sizeof(s), "%s:%d%s %s", node->node.address, -+ node->node.port, tpgt, node->node.name); -+ -+ return PYSTR_FROMSTRING(s); -+} -+ -+static PyObject *PyIscsiNode_login(PyObject *self) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ -+ if (libiscsi_node_login(context, &node->node)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ Py_RETURN_NONE; -+} -+ -+static PyObject *PyIscsiNode_logout(PyObject *self) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ -+ if (libiscsi_node_logout(context, &node->node)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ Py_RETURN_NONE; -+} -+ -+static PyObject *PyIscsiNode_setAuth(PyObject *self, PyObject *args, -+ PyObject *kwds) -+{ -+ char *kwlist[] = {"authinfo", NULL}; -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ PyObject *arg; -+ const struct libiscsi_auth_info *authinfo = NULL; -+ -+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &arg)) -+ return NULL; -+ -+ if (arg == Py_None) { -+ authinfo = NULL; -+ } else if (PyObject_IsInstance(arg, (PyObject *) -+ &PyIscsiChapAuthInfo_Type)) { -+ PyIscsiChapAuthInfo *pyauthinfo = (PyIscsiChapAuthInfo *)arg; -+ authinfo = &pyauthinfo->info; -+ } else { -+ PyErr_SetString(PyExc_ValueError, "invalid authinfo type"); -+ return NULL; -+ } -+ -+ if (libiscsi_node_set_auth(context, &node->node, authinfo)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ Py_RETURN_NONE; -+} -+ -+static PyObject *PyIscsiNode_getAuth(PyObject *self) -+{ -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ PyIscsiChapAuthInfo *pyauthinfo; -+ struct libiscsi_auth_info authinfo; -+ -+ if (libiscsi_node_get_auth(context, &node->node, &authinfo)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ -+ switch (authinfo.method) { -+ case libiscsi_auth_chap: -+ pyauthinfo = PyObject_New(PyIscsiChapAuthInfo, -+ &PyIscsiChapAuthInfo_Type); -+ if (!pyauthinfo) -+ return NULL; -+ -+ pyauthinfo->info = authinfo; -+ -+ return (PyObject *)pyauthinfo; -+ -+ case libiscsi_auth_none: -+ default: -+ Py_RETURN_NONE; -+ } -+} -+ -+static PyObject *PyIscsiNode_setParameter(PyObject *self, PyObject *args, -+ PyObject *kwds) -+{ -+ char *kwlist[] = {"parameter", "value", NULL}; -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ const char *parameter, *value; -+ -+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss", kwlist, -+ ¶meter, &value)) -+ return NULL; -+ if (check_string(parameter) || check_string(value)) -+ return NULL; -+ -+ if (libiscsi_node_set_parameter(context, &node->node, parameter, -+ value)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ Py_RETURN_NONE; -+} -+ -+static PyObject *PyIscsiNode_getParameter(PyObject *self, PyObject *args, -+ PyObject *kwds) -+{ -+ char *kwlist[] = {"parameter", NULL}; -+ PyIscsiNode *node = (PyIscsiNode *)self; -+ const char *parameter; -+ char value[LIBISCSI_VALUE_MAXLEN]; -+ -+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, ¶meter)) -+ return NULL; -+ if (check_string(parameter)) -+ return NULL; -+ -+ if (libiscsi_node_get_parameter(context, &node->node, parameter, -+ value)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ return Py_BuildValue("s", value); -+} -+ -+static struct PyGetSetDef PyIscsiNode_getseters[] = { -+ {"name", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, -+ "name", "name"}, -+ {"tpgt", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, -+ "tpgt", "tpgt"}, -+ {"address", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, -+ "address", "address"}, -+ {"port", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, -+ "port", "port"}, -+ {"iface", (getter)PyIscsiNode_get, (setter)PyIscsiNode_set, -+ "iface", "iface"}, -+ {NULL} -+}; -+ -+static struct PyMethodDef PyIscsiNode_methods[] = { -+ {"login", (PyCFunction) PyIscsiNode_login, METH_NOARGS, -+ "Log in to the node"}, -+ {"logout", (PyCFunction) PyIscsiNode_logout, METH_NOARGS, -+ "Log out of the node"}, -+ {"setAuth", (PyCFunction) PyIscsiNode_setAuth, -+ METH_VARARGS|METH_KEYWORDS, -+ "Set authentication information"}, -+ {"getAuth", (PyCFunction) PyIscsiNode_getAuth, METH_NOARGS, -+ "Get authentication information"}, -+ {"setParameter", (PyCFunction) PyIscsiNode_setParameter, -+ METH_VARARGS|METH_KEYWORDS, -+ "Set an iscsi node parameter"}, -+ {"getParameter", (PyCFunction) PyIscsiNode_getParameter, -+ METH_VARARGS|METH_KEYWORDS, -+ "Get an iscsi node parameter"}, -+ {NULL} -+}; -+ -+PyTypeObject PyIscsiNode_Type = { -+ PyVarObject_HEAD_INIT(NULL, 0) -+ .tp_name = "libiscsi.node", -+ .tp_basicsize = sizeof (PyIscsiNode), -+ .tp_getset = PyIscsiNode_getseters, -+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE -+#ifndef IS_PY3K -+ | Py_TPFLAGS_CHECKTYPES -+#endif -+ , -+ .tp_methods = PyIscsiNode_methods, -+ .tp_richcompare = (richcmpfunc)PyIscsiNode_richcompare, -+ .tp_init = PyIscsiNode_init, -+ .tp_str = PyIscsiNode_str, -+ .tp_new = PyType_GenericNew, -+ .tp_doc = "The iscsi node contains iscsi node information.", -+}; -+ -+/***************************************************************************/ -+ -+static PyObject *pylibiscsi_discover_sendtargets(PyObject *self, -+ PyObject *args, PyObject *kwds) -+{ -+ char *kwlist[] = {"address", "port", "authinfo", NULL}; -+ const char *address = NULL; -+ int i, nr_found, port = 3260; -+ PyObject *authinfo_arg = NULL; -+ const struct libiscsi_auth_info *authinfo = NULL; -+ struct libiscsi_node *found_nodes; -+ PyObject* found_node_list; -+ -+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|iO", -+ kwlist, &address, &port, -+ &authinfo_arg)) -+ return NULL; -+ -+ if (authinfo_arg) { -+ if (PyObject_IsInstance(authinfo_arg, (PyObject *) -+ &PyIscsiChapAuthInfo_Type)) { -+ PyIscsiChapAuthInfo *pyauthinfo = -+ (PyIscsiChapAuthInfo *)authinfo_arg; -+ authinfo = &pyauthinfo->info; -+ } else if (authinfo_arg != Py_None) { -+ PyErr_SetString(PyExc_ValueError, -+ "invalid authinfo type"); -+ return NULL; -+ } -+ } -+ -+ if (libiscsi_discover_sendtargets(context, address, port, authinfo, -+ &nr_found, &found_nodes)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ -+ if (nr_found == 0) -+ Py_RETURN_NONE; -+ -+ found_node_list = PyList_New(nr_found); -+ if (!found_node_list) -+ return NULL; -+ -+ for(i = 0; i < nr_found; i++) { -+ PyIscsiNode *pynode; -+ -+ pynode = PyObject_New(PyIscsiNode, &PyIscsiNode_Type); -+ if (!pynode) { -+ /* This will deref already added nodes for us */ -+ Py_DECREF(found_node_list); -+ return NULL; -+ } -+ pynode->node = found_nodes[i]; -+ PyList_SET_ITEM(found_node_list, i, (PyObject *)pynode); -+ } -+ -+ return found_node_list; -+} -+ -+static PyObject *pylibiscsi_discover_firmware(PyObject *self) -+{ -+ int i, nr_found; -+ struct libiscsi_node *found_nodes; -+ PyObject* found_node_list; -+ -+ if (libiscsi_discover_firmware(context, &nr_found, &found_nodes)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ -+ if (nr_found == 0) -+ Py_RETURN_NONE; -+ -+ found_node_list = PyList_New(nr_found); -+ if (!found_node_list) -+ return NULL; -+ -+ for(i = 0; i < nr_found; i++) { -+ PyIscsiNode *pynode; -+ -+ pynode = PyObject_New(PyIscsiNode, &PyIscsiNode_Type); -+ if (!pynode) { -+ /* This will deref already added nodes for us */ -+ Py_DECREF(found_node_list); -+ return NULL; -+ } -+ pynode->node = found_nodes[i]; -+ PyList_SET_ITEM(found_node_list, i, (PyObject *)pynode); -+ } -+ -+ return found_node_list; -+} -+ -+static PyObject *pylibiscsi_get_firmware_initiator_name(PyObject *self) -+{ -+ char initiatorname[LIBISCSI_VALUE_MAXLEN]; -+ -+ if (libiscsi_get_firmware_initiator_name(initiatorname)) { -+ PyErr_SetString(PyExc_IOError, -+ libiscsi_get_error_string(context)); -+ return NULL; -+ } -+ -+ return PYSTR_FROMSTRING(initiatorname); -+} -+ -+static PyMethodDef pylibiscsi_functions[] = { -+ { "discover_sendtargets", -+ (PyCFunction)pylibiscsi_discover_sendtargets, -+ METH_VARARGS|METH_KEYWORDS, -+ "Do sendtargets discovery and return a list of found nodes)"}, -+ { "discover_firmware", -+ (PyCFunction)pylibiscsi_discover_firmware, METH_NOARGS, -+ "Do firmware discovery and return a list of found nodes)"}, -+ { "get_firmware_initiator_name", -+ (PyCFunction)pylibiscsi_get_firmware_initiator_name, -+ METH_NOARGS, -+ "Get initator name (iqn) from firmware"}, -+ {NULL, NULL} -+}; -+ -+#ifdef IS_PY3K -+static struct PyModuleDef libiscsi_def = { -+ PyModuleDef_HEAD_INIT, -+ "libiscsi", -+ NULL, -+ -1, -+ pylibiscsi_functions, -+ NULL, -+ NULL, -+ NULL, -+ NULL -+}; -+ -+PyMODINIT_FUNC PyInit_libiscsi(void) -+#else -+PyMODINIT_FUNC initlibiscsi(void) -+#endif -+{ -+ PyObject *m; -+ -+ if (!context) /* We may be called more then once */ -+ context = libiscsi_init(); -+ if (!context) -+ MODINITERROR; -+ -+ if (PyType_Ready(&PyIscsiChapAuthInfo_Type) < 0) -+ MODINITERROR; -+ -+ if (PyType_Ready(&PyIscsiNode_Type) < 0) -+ MODINITERROR; -+ -+#ifdef IS_PY3K -+ m = PyModule_Create(&libiscsi_def); -+#else -+ m = Py_InitModule("libiscsi", pylibiscsi_functions); -+#endif -+ Py_INCREF(&PyIscsiChapAuthInfo_Type); -+ PyModule_AddObject(m, "chapAuthInfo", (PyObject *) &PyIscsiChapAuthInfo_Type); -+ Py_INCREF(&PyIscsiNode_Type); -+ PyModule_AddObject(m, "node", (PyObject *) &PyIscsiNode_Type); -+#ifdef IS_PY3K -+ return m; -+#endif -+} -diff --git a/libiscsi/setup.py b/libiscsi/setup.py -new file mode 100644 -index 0000000..caa4e66 ---- /dev/null -+++ b/libiscsi/setup.py -@@ -0,0 +1,9 @@ -+from distutils.core import setup, Extension -+ -+module1 = Extension('libiscsi', -+ sources = ['pylibiscsi.c'], -+ libraries = ['iscsi'], -+ library_dirs = ['.']) -+ -+setup (name = 'PyIscsi',version = '1.0', -+ description = 'libiscsi python bindings', ext_modules = [module1]) -diff --git a/libiscsi/tests/test_discovery_firmware.c b/libiscsi/tests/test_discovery_firmware.c -new file mode 100644 -index 0000000..76e852a ---- /dev/null -+++ b/libiscsi/tests/test_discovery_firmware.c -@@ -0,0 +1,53 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node *found_nodes; -+ struct libiscsi_context *context; -+ int i, found, rc = 0; -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ rc = libiscsi_discover_firmware(context, &found, &found_nodes); -+ if (rc) -+ fprintf(stderr, "Error discovering: %s\n", -+ libiscsi_get_error_string(context)); -+ -+ for (i = 0; i < found; i++) { -+ fprintf(stdout, "Found node: %s, tpgt: %d, portal: %s:%d\n", -+ found_nodes[i].name, found_nodes[i].tpgt, -+ found_nodes[i].address, found_nodes[i].port); -+ } -+ -+ libiscsi_cleanup(context); -+ free (found_nodes); -+ -+ return rc; -+} -diff --git a/libiscsi/tests/test_discovery_sendtargets.c b/libiscsi/tests/test_discovery_sendtargets.c -new file mode 100644 -index 0000000..1a3c12e ---- /dev/null -+++ b/libiscsi/tests/test_discovery_sendtargets.c -@@ -0,0 +1,60 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node *found_nodes; -+ struct libiscsi_context *context; -+ struct libiscsi_auth_info auth_info; -+ int i, found, rc = 0; -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ memset(&auth_info, 0, sizeof(auth_info)); -+ auth_info.method = libiscsi_auth_chap; -+ strcpy(auth_info.chap.username, "joe"); -+ strcpy(auth_info.chap.password, "secret"); -+ -+ rc = libiscsi_discover_sendtargets(context, "127.0.0.1", 3260, -+ &auth_info, &found, &found_nodes); -+ if (rc) -+ fprintf(stderr, "Error discovering: %s\n", -+ libiscsi_get_error_string(context)); -+ -+ for (i = 0; i < found; i++) { -+ fprintf(stdout, "Found node: %s, tpgt: %d, portal: %s:%d\n", -+ found_nodes[i].name, found_nodes[i].tpgt, -+ found_nodes[i].address, found_nodes[i].port); -+ } -+ -+ libiscsi_cleanup(context); -+ free (found_nodes); -+ -+ return rc; -+} -diff --git a/libiscsi/tests/test_get_auth.c b/libiscsi/tests/test_get_auth.c -new file mode 100644 -index 0000000..5e234da ---- /dev/null -+++ b/libiscsi/tests/test_get_auth.c -@@ -0,0 +1,70 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node node; -+ struct libiscsi_context *context; -+ struct libiscsi_auth_info auth_info; -+ int rc = 0; -+ -+ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", -+ "iqn.2009-01.com.example:testdisk"); -+ node.tpgt = 1; -+ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); -+ node.port = 3260; -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ rc = libiscsi_node_get_auth(context, &node, &auth_info); -+ if (rc) { -+ fprintf(stderr, "Error setting authinfo: %s\n", -+ libiscsi_get_error_string(context)); -+ goto leave; -+ } -+ -+ switch (auth_info.method) { -+ case libiscsi_auth_none: -+ printf("Method: \"None\"\n"); -+ break; -+ case libiscsi_auth_chap: -+ printf("Method: \"CHAP\"\n"); -+ printf("User: \"%s\"\n", auth_info.chap.username); -+ printf("Pass: \"%s\"\n", auth_info.chap.password); -+ printf("RevUser: \"%s\"\n", -+ auth_info.chap.reverse_username); -+ printf("RevPass: \"%s\"\n", -+ auth_info.chap.reverse_password); -+ break; -+ } -+leave: -+ libiscsi_cleanup(context); -+ -+ return rc; -+} -diff --git a/libiscsi/tests/test_get_initiator_name.c b/libiscsi/tests/test_get_initiator_name.c -new file mode 100644 -index 0000000..997c053 ---- /dev/null -+++ b/libiscsi/tests/test_get_initiator_name.c -@@ -0,0 +1,38 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ char initiatorname[LIBISCSI_VALUE_MAXLEN]; -+ -+ if (libiscsi_get_firmware_initiator_name(initiatorname)) { -+ fprintf(stderr, "No iscsi boot firmware found\n"); -+ return 1; -+ } -+ -+ printf("iqn:\t%s\n", initiatorname); -+ -+ return 0; -+} -diff --git a/libiscsi/tests/test_get_network_config.c b/libiscsi/tests/test_get_network_config.c -new file mode 100644 -index 0000000..2dedd61 ---- /dev/null -+++ b/libiscsi/tests/test_get_network_config.c -@@ -0,0 +1,45 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_network_config config; -+ -+ if (libiscsi_get_firmware_network_config(&config)) { -+ fprintf(stderr, "No iscsi boot firmware found\n"); -+ return 1; -+ } -+ -+ printf("dhcp:\t%d\n", config.dhcp); -+ printf("iface:\t%s\n", config.iface_name); -+ printf("mac:\t%s\n", config.mac_address); -+ printf("ipaddr:\t%s\n", config.ip_address); -+ printf("mask:\t%s\n", config.netmask); -+ printf("gate:\t%s\n", config.gateway); -+ printf("dns1:\t%s\n", config.primary_dns); -+ printf("dns2:\t%s\n", config.secondary_dns); -+ -+ return 0; -+} -diff --git a/libiscsi/tests/test_login.c b/libiscsi/tests/test_login.c -new file mode 100644 -index 0000000..3eb70d6 ---- /dev/null -+++ b/libiscsi/tests/test_login.c -@@ -0,0 +1,52 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node node; -+ struct libiscsi_context *context; -+ int rc = 0; -+ -+ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", -+ "iqn.2009-01.com.example:testdisk"); -+ node.tpgt = 1; -+ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); -+ node.port = 3260; -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ rc = libiscsi_node_login(context, &node); -+ if (rc) -+ fprintf(stderr, "Error logging in: %s\n", -+ libiscsi_get_error_string(context)); -+ -+ libiscsi_cleanup(context); -+ -+ return rc; -+} -diff --git a/libiscsi/tests/test_logout.c b/libiscsi/tests/test_logout.c -new file mode 100644 -index 0000000..b734dca ---- /dev/null -+++ b/libiscsi/tests/test_logout.c -@@ -0,0 +1,51 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node node; -+ struct libiscsi_context *context; -+ int rc = 0; -+ -+ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", -+ "iqn.2009-01.com.example:testdisk"); -+ node.tpgt = 1; -+ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); -+ node.port = 3260; -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ rc = libiscsi_node_logout(context, &node); -+ if (rc) -+ fprintf(stderr, "Error logging out: %s\n", -+ libiscsi_get_error_string(context)); -+ -+ libiscsi_cleanup(context); -+ -+ return rc; -+} -diff --git a/libiscsi/tests/test_params.c b/libiscsi/tests/test_params.c -new file mode 100644 -index 0000000..d3223be ---- /dev/null -+++ b/libiscsi/tests/test_params.c -@@ -0,0 +1,103 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node node; -+ struct libiscsi_context *context; -+ char orig_value[LIBISCSI_VALUE_MAXLEN], value[LIBISCSI_VALUE_MAXLEN]; -+ int rc = 0; -+ -+ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", -+ "iqn.2009-01.com.example:testdisk"); -+ node.tpgt = 1; -+ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); -+ node.port = 3260; -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ rc = libiscsi_node_get_parameter(context, &node, "node.startup", -+ orig_value); -+ if (rc) { -+ fprintf(stderr, "Error getting original value: %s\n", -+ libiscsi_get_error_string(context)); -+ goto leave; -+ } -+ -+ rc = libiscsi_node_set_parameter(context, &node, "node.startup", -+ "automatic"); -+ if (rc) { -+ fprintf(stderr, "Error setting node startup param: %s\n", -+ libiscsi_get_error_string(context)); -+ goto leave; -+ } -+ -+ rc = libiscsi_node_get_parameter(context, &node, "node.startup", -+ value); -+ if (rc) { -+ fprintf(stderr, "Error getting node startup param: %s\n", -+ libiscsi_get_error_string(context)); -+ goto leave; -+ } -+ -+ if (strcmp(value, "automatic")) { -+ fprintf(stderr, "Error set and get values do not match!\n"); -+ rc = EIO; -+ goto leave; -+ } -+ -+ rc = libiscsi_node_set_parameter(context, &node, "node.startup", -+ orig_value); -+ if (rc) { -+ fprintf(stderr, "Error setting original value: %s\n", -+ libiscsi_get_error_string(context)); -+ goto leave; -+ } -+ -+ rc = libiscsi_node_get_parameter(context, &node, "node.startup", -+ value); -+ if (rc) { -+ fprintf(stderr, "Error re-getting original value: %s\n", -+ libiscsi_get_error_string(context)); -+ goto leave; -+ } -+ -+ if (strcmp(value, orig_value)) { -+ fprintf(stderr, -+ "Error set and get original values do not match!\n"); -+ rc = EIO; -+ goto leave; -+ } -+ -+leave: -+ libiscsi_cleanup(context); -+ -+ return rc; -+} -diff --git a/libiscsi/tests/test_set_auth.c b/libiscsi/tests/test_set_auth.c -new file mode 100644 -index 0000000..a21f888 ---- /dev/null -+++ b/libiscsi/tests/test_set_auth.c -@@ -0,0 +1,58 @@ -+/* -+ * iSCSI Administration library -+ * -+ * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. -+ * Copyright (C) 2008-2009 Hans de Goede -+ * maintained by open-iscsi@googlegroups.com -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+#include -+#include -+#include -+#include "libiscsi.h" -+ -+int main(void) -+{ -+ struct libiscsi_node node; -+ struct libiscsi_context *context; -+ struct libiscsi_auth_info auth_info; -+ int rc = 0; -+ -+ snprintf(node.name, LIBISCSI_VALUE_MAXLEN, "%s", -+ "iqn.2009-01.com.example:testdisk"); -+ node.tpgt = 1; -+ snprintf(node.address, NI_MAXHOST, "%s", "127.0.0.1"); -+ node.port = 3260; -+ -+ memset(&auth_info, 0, sizeof(auth_info)); -+ auth_info.method = libiscsi_auth_chap; -+ strcpy(auth_info.chap.username, "joe"); -+ strcpy(auth_info.chap.password, "secret"); -+ -+ context = libiscsi_init(); -+ if (!context) { -+ fprintf(stderr, "Error initializing libiscsi\n"); -+ return 1; -+ } -+ -+ rc = libiscsi_node_set_auth(context, &node, &auth_info); -+ if (rc) -+ fprintf(stderr, "Error setting authinfo: %s\n", -+ libiscsi_get_error_string(context)); -+ -+ libiscsi_cleanup(context); -+ -+ return rc; -+} -diff --git a/usr/Makefile b/usr/Makefile -index 3d8ee22..e731545 100644 ---- a/usr/Makefile -+++ b/usr/Makefile -@@ -31,7 +31,7 @@ endif - OPTFLAGS ?= -O2 -g - WARNFLAGS ?= -Wall -Wstrict-prototypes - CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -I../include -I. -I../utils/open-isns \ -- -D$(OSNAME) $(IPC_CFLAGS) -+ -D$(OSNAME) $(IPC_CFLAGS) -DISNS_ENABLE - PROGRAMS = iscsid iscsiadm iscsistart - - # libc compat files -diff --git a/usr/discovery.c b/usr/discovery.c -index 635ec8d..df6d3f1 100644 ---- a/usr/discovery.c -+++ b/usr/discovery.c -@@ -36,6 +36,7 @@ - #include "types.h" - #include "iscsi_proto.h" - #include "initiator.h" -+#include "config.h" - #include "log.h" - #include "idbm.h" - #include "iscsi_settings.h" -@@ -50,9 +51,11 @@ - #include "iscsi_timer.h" - #include "iscsi_err.h" - /* libisns includes */ -+#ifdef ISNS_ENABLE - #include "isns.h" - #include "paths.h" - #include "message.h" -+#endif - - #ifdef SLP_ENABLE - #include "iscsi-slp-discovery.h" -@@ -98,6 +101,7 @@ static int request_initiator_name(void) - return 0; - } - -+#ifdef ISNS_ENABLE - void discovery_isns_free_servername(void) - { - if (isns_config.ic_server_name) -@@ -377,6 +381,7 @@ retry: - discovery_isns_free_servername(); - return rc; - } -+#endif - - int discovery_fw(void *data, struct iface_rec *iface, - struct list_head *rec_list) -diff --git a/usr/idbm.c b/usr/idbm.c -index c3c8de5..ff39438 100644 ---- a/usr/idbm.c -+++ b/usr/idbm.c -@@ -1711,9 +1711,9 @@ int idbm_print_all_discovery(int info_level) - * fn should return -1 if it skipped the rec, a ISCSI_ERR error code if - * the operation failed or 0 if fn was run successfully. - */ --static int idbm_for_each_iface(int *found, void *data, -- idbm_iface_op_fn *fn, -- char *targetname, int tpgt, char *ip, int port) -+int idbm_for_each_iface(int *found, void *data, -+ idbm_iface_op_fn *fn, -+ char *targetname, int tpgt, char *ip, int port) - { - DIR *iface_dirfd; - struct dirent *iface_dent; -diff --git a/usr/idbm.h b/usr/idbm.h -index b89ddff..3631262 100644 ---- a/usr/idbm.h -+++ b/usr/idbm.h -@@ -102,6 +102,9 @@ struct rec_op_data { - node_rec_t *match_rec; - idbm_iface_op_fn *fn; - }; -+extern int idbm_for_each_iface(int *found, void *data, -+ idbm_iface_op_fn *fn, -+ char *targetname, int tpgt, char *ip, int port); - extern int idbm_for_each_portal(int *found, void *data, - idbm_portal_op_fn *fn, char *targetname); - extern int idbm_for_each_node(int *found, void *data, -diff --git a/usr/iscsi_ipc.h b/usr/iscsi_ipc.h -index 5087b5c..a6dc40a 100644 ---- a/usr/iscsi_ipc.h -+++ b/usr/iscsi_ipc.h -@@ -166,4 +166,6 @@ struct iscsi_ipc { - char *host_stats); - }; - -+struct iscsi_ipc *ipc; -+ - #endif /* ISCSI_IPC_H */ --- -2.1.0 - diff --git a/0155-dont-use-static.patch b/0155-dont-use-static.patch deleted file mode 100644 index 9e43b7b..0000000 --- a/0155-dont-use-static.patch +++ /dev/null @@ -1,25 +0,0 @@ -From ff224a16d409c4b479b3ac1ff662093cb067e281 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 19 Nov 2012 17:04:29 -0800 -Subject: dont use static - ---- - usr/Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/usr/Makefile b/usr/Makefile -index 015f1b9..1669890 100644 ---- a/usr/Makefile -+++ b/usr/Makefile -@@ -61,7 +61,7 @@ iscsiadm: $(ISCSI_LIB_SRCS) $(DISCOVERY_SRCS) iscsiadm.o session_mgmt.o - - iscsistart: $(ISCSI_LIB_SRCS) $(INITIATOR_SRCS) $(FW_BOOT_SRCS) \ - iscsistart.o statics.o -- $(CC) $(CFLAGS) -static $^ -o $@ -+ $(CC) $(CFLAGS) $^ -o $@ - clean: - rm -f *.o $(PROGRAMS) .depend $(LIBSYS) - --- -1.7.11.7 - diff --git a/0156-remove-the-offload-boot-supported-ifdef.patch b/0156-remove-the-offload-boot-supported-ifdef.patch deleted file mode 100644 index a1ccdc7..0000000 --- a/0156-remove-the-offload-boot-supported-ifdef.patch +++ /dev/null @@ -1,45 +0,0 @@ -From aa58a042ec20575143c1a5c813c9552a286aeb0e Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 19 Nov 2012 17:09:24 -0800 -Subject: remove the offload boot supported ifdef - ---- - usr/iface.c | 7 +------ - 1 file changed, 1 insertion(+), 6 deletions(-) - -diff --git a/usr/iface.c b/usr/iface.c -index c86892e..f5441c0 100644 ---- a/usr/iface.c -+++ b/usr/iface.c -@@ -895,6 +895,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - { - struct iscsi_transport *t = NULL; - uint32_t hostno; -+ int rc; - - if (strlen(context->initiatorname)) - strlcpy(iface->iname, context->initiatorname, -@@ -907,10 +908,7 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - return 0; - } - } else if (strlen(context->iface)) { --/* this ifdef is only temp until distros and firmwares are updated */ --#ifdef OFFLOAD_BOOT_SUPPORTED - char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; -- int rc; - - memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN); - /* make sure offload driver is loaded */ -@@ -936,9 +934,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface, - } - - strlcpy(iface->netdev, context->iface, sizeof(iface->netdev)); --#else -- return 0; --#endif - } else - return 0; - --- -1.7.11.7 - diff --git a/0158-iscsiuio-IPC-newroot-command.patch b/0158-iscsiuio-IPC-newroot-command.patch deleted file mode 100644 index fa3f4c7..0000000 --- a/0158-iscsiuio-IPC-newroot-command.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 6e979154c9c51dedd54c91e46106e495a65ced43 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Wed, 2 Jan 2013 14:45:05 -0800 -Subject: [PATCH 58/58] iscsiuio IPC newroot command - ---- - usr/mgmt_ipc.c | 11 +++++++++++ - usr/transport.c | 1 + - usr/transport.h | 1 + - usr/uip_mgmt_ipc.c | 14 ++++++++++++++ - usr/uip_mgmt_ipc.h | 5 +++++ - 5 files changed, 32 insertions(+) - -diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c -index 5cb7143..a8f8473 100644 ---- a/usr/mgmt_ipc.c -+++ b/usr/mgmt_ipc.c -@@ -36,6 +36,7 @@ - #include "sysdeps.h" - #include "iscsi_ipc.h" - #include "iscsi_err.h" -+#include "iscsi_sysfs.h" - - #define PEERUSER_MAX 64 - #define EXTMSG_MAX (64 * 1024) -@@ -229,8 +230,18 @@ static int - mgmt_ipc_newroot(queue_task_t *qtask) - { - char *newroot = qtask->req.u.newroot.path; -+ struct iscsi_transport *t; -+ - if (chdir(newroot) || chroot(".") || chdir("/")) - return ISCSI_ERR; -+ -+ /* if a registered transport has a separate userspace process, -+ * notify it of the root change as well */ -+ list_for_each_entry(t, &transports, list) { -+ if (t->template->newroot) -+ t->template->newroot(t, newroot); -+ } -+ - mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS); - return ISCSI_SUCCESS; - } -diff --git a/usr/transport.c b/usr/transport.c -index 4d030a8..e0488ad 100644 ---- a/usr/transport.c -+++ b/usr/transport.c -@@ -83,6 +83,7 @@ struct iscsi_transport_template bnx2i = { - .ep_poll = ktransport_ep_poll, - .ep_disconnect = ktransport_ep_disconnect, - .set_net_config = uip_broadcast_params, -+ .newroot = uip_broadcast_newroot, - }; - - struct iscsi_transport_template be2iscsi = { -diff --git a/usr/transport.h b/usr/transport.h -index 388e4b1..d4d9ec7 100644 ---- a/usr/transport.h -+++ b/usr/transport.h -@@ -39,6 +39,7 @@ struct iscsi_transport_template { - int (*set_net_config) (struct iscsi_transport *t, - struct iface_rec *iface, - struct iscsi_session *session); -+ void (*newroot) (struct iscsi_transport *t, char *path); - }; - - /* represents data path provider */ -diff --git a/usr/uip_mgmt_ipc.c b/usr/uip_mgmt_ipc.c -index f3074ee..d5d496a 100644 ---- a/usr/uip_mgmt_ipc.c -+++ b/usr/uip_mgmt_ipc.c -@@ -39,3 +39,17 @@ int uip_broadcast_params(struct iscsi_transport *t, - sizeof(iscsid_uip_broadcast_header_t) + - sizeof(*iface)); - } -+ -+int uip_broadcast_newroot(struct iscsi_transport *t, char *newroot) -+{ -+ struct iscsid_uip_broadcast broadcast; -+ -+ memset(&broadcast, 0, sizeof(broadcast)); -+ -+ broadcast.header.command = ISCSID_UIP_NEWROOT; -+ strncpy(broadcast.u.newroot.path, newroot, PATH_MAX); -+ -+ return uip_broadcast(&broadcast, -+ sizeof(iscsid_uip_broadcast_header_t) + -+ PATH_MAX + 1); -+} -diff --git a/usr/uip_mgmt_ipc.h b/usr/uip_mgmt_ipc.h -index 29a4769..3ca4fb1 100644 ---- a/usr/uip_mgmt_ipc.h -+++ b/usr/uip_mgmt_ipc.h -@@ -29,6 +29,7 @@ - typedef enum iscsid_uip_cmd { - ISCSID_UIP_IPC_UNKNOWN = 0, - ISCSID_UIP_IPC_GET_IFACE = 1, -+ ISCSID_UIP_NEWROOT = 2, - - __ISCSID_UIP_IPC_MAX_COMMAND - } iscsid_uip_cmd_e; -@@ -47,6 +48,9 @@ typedef struct iscsid_uip_broadcast { - struct ipc_broadcast_iface_rec { - struct iface_rec rec; - } iface_rec; -+ struct ipc_broadcast_newroot { -+ char path[PATH_MAX + 1]; -+ } newroot; - } u; - } iscsid_uip_broadcast_t; - -@@ -69,5 +73,6 @@ extern int uip_broadcast_params(struct iscsi_transport *t, - struct iface_rec *iface, - struct iscsi_session *session); - -+extern int uip_broadcast_newroot(struct iscsi_transport *t, char *path); - - #endif /* UIP_MGMT_IPC_H */ --- -1.8.1.4 - diff --git a/0159-iscsiuio-systemd-unit-files.patch b/0159-iscsiuio-systemd-unit-files.patch deleted file mode 100644 index 2d0e213..0000000 --- a/0159-iscsiuio-systemd-unit-files.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 822b53e6c9ebb0fe7236ebd3b4c73b009100592d Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 22 Jan 2013 14:27:12 -0800 -Subject: iscsiuio systemd unit files - ---- - etc/systemd/iscsiuio.service | 17 +++++++++++++++++ - etc/systemd/iscsiuio.socket | 9 +++++++++ - 2 files changed, 26 insertions(+) - create mode 100644 etc/systemd/iscsiuio.service - create mode 100644 etc/systemd/iscsiuio.socket - -diff --git a/etc/systemd/iscsiuio.service b/etc/systemd/iscsiuio.service -new file mode 100644 -index 0000000..f0410b7 ---- /dev/null -+++ b/etc/systemd/iscsiuio.service -@@ -0,0 +1,17 @@ -+[Unit] -+Description=iSCSI UserSpace I/O driver -+Documentation=man:iscsiuio(8) -+DefaultDependencies=no -+Conflicts=shutdown.target -+Requires=iscsid.service -+BindTo=iscsid.service -+After=network.target -+Before=remote-fs-pre.target iscsid.service -+ -+[Service] -+Type=forking -+PIDFile=/var/run/iscsiuio.pid -+ExecStart=/usr/sbin/iscsiuio -+ -+[Install] -+WantedBy=multi-user.target -diff --git a/etc/systemd/iscsiuio.socket b/etc/systemd/iscsiuio.socket -new file mode 100644 -index 0000000..d42cedc ---- /dev/null -+++ b/etc/systemd/iscsiuio.socket -@@ -0,0 +1,9 @@ -+[Unit] -+Description=Open-iSCSI iscsiuio Socket -+Documentation=man:iscsiuio(8) -+ -+[Socket] -+ListenStream=@ISCSID_UIP_ABSTRACT_NAMESPACE -+ -+[Install] -+WantedBy=sockets.target --- -1.7.11.7 - diff --git a/0160-use-systemctl-to-start-iscsid.patch b/0160-use-systemctl-to-start-iscsid.patch deleted file mode 100644 index 81aa2a3..0000000 --- a/0160-use-systemctl-to-start-iscsid.patch +++ /dev/null @@ -1,25 +0,0 @@ -From c3d2b8f3de5b6161845304cf46982d2c5a9918b6 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Thu Feb 21 21:05:39 PST 2013 -Subject: disable iscsid.startup from iscsiadm, prefer systemd socket activation - ---- - etc/iscsid.conf | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/etc/iscsid.conf b/etc/iscsid.conf -index ac1d231..5851fa5 100644 ---- a/etc/iscsid.conf -+++ b/etc/iscsid.conf -@@ -17,7 +17,7 @@ - # maintainers. - # - # Default for Fedora and RHEL. (uncomment to activate). --iscsid.startup = /etc/rc.d/init.d/iscsid force-start -+#iscsid.startup = /bin/systemctl start iscsid.service - # - # Default for upstream open-iscsi scripts (uncomment to activate). - # iscsid.startup = /sbin/iscsid --- -1.7.11.7 - diff --git a/0162-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch b/0162-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch deleted file mode 100644 index 684463f..0000000 --- a/0162-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ab79bdb20e37216ca969e06d63a952acfd023963 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 28 May 2013 13:12:27 -0700 -Subject: [PATCH] Don't check for autostart sessions if iscsi is not used (bug - #951951) - -Change conditional startup in iscsi.service to check for a non-empty -nodes directory, instead of initiator-name. This fits better with what -it's doing, as there's no need to scan for autostart node records if -there are no node records at all. ---- - etc/systemd/iscsi.service | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -index bbd52fd..7b4efee 100644 ---- a/etc/systemd/iscsi.service -+++ b/etc/systemd/iscsi.service -@@ -5,7 +5,7 @@ DefaultDependencies=no - Conflicts=shutdown.target - After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service - Before=remote-fs-pre.target --ConditionPathExists=/etc/iscsi/initiatorname.iscsi -+ConditionDirectoryNotEmpty=/var/lib/iscsi/nodes - - [Service] - Type=oneshot --- -1.8.1.4 - diff --git a/0163-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch b/0163-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch deleted file mode 100644 index cedb4e0..0000000 --- a/0163-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 3cac85a3f97d0a22270166f428209f873b58c319 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Tue, 11 Jun 2013 11:25:27 -0700 -Subject: [PATCH] iscsid: fix order of setting uid/gid and drop supplementary - groups - -If using the user and group ID settings together the existing order of -calling setuid first will almost always cause the setgid call to fail, -assuming the new effective user id does not have the CAP_SETGID -capability. The effective group ID needs to change first. - -While we're at it, if iscsid is started as root it should drop any -inherited supplementary group permissions. - -And if anyone is actually using this to try and isolate capabilities, -they probably care enough to want to known that it is failing. Make -iscsid startup fail instead of just calling perror. - -Signed-off-by: Chris Leech ---- - usr/iscsid.c | 23 +++++++++++++++++++---- - 1 file changed, 19 insertions(+), 4 deletions(-) - -diff --git a/usr/iscsid.c b/usr/iscsid.c -index b4bb65b..c0ea6fa 100644 ---- a/usr/iscsid.c -+++ b/usr/iscsid.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -477,11 +478,25 @@ int main(int argc, char *argv[]) - } - } - -- if (uid && setuid(uid) < 0) -- perror("setuid\n"); -+ if (gid && setgid(gid) < 0) { -+ log_error("Unable to setgid to %d\n", gid); -+ log_close(log_pid); -+ exit(ISCSI_ERR); -+ } - -- if (gid && setgid(gid) < 0) -- perror("setgid\n"); -+ if ((geteuid() == 0) && (getgroups(0, NULL))) { -+ if (setgroups(0, NULL) != 0) { -+ log_error("Unable to drop supplementary group ids\n"); -+ log_close(log_pid); -+ exit(ISCSI_ERR); -+ } -+ } -+ -+ if (uid && setuid(uid) < 0) { -+ log_error("Unable to setuid to %d\n", uid); -+ log_close(log_pid); -+ exit(ISCSI_ERR); -+ } - - memset(&daemon_config, 0, sizeof (daemon_config)); - daemon_config.pid_file = pid_file; --- -1.8.1.4 - diff --git a/0165-fix-hardened-build-of-iscsiuio.patch b/0165-fix-hardened-build-of-iscsiuio.patch deleted file mode 100644 index ad94daa..0000000 --- a/0165-fix-hardened-build-of-iscsiuio.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 95cc21cf6283ef6faaa1be7c12c9ef58d7891d25 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Fri, 13 Sep 2013 16:56:51 -0700 -Subject: [PATCH] fix hardened build of iscsiuio - -The new iscsiuio code sets CFLAGS in configure.ac, wiping out the -environment setup by rpm. Patch that out. - ---- - iscsiuio/configure | 2 +- - iscsiuio/configure.ac | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/iscsiuio/configure b/iscsiuio/configure -index 444c9c0..50cfd90 100755 ---- a/iscsiuio/configure -+++ b/iscsiuio/configure -@@ -22782,7 +22782,7 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - --CFLAGS="-O2 -Wall" -+CFLAGS="${CFLAGS} -O2 -Wall" - ## check for --enable-debug first before checking CFLAGS before - ## so that we don't mix -O and -g - # Check whether --enable-debug was given. -diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac -index 381b94d..e4af3b2 100644 ---- a/iscsiuio/configure.ac -+++ b/iscsiuio/configure.ac -@@ -52,7 +52,7 @@ AC_LIBTOOL_DLOPEN - # libtool stuff - AC_PROG_LIBTOOL - --CFLAGS="-O2 -Wall" -+CFLAGS="${CFLAGS} -O2 -Wall" - ## check for --enable-debug first before checking CFLAGS before - ## so that we don't mix -O and -g - AC_ARG_ENABLE(debug, --- -1.8.3.1 - diff --git a/0166-start-socket-listeners-on-iscsiadm-command.patch b/0166-start-socket-listeners-on-iscsiadm-command.patch deleted file mode 100644 index cb363b7..0000000 --- a/0166-start-socket-listeners-on-iscsiadm-command.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 89e9c2ff66d069b812fabcd4fefe453bbcea73e4 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 25 Nov 2013 22:28:12 -0800 -Subject: [PATCH] start socket listeners on iscsiadm command - -fix for trying to run iscsiadm commands right after installing the rpm -without manually starting the systemd units ---- - etc/iscsid.conf | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/etc/iscsid.conf b/etc/iscsid.conf -index 1fd3000..412f130 100644 ---- a/etc/iscsid.conf -+++ b/etc/iscsid.conf -@@ -17,7 +17,8 @@ - # maintainers. - # - # Default for Fedora and RHEL. (uncomment to activate). --#iscsid.startup = /bin/systemctl start iscsid.service -+# Use socket activation, but try to make sure the socket units are listening -+iscsid.startup = /bin/systemctl start iscsid.socket iscsiuio.socket - # - # Default for upstream open-iscsi scripts (uncomment to activate). - # iscsid.startup = /sbin/iscsid --- -1.8.3.1 - diff --git a/0167-Revert-iscsiadm-return-error-when-login-fails.patch b/0167-Revert-iscsiadm-return-error-when-login-fails.patch deleted file mode 100644 index 64c9af8..0000000 --- a/0167-Revert-iscsiadm-return-error-when-login-fails.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 1c0f37a8ae48daa3ae1c37cdac7c0789299180eb Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 24 Feb 2014 09:33:33 -0800 -Subject: [PATCH] Revert "iscsiadm: return error when login fails" - -This reverts commit fc2a8e9a2911bc76f961fe3e4a159fab9b8b9691. - -Done to address RHBZ #1015563 - ---- - usr/session_mgmt.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/usr/session_mgmt.c b/usr/session_mgmt.c -index 87b8e00..3815b1d 100644 ---- a/usr/session_mgmt.c -+++ b/usr/session_mgmt.c -@@ -178,12 +178,12 @@ int iscsi_login_portal(void *data, struct list_head *list, struct node_rec *rec) - goto done; - } - if (session_count >= rec->session.nr_sessions) { -- log_warning("%s: %d session%s requested, but %d " -+ log_debug(1, "%s: %d session%s requested, but %d " - "already present.", - rec->iface.name, rec->session.nr_sessions, - rec->session.nr_sessions == 1 ? "" : "s", - session_count); -- rc = ISCSI_ERR_SESS_EXISTS; -+ rc = 0; - goto done; - } - --- -1.8.3.1 - diff --git a/0168-update-handling-of-boot-sessions.patch b/0168-update-handling-of-boot-sessions.patch deleted file mode 100644 index badbdb0..0000000 --- a/0168-update-handling-of-boot-sessions.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 83f291bd475f3d11abaf1f7346732f75af585ed8 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Wed, 26 Feb 2014 16:33:48 -0800 -Subject: update handling of boot sessions - -force start iscsiuio if needed, socket activation does not seem to be -working for recovery ---- - etc/systemd/iscsi-mark-root-nodes | 29 +++++++++++++++++++++++------ - 1 file changed, 23 insertions(+), 6 deletions(-) - -diff --git a/etc/systemd/iscsi-mark-root-nodes b/etc/systemd/iscsi-mark-root-nodes -index 157be62..d106ac6 100644 ---- a/etc/systemd/iscsi-mark-root-nodes -+++ b/etc/systemd/iscsi-mark-root-nodes -@@ -1,13 +1,30 @@ - #!/bin/bash - - ISCSIADM=/sbin/iscsiadm -+start_iscsid=0 -+start_iscsiuio=0 - --$ISCSIADM -m session >/dev/null 2>&1 || exit 0 -+while read t num p target flash; do -+ # strip tag number from portal, keep "ip:port" -+ portal=${p%,*} -+ transport=${t%:} - --$ISCSIADM -m session | while read t num i target; do -- ip=${i%:*} -- $ISCSIADM -m node -p $ip -T $target -o update -n node.startup -v onboot --done -+ $ISCSIADM -m node -p $portal -T $target -o update -n node.startup -v onboot - --systemctl start iscsid.service -+ start_iscsid=1 -+ -+ if [ "$transport" = bnx2i ]; then -+ start_iscsiuio=1 -+ fi -+done < <( $ISCSIADM -m session ) -+ -+# force iscsid and iscsiuio to start if needed for -+# recovering sessions created in the initrd -+ -+if [ "$start_iscsid" -eq 1 ]; then -+ systemctl --no-block start iscsid.service -+fi -+if [ "$start_iscsiuio" -eq 1 ]; then -+ systemctl --no-block start iscsiuio.service -+fi - --- -1.8.3.1 - diff --git a/0169-update-iscsi.service-for-boot-session-recovery.patch b/0169-update-iscsi.service-for-boot-session-recovery.patch deleted file mode 100644 index f7a2f79..0000000 --- a/0169-update-iscsi.service-for-boot-session-recovery.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 969e26197c792ec5377d2c261a934a9c907e82f0 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Fri, 14 Mar 2014 09:22:21 -0700 -Subject: [PATCH] update iscsi.service for boot session recovery - ---- - etc/systemd/iscsi.service | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -index d5712bd..3de76c5 100644 ---- a/etc/systemd/iscsi.service -+++ b/etc/systemd/iscsi.service -@@ -5,14 +5,15 @@ DefaultDependencies=no - Conflicts=shutdown.target - After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service - Before=remote-fs-pre.target --ConditionDirectoryNotEmpty=/var/lib/iscsi/nodes -+ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes -+ConditionDirectoryNotEmpty=|/sys/class/iscsi_session - - [Service] - Type=oneshot - RemainAfterExit=true - ExecStart=/usr/libexec/iscsi-mark-root-nodes -+SuccessExitStatus=21 - ExecStart=/sbin/iscsiadm -m node --loginall=automatic --ExecStop=/bin/sync - ExecStop=/sbin/iscsiadm -m node --logoutall=automatic - ExecReload=/sbin/iscsiadm -m node --loginall=automatic - --- -1.8.3.1 - diff --git a/0170-fix-systemd-unit-wants.patch b/0170-fix-systemd-unit-wants.patch deleted file mode 100644 index 45ce32a..0000000 --- a/0170-fix-systemd-unit-wants.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 347e6120213efda47a45443b4e366ed1400433c1 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Wed, 17 Sep 2014 09:58:39 -0700 -Subject: [PATCH] updates to iscsi.service - -Resolves: #1126524 -Resolves: #1111925 ---- - etc/systemd/iscsi.service | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -index 3de76c5..ad7be34 100644 ---- a/etc/systemd/iscsi.service -+++ b/etc/systemd/iscsi.service -@@ -5,17 +5,17 @@ DefaultDependencies=no - Conflicts=shutdown.target - After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service - Before=remote-fs-pre.target -+Wants=remote-fs-pre.target - ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes - ConditionDirectoryNotEmpty=|/sys/class/iscsi_session - - [Service] - Type=oneshot - RemainAfterExit=true --ExecStart=/usr/libexec/iscsi-mark-root-nodes --SuccessExitStatus=21 --ExecStart=/sbin/iscsiadm -m node --loginall=automatic --ExecStop=/sbin/iscsiadm -m node --logoutall=automatic --ExecReload=/sbin/iscsiadm -m node --loginall=automatic -+ExecStart=-/usr/libexec/iscsi-mark-root-nodes -+ExecStart=-/sbin/iscsiadm -m node --loginall=automatic -+ExecStop=-/sbin/iscsiadm -m node --logoutall=automatic -+ExecReload=-/sbin/iscsiadm -m node --loginall=automatic - - [Install] - WantedBy=sysinit.target --- -1.9.3 - diff --git a/0171-iscsiuio-strict-aliasing.patch b/0171-iscsiuio-strict-aliasing.patch deleted file mode 100644 index 1a0eb68..0000000 --- a/0171-iscsiuio-strict-aliasing.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/iscsiuio/configure b/iscsiuio/configure -index 50cfd90..c930b67 100755 ---- a/iscsiuio/configure -+++ b/iscsiuio/configure -@@ -22782,7 +22782,7 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - --CFLAGS="${CFLAGS} -O2 -Wall" -+CFLAGS="${CFLAGS} -O2 -Wall -fno-strict-aliasing" - ## check for --enable-debug first before checking CFLAGS before - ## so that we don't mix -O and -g - # Check whether --enable-debug was given. -diff --git a/iscsiuio/configure.ac b/iscsiuio/configure.ac -index e4af3b2..551a513 100644 ---- a/iscsiuio/configure.ac -+++ b/iscsiuio/configure.ac -@@ -52,7 +52,7 @@ AC_LIBTOOL_DLOPEN - # libtool stuff - AC_PROG_LIBTOOL - --CFLAGS="${CFLAGS} -O2 -Wall" -+CFLAGS="${CFLAGS} -O2 -Wall -fno-strict-aliasing" - ## check for --enable-debug first before checking CFLAGS before - ## so that we don't mix -O and -g - AC_ARG_ENABLE(debug, diff --git a/0171-make-session-shutdown-a-seperate-service.patch b/0171-make-session-shutdown-a-seperate-service.patch deleted file mode 100644 index c7193ba..0000000 --- a/0171-make-session-shutdown-a-seperate-service.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 56d9d1c6a02dcad0915c0673f9cd2e653c86302f Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Tue, 13 Jan 2015 16:30:01 -0800 -Subject: [PATCH] 0171-make-session-shutdown-a-seperate-service.patch - ---- - etc/systemd/iscsi-shutdown.service | 14 ++++++++++++++ - etc/systemd/iscsi.service | 3 +-- - 2 files changed, 15 insertions(+), 2 deletions(-) - create mode 100644 etc/systemd/iscsi-shutdown.service - -diff --git a/etc/systemd/iscsi-shutdown.service b/etc/systemd/iscsi-shutdown.service -new file mode 100644 -index 0000000..23758e9 ---- /dev/null -+++ b/etc/systemd/iscsi-shutdown.service -@@ -0,0 +1,14 @@ -+[Unit] -+Description=Logout off all iSCSI sessions on shutdown -+Documentation=man:iscsid(8) man:iscsiadm(8) -+DefaultDependencies=no -+Conflicts=shutdown.target -+After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service -+Before=remote-fs-pre.target -+Wants=remote-fs-pre.target -+RefuseManualStop=yes -+ -+[Service] -+Type=oneshot -+RemainAfterExit=true -+ExecStop=-/sbin/iscsiadm -m node --logoutall=all -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -index ad7be34..2736956 100644 ---- a/etc/systemd/iscsi.service -+++ b/etc/systemd/iscsi.service -@@ -5,7 +5,7 @@ DefaultDependencies=no - Conflicts=shutdown.target - After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service - Before=remote-fs-pre.target --Wants=remote-fs-pre.target -+Wants=remote-fs-pre.target iscsi-shutdown.service - ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes - ConditionDirectoryNotEmpty=|/sys/class/iscsi_session - -@@ -14,7 +14,6 @@ Type=oneshot - RemainAfterExit=true - ExecStart=-/usr/libexec/iscsi-mark-root-nodes - ExecStart=-/sbin/iscsiadm -m node --loginall=automatic --ExecStop=-/sbin/iscsiadm -m node --logoutall=automatic - ExecReload=-/sbin/iscsiadm -m node --loginall=automatic - - [Install] --- -2.1.0 - diff --git a/0172-move-cleanup-to-seperate-service.patch b/0172-move-cleanup-to-seperate-service.patch deleted file mode 100644 index c7193ba..0000000 --- a/0172-move-cleanup-to-seperate-service.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 56d9d1c6a02dcad0915c0673f9cd2e653c86302f Mon Sep 17 00:00:00 2001 -From: rpm-build -Date: Tue, 13 Jan 2015 16:30:01 -0800 -Subject: [PATCH] 0171-make-session-shutdown-a-seperate-service.patch - ---- - etc/systemd/iscsi-shutdown.service | 14 ++++++++++++++ - etc/systemd/iscsi.service | 3 +-- - 2 files changed, 15 insertions(+), 2 deletions(-) - create mode 100644 etc/systemd/iscsi-shutdown.service - -diff --git a/etc/systemd/iscsi-shutdown.service b/etc/systemd/iscsi-shutdown.service -new file mode 100644 -index 0000000..23758e9 ---- /dev/null -+++ b/etc/systemd/iscsi-shutdown.service -@@ -0,0 +1,14 @@ -+[Unit] -+Description=Logout off all iSCSI sessions on shutdown -+Documentation=man:iscsid(8) man:iscsiadm(8) -+DefaultDependencies=no -+Conflicts=shutdown.target -+After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service -+Before=remote-fs-pre.target -+Wants=remote-fs-pre.target -+RefuseManualStop=yes -+ -+[Service] -+Type=oneshot -+RemainAfterExit=true -+ExecStop=-/sbin/iscsiadm -m node --logoutall=all -diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service -index ad7be34..2736956 100644 ---- a/etc/systemd/iscsi.service -+++ b/etc/systemd/iscsi.service -@@ -5,7 +5,7 @@ DefaultDependencies=no - Conflicts=shutdown.target - After=systemd-remount-fs.service network.target iscsid.service iscsiuio.service - Before=remote-fs-pre.target --Wants=remote-fs-pre.target -+Wants=remote-fs-pre.target iscsi-shutdown.service - ConditionDirectoryNotEmpty=|/var/lib/iscsi/nodes - ConditionDirectoryNotEmpty=|/sys/class/iscsi_session - -@@ -14,7 +14,6 @@ Type=oneshot - RemainAfterExit=true - ExecStart=-/usr/libexec/iscsi-mark-root-nodes - ExecStart=-/sbin/iscsiadm -m node --loginall=automatic --ExecStop=-/sbin/iscsiadm -m node --logoutall=automatic - ExecReload=-/sbin/iscsiadm -m node --loginall=automatic - - [Install] --- -2.1.0 - diff --git a/0199-use-Red-Hat-version-string-to-match-RPM-package-vers.patch b/0199-use-Red-Hat-version-string-to-match-RPM-package-vers.patch deleted file mode 100644 index 3be2b70..0000000 --- a/0199-use-Red-Hat-version-string-to-match-RPM-package-vers.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 1483a176fdbb22bbfecf06eea57d1aa200f30561 Mon Sep 17 00:00:00 2001 -From: Chris Leech -Date: Mon, 21 Jan 2013 15:43:36 -0800 -Subject: use Red Hat version string to match RPM package version - ---- - usr/version.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/usr/version.h b/usr/version.h -index a090522..aef0c3d 100644 ---- a/usr/version.h -+++ b/usr/version.h -@@ -6,7 +6,7 @@ - * This may not be the same value as the kernel versions because - * some other maintainer could merge a patch without going through us - */ --#define ISCSI_VERSION_STR "2.0-873" -+#define ISCSI_VERSION_STR "6.2.0.873-25" - #define ISCSI_VERSION_FILE "/sys/module/scsi_transport_iscsi/version" - - #endif --- -1.7.11.7 - diff --git a/9999-use-Red-Hat-version-string-to-match-RPM-package-vers.patch b/9999-use-Red-Hat-version-string-to-match-RPM-package-vers.patch new file mode 100644 index 0000000..e6d8760 --- /dev/null +++ b/9999-use-Red-Hat-version-string-to-match-RPM-package-vers.patch @@ -0,0 +1,25 @@ +From ec84dfefd6bc98ef1d35f42b0fbc33d6ff90f130 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Mon, 21 Jan 2013 15:43:36 -0800 +Subject: [PATCH] use Red Hat version string to match RPM package version + +--- + usr/version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/usr/version.h b/usr/version.h +index a090522..fc99846 100644 +--- a/usr/version.h ++++ b/usr/version.h +@@ -6,7 +6,7 @@ + * This may not be the same value as the kernel versions because + * some other maintainer could merge a patch without going through us + */ +-#define ISCSI_VERSION_STR "2.0-873" ++#define ISCSI_VERSION_STR "6.2.0.873-26" + #define ISCSI_VERSION_FILE "/sys/module/scsi_transport_iscsi/version" + + #endif +-- +2.1.0 + diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec index 93366a0..9e0693e 100644 --- a/iscsi-initiator-utils.spec +++ b/iscsi-initiator-utils.spec @@ -1,11 +1,11 @@ %global open_iscsi_version 2.0 %global open_iscsi_build 873 -%global checkout c9d830b +%global checkout 6aa2c9b Summary: iSCSI daemon and utility programs Name: iscsi-initiator-utils Version: 6.%{open_iscsi_version}.%{open_iscsi_build} -Release: 25.git%{checkout}%{?dist} +Release: 26.git%{checkout}%{?dist} Group: System Environment/Daemons License: GPLv2+ URL: http://www.open-iscsi.org @@ -15,119 +15,33 @@ Source4: 04-iscsi Source5: iscsi-tmpfiles.conf # upstream patches, post last tagged version -Patch1: 0001-iscsid-fix-iscsid-segfault-during-qla4xxx-login.patch -Patch2: 0002-ISCSISTART-Bring-up-the-corresponding-network-interf.patch -Patch3: 0003-iscsi-tools-fix-compile-error-when-OFFLOAD_BOOT_SUPP.patch -Patch4: 0004-ISCSID-Passing-more-net-params-from-ibft-to-iface.patch -Patch5: 0005-iscsi-tools-Convert-r-argument-to-an-integer-before-.patch -Patch6: 0006-Update-README-for-removal-of-DBM-requirement.patch -Patch7: 0007-iscsid-iscsiadm-fix-abstract-socket-length-in-bind-c.patch -Patch8: 0008-iscsid-implement-systemd-compatible-socket-activatio.patch -Patch9: 0009-iscsid-add-example-unit-files-for-systemd.patch -Patch10: 0010-iscsi-tools-fix-get_random_bytes-error-handling.patch -Patch11: 0011-ISCSID-Added-socket-communication-hooks-for-uip.patch -Patch12: 0012-ISCSID-Modified-the-Makefile-for-iscsiuio-compilatio.patch -Patch13: 0013-ISCSID-Added-iscsiuio-source-to-the-open-iscsi-pkg.patch -Patch14: 0014-From-Adheer-Chandravanshi-adheer.chandravanshi-qlogi.patch -Patch15: 0015-Manpage-changes-for-flashnode-submode-support-for-ho.patch -Patch16: 0016-README-changes-for-flashnode-submode-support-for-hos.patch -Patch17: 0017-PATCH-1-of-1-correctly-check-return-value-of-nice.patch -Patch18: 0018-Allow-firmware-mode-to-use-debug-flag.patch -Patch19: 0019-iscsiadm-return-error-when-login-fails.patch -Patch20: 0020-iscsiadm-bind-ifaces-to-portals-found-using-isns.patch -Patch21: 0021-iscsiadm-Check-for-mode-is-not-required-when-creatin.patch -Patch22: 0022-iscsid-iscsiadm-add-support-for-emulex-one-connect-s.patch -Patch23: 0023-ISCSIUIO-Updated-iscsiuio-to-version-0.7.8.1b-for-pe.patch -Patch24: 0024-Fix-discovery-error-return-without-return-value.patch -Patch25: 0025-iscsid-Fix-strlen-parameter.patch -Patch26: 0026-iscsiuio-Change-socket-bind-to-use-the-same-struct-s.patch -Patch27: 0027-Make-rescan-run-in-parallel.patch -Patch28: 0028-iscsiadm-Correctly-check-for-invalid-hostno-and-flas.patch -Patch29: 0029-iscsi-tools-Print-additional-session-info-for-flashn.patch -Patch30: 0030-iscsi-tools-sync-iscsi_if.h-with-kernel-space.patch -Patch31: 0031-PATCH-v5-1-3-ISCSISTART-Saved-ibft-boot-info-to-the-.patch -Patch32: 0032-ISCSID-Added-the-extraction-of-the-session-boot-info.patch -Patch33: 0033-ISCSID-Added-iface-content-override-fix.patch -Patch34: 0034-iscsi-tools-Bug-fix-on-IPC-address-copy-version-2.patch -Patch35: 0035-flashnode-Add-support-to-set-ISCSI_FLASHNODE_CHAP_OU.patch -Patch36: 0036-iscsiadm-Use-x-option-instead-of-v-to-specify-chap_t.patch -Patch37: 0037-iscsiadm-Man-page-changes-to-use-x-option-for-chap_t.patch -Patch38: 0038-README-changes-to-use-long-option-index-instead-of-f.patch -Patch39: 0039-iscsiadm-Add-support-to-set-CHAP-entry-using-host-ch.patch -Patch40: 0040-iscsi-tools-Correctly-get-username_in-and-password_i.patch -Patch41: 0041-README-changes-for-adding-support-to-set-CHAP-entry.patch -Patch42: 0042-iscsi-tools-Setup-iface-conf-file-with-all-iface-att.patch -Patch43: 0043-iscsi_if.h-Remove-numbers-used-for-network-parameter.patch -Patch44: 0044-iscsi_if.h-Additional-parameters-for-network-param-s.patch -Patch45: 0045-iscsi-tools-Use-macro-to-set-IPv4-IPv6-IP-addresses.patch -Patch46: 0046-iscsi-tools-Use-single-function-to-enable-disable-ne.patch -Patch47: 0047-iscsi-tools-Use-single-function-to-set-integer-netwo.patch -Patch48: 0048-iscsi-tools-Ignore-network-parameter-if-not-enabled-.patch -Patch49: 0049-iscsi-tools-Additional-parameters-for-network-settin.patch -Patch50: 0050-iscsi-tools-iface-params-should-be-updated-for-node_.patch -Patch51: 0051-iscsi-tools-Let-default-type-of-iface-be-ipv4.patch -Patch52: 0052-iscsi-tools-Show-iface-params-based-on-iface-type.patch -Patch53: 0053-iscsiadm-Added-document-for-description-of-iface-att.patch -Patch54: 0054-iscsi_tool-Add-offload-host-statistics-support.patch -Patch55: 0055-README-Updated-for-host-statistics.patch -Patch56: 0056-iscsiadm.8-Updated-man-page-for-host-statistics.patch -Patch57: 0057-iscsi-tools-Fix-the-iscsiadm-help-options-for-host-m.patch -Patch58: 0058-Man-page-correction-for-host-mode-options-of-iscsiad.patch -Patch59: 0059-ISCSIUIO-Added-tx-doorbell-override-mechanism.patch -Patch60: 0060-ISCSIUIO-Added-fix-for-the-iface.subnet_mask-decodin.patch -Patch61: 0061-ISCSIUIO-Added-fix-for-the-ARP-cache-flush-mechanism.patch -Patch62: 0062-ISCSIUIO-Updated-RELEASE-note-and-version.patch -Patch63: 0063-ISCSIUIO-Updated-the-configure-file-to-reflect-the-n.patch -Patch64: 0064-ISCSIUIO-Removed-the-auto-generated-COPYING-file.patch -Patch68: 0068-iscsiuio-fix-compilation.patch -Patch69: 0069-Add-missing-DESTDIR.patch -Patch70: 0070-iscsi-tools-set-non-negotiated-params-early.patch -Patch71: 0071-iscsiadm-Fix-the-hostno-check-for-stats-submode-of-h.patch -Patch72: 0072-iscsiadm-Fix-the-compile-time-warning.patch -Patch74: 0074-iscsid-Fix-handling-of-iscsi-async-events.patch -Patch75: 0075-be2iscsi-Fix-MaxXmitDataLenght-of-the-driver.patch -Patch76: 0076-Fix-StatSN-in-Open-iSCSI-Stack.patch -Patch77: 0077-iscsid-retry-login-for-ISCSI_ERR_HOST_NOT_FOUND.patch -Patch78: 0078-iscsid-Fix-double-close-of-mgmt-ipc-fd.patch -Patch79: 0079-iscsiadm-Initialize-param_count-in-set_host_chap_inf.patch -Patch81: 0081-iscsiadm-make-iface.ipaddress-optional-in-iface-conf.patch -Patch82: 0082-Remove-unused-variable-path.patch -Patch83: 0083-Parse-origin-value-from-iBFT.patch -Patch84: 0084-isns-Add-docs-for-deregistering-discovery-domains.patch -Patch114: 0114-fix-regression-in-iscsi_tcp-iface-binding.patch - -# not (yet) upstream merged -Patch130: 0130-guard-against-NULL-ptr-during-discovery-from-unexpec.patch -Patch140: 0140-add-discovery-as-a-valid-mode-in-iscsiadm.8.patch -Patch143: 0143-idmb_rec_write-check-for-tpgt-first.patch -Patch145: 0145-idbm_rec_write-seperate-old-and-new-style-writes.patch -Patch146: 0146-idbw_rec_write-pick-tpgt-from-existing-record.patch -Patch147: 0147-iscsiuio-systemd-socket-activation-support.patch -Patch149: 0149-update-systemd-service-files-add-iscsi.service-for-s.patch -Patch150: 0150-iscsi-boot-related-service-file-updates.patch -# distro specific modifications -Patch151: 0151-update-initscripts-and-docs.patch -Patch152: 0152-use-var-for-config.patch -Patch153: 0153-use-red-hat-for-name.patch -Patch154: 0154-add-libiscsi.patch -Patch155: 0155-dont-use-static.patch -Patch156: 0156-remove-the-offload-boot-supported-ifdef.patch -Patch159: 0159-iscsiuio-systemd-unit-files.patch -Patch160: 0160-use-systemctl-to-start-iscsid.patch -Patch162: 0162-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch -Patch163: 0163-fix-order-of-setting-uid-gid-and-drop-supplementary-.patch -Patch165: 0165-fix-hardened-build-of-iscsiuio.patch -Patch166: 0166-start-socket-listeners-on-iscsiadm-command.patch -Patch167: 0167-Revert-iscsiadm-return-error-when-login-fails.patch -Patch168: 0168-update-handling-of-boot-sessions.patch -Patch169: 0169-update-iscsi.service-for-boot-session-recovery.patch -Patch170: 0170-fix-systemd-unit-wants.patch -Patch171: 0171-iscsiuio-strict-aliasing.patch -Patch172: 0172-move-cleanup-to-seperate-service.patch -# version string, needs to be updated with each build -Patch199: 0199-use-Red-Hat-version-string-to-match-RPM-package-vers.patch - -BuildRequires: flex bison python2-devel python3-devel python-setuptools doxygen kmod-devel systemd-devel +Patch1: 0001-sync-to-2.0.873-134-g6aa2c9b.patch +Patch2: 0002-idmb_rec_write-check-for-tpgt-first.patch +Patch3: 0003-idbm_rec_write-seperate-old-and-new-style-writes.patch +Patch4: 0004-idbw_rec_write-pick-tpgt-from-existing-record.patch +Patch5: 0005-update-systemd-service-files-add-iscsi.service-for-s.patch +Patch6: 0006-iscsi-boot-related-service-file-updates.patch +Patch7: 0007-update-initscripts-and-docs.patch +Patch8: 0008-use-var-for-config.patch +Patch9: 0009-use-red-hat-for-name.patch +Patch10: 0010-libiscsi.patch +Patch11: 0011-remove-the-offload-boot-supported-ifdef.patch +Patch12: 0012-iscsiuio-systemd-unit-files.patch +Patch13: 0013-disable-iscsid.startup-from-iscsiadm-prefer-systemd-.patch +Patch14: 0014-Don-t-check-for-autostart-sessions-if-iscsi-is-not-u.patch +Patch15: 0015-start-socket-listeners-on-iscsiadm-command.patch +Patch16: 0016-Revert-iscsiadm-return-error-when-login-fails.patch +Patch17: 0017-update-handling-of-boot-sessions.patch +Patch18: 0018-update-iscsi.service-for-boot-session-recovery.patch +Patch19: 0019-updates-to-iscsi.service.patch +Patch20: 0020-make-session-shutdown-a-seperate-service.patch.patch +Patch22: 0022-honor-all-requested-delays-in-iscsi_sched_ev_context.patch +Patch23: 0023-Add-macros-to-release-GIL-lock.patch +# ugly version string patch, should change with every rebuild +Patch9999: 9999-use-Red-Hat-version-string-to-match-RPM-package-vers.patch + +BuildRequires: flex bison python2-devel python3-devel python-setuptools doxygen kmod-devel systemd-units +BuildRequires: autoconf automake libtool libmount-devel # For dir ownership Requires: %{name}-iscsiuio >= %{version}-%{release} Requires(post): systemd @@ -162,6 +76,22 @@ Requires: %{name} = %{version}-%{release} The %{name}-devel package contains libraries and header files for developing applications that use %{name}. +%package -n python-%{name} +Summary: Python %{python2_version} bindings to %{name} +Group: Development/Libraries + +%description -n python-%{name} +The %{name}-python2 package contains Python %{python2_version} bindings to the +libiscsi interface for interacting with %{name} + +%package -n python3-%{name} +Summary: Python %{python3_version} bindings to %{name} +Group: Development/Libraries + +%description -n python3-%{name} +The %{name}-python3 package contains Python %{python3_version} bindings to the +libiscsi interface for interacting with %{name} + %prep %autosetup -p1 -n open-iscsi-%{open_iscsi_version}-%{open_iscsi_build} @@ -173,7 +103,7 @@ developing applications that use %{name}. # configure sub-packages from here # letting the top level Makefile do it will lose setting from rpm cd iscsiuio -%{__chmod} +x configure +autoreconf --install %{configure} cd .. cd utils/open-isns @@ -350,8 +280,6 @@ fi %{_sbindir}/iscsid %{_sbindir}/iscsistart %{_libdir}/libiscsi.so.0 -%{python2_sitearch}/* -%{python3_sitearch}/* %{_mandir}/man8/iscsi-iname.8.gz %{_mandir}/man8/iscsiadm.8.gz %{_mandir}/man8/iscsid.8.gz @@ -369,7 +297,18 @@ fi %{_libdir}/libiscsi.so %{_includedir}/libiscsi.h +%files -n python-%{name} +%{python2_sitearch}/* + +%files -n python3-%{name} +%{python3_sitearch}/* + %changelog +* Wed Jun 10 2015 Chris Leech - 6.2.0.873-26.git6aa2c9b +- rebase to upstream snapshot +- add patch to improve GIL lock performance in libiscsi +- Split Python 2 and Python 3 bindings out into subpackages + * Wed Jan 28 2015 Chris Leech - 6.2.0.873-25.gitc9d830b - split out session logout on shutdown to a separate service - 985321 roll up libiscsi patches, update python bindings to support python3