The uIP user daemon is now using the iface file to set the IP address.
This will be broadcasted to the uIP daemon when a iSCSI connected is
initiated.

Signed-off-by: Benjamin Li <be...@broadcom.com>
---
 usr/Makefile       |    2 +-
 usr/initiator.c    |    5 +++
 usr/transport.c    |    5 +++
 usr/transport.h    |    3 ++
 usr/uip_mgmt_ipc.c |   41 +++++++++++++++++++++++++++
 usr/uip_mgmt_ipc.h |   71 +++++++++++++++++++++++++++++++++++++++++++++++
 usr/util.c         |   78 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 usr/util.h         |    3 ++
 8 files changed, 204 insertions(+), 4 deletions(-)
 create mode 100644 usr/uip_mgmt_ipc.c
 create mode 100644 usr/uip_mgmt_ipc.h

diff --git a/usr/Makefile b/usr/Makefile
index 023e491..321ea34 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -41,7 +41,7 @@ ISCSI_LIB_SRCS = util.o io.o auth.o login.o log.o md5.o 
sha1.o iface.o idbm.o sy
 COMMON_SRCS =  $(ISCSI_LIB_SRCS)
 # core initiator files
 INITIATOR_SRCS = initiator.o scsi.o actor.o event_poll.o mgmt_ipc.o isns.o \
-               transport.o
+               transport.o uip_mgmt_ipc.o
 # fw boot files
 FW_BOOT_SRCS = $(wildcard ../utils/fwparam_ibft/*.o)
 
diff --git a/usr/initiator.c b/usr/initiator.c
index 4a56347..60d1f5a 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -2066,6 +2066,11 @@ static int iface_set_param(struct iscsi_transport *t, 
struct iface_rec *iface,
                  iface->name, iface->netdev, iface->ipaddress,
                  iface->hwaddress, iface->transport_name);
 
+       if(t->template->set_net_config) {
+               rc = t->template->set_net_config(t, iface, session);
+               return rc;
+       }
+
        /* if we need to set the ip addr then set all the iface net settings */
        if (!iface_is_bound_by_ipaddr(iface))
                return 0;
diff --git a/usr/transport.c b/usr/transport.c
index 07b61db..12d3620 100644
--- a/usr/transport.c
+++ b/usr/transport.c
@@ -25,12 +25,14 @@
 #include "log.h"
 #include "util.h"
 #include "iscsi_sysfs.h"
+#include "uip_mgmt_ipc.h"
 
 struct iscsi_transport_template iscsi_tcp = {
        .name           = "tcp",
        .ep_connect     = iscsi_io_tcp_connect,
        .ep_poll        = iscsi_io_tcp_poll,
        .ep_disconnect  = iscsi_io_tcp_disconnect,
+       .set_net_config = NULL,
 };
 
 struct iscsi_transport_template iscsi_iser = {
@@ -39,6 +41,7 @@ struct iscsi_transport_template iscsi_iser = {
        .ep_connect     = ktransport_ep_connect,
        .ep_poll        = ktransport_ep_poll,
        .ep_disconnect  = ktransport_ep_disconnect,
+       .set_net_config = NULL,
 };
 
 struct iscsi_transport_template cxgb3i = {
@@ -46,6 +49,7 @@ struct iscsi_transport_template cxgb3i = {
        .ep_connect     = ktransport_ep_connect,
        .ep_poll        = ktransport_ep_poll,
        .ep_disconnect  = ktransport_ep_disconnect,
+       .set_net_config = NULL,
 };
 
 struct iscsi_transport_template bnx2i = {
@@ -53,6 +57,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 qla4xxx = {
diff --git a/usr/transport.h b/usr/transport.h
index 402747f..027c031 100644
--- a/usr/transport.h
+++ b/usr/transport.h
@@ -29,6 +29,9 @@ struct iscsi_transport_template {
        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);
+       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..a34a943
--- /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 <string.h>
+
+#include "log.h"
+#include "uip_mgmt_ipc.h"
+#include "util.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..dd49c0b
--- /dev/null
+++ b/usr/uip_mgmt_ipc.h
@@ -0,0 +1,71 @@
+/*
+ * 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,
+        ISCISD_UIP_MGMT_IPC_ERR                    = 1,
+        ISCISD_UIP_MGMT_IPC_ERR_NOT_FOUND          = 2,
+        ISCISD_UIP_MGMT_IPC_ERR_NOMEM              = 3,
+} 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/usr/util.c b/usr/util.c
index 5b31e89..4c77e9a 100644
--- a/usr/util.c
+++ b/usr/util.c
@@ -22,6 +22,7 @@
 #include "idbm.h"
 #include "iface.h"
 #include "session_info.h"
+#include "uip_mgmt_ipc.h"
 
 void daemon_init(void)
 {
@@ -121,7 +122,7 @@ int increase_max_files(void)
 
 #define MAXSLEEP 128
 
-static mgmt_ipc_err_e iscsid_connect(int *fd)
+static mgmt_ipc_err_e ipc_connect(int *fd, char *unix_sock_name)
 {
        int nsec;
        struct sockaddr_un addr;
@@ -134,8 +135,8 @@ static mgmt_ipc_err_e iscsid_connect(int *fd)
 
        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, unix_sock_name,
+               strlen(unix_sock_name));
        /*
         * Trying to connect with exponential backoff
         */
@@ -159,6 +160,11 @@ static mgmt_ipc_err_e iscsid_connect(int *fd)
        return MGMT_IPC_ERR_ISCSID_NOTCONN;
 }
 
+static mgmt_ipc_err_e iscsid_connect(int *fd)
+{
+       return ipc_connect(fd, ISCSIADM_NAMESPACE);
+}
+
 mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req)
 {
        int err;
@@ -255,6 +261,72 @@ int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid)
        return iscsid_req_wait(cmd, fd);
 }
 
+static mgmt_ipc_err_e uip_connect(int *fd)
+{
+       return ipc_connect(fd, ISCSID_UIP_NAMESPACE);
+}
+
+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;
+       }
+
+       /*  Send the data to uIP */
+       if ((err = write(fd, buf, buf_len)) != buf_len) {
+               log_error("got write error (%d/%d), daemon died?",
+                       err, errno);
+               close(fd);
+               return -EIO;
+       }
+
+       /*  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 != 0) {
+               log_error("could not set uip broadcast to non-blocking: %d",
+                         errno);
+               close(fd);
+               return -EIO;
+       }
+
+#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\n",
+                                 buf_len);
+                       break;
+               } else if((err == -1) && (errno == EAGAIN)) {
+                       usleep(250000);
+                       continue;
+               } else {
+                       log_error("Could not read response (%d/%d), daemon 
died?",
+                                 err, errno);
+                       break;
+               }
+       }
+
+       if(count == MAX_UIP_BROADCAST_READ_TRIES)
+               log_error("Could not broadcast to uIP");
+
+       close(fd);
+
+       return 0;
+}
+
 void idbm_node_setup_defaults(node_rec_t *rec)
 {
        int i;
diff --git a/usr/util.h b/usr/util.h
index b88fd65..46ecce9 100644
--- a/usr/util.h
+++ b/usr/util.h
@@ -31,4 +31,7 @@ extern int __iscsi_match_session(struct node_rec *rec, char 
*targetname,
                                 char *address, int port,
                                 struct iface_rec *iface);
 
+extern int uip_broadcast(void *buf, size_t buf_len);
+
+
 #endif
-- 
1.6.2.4



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-iscsi@googlegroups.com
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/open-iscsi
-~----------~----~----~----~------~----~------~--~---

Reply via email to