#endif
-static int ecs_socket_listen(int port)
-{
- struct sockaddr_in addr;
- int slisten = -1;
- int ret = -1;
-
- addr.sin_family = AF_INET;
- addr.sin_port = htons(port);
-
- ret = inet_aton(HOST_LISTEN_ADDR, &addr.sin_addr);
- if (ret == 0) {
- LOG_SEVERE("inet_aton failure\n");
- return -1;
- }
-
- slisten = qemu_socket(PF_INET, SOCK_STREAM, 0);
- if (slisten < 0) {
- LOG_SEVERE("socket creation failed.\n");
- return slisten;
- }
+static int socket_initialize(ECS_State *cs) {
+ LOG_INFO("Listen fd is %d\n", emul_vm_base_socket);
- ret = socket_set_fast_reuse(slisten);
- if (ret != 0) {
- LOG_SEVERE("It cannot be reach here.\n");
- closesocket(slisten);
- return -1;
- }
-
- if (bind(slisten, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- LOG_SEVERE("bind failed : %d\n", errno);
- closesocket(slisten);
- return -1;
- }
-
- if (listen(slisten,1) != 0) {
- LOG_SEVERE("listen failed : %d\n", errno);
- closesocket(slisten);
- return -1;
- }
-
- return slisten;
-}
-
-static int socket_initialize(ECS_State *cs, int port) {
- int fd = -1;
-
- fd = ecs_socket_listen(port);
- if (fd < 0) {
- return -1;
- }
-
- LOG_INFO("Listen fd is %d\n", fd);
-
- qemu_set_nonblock(fd);
-
- cs->listen_fd = fd;
+ cs->listen_fd = emul_vm_base_socket;
#ifdef CONFIG_LINUX
epoll_init(cs);
#else
FD_ZERO(&cs->reads);
- FD_SET(fd, &cs->reads);
+ FD_SET(cs->listen_fd, &cs->reads);
#endif
make_keep_alive_msg();
int ret = 1;
ECS_State *cs = NULL;
Monitor* mon = NULL;
- int port = 0;
LOG_INFO("ecs starts initializing.\n");
}
cs->listen_fd = -1;
-
- port = get_emul_ecs_port();
-
- ret = socket_initialize(cs, port);
+ ret = socket_initialize(cs);
if (ret < 0) {
LOG_SEVERE("Socket initialization is failed.\n");
ecs_close(cs);
#include "skin/maruskin_server.h"
#endif
-static bool sdb_daemon_is_initialized = false;
+#define SDB_INDEX 1
+#define GDB_INDEX 2
+#define ECS_INDEX 3
+#define SDB_NOTI_PORT_INDEX 3
+#define START_BASE_PORT 26100
+#define SDB_GUEST_PORT (START_BASE_PORT + SDB_INDEX)
+#define GDB_GUEST_PORT (START_BASE_PORT + GDB_INDEX)
+int emul_vm_base_socket;
+static bool sdb_daemon_is_initialized = false;
#ifdef _WIN32
#include "qemu/main-loop.h"
int check_port_bind_listen(uint32_t port)
{
struct sockaddr_in addr;
- int s = 0;
int ret = -1;
- socklen_t addrlen = sizeof(addr);
- memset(&addr, 0, addrlen);
-
addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(port);
- s = qemu_socket(AF_INET, SOCK_STREAM, 0);
- if (s < 0) {
- INFO("failed to create a socket\n");
+ if (inet_aton(HOST_LISTEN_ADDR, &addr.sin_addr) == 0) {
+ LOG_SEVERE("inet_aton failure\n");
return -1;
}
-#ifndef _WIN32
- int opt = 1;
- ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
- (char *)&opt, sizeof(int));
+ ret = qemu_socket(PF_INET, SOCK_STREAM, 0);
if (ret < 0) {
- INFO("setsockopt failure\n");
- close(s);
+ LOG_SEVERE("socket creation failed.\n");
return -1;
}
-#endif
- if ((bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) ||
- (listen(s, 1) < 0)) {
- /* failure */
- ret = -1;
- INFO("port(%d) listen failure\n", port);
- } else {
- /* success */
- ret = 1;
- INFO("port(%d) listen success\n", port);
+ qemu_set_nonblock(ret);
+
+ if (socket_set_fast_reuse(ret) != 0) {
+ LOG_SEVERE("It cannot be reach here.\n");
+ closesocket(ret);
+ return -1;
}
-#ifdef _WIN32
- closesocket(s);
-#else
- close(s);
-#endif
+ if (bind(ret, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
+ LOG_INFO("bind failed for port: %d, errno: %d\n", port, errno);
+ closesocket(ret);
+ return -1;
+ }
+
+ if (listen(ret, 1) != 0) {
+ LOG_SEVERE("listen failed :%s-%d\n", strerror(errno), errno);
+ closesocket(ret);
+ return -1;
+ }
return ret;
}
-#define ECS_INDEX 3
-#define SDB_GUEST_PORT 26101
-#define GDB_GUEST_PORT 26102
+int find_available_port(uint32_t base_port)
+{
+ int ret = 0;
+ /* TODO: additional check for sdb and gdb port using for redirection */
+ ret = check_port_bind_listen(base_port + ECS_INDEX);
+ if (ret > 0) {
+ emul_vm_base_socket = ret;
+ } else {
+ LOG_INFO("socket close. port:%d\n", base_port + ECS_INDEX);
+ }
+ return ret;
+}
+
void init_vm_base_port(void)
{
int tries = 10;
int success = 0;
- uint32_t port = 26100;
+ uint32_t port = START_BASE_PORT;
int base_port;
base_port = get_emul_vm_base_port();
if (base_port == 0) {
for ( ; tries > 0; tries--, port += 10 ) {
- if (check_port_bind_listen(port + ECS_INDEX) < 0)
+ if (find_available_port(port) < 0) {
+ LOG_INFO("port(%d) is not available. It can be reserved.\n", port);
continue;
+ }
success = 1;
break;
static void start_sdb_noti_server(int server_port);
void init_sdb(int server_port)
{
- start_sdb_noti_server(server_port);
+ start_sdb_noti_server(server_port + SDB_NOTI_PORT_INDEX);
+ /* no need to redir if network is tap */
if (is_netclient_tap_attached()) {
return;
}
- int tries = 10;
- int success = 0;
char buf_sdb[64] = {0,};
char buf_gdb[64] = {0,};
- int number;
-
- number = get_device_serial_number();
- for ( ; tries > 0; tries--, number += 10 ) {
- sprintf(buf_sdb, "tcp:%d::%d", number, SDB_GUEST_PORT);
- sprintf(buf_gdb, "tcp:%d::%d", number + 1, GDB_GUEST_PORT);
- if(net_slirp_redir((char*)buf_sdb) < 0 || net_slirp_redir((char*)buf_gdb) < 0)
- continue;
-
- INFO( "SDBD established on port %d\n", number);
- success = 1;
- break;
+ sprintf(buf_sdb, "tcp:%d::%d", server_port + SDB_INDEX, SDB_GUEST_PORT);
+ if (net_slirp_redir((char*)buf_sdb) < 0) {
+ LOG_WARNING("failed to redirect sdb port [%s]\n", buf_sdb);
+ } else {
+ INFO("redirect port for sdb [%s]\n", buf_sdb);
}
- INFO("redirect [%s] success\n", buf_sdb);
- INFO("redirect [%s] success\n", buf_gdb);
- if (!success) {
- INFO( "it seems too many emulator instances are running on this machine. Aborting\n" );
- exit(1);
+ sprintf(buf_gdb, "tcp:%d::%d", server_port + GDB_INDEX, GDB_GUEST_PORT);
+ if (net_slirp_redir((char*)buf_gdb) < 0) {
+ LOG_WARNING("failed to redirect gdb port [%s]\n", buf_gdb);
+ } else {
+ INFO("redirect port for gdb [%s]\n", buf_gdb);
}
-
- INFO( "Port(%d/tcp) listen for SDB\n", number);
}
/*