xiaoxiang781216 commented on code in PR #3098:
URL: https://github.com/apache/nuttx-apps/pull/3098#discussion_r2152241503


##########
system/fastboot/fastboot.c:
##########
@@ -1105,8 +1177,175 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
     }
 }
 
+static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,
+                                    FAR void *buf, size_t len)
+{
+  return fastboot_read(ctx->usbdev_in, buf, len);
+}
+
+static int fastboot_usbdev_write(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  return fastboot_write(ctx->usbdev_out, buf, len);
+}
+#endif
+
+#ifdef CONFIG_NET_TCP
+static int fastboot_tcp_initialize(FAR struct fastboot_ctx_s *ctx)
+{
+  struct sockaddr_in addr;
+
+  ctx->server_fd = socket(AF_INET, SOCK_STREAM, 0);
+  if (ctx->server_fd < 0)
+    {
+      fb_err("create socket failed %d", errno);
+      return -errno;
+    }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  addr.sin_port = htons(FASTBOOT_TCP_PORT);
+  if (bind(ctx->server_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
+    {
+      fb_err("bind() failed %d", errno);
+      return -errno;
+    }
+
+  if (listen(ctx->server_fd, 1) < 0)
+    {
+      fb_err("listen() failed %d", errno);
+      return -errno;
+    }
+
+  return 0;
+}
+
+static void fastboot_tcp_disconn(FAR struct fastboot_ctx_s *ctx)
+{
+  close(ctx->conn_fd);
+  ctx->conn_fd = -1;
+}
+
+static void fastboot_tcp_deinit(FAR struct fastboot_ctx_s *ctx)
+{
+  fastboot_tcp_disconn(ctx);
+  close(ctx->server_fd);
+  ctx->server_fd = -1;
+}
+
+static ssize_t fastboot_read_all(int fd, FAR void *buf, size_t len)
+{
+  size_t total = 0;
+  ssize_t nread;
+
+  while (total < len)
+    {
+      nread = fastboot_read(fd, buf, len);
+      if (nread <= 0)
+        {
+          if (total == 0)
+            {
+              return nread;
+            }
+
+          break;
+        }
+
+      total += nread;
+    }
+
+  return total;
+}
+
+static ssize_t fastboot_tcp_read(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  char buff[FASTBOOT_TCP_HANDSHAKE_LEN];
+  uint64_t data_size;
+  ssize_t nread;
+
+  if (ctx->conn_fd == -1)
+    {
+      while (1)
+        {
+          /* accept a connection, not care the address of the peer socket */
+
+          ctx->conn_fd = accept(ctx->server_fd, NULL, 0);
+          if (ctx->conn_fd < 0)
+            {
+              continue;
+            }
+
+          /* handshake */
+
+          if ((fastboot_read_all(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != FASTBOOT_TCP_HANDSHAKE_LEN) ||

Review Comment:
   align to (



##########
system/fastboot/fastboot.c:
##########
@@ -217,6 +267,28 @@ static const struct memory_region_s g_memory_region[] =
 };
 #endif
 
+#ifdef CONFIG_USBFASTBOOT
+struct fastboot_transport_s g_transport_usb =
+{
+  .init    = fastboot_usbdev_initialize,
+  .deinit  = fastboot_usbdev_deinit,
+  .read    = fastboot_usbdev_read,
+  .write   = fastboot_usbdev_write,
+};
+#endif
+
+#ifdef CONFIG_NET_TCP
+struct fastboot_transport_s g_transport_tcp =
+{
+  .init    = fastboot_tcp_initialize,
+  .deinit  = fastboot_tcp_deinit,
+  .read    = fastboot_tcp_read,
+  .write   = fastboot_tcp_write,
+};
+
+static uint64_t g_read_left;

Review Comment:
   why need global variable



##########
system/fastboot/fastboot.c:
##########
@@ -1105,8 +1177,175 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
     }
 }
 
+static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,
+                                    FAR void *buf, size_t len)
+{
+  return fastboot_read(ctx->usbdev_in, buf, len);
+}
+
+static int fastboot_usbdev_write(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  return fastboot_write(ctx->usbdev_out, buf, len);
+}
+#endif
+
+#ifdef CONFIG_NET_TCP
+static int fastboot_tcp_initialize(FAR struct fastboot_ctx_s *ctx)
+{
+  struct sockaddr_in addr;
+
+  ctx->server_fd = socket(AF_INET, SOCK_STREAM, 0);
+  if (ctx->server_fd < 0)
+    {
+      fb_err("create socket failed %d", errno);
+      return -errno;
+    }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  addr.sin_port = htons(FASTBOOT_TCP_PORT);
+  if (bind(ctx->server_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
+    {
+      fb_err("bind() failed %d", errno);
+      return -errno;
+    }
+
+  if (listen(ctx->server_fd, 1) < 0)
+    {
+      fb_err("listen() failed %d", errno);
+      return -errno;
+    }
+
+  return 0;
+}
+
+static void fastboot_tcp_disconn(FAR struct fastboot_ctx_s *ctx)
+{
+  close(ctx->conn_fd);
+  ctx->conn_fd = -1;
+}
+
+static void fastboot_tcp_deinit(FAR struct fastboot_ctx_s *ctx)
+{
+  fastboot_tcp_disconn(ctx);
+  close(ctx->server_fd);
+  ctx->server_fd = -1;
+}
+
+static ssize_t fastboot_read_all(int fd, FAR void *buf, size_t len)
+{
+  size_t total = 0;
+  ssize_t nread;
+
+  while (total < len)
+    {
+      nread = fastboot_read(fd, buf, len);
+      if (nread <= 0)
+        {
+          if (total == 0)
+            {
+              return nread;
+            }
+
+          break;
+        }
+
+      total += nread;
+    }
+
+  return total;
+}
+
+static ssize_t fastboot_tcp_read(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  char buff[FASTBOOT_TCP_HANDSHAKE_LEN];
+  uint64_t data_size;
+  ssize_t nread;
+
+  if (ctx->conn_fd == -1)
+    {
+      while (1)
+        {
+          /* accept a connection, not care the address of the peer socket */
+
+          ctx->conn_fd = accept(ctx->server_fd, NULL, 0);
+          if (ctx->conn_fd < 0)
+            {
+              continue;
+            }
+
+          /* handshake */
+
+          if ((fastboot_read_all(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != FASTBOOT_TCP_HANDSHAKE_LEN) ||
+              (strncmp(buff, FASTBOOT_TCP_HANDSHAKE,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != 0) ||
+              (fastboot_write(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) < 0))
+            {
+              fb_err("%s err handshake %d", __func__, errno);
+              fastboot_tcp_disconn(ctx);
+              continue;
+            }
+
+          break;
+        }
+    }
+
+  if (g_read_left == 0)
+    {
+      nread = fastboot_read_all(ctx->conn_fd, &data_size, sizeof(data_size));
+      if (nread != sizeof(data_size))
+        {
+          /* as normal, end of file if client has closed the connection */
+
+          if (nread != 0)
+            {
+              fb_err("%s err read data_size %zd %d", __func__, nread, errno);
+            }
+
+          fastboot_tcp_disconn(ctx);
+          return nread;
+        }
+
+      g_read_left = be64toh(data_size);
+    }
+
+  if (len > g_read_left)
+    {
+      len = g_read_left;
+    }
+
+  nread = fastboot_read(ctx->conn_fd, buf, len);
+  if (nread <= 0)
+    {
+      fastboot_tcp_disconn(ctx);
+      g_read_left = 0;
+    }
+  else
+    {
+      g_read_left -= nread;
+    }
+
+  return nread;
+}
+
+static int fastboot_tcp_write(FAR struct fastboot_ctx_s *ctx,
+                              FAR void *buf, size_t len)
+{
+  uint64_t data_size = htobe64(len);
+  return (fastboot_write(ctx->conn_fd, &data_size, sizeof(data_size)) < 0) ?

Review Comment:
   split to two statement



##########
system/fastboot/fastboot.c:
##########
@@ -122,10 +139,20 @@ struct fastboot_file_s
   off_t offset;
 };
 
+struct fastboot_transport_s
+{
+  int (*init)(FAR struct fastboot_ctx_s *);
+  void (*deinit)(FAR struct fastboot_ctx_s *);
+  ssize_t (*read)(FAR struct fastboot_ctx_s *, FAR void *, size_t);
+  int (*write)(FAR struct fastboot_ctx_s *, FAR void *, size_t);
+};
+
 struct fastboot_ctx_s
 {
   int usbdev_in;
   int usbdev_out;
+  int server_fd;  /* fd for the TCP socket */
+  int conn_fd;    /* fd for the accepted socket */

Review Comment:
   let's generalize usbdev_in/usbdev_out and server_fd/conn_fd, so we can reuse 
the same fields



##########
system/fastboot/fastboot.c:
##########
@@ -1105,8 +1177,175 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
     }
 }
 
+static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,
+                                    FAR void *buf, size_t len)
+{
+  return fastboot_read(ctx->usbdev_in, buf, len);
+}
+
+static int fastboot_usbdev_write(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  return fastboot_write(ctx->usbdev_out, buf, len);
+}
+#endif
+
+#ifdef CONFIG_NET_TCP
+static int fastboot_tcp_initialize(FAR struct fastboot_ctx_s *ctx)
+{
+  struct sockaddr_in addr;
+
+  ctx->server_fd = socket(AF_INET, SOCK_STREAM, 0);
+  if (ctx->server_fd < 0)
+    {
+      fb_err("create socket failed %d", errno);
+      return -errno;
+    }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  addr.sin_port = htons(FASTBOOT_TCP_PORT);
+  if (bind(ctx->server_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
+    {
+      fb_err("bind() failed %d", errno);
+      return -errno;
+    }
+
+  if (listen(ctx->server_fd, 1) < 0)
+    {
+      fb_err("listen() failed %d", errno);
+      return -errno;
+    }
+
+  return 0;
+}
+
+static void fastboot_tcp_disconn(FAR struct fastboot_ctx_s *ctx)
+{
+  close(ctx->conn_fd);
+  ctx->conn_fd = -1;
+}
+
+static void fastboot_tcp_deinit(FAR struct fastboot_ctx_s *ctx)
+{
+  fastboot_tcp_disconn(ctx);
+  close(ctx->server_fd);
+  ctx->server_fd = -1;
+}
+
+static ssize_t fastboot_read_all(int fd, FAR void *buf, size_t len)
+{
+  size_t total = 0;
+  ssize_t nread;
+
+  while (total < len)
+    {
+      nread = fastboot_read(fd, buf, len);
+      if (nread <= 0)
+        {
+          if (total == 0)
+            {
+              return nread;
+            }
+
+          break;
+        }
+
+      total += nread;
+    }
+
+  return total;
+}
+
+static ssize_t fastboot_tcp_read(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  char buff[FASTBOOT_TCP_HANDSHAKE_LEN];
+  uint64_t data_size;
+  ssize_t nread;
+
+  if (ctx->conn_fd == -1)
+    {
+      while (1)
+        {
+          /* accept a connection, not care the address of the peer socket */
+
+          ctx->conn_fd = accept(ctx->server_fd, NULL, 0);
+          if (ctx->conn_fd < 0)
+            {
+              continue;
+            }
+
+          /* handshake */
+
+          if ((fastboot_read_all(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != FASTBOOT_TCP_HANDSHAKE_LEN) ||
+              (strncmp(buff, FASTBOOT_TCP_HANDSHAKE,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != 0) ||
+              (fastboot_write(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) < 0))
+            {
+              fb_err("%s err handshake %d", __func__, errno);
+              fastboot_tcp_disconn(ctx);
+              continue;
+            }
+
+          break;
+        }
+    }
+
+  if (g_read_left == 0)
+    {
+      nread = fastboot_read_all(ctx->conn_fd, &data_size, sizeof(data_size));
+      if (nread != sizeof(data_size))
+        {
+          /* as normal, end of file if client has closed the connection */
+
+          if (nread != 0)
+            {
+              fb_err("%s err read data_size %zd %d", __func__, nread, errno);
+            }
+
+          fastboot_tcp_disconn(ctx);
+          return nread;
+        }
+
+      g_read_left = be64toh(data_size);
+    }
+
+  if (len > g_read_left)
+    {
+      len = g_read_left;
+    }
+
+  nread = fastboot_read(ctx->conn_fd, buf, len);
+  if (nread <= 0)
+    {
+      fastboot_tcp_disconn(ctx);
+      g_read_left = 0;
+    }
+  else
+    {
+      g_read_left -= nread;
+    }
+
+  return nread;
+}
+
+static int fastboot_tcp_write(FAR struct fastboot_ctx_s *ctx,
+                              FAR void *buf, size_t len)
+{
+  uint64_t data_size = htobe64(len);
+  return (fastboot_write(ctx->conn_fd, &data_size, sizeof(data_size)) < 0) ?
+         ERROR:

Review Comment:
   why not read the real error code



##########
system/fastboot/fastboot.c:
##########
@@ -1105,8 +1177,175 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
     }
 }
 
+static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,
+                                    FAR void *buf, size_t len)
+{
+  return fastboot_read(ctx->usbdev_in, buf, len);
+}
+
+static int fastboot_usbdev_write(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  return fastboot_write(ctx->usbdev_out, buf, len);
+}
+#endif
+
+#ifdef CONFIG_NET_TCP
+static int fastboot_tcp_initialize(FAR struct fastboot_ctx_s *ctx)
+{
+  struct sockaddr_in addr;
+
+  ctx->server_fd = socket(AF_INET, SOCK_STREAM, 0);
+  if (ctx->server_fd < 0)
+    {
+      fb_err("create socket failed %d", errno);
+      return -errno;
+    }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  addr.sin_port = htons(FASTBOOT_TCP_PORT);
+  if (bind(ctx->server_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
+    {
+      fb_err("bind() failed %d", errno);
+      return -errno;
+    }
+
+  if (listen(ctx->server_fd, 1) < 0)
+    {
+      fb_err("listen() failed %d", errno);
+      return -errno;
+    }
+
+  return 0;
+}
+
+static void fastboot_tcp_disconn(FAR struct fastboot_ctx_s *ctx)
+{
+  close(ctx->conn_fd);
+  ctx->conn_fd = -1;
+}
+
+static void fastboot_tcp_deinit(FAR struct fastboot_ctx_s *ctx)
+{
+  fastboot_tcp_disconn(ctx);
+  close(ctx->server_fd);
+  ctx->server_fd = -1;
+}
+
+static ssize_t fastboot_read_all(int fd, FAR void *buf, size_t len)
+{
+  size_t total = 0;
+  ssize_t nread;
+
+  while (total < len)
+    {
+      nread = fastboot_read(fd, buf, len);
+      if (nread <= 0)
+        {
+          if (total == 0)
+            {
+              return nread;
+            }
+
+          break;
+        }
+
+      total += nread;
+    }
+
+  return total;
+}
+
+static ssize_t fastboot_tcp_read(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  char buff[FASTBOOT_TCP_HANDSHAKE_LEN];
+  uint64_t data_size;
+  ssize_t nread;
+
+  if (ctx->conn_fd == -1)
+    {
+      while (1)
+        {
+          /* accept a connection, not care the address of the peer socket */
+
+          ctx->conn_fd = accept(ctx->server_fd, NULL, 0);
+          if (ctx->conn_fd < 0)
+            {
+              continue;
+            }
+
+          /* handshake */
+
+          if ((fastboot_read_all(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != FASTBOOT_TCP_HANDSHAKE_LEN) ||
+              (strncmp(buff, FASTBOOT_TCP_HANDSHAKE,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != 0) ||
+              (fastboot_write(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) < 0))
+            {
+              fb_err("%s err handshake %d", __func__, errno);
+              fastboot_tcp_disconn(ctx);
+              continue;
+            }
+
+          break;
+        }
+    }
+
+  if (g_read_left == 0)
+    {
+      nread = fastboot_read_all(ctx->conn_fd, &data_size, sizeof(data_size));
+      if (nread != sizeof(data_size))
+        {
+          /* as normal, end of file if client has closed the connection */
+
+          if (nread != 0)
+            {
+              fb_err("%s err read data_size %zd %d", __func__, nread, errno);
+            }
+
+          fastboot_tcp_disconn(ctx);
+          return nread;
+        }
+
+      g_read_left = be64toh(data_size);

Review Comment:
   let's move to ctx



##########
system/fastboot/fastboot.c:
##########
@@ -1105,8 +1177,175 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
     }
 }
 
+static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,
+                                    FAR void *buf, size_t len)
+{
+  return fastboot_read(ctx->usbdev_in, buf, len);
+}
+
+static int fastboot_usbdev_write(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  return fastboot_write(ctx->usbdev_out, buf, len);
+}
+#endif
+
+#ifdef CONFIG_NET_TCP
+static int fastboot_tcp_initialize(FAR struct fastboot_ctx_s *ctx)
+{
+  struct sockaddr_in addr;
+
+  ctx->server_fd = socket(AF_INET, SOCK_STREAM, 0);
+  if (ctx->server_fd < 0)
+    {
+      fb_err("create socket failed %d", errno);
+      return -errno;
+    }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  addr.sin_port = htons(FASTBOOT_TCP_PORT);
+  if (bind(ctx->server_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
+    {
+      fb_err("bind() failed %d", errno);
+      return -errno;
+    }
+
+  if (listen(ctx->server_fd, 1) < 0)
+    {
+      fb_err("listen() failed %d", errno);
+      return -errno;
+    }
+
+  return 0;
+}
+
+static void fastboot_tcp_disconn(FAR struct fastboot_ctx_s *ctx)
+{
+  close(ctx->conn_fd);
+  ctx->conn_fd = -1;
+}
+
+static void fastboot_tcp_deinit(FAR struct fastboot_ctx_s *ctx)
+{
+  fastboot_tcp_disconn(ctx);
+  close(ctx->server_fd);
+  ctx->server_fd = -1;
+}
+
+static ssize_t fastboot_read_all(int fd, FAR void *buf, size_t len)
+{
+  size_t total = 0;
+  ssize_t nread;
+
+  while (total < len)
+    {
+      nread = fastboot_read(fd, buf, len);
+      if (nread <= 0)
+        {
+          if (total == 0)
+            {
+              return nread;
+            }
+
+          break;
+        }
+
+      total += nread;
+    }
+
+  return total;
+}
+
+static ssize_t fastboot_tcp_read(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  char buff[FASTBOOT_TCP_HANDSHAKE_LEN];
+  uint64_t data_size;
+  ssize_t nread;
+
+  if (ctx->conn_fd == -1)
+    {
+      while (1)
+        {
+          /* accept a connection, not care the address of the peer socket */
+
+          ctx->conn_fd = accept(ctx->server_fd, NULL, 0);
+          if (ctx->conn_fd < 0)
+            {
+              continue;
+            }
+
+          /* handshake */
+
+          if ((fastboot_read_all(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != FASTBOOT_TCP_HANDSHAKE_LEN) ||
+              (strncmp(buff, FASTBOOT_TCP_HANDSHAKE,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != 0) ||

Review Comment:
   ditto



##########
system/fastboot/fastboot.c:
##########
@@ -937,12 +1008,12 @@ static void fastboot_command_loop(FAR struct 
fastboot_ctx_s *context)
       size_t ncmds = nitems(g_fast_cmd);
       size_t index;
 
-      ssize_t r = fastboot_read(context->usbdev_in,
-                                buffer, FASTBOOT_MSG_LEN);
+      ssize_t r = context->transport->read(context, buffer,
+                                           FASTBOOT_MSG_LEN);
       if (r < 0)
         {
-          fb_err("USB read error\n");
-          break;
+          fb_err("fastboot transport read() %zd %d\n", r, errno);

Review Comment:
   don't touch errno, use r instead



##########
system/fastboot/fastboot.c:
##########
@@ -1115,6 +1354,12 @@ static void fastboot_context_initialize(FAR struct 
fastboot_ctx_s *ctx)
   ctx->total_imgsize   = 0;
   ctx->varlist         = NULL;
   ctx->wait_ms         = 0;
+#if   defined(CONFIG_USBFASTBOOT)

Review Comment:
   can we support both server if usb and tcp exist at the same time



##########
system/fastboot/fastboot.c:
##########
@@ -1105,8 +1177,175 @@ static void fastboot_usbdev_deinit(FAR struct 
fastboot_ctx_s *ctx)
     }
 }
 
+static ssize_t fastboot_usbdev_read(FAR struct fastboot_ctx_s *ctx,
+                                    FAR void *buf, size_t len)
+{
+  return fastboot_read(ctx->usbdev_in, buf, len);
+}
+
+static int fastboot_usbdev_write(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  return fastboot_write(ctx->usbdev_out, buf, len);
+}
+#endif
+
+#ifdef CONFIG_NET_TCP
+static int fastboot_tcp_initialize(FAR struct fastboot_ctx_s *ctx)
+{
+  struct sockaddr_in addr;
+
+  ctx->server_fd = socket(AF_INET, SOCK_STREAM, 0);
+  if (ctx->server_fd < 0)
+    {
+      fb_err("create socket failed %d", errno);
+      return -errno;
+    }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(INADDR_ANY);
+  addr.sin_port = htons(FASTBOOT_TCP_PORT);
+  if (bind(ctx->server_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
+    {
+      fb_err("bind() failed %d", errno);
+      return -errno;
+    }
+
+  if (listen(ctx->server_fd, 1) < 0)
+    {
+      fb_err("listen() failed %d", errno);
+      return -errno;
+    }
+
+  return 0;
+}
+
+static void fastboot_tcp_disconn(FAR struct fastboot_ctx_s *ctx)
+{
+  close(ctx->conn_fd);
+  ctx->conn_fd = -1;
+}
+
+static void fastboot_tcp_deinit(FAR struct fastboot_ctx_s *ctx)
+{
+  fastboot_tcp_disconn(ctx);
+  close(ctx->server_fd);
+  ctx->server_fd = -1;
+}
+
+static ssize_t fastboot_read_all(int fd, FAR void *buf, size_t len)
+{
+  size_t total = 0;
+  ssize_t nread;
+
+  while (total < len)
+    {
+      nread = fastboot_read(fd, buf, len);
+      if (nread <= 0)
+        {
+          if (total == 0)
+            {
+              return nread;
+            }
+
+          break;
+        }
+
+      total += nread;
+    }
+
+  return total;
+}
+
+static ssize_t fastboot_tcp_read(FAR struct fastboot_ctx_s *ctx,
+                                 FAR void *buf, size_t len)
+{
+  char buff[FASTBOOT_TCP_HANDSHAKE_LEN];
+  uint64_t data_size;
+  ssize_t nread;
+
+  if (ctx->conn_fd == -1)
+    {
+      while (1)
+        {
+          /* accept a connection, not care the address of the peer socket */
+
+          ctx->conn_fd = accept(ctx->server_fd, NULL, 0);
+          if (ctx->conn_fd < 0)
+            {
+              continue;
+            }
+
+          /* handshake */
+
+          if ((fastboot_read_all(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != FASTBOOT_TCP_HANDSHAKE_LEN) ||
+              (strncmp(buff, FASTBOOT_TCP_HANDSHAKE,
+                FASTBOOT_TCP_HANDSHAKE_LEN) != 0) ||
+              (fastboot_write(ctx->conn_fd, buff,
+                FASTBOOT_TCP_HANDSHAKE_LEN) < 0))

Review Comment:
   ditto



##########
system/fastboot/fastboot.c:
##########
@@ -1070,18 +1070,63 @@ static int fastboot_usbdev_initialize(void)
     }
 #endif /* SYSTEM_FASTBOOTD_USB_BOARDCTL */
 
+  ctx->usbdev_in  = -1;
+  ctx->usbdev_out = -1;
+
+  ctx->usbdev_in  =
+      fastboot_open_usb(FASTBOOT_EP_BULKOUT_IDX, O_RDONLY | O_CLOEXEC);
+  if (ctx->usbdev_in < 0)
+    {
+      return -errno;
+    }
+
+  ctx->usbdev_out =
+      fastboot_open_usb(FASTBOOT_EP_BULKIN_IDX, O_WRONLY | O_CLOEXEC);
+  if (ctx->usbdev_out < 0)
+    {
+      return -errno;

Review Comment:
   need close `ctx->usbdev_in` first



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to