From 9378a39ddc1be3a43712803c8dabae305b88572e Mon Sep 17 00:00:00 2001 From: Roy Shterman Date: Fri, 27 May 2016 18:47:14 +0300 Subject: [PATCH] Libiscsi: Adding transport layer into all library utilities lib/init: initializing connection transport lib/socket: Adding function to initialize tcp transport. future commits will include adding iSER transport layer, so each transport option will has it's own template of functions. all_utils: All utils stay the same, in future iSER commits in case of iSER transport we will override tcp_transport in iscsi_context. connect: adding transport initialization when creating context include/iscsi-private: Adding iscsi_transport attribute in iscsi_context Signed-off-by: Roy Shterman Make iscsi_init_tcp_transport private Signed-off-by: Ronnie Sahlberg --- include/iscsi-private.h | 16 +++++++++++++++ include/iscsi.h | 15 ++++++++++++++ lib/init.c | 43 +++++++++++++++++++++++++++++++++++++++-- lib/libiscsi.def | 1 + lib/libiscsi.syms | 1 + lib/socket.c | 8 ++++++++ 6 files changed, 82 insertions(+), 2 deletions(-) diff --git a/include/iscsi-private.h b/include/iscsi-private.h index b64e491..1fec387 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -66,7 +66,21 @@ void iscsi_free_iscsi_inqueue(struct iscsi_context *iscsi, struct iscsi_in_pdu * /* max length of chap challange */ #define MAX_CHAP_C_LENGTH 2048 +struct iscsi_transport { + + int temp; +}; + +struct tcp_transport { + + struct iscsi_transport t; + +}; + struct iscsi_context { + + struct iscsi_transport *t; + enum iscsi_transport_type transport; char initiator_name[MAX_STRING_SIZE+1]; char target_name[MAX_STRING_SIZE+1]; char target_address[MAX_STRING_SIZE+1]; /* If a redirect */ @@ -372,6 +386,8 @@ void iscsi_timeout_scan(struct iscsi_context *iscsi); void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, void *private_data); +void iscsi_init_tcp_transport(struct iscsi_context *iscsi); + #ifdef __cplusplus } #endif diff --git a/include/iscsi.h b/include/iscsi.h index 769806d..20f7d62 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -50,6 +50,9 @@ struct sockaddr; #define ISCSI_PORTAL_URL_SYNTAX "\"iscsi://[[%]@]" \ "[:]\"" +enum iscsi_transport_type { + TCP_TRANSPORT = 0 +}; EXTERN void iscsi_set_cache_allocations(struct iscsi_context *iscsi, int ca); @@ -244,6 +247,18 @@ EXTERN struct iscsi_context *iscsi_create_context(const char *initiator_name); */ EXTERN int iscsi_destroy_context(struct iscsi_context *iscsi); +/* + * Sets and initializes the transport type for a context. + * TCP_TRANSPORT is the default and is available on all platforms. + * ISER_TRANSPORT is conditionally supported on Linux where available. + * + * Returns: + * 0: success + * <0: error + */ +EXTERN int iscsi_init_transport(struct iscsi_context *iscsi, + enum iscsi_transport_type transport); + /* * Set an optional alias name to identify with when connecting to the target * diff --git a/lib/init.c b/lib/init.c index f06d216..3ef035b 100644 --- a/lib/init.c +++ b/lib/init.c @@ -34,6 +34,39 @@ #include "iscsi-private.h" #include "slist.h" + +/** + * Initialize transport type of session + */ + +int iscsi_init_transport(struct iscsi_context *iscsi, + enum iscsi_transport_type transport) { + struct tcp_transport *tcp_transport; + + if (iscsi->t) { + iscsi_free(iscsi, iscsi->t); + iscsi->t = NULL; + } + iscsi->transport = transport; + + switch (iscsi->transport) { + case TCP_TRANSPORT: + tcp_transport = iscsi_malloc(iscsi, sizeof(struct tcp_transport)); + if (tcp_transport == NULL) { + iscsi_set_error(iscsi, "Couldn't allocate memory for transport\n"); + return -1; + } + iscsi->t = &tcp_transport->t; + iscsi_init_tcp_transport(iscsi); + break; + default: + iscsi_set_error(iscsi, "Unfamiliar transport type"); + return -1; + } + + return 0; +} + /** * Whether or not the internal memory allocator caches allocations. Disable * memory allocation caching to improve the accuracy of Valgrind reports. @@ -122,13 +155,19 @@ iscsi_create_context(const char *initiator_name) if (iscsi == NULL) { return NULL; } - + memset(iscsi, 0, sizeof(struct iscsi_context)); + /* initalize transport of context */ + if (iscsi_init_transport(iscsi, TCP_TRANSPORT)) { + iscsi_set_error(iscsi, "Failed allocating transport"); + return NULL; + } + strncpy(iscsi->initiator_name,initiator_name,MAX_STRING_SIZE); iscsi->fd = -1; - + srand(time(NULL) ^ getpid() ^ (uint32_t) ((uintptr_t) iscsi)); /* initialize to a "random" isid */ diff --git a/lib/libiscsi.def b/lib/libiscsi.def index b81cb31..f9de83d 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -16,6 +16,7 @@ iscsi_get_lba_status_sync iscsi_get_lba_status_task iscsi_get_target_address iscsi_get_nops_in_flight +iscsi_init_transport iscsi_inquiry_sync iscsi_inquiry_task iscsi_is_logged_in diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index 3320e0e..628603f 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -14,6 +14,7 @@ iscsi_get_lba_status_sync iscsi_get_lba_status_task iscsi_get_target_address iscsi_get_nops_in_flight +iscsi_init_transport iscsi_inquiry_sync iscsi_inquiry_task iscsi_is_logged_in diff --git a/lib/socket.c b/lib/socket.c index 59e7026..06ced54 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -72,6 +72,14 @@ #include "slist.h" static uint32_t iface_rr = 0; +struct iscsi_transport; + +void iscsi_init_tcp_transport(struct iscsi_context *iscsi) +{ + iscsi->t = NULL; + + return; +} void iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)