From 19b05a07d4488385f767caa6fdfadf47d84c41be Mon Sep 17 00:00:00 2001 From: mchristi Date: Thu, 27 Oct 2011 19:47:37 +0000 Subject: [PATCH] Resolves: #749051 --- iscsi-initiator-utils-add-rh-ver.patch | 2 +- ...i-initiator-utils-sync-uio-0.7.0.14g.patch | 1486 +++++++++++++++++ iscsi-initiator-utils.spec | 13 +- 3 files changed, 1497 insertions(+), 4 deletions(-) create mode 100644 iscsi-initiator-utils-sync-uio-0.7.0.14g.patch diff --git a/iscsi-initiator-utils-add-rh-ver.patch b/iscsi-initiator-utils-add-rh-ver.patch index b463c72..77ffc58 100644 --- a/iscsi-initiator-utils-add-rh-ver.patch +++ b/iscsi-initiator-utils-add-rh-ver.patch @@ -5,7 +5,7 @@ * some other maintainer could merge a patch without going through us */ -#define ISCSI_VERSION_STR "2.0-872" -+#define ISCSI_VERSION_STR "2.0-872.28.el6" ++#define ISCSI_VERSION_STR "2.0-872.31.el6" #define ISCSI_VERSION_FILE "/sys/module/scsi_transport_iscsi/version" #endif diff --git a/iscsi-initiator-utils-sync-uio-0.7.0.14g.patch b/iscsi-initiator-utils-sync-uio-0.7.0.14g.patch new file mode 100644 index 0000000..c19f851 --- /dev/null +++ b/iscsi-initiator-utils-sync-uio-0.7.0.14g.patch @@ -0,0 +1,1486 @@ +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/RELEASE.TXT open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/RELEASE.TXT +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/RELEASE.TXT 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/RELEASE.TXT 2011-10-26 17:55:59.000000000 -0500 +@@ -1,7 +1,7 @@ + Release Notes + Broadcom uIP Linux Driver + Version 0.7.0.14 +- 08/23/2011 ++ 10/25/2011 + + Broadcom Corporation + 5300 California Avenue, +@@ -10,7 +10,7 @@ + Copyright (c) 2004 - 2011 Broadcom Corporation + All rights reserved + +-uIP v0.7.0.14 (Aug 23, 2011) ++uIP v0.7.0.14 (Oct 25, 2011) + ======================================================= + Fixes + ----- +@@ -23,11 +23,56 @@ uIP v0.7.0.14 (Aug 23, 2011) + Change: Adjusted the routine which seeks the device->net entry + to include more logic instead of hard waiting for 5s. + ++ 2. 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. ++ ++ 3. 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 ++ ++ 4. 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 ++ ++ 5. 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) ++ ++ 6. Problem: Cont00059288 - Show segfault w/ 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: 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 ++ 4. Change: Added support for bnx2x-1.71.00 ++ 5. Change: Changed the log file open error to a warning and let ++ the daemon progress ++ 6. Change: Added oom_adjust call to prevent OOM Killer from killing ++ iscsiuio when memory is low ++ 7. Change: Added mlockall setting to prevent page swap + + + uIP v0.7.0.13 (Aug 10, 2011) +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/uip/uip.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/uip/uip.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/uip/uip.c 2011-10-26 07:21:27.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/uip/uip.c 2011-10-26 17:55:59.000000000 -0500 +@@ -1300,7 +1300,7 @@ void uip_process(struct uip_stack *ustac + u16_t len = ntohs(ipv6_hdr->ip6_plen); + if (len <= ustack->uip_len) { + } else { +- LOG_WARN(PFX ++ LOG_DEBUG(PFX + "ip: packet shorter than reported in IP header" + ":IPv6_BUF(ustack)->len: %d ustack->uip_len: " + "%d", len, ustack->uip_len); +@@ -1312,7 +1312,7 @@ void uip_process(struct uip_stack *ustac + ustack->uip_len = (tcp_ipv4_hdr->len[0] << 8) + + tcp_ipv4_hdr->len[1]; + } else { +- LOG_WARN(PFX ++ 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) + +@@ -1505,7 +1505,7 @@ icmp_input: + if (UDPBUF(ustack)->udpchksum != 0 && uip_udpchksum(ustack) != 0xffff) { + ++ustack->stats.udp.drop; + ++ustack->stats.udp.chkerr; +- LOG_WARN(PFX "udp: bad checksum."); ++ LOG_DEBUG(PFX "udp: bad checksum."); + goto drop; + } + #else /* UIP_UDP_CHECKSUMS */ +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/iscsid_ipc.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/iscsid_ipc.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/iscsid_ipc.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/iscsid_ipc.c 2011-10-26 17:55:59.000000000 -0500 +@@ -111,8 +111,8 @@ static void *enable_nic_thread(void *dat + LOG_INFO(PFX "%s: started NIC enable thread state: 0x%x", + nic->log_name, nic->state) + +- /* Enable the NIC */ +- nic_enable(nic); ++ /* Enable the NIC */ ++ nic_enable(nic); + + pthread_exit(NULL); + } +@@ -206,7 +206,7 @@ static int parse_iface(void *arg) + { + int rc; + nic_t *nic = NULL; +- nic_interface_t *nic_iface, *next_nic_iface; ++ nic_interface_t *nic_iface, *vlan_iface, *base_nic_iface; + char *transport_name; + size_t transport_name_size; + nic_lib_handle_t *handle; +@@ -356,24 +356,22 @@ static int parse_iface(void *arg) + LOG_INFO(PFX "%s library set using transport_name %s", + nic->log_name, transport_name); + +- /* Create the network interface if it doesn't exist */ +- nic_iface = nic_find_nic_iface_protocol(nic, vlan, ipam.ip_type); ++ /* Create the base network interface if it doesn't exist */ ++ nic_iface = nic_find_nic_iface_protocol(nic, 0, ipam.ip_type); + if (nic_iface == NULL) { +- LOG_INFO(PFX "%s couldn't find VLAN %d interface with " ++ LOG_INFO(PFX "%s couldn't find interface with " + "ip_type: 0x%x creating it", +- nic->log_name, vlan, ipam.ip_type); ++ nic->log_name, ipam.ip_type); + +- /* Create the vlan interface */ ++ /* Create the nic interface */ + nic_iface = nic_iface_init(); + + if (nic_iface == NULL) { +- LOG_ERR(PFX "Couldn't allocate nic_iface for VLAN: %d", +- nic_iface, vlan); ++ LOG_ERR(PFX "Couldn't allocate nic_iface", nic_iface); + goto done; + } + + nic_iface->protocol = ipam.ip_type; +- nic_iface->vlan_id = vlan; + nic_add_nic_iface(nic, nic_iface); + + persist_all_nic_iface(nic); +@@ -384,6 +382,37 @@ static int parse_iface(void *arg) + nic->log_name); + } + ++ set_nic_iface(nic, nic_iface); ++ ++ /* Find the vlan nic_interface */ ++ if (vlan) { ++ vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface, vlan, ++ ipam.ip_type); ++ if (vlan_iface == NULL) { ++ LOG_INFO(PFX "%s couldn't find interface with VLAN = %d" ++ "ip_type: 0x%x creating it", ++ nic->log_name, vlan, ipam.ip_type); ++ ++ /* Create the nic interface */ ++ vlan_iface = nic_iface_init(); ++ ++ if (vlan_iface == NULL) { ++ LOG_ERR(PFX "Couldn't allocate nic_iface for " ++ "VLAN: %d", vlan_iface, vlan); ++ goto done; ++ } ++ ++ vlan_iface->protocol = ipam.ip_type; ++ vlan_iface->vlan_id = vlan; ++ nic_add_vlan_iface(nic, nic_iface, vlan_iface); ++ } else { ++ LOG_INFO(PFX "%s: using existing vlan interface", ++ nic->log_name); ++ } ++ base_nic_iface = nic_iface; ++ nic_iface = vlan_iface; ++ } ++ + /* Determine how to configure the IP address */ + if (ipam.ip_type == AF_INET) { + if (memcmp(&ipam.addr4, +@@ -509,24 +538,27 @@ diff: + } + + /* Configuration changed, do VLAN WA */ +- next_nic_iface = nic_iface->next; +- while (next_nic_iface) { +- if (next_nic_iface->vlan_id) { +- /* TODO: When VLAN support is placed in the iface file +- * revisit this code */ +- next_nic_iface->ustack.ip_config = ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface) { ++ /* TODO: When VLAN support is placed in the iface file ++ * revisit this code */ ++ if (vlan_iface->ustack.ip_config) { ++ vlan_iface->ustack.ip_config = + nic_iface->ustack.ip_config; +- memcpy(next_nic_iface->ustack.hostaddr, ++ memcpy(vlan_iface->ustack.hostaddr, + nic_iface->ustack.hostaddr, + sizeof(nic_iface->ustack.hostaddr)); +- memcpy(next_nic_iface->ustack.netmask, ++ memcpy(vlan_iface->ustack.netmask, + nic_iface->ustack.netmask, + sizeof(nic_iface->ustack.netmask)); +- memcpy(next_nic_iface->ustack.hostaddr6, ++ memcpy(vlan_iface->ustack.hostaddr6, + nic_iface->ustack.hostaddr6, + sizeof(nic_iface->ustack.hostaddr6)); ++ memcpy(vlan_iface->ustack.netmask6, ++ nic_iface->ustack.netmask6, ++ sizeof(nic_iface->ustack.netmask6)); + } +- next_nic_iface = next_nic_iface->next; ++ vlan_iface = vlan_iface->vlan_next; + } + + enable_nic: +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.c 2011-10-26 07:21:27.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.c 2011-10-26 17:55:59.000000000 -0500 +@@ -396,6 +396,7 @@ static bnx2_t *bnx2_alloc(nic_t * nic) + /* 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; +@@ -417,6 +418,7 @@ static int bnx2_open(nic_t * nic) + __u32 val; + uint32_t tx_cid; + __u32 msix_vector = 0; ++ char sysfs_resc_path[80]; + + /* Sanity Check: validate the parameters */ + if (nic == NULL) { +@@ -465,6 +467,14 @@ static int bnx2_open(nic_t * nic) + } + 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); ++ return -ENODEV; ++ } ++ + /* TODO: hardcoded with the cnic driver */ + bp->rx_ring_size = 3; + bp->rx_buffer_size = 0x400; +@@ -498,7 +508,7 @@ static int bnx2_open(nic_t * nic) + mlock(bp->rx_pkt_ring, sizeof(void *) * bp->rx_ring_size); + + bp->reg = mmap(NULL, 0x12800, PROT_READ | PROT_WRITE, MAP_SHARED, +- nic->fd, (off_t) 0); ++ 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)); +@@ -758,6 +768,11 @@ static int bnx2_uio_close_resources(nic_ + 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) { +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.h +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2.h 2011-10-26 07:21:27.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2.h 2011-10-26 17:55:59.000000000 -0500 +@@ -250,6 +250,7 @@ typedef struct bnx2 { + #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; +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.c 2011-10-26 17:55:59.000000000 -0500 +@@ -77,9 +77,6 @@ static const char library_uio_name[] = " + static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name"; + static const char bnx2x_uio_sysfs_name[] = "bnx2x_cnic"; + +-static const char cnic_uio_sysfs_resc_tempate[] = +- "/sys/class/uio/uio%i/device/resource"; +- + /******************************************************************************* + * String constants used to display human readable adapter name + ******************************************************************************/ +@@ -377,7 +374,7 @@ error: + + static inline int bnx2x_is_ver70(bnx2x_t *bp) + { +- return (bp->version.major == 1 && bp->version.minor == 70); ++ return (bp->version.major == 1 && bp->version.minor >= 70); + } + + static inline int bnx2x_is_ver60(bnx2x_t * bp) +@@ -506,44 +503,10 @@ static int bnx2x_uio_verify(nic_t * nic) + + LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name); + +- error: ++error: + return rc; + } + +-static unsigned long cnic_get_bar2(nic_t * nic) +-{ +- char *raw = NULL, *raw_tmp; +- uint32_t raw_size = 0; +- char temp_path[sizeof(cnic_uio_sysfs_resc_tempate) + 8]; +- int rc = 0, i, new_line; +- unsigned long bar = 0; +- +- /* Build the path to determine uio name */ +- snprintf(temp_path, sizeof(temp_path), +- cnic_uio_sysfs_resc_tempate, nic->uio_minor); +- +- rc = capture_file(&raw, &raw_size, temp_path); +- if (rc != 0) +- return 0; +- +- /* Skip 2 lines to get to BAR2 */ +- raw_tmp = raw; +- i = 0; +- new_line = 0; +- while (i++ < raw_size && new_line < 2) { +- if (*raw_tmp == '\n') +- new_line++; +- raw_tmp++; +- } +- +- if (new_line == 2) +- sscanf(raw_tmp, "%lx ", &bar); +- +- free(raw); +- +- return bar; +-} +- + /******************************************************************************* + * bnx2x Utility Functions to get to the hardware consumer indexes + ******************************************************************************/ +@@ -635,7 +598,8 @@ static bnx2x_t *bnx2x_alloc(nic_t * nic) + /* Clear out the CNIC contents */ + memset(bp, 0, sizeof(*bp)); + +- bp->mem_fd = INVALID_FD; ++ bp->bar0_fd = INVALID_FD; ++ bp->bar2_fd = INVALID_FD; + + bp->parent = nic; + nic->priv = (void *)bp; +@@ -657,9 +621,8 @@ static int bnx2x_open(nic_t * nic) + struct stat uio_stat; + int i, rc; + __u32 val; +- unsigned long bar2; + int count; +- ++ char sysfs_resc_path[80]; + uint32_t bus; + uint32_t slot; + uint32_t func; +@@ -722,20 +685,37 @@ static int bnx2x_open(nic_t * nic) + } + nic->uio_minor = minor(uio_stat.st_rdev); + +- bar2 = cnic_get_bar2(nic); +- if (bar2 == 0) { +- LOG_ERR(PFX "%s: Could not read BAR2", nic->log_name); ++ 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); + return -ENODEV; + } + +- bp->mem_fd = open("/dev/mem", O_RDWR | O_SYNC); +- if (bp->mem_fd < 0) { +- LOG_ERR(PFX "%s: Could not open /dev/mem", nic->log_name); ++ 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); + return -ENODEV; + } + + bp->reg2 = mmap(NULL, BNX2X_BAR2_SIZE, PROT_READ | PROT_WRITE, +- MAP_SHARED, bp->mem_fd, (off_t) bar2); ++ MAP_SHARED, bp->bar2_fd, (off_t) 0); + + if (bp->reg2 == MAP_FAILED) { + LOG_INFO(PFX "%s: Couldn't mmap BAR2 registers: %s", +@@ -768,18 +748,6 @@ static int bnx2x_open(nic_t * nic) + goto open_error; + } + +- bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, +- nic->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; +- rc = errno; +- goto open_error; +- } +- +- msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC); +- + if (bnx2x_is_ver60_plus(bp)) + bp->status_blk_size = sizeof(struct host_sp_status_block); + else if (bnx2x_is_ver52(bp)) +@@ -1036,9 +1004,14 @@ open_error: + bp->rx_pkt_ring = NULL; + } + +- if (bp->mem_fd != INVALID_FD) { +- close(bp->mem_fd); +- bp->mem_fd = INVALID_FD; ++ 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; + } + + return rc; +@@ -1108,9 +1081,14 @@ static int bnx2x_uio_close_resources(nic + bp->reg2 = NULL; + } + +- if (bp->mem_fd != INVALID_FD) { +- close(bp->mem_fd); +- bp->mem_fd = INVALID_FD; ++ 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) { +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.h +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/bnx2x.h 2011-10-26 07:21:27.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/bnx2x.h 2011-10-26 17:55:59.000000000 -0500 +@@ -574,7 +574,8 @@ typedef struct bnx2x { + void *reg; /* Pointer to the BAR1 mapped registers */ + void *reg2; /* Pointer to the BAR2 mapped registers */ + +- int mem_fd; ++ int bar0_fd; ++ int bar2_fd; + + __u32 chip_id; + __u32 shmem_base; +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/cnic.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/cnic.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/libs/cnic.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/libs/cnic.c 2011-10-26 17:55:59.000000000 -0500 +@@ -325,7 +325,7 @@ int cnic_handle_ipv4_iscsi_path_req(nic_ + struct iscsi_uevent *ev, + struct iscsi_path *path) + { +- nic_interface_t *nic_iface; ++ nic_interface_t *nic_iface, *vlan_iface; + struct in_addr src_addr, dst_addr, + src_matching_addr, dst_matching_addr, netmask; + __u8 mac_addr[6]; +@@ -338,18 +338,50 @@ int cnic_handle_ipv4_iscsi_path_req(nic_ + pthread_mutex_lock(&nic_list_mutex); + + /* Find the proper interface via VLAN id */ +- nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, AF_INET); ++ nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET); + if (nic_iface == NULL) { +- nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET); +- if (nic_iface == NULL) { +- pthread_mutex_unlock(&nic_list_mutex); +- LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d", +- nic->log_name, path->vlan_id); +- return -EINVAL; +- } ++ pthread_mutex_unlock(&nic_list_mutex); ++ LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d", ++ nic->log_name, path->vlan_id); ++ return -EINVAL; ++ } ++ if (path->vlan_id) { ++ vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface, ++ path->vlan_id, ++ AF_INET); ++ if (vlan_iface == NULL) { ++ LOG_INFO(PFX "%s couldn't find interface with VLAN = %d" ++ "ip_type: 0x%x creating it", ++ nic->log_name, path->vlan_id, AF_INET); ++ ++ /* Create the nic interface */ ++ vlan_iface = nic_iface_init(); ++ ++ if (vlan_iface == NULL) { ++ LOG_ERR(PFX "Couldn't allocate nic_iface for " ++ "VLAN: %d", vlan_iface, ++ path->vlan_id); ++ return -EINVAL; ++ } + +- nic_iface->vlan_id = path->vlan_id; ++ vlan_iface->protocol = nic_iface->protocol; ++ vlan_iface->vlan_id = path->vlan_id; ++ 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)); ++ nic_add_vlan_iface(nic, nic_iface, vlan_iface); ++ } else { ++ LOG_INFO(PFX "%s: using existing vlan interface", ++ nic->log_name); ++ } ++ nic_iface = vlan_iface; + } ++ + #define MAX_ARP_RETRY 4 + + memcpy(&dst_addr, &path->dst.v4_addr, sizeof(dst_addr)); +@@ -364,6 +396,9 @@ int cnic_handle_ipv4_iscsi_path_req(nic_ + 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 */ +@@ -374,6 +409,7 @@ int cnic_handle_ipv4_iscsi_path_req(nic_ + sizeof(dst_addr)); + } else { + arp_retry = MAX_ARP_RETRY; ++ LOG_DEBUG(PFX "%s: no default", nic->log_name); + goto done; + } + } +@@ -473,7 +509,7 @@ int cnic_handle_ipv6_iscsi_path_req(nic_ + struct iscsi_uevent *ev, + struct iscsi_path *path) + { +- nic_interface_t *nic_iface; ++ nic_interface_t *nic_iface, *vlan_iface; + __u8 mac_addr[6]; + int rc, i; + uint16_t neighbor_retry; +@@ -492,18 +528,49 @@ int cnic_handle_ipv6_iscsi_path_req(nic_ + pthread_mutex_lock(&nic_list_mutex); + + /* Find the proper interface via VLAN id */ +- nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, AF_INET6); ++ nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET6); + if (nic_iface == NULL) { +- nic_iface = nic_find_nic_iface_protocol(nic, 0, AF_INET6); +- if (nic_iface == NULL) { +- pthread_mutex_unlock(&nic_list_mutex); +- LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d", +- nic->log_name, path->vlan_id); +- return -EINVAL; ++ pthread_mutex_unlock(&nic_list_mutex); ++ LOG_ERR(PFX "%s: Couldn't find net_iface vlan_id: %d", ++ nic->log_name, path->vlan_id); ++ return -EINVAL; ++ } ++ if (path->vlan_id) { ++ vlan_iface = nic_find_vlan_iface_protocol(nic, nic_iface, ++ path->vlan_id, ++ AF_INET6); ++ if (vlan_iface == NULL) { ++ LOG_INFO(PFX "%s couldn't find interface with VLAN = %d" ++ "ip_type: 0x%x creating it", ++ nic->log_name, path->vlan_id, AF_INET6); ++ ++ /* Create the nic interface */ ++ vlan_iface = nic_iface_init(); ++ ++ if (vlan_iface == NULL) { ++ LOG_ERR(PFX "Couldn't allocate nic_iface for " ++ "VLAN: %d", vlan_iface, ++ path->vlan_id); ++ return -EINVAL; ++ } ++ vlan_iface->protocol = nic_iface->protocol; ++ vlan_iface->vlan_id = path->vlan_id; ++ vlan_iface->ustack.ip_config = ++ nic_iface->ustack.ip_config; ++ memcpy(vlan_iface->ustack.hostaddr6, ++ nic_iface->ustack.hostaddr6, ++ sizeof(nic_iface->ustack.hostaddr6)); ++ memcpy(vlan_iface->ustack.netmask6, ++ nic_iface->ustack.netmask6, ++ sizeof(nic_iface->ustack.netmask6)); ++ nic_add_vlan_iface(nic, nic_iface, vlan_iface); ++ } else { ++ LOG_INFO(PFX "%s: using existing vlan interface", ++ nic->log_name); + } +- +- nic_iface->vlan_id = path->vlan_id; ++ nic_iface = vlan_iface; + } ++ + /* 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 */ +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/logger.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/logger.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/logger.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/logger.c 2011-10-26 17:55:59.000000000 -0500 +@@ -109,7 +109,7 @@ void log_uip(char *level_str, char *fmt, + fflush(stdout); + } + +- end: ++end: + va_end(ap2); + va_end(ap); + pthread_mutex_unlock(&main_log.lock); +@@ -129,17 +129,26 @@ int init_logger(char *filename) + + 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; + } +- main_log.enabled = LOGGER_ENABLED; ++disable: ++ if (rc) ++ main_log.enabled = LOGGER_DISABLED; ++ else ++ main_log.enabled = LOGGER_ENABLED; + + pthread_mutex_unlock(&main_log.lock); + +- LOG_INFO("Initialize logger using log file: %s", filename); ++ if (!rc) ++ LOG_INFO("Initialize logger using log file: %s", filename); + + return rc; + } +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/main.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/main.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/main.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/main.c 2011-10-26 17:55:59.000000000 -0500 +@@ -48,6 +48,7 @@ + #include + #include + #include ++#include + + #include "uip.h" + #include "uip_arp.h" +@@ -143,11 +144,9 @@ signal_wait: + retry: + fini_logger(SHUTDOWN_LOGGER); + rc = init_logger(main_log.log_file); +- if (rc != 0) { ++ if (rc != 0) + printf("Could not initialize the logger in " + "signal!\n"); +- goto retry; +- } + goto signal_wait; + default: + break; +@@ -198,6 +197,38 @@ static void daemon_init() + 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 + ******************************************************************************/ +@@ -250,10 +281,8 @@ int main(int argc, char *argv[]) + if (main_log.enabled == LOGGER_ENABLED) { + /* initialize the logger */ + rc = init_logger(main_log.log_file); +- if (rc != 0) { +- printf("Could not initialize the logger\n"); +- goto error; +- } ++ if (rc != 0 && opt.debug == DEBUG_ON) ++ printf("WARN: Could not initialize the logger\n"); + } + + LOG_INFO("Started iSCSI uio stack: Ver " PACKAGE_VERSION); +@@ -348,6 +377,16 @@ int main(int argc, char *argv[]) + /* 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) { +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.c 2011-10-26 17:55:59.000000000 -0500 +@@ -440,7 +440,7 @@ int nic_remove(nic_t * nic) + nic_t *prev, *current; + struct stat file_stat; + void *res; +- nic_interface_t *nic_iface, *next_nic_iface; ++ nic_interface_t *nic_iface, *next_nic_iface, *vlan_iface; + + pthread_mutex_lock(&nic->nic_mutex); + +@@ -505,6 +505,12 @@ int nic_remove(nic_t * nic) + nic_iface */ + nic_iface = nic->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; +@@ -532,7 +538,7 @@ int nic_remove(nic_t * nic) + void nic_close(nic_t * nic, NIC_SHUTDOWN_T graceful, int clean) + { + int rc; +- nic_interface_t *nic_iface; ++ nic_interface_t *nic_iface, *vlan_iface; + struct stat file_stat; + + /* The NIC could be configured by the uIP config file +@@ -559,8 +565,14 @@ void nic_close(nic_t * nic, NIC_SHUTDOWN + nic_iface = nic->nic_iface; + while (nic_iface != NULL) { + if (!((nic_iface->flags & NIC_IFACE_PERSIST) == +- 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; + } + +@@ -608,12 +620,13 @@ nic_interface_t *nic_iface_init() + + memset(nic_iface, 0, sizeof(*nic_iface)); + nic_iface->next = NULL; ++ nic_iface->vlan_next = NULL; + + return nic_iface; + } + + /** +- * nic_add_net_iface() - This function is used to add an interface to the ++ * nic_add_nic_iface() - This function is used to add an interface to the + * nic structure + * @param nic - struct nic device to add the interface to + * @param nic_iface - network interface used to add to the nic +@@ -632,7 +645,7 @@ int nic_add_nic_iface(nic_t * nic, nic_i + + /* Check to see if this interface already exists via 2 + * conditions: 1) VLAN 2) protocol */ +- while (current->next != NULL) { ++ while (current != NULL) { + if ((current->protocol == nic_iface->protocol) && + (current->vlan_id == nic_iface->vlan_id)) { + LOG_WARN(PFX "%s: nic interface alread exists" +@@ -641,7 +654,6 @@ int nic_add_nic_iface(nic_t * nic, nic_i + current->protocol); + goto error; + } +- + current = current->next; + } + +@@ -668,6 +680,60 @@ error: + return 0; + } + ++/** ++ * nic_add_vlan_iface() - This function is used to add a vlan interface to the ++ * nic structure ++ * @param nic - struct nic device to add the interface to ++ * @param nic_iface - network interface to be added to ++ * @param vlan_iface - vlan interface used to add to the nic_iface ++ * @return 0 on success, <0 on failure ++ */ ++int nic_add_vlan_iface(nic_t *nic, nic_interface_t *nic_iface, ++ nic_interface_t *vlan_iface) ++{ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ /* Add the nic_interface */ ++ if (nic_iface == NULL) ++ goto error; ++ else { ++ nic_interface_t *current = nic_iface->vlan_next; ++ ++ /* Check to see if this interface already exists via 2 ++ * conditions: 1) VLAN 2) protocol */ ++ while (current != NULL) { ++ if ((current->protocol == vlan_iface->protocol) && ++ (current->vlan_id == vlan_iface->vlan_id)) { ++ LOG_WARN(PFX "%s: vlan interface already exists" ++ "for VLAN: %d, protocol: %d", ++ nic->log_name, current->vlan_id, ++ current->protocol); ++ goto error; ++ } ++ current = current->vlan_next; ++ } ++ ++ /* This interface doesn't exists, we can safely add ++ * this nic interface */ ++ current = nic_iface; ++ while (current->vlan_next != NULL) ++ current = current->vlan_next; ++ ++ current->vlan_next = vlan_iface; ++ } ++ ++ /* Set nic_interface common fields */ ++ vlan_iface->parent = nic; ++ nic->num_of_nic_iface++; ++ ++ LOG_INFO(PFX "%s: Added vlan interface for VLAN: %d, protocol: %d", ++ nic->log_name, vlan_iface->vlan_id, vlan_iface->protocol); ++ ++error: ++ pthread_mutex_unlock(&nic->nic_mutex); ++ ++ return 0; ++} + /****************************************************************************** + * Routine to process interrupts from the NIC device + ******************************************************************************/ +@@ -944,6 +1010,7 @@ int process_packets(nic_t * nic, + uint16_t type = 0; + int af_type = 0; + struct uip_stack *ustack; ++ nic_interface_t *vlan_iface; + + if ((pkt->vlan_tag == 0) || + (NIC_VLAN_STRIP_ENABLED & nic->flags)) { +@@ -970,8 +1037,7 @@ int process_packets(nic_t * nic, + + /* check if we have the given VLAN interface */ + if (nic_iface == NULL) { +- nic_iface = nic_find_nic_iface_protocol(nic, +- pkt->vlan_tag, ++ nic_iface = nic_find_nic_iface_protocol(nic, 0, + af_type); + if (nic_iface == NULL) { + LOG_INFO(PFX "%s: Couldn't find interface for " +@@ -993,11 +1059,58 @@ int process_packets(nic_t * nic, + } + + nic_iface->protocol = af_type; +- nic_iface->vlan_id = pkt->vlan_tag; ++ nic_iface->vlan_id = 0; + nic_add_nic_iface(nic, nic_iface); + + persist_all_nic_iface(nic); + } ++ if (pkt->vlan_tag) { ++ vlan_iface = nic_find_vlan_iface_protocol(nic, ++ nic_iface, pkt->vlan_tag, ++ af_type); ++ if (vlan_iface == NULL) { ++ LOG_INFO(PFX "%s couldn't find " ++ "interface with VLAN =" ++ " %d ip_type: 0x%x " ++ "creating it", ++ nic->log_name, pkt->vlan_tag, ++ af_type); ++ ++ /* Create the nic interface */ ++ vlan_iface = nic_iface_init(); ++ ++ if (vlan_iface == NULL) { ++ LOG_ERR(PFX "Couldn't allocate " ++ "nic_iface for VLAN: %d", ++ vlan_iface, ++ pkt->vlan_tag); ++ rc = 0; ++ goto done; ++ } ++ vlan_iface->protocol = af_type; ++ vlan_iface->vlan_id = pkt->vlan_tag; ++ nic_add_vlan_iface(nic, nic_iface, ++ vlan_iface); ++ /* TODO: When VLAN support is placed */ ++ /* in the iface file revisit this */ ++ /* code */ ++ 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_all_nic_iface(nic); ++ } ++ nic_iface = vlan_iface; ++ } + } + + pkt->nic_iface = nic_iface; +@@ -1095,10 +1208,19 @@ static int process_dhcp_loop(nic_t * nic + struct timeval total_time; + + /* 10s loop time to wait for DHCP */ +- if (nic_iface->ustack.ip_config == IPV4_CONFIG_DHCP) ++ switch (nic_iface->ustack.ip_config) { ++ case IPV4_CONFIG_DHCP: + wait_time.tv_sec = 10; +- else ++ 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; +@@ -1177,7 +1299,6 @@ void *nic_loop(void *arg) + /* Signal the device to enable itself */ + pthread_mutex_lock(&nic->nic_mutex); + pthread_cond_signal(&nic->nic_loop_started_cond); +- pthread_mutex_unlock(&nic->nic_mutex); + + while ((event_loop_stop == 0) && + !(nic->flags & NIC_EXIT_MAIN_LOOP) && +@@ -1189,16 +1310,17 @@ void *nic_loop(void *arg) + nic->log_name); + + /* Wait for the device to be enabled */ +- pthread_mutex_lock(&nic->nic_mutex); ++ /* nic_mutex is already locked */ + pthread_cond_wait(&nic->enable_wait_cond, + &nic->nic_mutex); +- pthread_mutex_unlock(&nic->nic_mutex); + +- if (nic->state == NIC_EXIT) ++ if (nic->state == NIC_EXIT) { ++ pthread_mutex_unlock(&nic->nic_mutex); + pthread_exit(NULL); +- ++ } + LOG_DEBUG(PFX "%s: is now enabled", nic->log_name); + } ++ pthread_mutex_unlock(&nic->nic_mutex); + + /* initialize the device to send/rec data */ + rc = (*nic->ops->open) (nic); +@@ -1407,7 +1529,7 @@ skip: + nic->log_name, + nic_iface->vlan_id, nic_iface->protocol); + +- nic_iface = nic_iface->next; ++ nic_iface = nic_iface->vlan_next; + } + + if (nic->flags & NIC_DISABLED) { +@@ -1458,20 +1580,27 @@ dev_close: + + nic->flags &= ~NIC_GOING_DOWN; + } else { +- + pthread_mutex_destroy(&nic->xmit_mutex); + pthread_mutex_init(&nic->xmit_mutex, NULL); + + if (nic->flags & NIC_RESET_UIP) { + nic_interface_t *nic_iface = nic->nic_iface; ++ nic_interface_t *vlan_iface; + while (nic_iface != NULL) { + LOG_INFO(PFX "%s: resetting uIP stack", + nic->log_name); + uip_reset(&nic_iface->ustack); +- ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface != NULL) { ++ LOG_INFO(PFX "%s: resetting " ++ "vlan uIP stack", ++ nic->log_name); ++ uip_reset(&vlan_iface->ustack); ++ vlan_iface = ++ vlan_iface->vlan_next; ++ } + nic_iface = nic_iface->next; + } +- + nic->flags &= ~NIC_RESET_UIP; + } + } +@@ -1486,8 +1615,8 @@ dev_close: + /* Signal we are done closing CNIC/UIO device */ + pthread_cond_broadcast(&nic->disable_wait_cond); + } +- pthread_mutex_unlock(&nic->nic_mutex); + } ++ pthread_mutex_unlock(&nic->nic_mutex); + + LOG_INFO(PFX "%s: nic loop thread exited", nic->log_name); + +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.h +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic.h 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic.h 2011-10-26 17:55:59.000000000 -0500 +@@ -130,6 +130,7 @@ typedef struct nic_interface { + time_t start_time; + + struct uip_stack ustack; ++ struct nic_interface *vlan_next; + } nic_interface_t; + + /****************************************************************************** +@@ -302,11 +303,13 @@ typedef struct nic { + int load_all_nic_libraries(); + + nic_t *nic_init(); +-void nic_add(nic_t * nic); +-int nic_remove(nic_t * nic); ++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); ++int nic_add_nic_iface(nic_t *nic, nic_interface_t *nic_iface); ++int nic_add_vlan_iface(nic_t *nic, nic_interface_t *nic_iface, ++ nic_interface_t *vlan_iface); ++int nic_process_intr(nic_t *nic, int discard_check); + + nic_interface_t *nic_iface_init(); + +@@ -340,6 +343,10 @@ struct nic_interface *nic_find_nic_iface + struct nic_interface *nic_find_nic_iface_protocol(nic_t * nic, + uint16_t vlan_id, + uint16_t protocol); ++struct nic_interface *nic_find_vlan_iface_protocol(nic_t *nic, ++ nic_interface_t *nic_iface, ++ uint16_t vlan_id, ++ uint16_t protocol); + int find_nic_lib_using_pci_id(uint32_t vendor, uint32_t device, + uint32_t subvendor, uint32_t subdevice, + nic_lib_handle_t ** handle, +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_nl.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_nl.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_nl.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_nl.c 2011-10-26 17:55:59.000000000 -0500 +@@ -329,7 +329,7 @@ static int ctldev_handle(char *data) + + if (ev->type == ISCSI_KEVENT_PATH_REQ) { + struct timespec sleep_rem; +- nic_interface_t *nic_iface; ++ nic_interface_t *nic_iface, *vlan_iface; + uint16_t ip_type; + + if (path->ip_addr_len == 4) +@@ -339,52 +339,56 @@ static int ctldev_handle(char *data) + else + ip_type = 0; + +- nic_iface = nic_find_nic_iface_protocol(nic, path->vlan_id, +- ip_type); ++ /* Find the parent nic_iface */ ++ nic_iface = nic_find_nic_iface_protocol(nic, 0, ip_type); + if (nic_iface == NULL) { +- nic_interface_t *default_iface; +- default_iface = nic_find_nic_iface_protocol(nic, +- 0, ip_type); +- if (default_iface == NULL) { +- LOG_ERR(PFX "%s: Couldn't find default iface " +- "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; +- } +- +- nic_iface = nic_iface_init(); +- if (nic_iface == NULL) { +- LOG_ERR(PFX "%s: Couldn't allocate space for " +- "vlan: %d ip_type: %d " +- "ip_addr_len: %d", +- nic->log_name, path->vlan_id, ip_type, +- path->ip_addr_len); +- +- goto error; ++ LOG_ERR(PFX "%s: Couldn't find nic iface " ++ "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 (path->vlan_id) { ++ vlan_iface = nic_find_vlan_iface_protocol(nic, ++ nic_iface, path->vlan_id, ip_type); ++ if (vlan_iface == NULL) { ++ /* Create a vlan_iface */ ++ vlan_iface = nic_iface_init(); ++ if (vlan_iface == NULL) { ++ LOG_ERR(PFX "%s: Couldn't allocate " ++ "space for vlan: %d ip_type: " ++ "%d ip_addr_len: %d", ++ nic->log_name, path->vlan_id, ++ ip_type, path->ip_addr_len); ++ goto error; ++ } ++ ++ vlan_iface->protocol = ip_type; ++ vlan_iface->vlan_id = path->vlan_id; ++ nic_add_vlan_iface(nic, nic_iface, vlan_iface); ++ ++ /* TODO: When VLAN support is placed in */ ++ /* the iface file revisit this code */ ++ 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_all_nic_iface(nic); ++ nic_disable(nic, 0); ++ nic_iface = vlan_iface; + } +- +- nic_iface->protocol = ip_type; +- nic_iface->vlan_id = path->vlan_id; +- nic_add_nic_iface(nic, nic_iface); +- +- /* TODO: When VLAN support is placed in the iface file +- * revisit this code */ +- nic_iface->ustack.ip_config = +- default_iface->ustack.ip_config; +- memcpy(nic_iface->ustack.hostaddr, +- default_iface->ustack.hostaddr, +- sizeof(nic_iface->ustack.hostaddr)); +- memcpy(nic_iface->ustack.netmask, +- default_iface->ustack.netmask, +- sizeof(nic_iface->ustack.netmask)); +- memcpy(nic_iface->ustack.hostaddr6, +- default_iface->ustack.hostaddr6, +- sizeof(nic_iface->ustack.hostaddr6)); +- +- persist_all_nic_iface(nic); +- nic_disable(nic, 0); + } + + /* Force enable the NIC */ +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.c open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.c +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.c 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.c 2011-10-26 17:55:59.000000000 -0500 +@@ -78,6 +78,8 @@ static const char host_template[] = "hos + 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 +@@ -824,6 +826,15 @@ int nic_fill_name(nic_t * nic) + 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; +@@ -925,13 +936,23 @@ int nic_enable(nic_t * nic) + rc = gettimeofday(&tp, NULL); + ts.tv_sec = tp.tv_sec; + ts.tv_nsec = tp.tv_usec * 1000; +- /* Changed the timeout to 10s to accommodate for DHCP +- timeout */ + ts.tv_sec += 10; + +- /* Wait for the device to be disabled */ ++ /* Wait for the device to be enabled */ + rc = pthread_cond_timedwait(&nic->enable_done_cond, + &nic->nic_mutex, &ts); ++#if 0 ++ if (rc || !nic->flags & NIC_ENABLED) { ++ /* Give it one more shout */ ++ pthread_cond_broadcast(&nic->enable_wait_cond); ++ rc = gettimeofday(&tp, NULL); ++ ts.tv_sec = tp.tv_sec; ++ ts.tv_nsec = tp.tv_usec * 1000; ++ ts.tv_sec += 5; ++ rc = pthread_cond_timedwait(&nic->enable_done_cond, ++ &nic->nic_mutex, &ts); ++ } ++#endif + nic->flags &= ~NIC_ENABLED_PENDING; + pthread_mutex_unlock(&nic->nic_mutex); + +@@ -940,6 +961,24 @@ int nic_enable(nic_t * nic) + } else { + LOG_ERR(PFX "%s: waiting to finish nic_enable err:%s", + nic->log_name, strerror(rc)); ++ /* Must clean up the ustack */ ++ nic_interface_t *nic_iface = nic->nic_iface; ++ nic_interface_t *vlan_iface; ++ while (nic_iface != NULL) { ++ LOG_INFO(PFX "%s: resetting uIP stack", ++ nic->log_name); ++ uip_reset(&nic_iface->ustack); ++ vlan_iface = nic_iface->vlan_next; ++ while (vlan_iface != NULL) { ++ LOG_INFO(PFX "%s: resetting " ++ "vlan uIP stack", ++ nic->log_name); ++ uip_reset(&vlan_iface->ustack); ++ vlan_iface = ++ vlan_iface->vlan_next; ++ } ++ nic_iface = nic_iface->next; ++ } + } + + return rc; +@@ -979,7 +1018,7 @@ int nic_disable(nic_t * nic, int going_d + 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 2 seconds */ ++ 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, +@@ -1087,7 +1126,7 @@ error: + */ + void nic_set_all_nic_iface_mac_to_parent(nic_t * nic) + { +- nic_interface_t *current; ++ nic_interface_t *current, *vlan_current; + + pthread_mutex_lock(&nic->nic_mutex); + +@@ -1097,6 +1136,11 @@ void nic_set_all_nic_iface_mac_to_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; + } + +@@ -1286,20 +1330,80 @@ nic_interface_t *nic_find_nic_iface_prot + + void persist_all_nic_iface(nic_t * nic) + { +- nic_interface_t *current; ++ nic_interface_t *current, *vlan_iface; + + pthread_mutex_lock(&nic->nic_mutex); + + current = nic->nic_iface; + while (current != NULL) { + current->flags |= NIC_IFACE_PERSIST; +- ++ vlan_iface = current->vlan_next; ++ while (vlan_iface != NULL) { ++ vlan_iface->flags |= NIC_IFACE_PERSIST; ++ vlan_iface = vlan_iface->vlan_next; ++ } + current = current->next; + } + + pthread_mutex_unlock(&nic->nic_mutex); + } + ++/** ++ * nic_find_vlan_iface_protocol() - This function is used to find an interface ++ * from the NIC ++ * @param nic_iface - Base NIC to look for the vlan interfaces ++ * @param vlan_id - VLAN id to look for ++ * @param protocol - either AF_INET or AF_INET6 ++ * @return nic_iface - if found network interface with the given VLAN ID ++ * if not found a NULL is returned ++ */ ++nic_interface_t *nic_find_vlan_iface_protocol(nic_t *nic, ++ nic_interface_t *nic_iface, ++ uint16_t vlan_id, ++ uint16_t protocol) ++{ ++ nic_interface_t *current; ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ current = nic_iface->vlan_next; ++ while (current != NULL) { ++ if ((current->vlan_id == vlan_id) && ++ (current->protocol == protocol)) { ++ pthread_mutex_unlock(&nic->nic_mutex); ++ return current; ++ } ++ current = current->vlan_next; ++ } ++ ++ pthread_mutex_unlock(&nic->nic_mutex); ++ return NULL; ++} ++ ++void set_nic_iface(nic_t *nic, nic_interface_t *nic_iface) ++{ ++ nic_interface_t *current, *prev; ++ ++ pthread_mutex_lock(&nic->nic_mutex); ++ ++ if (nic->nic_iface == nic_iface) ++ goto done; ++ ++ prev = nic->nic_iface; ++ current = nic->nic_iface->next; ++ while (current != NULL) { ++ if (current == nic_iface) { ++ prev->next = current->next; ++ current->next = nic->nic_iface; ++ nic->nic_iface = current; ++ goto done; ++ } ++ prev = current; ++ current = current->next; ++ } ++done: ++ pthread_mutex_unlock(&nic->nic_mutex); ++} + /******************************************************************************* + * Packet management utility functions + ******************************************************************************/ +diff -Naurp open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.h open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.h +--- open-iscsi-2.0-872-rc4-bnx2i/iscsiuio/src/unix/nic_utils.h 2011-10-26 07:21:46.000000000 -0500 ++++ open-iscsi-2.0-872-rc4-bnx2i.work/iscsiuio/src/unix/nic_utils.h 2011-10-26 17:55:59.000000000 -0500 +@@ -68,12 +68,15 @@ void nic_fill_ethernet_header(nic_interf + uint16_t ether_type); + + nic_interface_t *nic_find_nic_iface(nic_t * nic, uint16_t vlan_id); ++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(); + diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec index 986c784..0bd39cf 100644 --- a/iscsi-initiator-utils.spec +++ b/iscsi-initiator-utils.spec @@ -3,7 +3,7 @@ Summary: iSCSI daemon and utility programs Name: iscsi-initiator-utils Version: 6.2.0.872 -Release: 30%{?dist} +Release: 31%{?dist} Source0: http://people.redhat.com/mchristi/iscsi/rhel6.0/source/open-iscsi-2.0-872-rc4-bnx2i.tar.gz Source1: iscsid.init Source2: iscsidevs.init @@ -49,8 +49,10 @@ Patch17: iscsi-initiator-utils-fix-ipv6-boot.patch Patch18: iscsi-initiator-utils-Add-Netconfig-support-through-libiscsi.patch # libiscsi offload support Patch19: iscsi-initiator-utils-libiscsi-to-support-offload.patch +# sync iscsiuio to 0.7.0.14g +Patch20: iscsi-initiator-utils-sync-uio-0.7.0.14g.patch # add rhel version info to iscsi tools -Patch20: iscsi-initiator-utils-add-rh-ver.patch +Patch21: iscsi-initiator-utils-add-rh-ver.patch Group: System Environment/Daemons License: GPLv2+ @@ -98,7 +100,8 @@ developing applications that use %{name}. %patch17 -p1 -b .fix-ipv6-boot %patch18 -p1 -b .Add-Netconfig-support-through-libiscsi %patch19 -p1 -b .libiscsi-to-support-offload -%patch20 -p1 -b .add-rh-ver +%patch20 -p1 -b .sync-uio-0.7.0.14g +%patch21 -p1 -b .add-rh-ver %build cd utils/open-isns @@ -224,6 +227,10 @@ fi %{_includedir}/libiscsi.h %changelog +* Tue Oct 25 2011 Mike Christie 6.2.0.872.31 +- 749051 Sync iscsiuio to iscsiuio-0.7.0.14g to fix boot hang + when connection is lost during startup. + * Tue Oct 18 2011 Mike Christie 6.2.0.872.30 - 602959 rotate iscsiuio/brcm_iscsiuio log.