[spp] [PATCH 27/57] spp_vf: update socket creation procedure

x-fn-spp at sl.ntt-tx.co.jp x-fn-spp at sl.ntt-tx.co.jp
Thu Dec 28 05:55:34 CET 2017


From: Hiroyuki Nakamura <nakamura.hioryuki at po.ntt-tx.co.jp>

Update socket socket creation procedure as follows:
* Stop recreating socket spontaneously on failure so the caller can
  decide corresponding action.
* Add socket closing procedure when error occurred.
* Add comments.

Signed-off-by: Daiki Yamashita <yamashita.daiki.z01 at as.ntt-tx.co.jp>
Signed-off-by: Yasufum Ogawa <ogawa.yasufumi at lab.ntt.co.jp>
---
 src/vf/command_conn.c  | 26 ++++++++++++++------------
 src/vf/command_proc.c  |  8 ++++----
 src/vf/string_buffer.h | 48 ++++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 62 insertions(+), 20 deletions(-)

diff --git a/src/vf/command_conn.c b/src/vf/command_conn.c
index edd4d4c..4ac61a2 100644
--- a/src/vf/command_conn.c
+++ b/src/vf/command_conn.c
@@ -43,21 +43,19 @@ spp_connect_to_controller(int *sock)
 		return 0;
 
 	/* create socket */
+	RTE_LOG(INFO, SPP_COMMAND_PROC, "Creating socket...\n");
+	*sock = socket(AF_INET, SOCK_STREAM, 0);
 	if (*sock < 0) {
-		RTE_LOG(INFO, SPP_COMMAND_PROC, "Creating socket...\n");
-		*sock = socket(AF_INET, SOCK_STREAM, 0);
-		if (*sock < 0) {
-			RTE_LOG(ERR, SPP_COMMAND_PROC, 
-					"Cannot create tcp socket. errno=%d\n", errno);
-			return -1;
-		}
-
-		memset(&controller_addr, 0, sizeof(controller_addr));
-		controller_addr.sin_family = AF_INET;
-		controller_addr.sin_addr.s_addr = inet_addr(g_controller_ip);
-		controller_addr.sin_port = htons(g_controller_port);
+		RTE_LOG(ERR, SPP_COMMAND_PROC, 
+				"Cannot create tcp socket. errno=%d\n", errno);
+		return -1;
 	}
 
+	memset(&controller_addr, 0, sizeof(controller_addr));
+	controller_addr.sin_family = AF_INET;
+	controller_addr.sin_addr.s_addr = inet_addr(g_controller_ip);
+	controller_addr.sin_port = htons(g_controller_port);
+
 	/* connect to */
 	RTE_LOG(INFO, SPP_COMMAND_PROC, "Trying to connect ... socket=%d\n", *sock);
 	ret = connect(*sock, (struct sockaddr *)&controller_addr,
@@ -65,6 +63,8 @@ spp_connect_to_controller(int *sock)
 	if (ret < 0) {
 		RTE_LOG(ERR, SPP_COMMAND_PROC,
 				"Cannot connect to controller. errno=%d\n", errno);
+		close(*sock);
+		*sock = -1;
 		return -1;
 	}
 
@@ -129,6 +129,8 @@ spp_send_message(int *sock, const char* message, size_t message_len)
 	ret = send(*sock, message, message_len, 0);
 	if (unlikely(ret == -1)) {
 		RTE_LOG(ERR, SPP_COMMAND_PROC, "Send failure. ret=%d\n", ret);
+		close(*sock);
+		*sock = -1;
 		return -1;
 	}
 
diff --git a/src/vf/command_proc.c b/src/vf/command_proc.c
index 097483c..10e209c 100644
--- a/src/vf/command_proc.c
+++ b/src/vf/command_proc.c
@@ -16,7 +16,7 @@
 #define RTE_LOGTYPE_SPP_COMMAND_PROC RTE_LOGTYPE_USER1
 
 /* request message initial size */
-#define MESSAGE_BUFFER_BLOCK_SIZE 2048
+#define CMD_REQ_BUF_INIT_SIZE 2048
 
 /* command execution result code */
 enum command_result_code {
@@ -112,7 +112,7 @@ create_error_result_object(const char* err_msg)
 			"message", err_msg);
 }
 
-/*  */
+/* append decode result array object to specified object */
 static int
 append_response_decode_results_object(json_t *parent_obj,
 		const struct spp_command_request *request,
@@ -167,7 +167,7 @@ append_response_decode_results_object(json_t *parent_obj,
 	return 0;
 }
 
-/*  */
+/* append command execution result array object to specified object */
 static int
 append_response_command_results_object(json_t *parent_obj,
 		const struct spp_command_request *request,
@@ -391,7 +391,7 @@ spp_command_proc_do(void)
 	static size_t lb_cnt = 0;
 
 	if (unlikely(msgbuf == NULL))
-		msgbuf = spp_strbuf_allocate(MESSAGE_BUFFER_BLOCK_SIZE);
+		msgbuf = spp_strbuf_allocate(CMD_REQ_BUF_INIT_SIZE);
 
 	ret = spp_connect_to_controller(&sock);
 	if (unlikely(ret != 0))
diff --git a/src/vf/string_buffer.h b/src/vf/string_buffer.h
index adc52ef..9879b9d 100644
--- a/src/vf/string_buffer.h
+++ b/src/vf/string_buffer.h
@@ -1,16 +1,56 @@
 #ifndef _STRING_BUFFER_H_
 #define _STRING_BUFFER_H_
 
-/* allocate message buffer */
+/**
+ * allocate string buffer from heap memory.
+ *
+ * @attention allocated memory must free by spp_strbuf_free function.
+ *
+ * @param capacity
+ *  initial buffer size (include null char).
+ *
+ * @retval not-NULL pointer to the allocated memory. 
+ * @retval NULL     error.
+ */
 char* spp_strbuf_allocate(size_t capacity);
 
-/* free message buffer */
+/**
+ * free string buffer.
+ *
+ * @param strbuf
+ *  spp_strbuf_allocate/spp_strbuf_append return value.
+ */
 void spp_strbuf_free(char* strbuf);
 
-/* append message to buffer */
+/**
+ * append string to buffer.
+ *
+ * @param strbuf
+ *  destination string buffer.
+ *  spp_strbuf_allocate/spp_strbuf_append return value.
+ *
+ * @param append
+ *  string to append. normal c-string.
+ *
+ * @param append_len
+ *  length of append string.
+ *
+ * @return if the capacity is enough, the 1st parameter "strbuf", 
+ *         if it is insufficient, a new pointer to the allocated memory.
+ *         in that case, old strbuf is freed in the function.
+ */
 char* spp_strbuf_append(char *strbuf, const char *append, size_t append_len);
 
-/* remove message from front */
+/**
+ * remove string from front.
+ *
+ * @param strbuf
+ *  target string buffer.
+ *  spp_strbuf_allocate/spp_strbuf_append return value.
+ *
+ * @param remove_len
+ *  length of remove.
+ */
 char* spp_strbuf_remove_front(char *strbuf, size_t remove_len);
 
 #endif /* _STRING_BUFFER_H_ */
-- 
1.9.1



More information about the spp mailing list