summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2008-11-26 02:04:54 -0600
committerMike Christie <michaelc@cs.wisc.edu>2008-11-26 05:37:48 -0600
commit8b840585f5b89380113b54123afc17953d39d44e (patch)
tree20365246774bd5d842f670735807c5abe8a10e32 /include
parent55598cfa27966d90c30f243171e17c4905ee2755 (diff)
downloadopen-iscsi-8b840585f5b89380113b54123afc17953d39d44e.tar.gz
ibft: add support to use iscsi_ibft module and log into all portals found in firmware
This adds the ibft sysfs module (iscsi_ibft) parsing support. It was original done by Konard, but I have ported it to use the sysfs.c helpers (add new ones and ported iscsi_sysfs.c too). This patch also modifies iscsistart and iscsiadm to print/log into all the portals found in firmware. It also changes the behavior of iscsiadm -m discovery -t fw so that we create db records for what is found. It is not fully hooked into the iface code, so it will use the different inititor name, but it will not create a iface for it (this means that if you have a record for the same portal that is bound to a iface with a iname you can run into problems).
Diffstat (limited to 'include')
-rw-r--r--include/fw_context.h36
-rw-r--r--include/iscsi_proto.h1
-rw-r--r--include/list.h93
3 files changed, 121 insertions, 9 deletions
diff --git a/include/fw_context.h b/include/fw_context.h
index 47ac6ae..f522449 100644
--- a/include/fw_context.h
+++ b/include/fw_context.h
@@ -21,26 +21,44 @@
#ifndef FWPARAM_CONTEXT_H_
#define FWPARAM_CONTEXT_H_
+#include <net/if.h>
+
+#include "iscsi_proto.h"
+#include "list.h"
+#include "auth.h"
+
struct boot_context {
-#define IQNSZ (223+1)
+ struct list_head list;
+
+ /* target settings */
int target_port;
- char initiatorname[IQNSZ];
- char targetname[IQNSZ];
+ char targetname[TARGET_NAME_MAXLEN + 1];
char target_ipaddr[32];
- char chap_name[127];
- char chap_password[16];
- char chap_name_in[127];
- char chap_password_in[16];
- char iface[42];
+ char chap_name[AUTH_STR_MAX_LEN];
+ char chap_password[AUTH_STR_MAX_LEN];
+ char chap_name_in[AUTH_STR_MAX_LEN];
+ char chap_password_in[AUTH_STR_MAX_LEN];
+
+ /* initiator settings */
+ char isid[10];
+ char initiatorname[TARGET_NAME_MAXLEN + 1];
+
+ /* network settings */
+ char dhcp[18];
+ char iface[IF_NAMESIZE];
char mac[18];
char ipaddr[18];
+ char gateway[18];
+ char primary_dns[18];
+ char secondary_dns[18];
char mask[18];
char lun[17];
char vlan[15];
- char isid[10];
};
extern int fw_get_entry(struct boot_context *context, const char *filepath);
extern void fw_print_entry(struct boot_context *context);
+extern int fw_get_targets(struct list_head *list);
+extern void fw_free_targets(struct list_head *list);
#endif /* FWPARAM_CONTEXT_H_ */
diff --git a/include/iscsi_proto.h b/include/iscsi_proto.h
index aa32e1c..0225ef3 100644
--- a/include/iscsi_proto.h
+++ b/include/iscsi_proto.h
@@ -21,6 +21,7 @@
#ifndef ISCSI_PROTO_H
#define ISCSI_PROTO_H
+#include <stdint.h>
#include <linux/types.h>
#define ISCSI_DRAFT20_VERSION 0x00
diff --git a/include/list.h b/include/list.h
new file mode 100644
index 0000000..bbf3425
--- /dev/null
+++ b/include/list.h
@@ -0,0 +1,93 @@
+#ifndef __LIST_H__
+#define __LIST_H__
+
+#include <stddef.h>
+/* taken from linux kernel */
+
+#undef offsetof
+#ifdef __compiler_offsetof
+#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
+#else
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#endif
+
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
+struct list_head {
+ struct list_head *next, *prev;
+};
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+ struct list_head name = LIST_HEAD_INIT(name)
+
+static inline void INIT_LIST_HEAD(struct list_head *list)
+{
+ list->next = list;
+ list->prev = list;
+}
+
+static inline int list_empty(const struct list_head *head)
+{
+ return head->next == head;
+}
+
+#define list_entry(ptr, type, member) \
+ container_of(ptr, type, member)
+
+#define list_for_each(pos, head) \
+ for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define list_for_each_entry(pos, head, member) \
+ for (pos = list_entry((head)->next, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = list_entry(pos->member.next, typeof(*pos), member))
+
+#define list_for_each_entry_safe(pos, n, head, member) \
+ for (pos = list_entry((head)->next, typeof(*pos), member), \
+ n = list_entry(pos->member.next, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = n, n = list_entry(n->member.next, typeof(*n), member))
+
+static inline void __list_add(struct list_head *new,
+ struct list_head *prev,
+ struct list_head *next)
+{
+ next->prev = new;
+ new->next = next;
+ new->prev = prev;
+ prev->next = new;
+}
+
+static inline void list_add(struct list_head *new, struct list_head *head)
+{
+ __list_add(new, head, head->next);
+}
+
+static inline void list_add_tail(struct list_head *new, struct list_head *head)
+{
+ __list_add(new, head->prev, head);
+}
+
+static inline void __list_del(struct list_head * prev, struct list_head * next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+static inline void list_del(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+ entry->next = entry->prev = NULL;
+}
+
+static inline void list_del_init(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+ INIT_LIST_HEAD(entry);
+}
+
+#endif