summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2016-08-20 10:42:36 +0200
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2016-08-21 18:32:12 +0200
commit0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66 (patch)
tree9c0adf0b6ef3b9350c13939f6d40c79eca7546fd /src/tools
parentba27593e3e8406e109393ae383f17c7416675c1e (diff)
downloadouroboros-0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66.tar.gz
ouroboros-0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66.zip
irmd, lib: Rebuild the IRMd data model
The complete data model inside the IRMd has been restructured. The bind operation was revised to allow binding of AP and AP instances and register those names with different DIFs (see "irm bind" for details). Server applications require to call ap_init with a server name argument, client application that do not the be reachable over any DIF can call ap_init(NULL). Calling ap_init for a client with a specified name will not have adverse consequences for the application, but will consume unnecessary resources in the IRMd. Application servers can now be started at any point after the IRMd has been started. Starting servers, binding AP names and registering names in DIFs can be performed in any order that does not defy temporal logic. Supports naming instances by their pid. In case of IPCP Instances created with the IRM tool, the name assigned during "irm ipcp create" can be used. All the changes required updates in the tools.
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/cbr/cbr.c16
-rw-r--r--src/tools/cbr/cbr_server.c5
-rw-r--r--src/tools/echo/echo.c24
-rw-r--r--src/tools/echo/echo_server.c5
-rw-r--r--src/tools/irm/CMakeLists.txt6
-rw-r--r--src/tools/irm/irm.c4
-rw-r--r--src/tools/irm/irm_bind.c87
-rw-r--r--src/tools/irm/irm_bind_ap.c98
-rw-r--r--src/tools/irm/irm_bind_api.c68
-rw-r--r--src/tools/irm/irm_ipcp.c2
-rw-r--r--src/tools/irm/irm_ops.h10
-rw-r--r--src/tools/irm/irm_unbind.c58
-rw-r--r--src/tools/irm/irm_unbind_ap.c68
-rw-r--r--src/tools/irm/irm_unbind_api.c69
-rw-r--r--src/tools/oping/oping.c17
-rw-r--r--src/tools/oping/oping_server.c13
16 files changed, 437 insertions, 113 deletions
diff --git a/src/tools/cbr/cbr.c b/src/tools/cbr/cbr.c
index 65783119..e42492df 100644
--- a/src/tools/cbr/cbr.c
+++ b/src/tools/cbr/cbr.c
@@ -72,14 +72,10 @@ int main(int argc, char ** argv)
int ret = 0;
char * rem = NULL;
char * s_apn = NULL;
+ char ** argv_dup = argv;
bool server = false;
- if (ap_init(argv[0]) < 0) {
- printf("Failed to init.\n");
- exit(EXIT_FAILURE);
- }
-
server_settings.interval = 1; /* One second reporting interval */
server_settings.timeout = 1;
@@ -133,8 +129,18 @@ int main(int argc, char ** argv)
}
if (server) {
+ if (ap_init(argv_dup[0]) < 0) {
+ printf("Failed to init.\n");
+ exit(EXIT_FAILURE);
+ }
+
ret = server_main();
} else {
+ if (ap_init(NULL) < 0) {
+ printf("Failed to init.\n");
+ exit(EXIT_FAILURE);
+ }
+
if (s_apn == NULL) {
printf("No server specified.\n");
usage();
diff --git a/src/tools/cbr/cbr_server.c b/src/tools/cbr/cbr_server.c
index d0666551..8eff4a4c 100644
--- a/src/tools/cbr/cbr_server.c
+++ b/src/tools/cbr/cbr_server.c
@@ -219,11 +219,6 @@ int server_main()
return -1;
}
- if (api_bind(NULL) < 0) {
- printf("Failed to bind the server api.");
- return -1;
- }
-
for (i = 0; i < THREADS_SIZE; i++)
pthread_create(&threads[i], NULL, worker, NULL);
diff --git a/src/tools/echo/echo.c b/src/tools/echo/echo.c
index ab7d5557..28ae4c1a 100644
--- a/src/tools/echo/echo.c
+++ b/src/tools/echo/echo.c
@@ -41,19 +41,15 @@ static void usage()
int main(int argc, char ** argv)
{
int ret = -1;
- if (ap_init(argv[0])) {
- printf("Failed to init AP.\n");
- return -1;
- }
+ char ** argv_dup = argv;
+ bool server = false;
argc--;
argv++;
while (argc > 0) {
if (strcmp(*argv, "-l") == 0 ||
strcmp(*argv, "--listen") == 0) {
- ret = server_main();
- ap_fini();
- return ret;
+ server = true;
} else {
usage();
return 0;
@@ -62,7 +58,19 @@ int main(int argc, char ** argv)
argv++;
}
- ret = client_main();
+ if (server) {
+ if (ap_init(argv_dup[0])) {
+ printf("Failed to init AP.\n");
+ return -1;
+ }
+ ret = server_main();
+ } else {
+ if (ap_init(NULL)) {
+ printf("Failed to init AP.\n");
+ return -1;
+ }
+ ret = client_main();
+ }
ap_fini();
diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c
index 3106ee35..e6ab9cfd 100644
--- a/src/tools/echo/echo_server.c
+++ b/src/tools/echo/echo_server.c
@@ -39,11 +39,6 @@ int server_main()
char buf[BUF_SIZE];
ssize_t count = 0;
- if (api_bind(NULL) < 0) {
- printf("Failed to bind the server api.");
- return -1;
- }
-
printf("Starting the server.\n");
/* Manual cleanup is required for now */
diff --git a/src/tools/irm/CMakeLists.txt b/src/tools/irm/CMakeLists.txt
index 68297615..f59d9af0 100644
--- a/src/tools/irm/CMakeLists.txt
+++ b/src/tools/irm/CMakeLists.txt
@@ -7,10 +7,16 @@ include_directories(${CMAKE_BINARY_DIR}/include)
set(SOURCE_FILES
# Add source files here
irm.c
+ irm_bind_ap.c
+ irm_bind_api.c
+ irm_bind_ipcp.c
irm_ipcp_create.c
irm_ipcp_destroy.c
irm_ipcp_bootstrap.c
irm_ipcp_enroll.c
+ irm_unbind_ap.c
+ irm_unbind_api.c
+ irm_unbind_ipcp.c
irm_unbind.c
irm_bind.c
irm_ipcp.c
diff --git a/src/tools/irm/irm.c b/src/tools/irm/irm.c
index 14420207..c260feb9 100644
--- a/src/tools/irm/irm.c
+++ b/src/tools/irm/irm.c
@@ -46,8 +46,8 @@ static const struct cmd {
int (* func)(int argc, char ** argv);
} cmds[] = {
{ "ipcp", ipcp_cmd },
- { "bind", do_bind },
- { "unbind", do_unbind },
+ { "bind", bind_cmd },
+ { "unbind", unbind_cmd },
{ "register", do_register },
{ "unregister", do_unregister },
{ "help", do_help },
diff --git a/src/tools/irm/irm_bind.c b/src/tools/irm/irm_bind.c
index 061aeef5..9b37e800 100644
--- a/src/tools/irm/irm_bind.c
+++ b/src/tools/irm/irm_bind.c
@@ -1,8 +1,9 @@
/*
* Ouroboros - Copyright (C) 2016
*
- * Bind AP to a name
+ * Bind names in the processing system
*
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
* Sander Vrijders <sander.vrijders@intec.ugent.be>
*
* This program is free software; you can redistribute it and/or modify
@@ -21,75 +22,57 @@
*/
#include <stdio.h>
-#include <string.h>
#include <ouroboros/irm.h>
-#include <ouroboros/errno.h>
#include "irm_ops.h"
#include "irm_utils.h"
static void usage()
{
- printf("Usage: irm bind\n"
- " name <name>\n"
- " apn <application process name>\n"
- " [auto] (instantiate apn if not running)\n"
- " [unique] (there can only be one instantiation)\n"
- " [-- <application arguments>]\n");
+ printf("Usage: irm bind [OPERATION]\n"
+ "where OPERATION = {ap api ipcp help}\n");
}
-
-int do_bind(int argc, char ** argv)
+static int do_help(int argc, char **argv)
{
- char * name = NULL;
- char * ap_name = NULL;
- uint16_t flags = 0;
- int ret = 0;
+ usage();
+ return 0;
+}
- while (argc > 0) {
- if (matches(*argv, "name") == 0) {
- name = *(argv + 1);
- ++argv;
- --argc;
- } else if (matches(*argv, "apn") == 0) {
- ap_name = *(argv + 1);
- ++argv;
- --argc;
- } else if (strcmp(*argv, "auto") == 0) {
- flags |= BIND_AP_AUTO;
- } else if (strcmp(*argv, "unique") == 0) {
- flags |= BIND_AP_UNIQUE;
- } else if (strcmp(*argv, "--") == 0) {
- ++argv;
- --argc;
- break;
- } else {
- printf("\"%s\" is unknown, try \"irm "
- "bind\".\n", *argv);
- return -1;
- }
+static const struct cmd {
+ const char * cmd;
+ int (* func)(int argc, char ** argv);
+} cmds[] = {
+ { "ap", do_bind_ap },
+ { "api", do_bind_api },
+ { "ipcp", do_bind_ipcp },
+ { "help", do_help },
+ { 0 }
+};
- ++argv;
- --argc;
- }
+static int do_cmd(const char * argv0,
+ int argc,
+ char ** argv)
+{
+ const struct cmd * c;
- if (name == NULL || ap_name == NULL) {
- usage();
- return -1;
+ for (c = cmds; c->cmd; ++c) {
+ if (!matches(argv0, c->cmd))
+ return c->func(argc, argv);
}
- ret = irm_bind(name, ap_name, flags, argc, argv);
- if (ret == -ENOENT) {
- printf("%s does not exist.\n", ap_name);
- return -1;
- }
+ fprintf(stderr, "\"%s\" is unknown, try \"irm bind help\".\n", argv0);
+
+ return -1;
+}
- if (ret == -EPERM) {
- printf("Cannot execute %s, please check permissions.\n",
- ap_name);
+int bind_cmd(int argc, char ** argv)
+{
+ if (argc < 1) {
+ usage();
return -1;
}
- return ret;
+ return do_cmd(argv[0], argc, argv);
}
diff --git a/src/tools/irm/irm_bind_ap.c b/src/tools/irm/irm_bind_ap.c
new file mode 100644
index 00000000..a525c077
--- /dev/null
+++ b/src/tools/irm/irm_bind_ap.c
@@ -0,0 +1,98 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Bind AP to a name
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <ouroboros/irm.h>
+#include <ouroboros/errno.h>
+
+#include "irm_ops.h"
+#include "irm_utils.h"
+
+static void usage()
+{
+ printf("Usage: irm bind ap <ap>\n"
+ " name <name>\n"
+ " [auto] (instantiate apn if not running)\n"
+ " [loc] (location-dependent application)\n"
+ " [unique] (there can only be one instantiation)\n"
+ " [-- <application arguments>]\n");
+}
+
+
+int do_bind_ap(int argc, char ** argv)
+{
+ char * name = NULL;
+ char * ap_name = NULL;
+ uint16_t flags = 0;
+ int ret = 0;
+
+ while (argc > 0) {
+ if (matches(*argv, "name") == 0) {
+ name = *(argv + 1);
+ ++argv;
+ --argc;
+ } else if (matches(*argv, "ap") == 0) {
+ ap_name = *(argv + 1);
+ ++argv;
+ --argc;
+ } else if (strcmp(*argv, "auto") == 0) {
+ flags |= BIND_AP_AUTO;
+ } else if (strcmp(*argv, "unique") == 0) {
+ flags |= BIND_AP_UNIQUE;
+ } else if (strcmp(*argv, "loc") == 0) {
+ flags |= BIND_AP_LOC;
+ } else if (strcmp(*argv, "--") == 0) {
+ ++argv;
+ --argc;
+ break;
+ } else {
+ printf("\"%s\" is unknown, try \"irm "
+ "bind\".\n", *argv);
+ return -1;
+ }
+
+ ++argv;
+ --argc;
+ }
+
+ if (name == NULL || ap_name == NULL) {
+ usage();
+ return -1;
+ }
+
+ ret = irm_bind_ap(ap_name, name, flags, argc, argv);
+ if (ret == -ENOENT) {
+ printf("%s does not exist.\n", ap_name);
+ return -1;
+ }
+
+ if (ret == -EPERM) {
+ printf("Cannot execute %s, please check permissions.\n",
+ ap_name);
+ return -1;
+ }
+
+ return ret;
+}
diff --git a/src/tools/irm/irm_bind_api.c b/src/tools/irm/irm_bind_api.c
new file mode 100644
index 00000000..b21d305c
--- /dev/null
+++ b/src/tools/irm/irm_bind_api.c
@@ -0,0 +1,68 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Bind AP-I to a name
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <ouroboros/irm.h>
+#include <ouroboros/errno.h>
+
+#include "irm_ops.h"
+#include "irm_utils.h"
+
+static void usage()
+{
+ printf("Usage: irm bind api <pid> name <name>\n");
+}
+
+int do_bind_api(int argc, char ** argv)
+{
+ pid_t api = -1;
+ char * name = NULL;
+
+ while (argc > 0) {
+ if (matches(*argv, "name") == 0) {
+ name = *(argv + 1);
+ ++argv;
+ --argc;
+ } else if (matches(*argv, "api") == 0) {
+ api = strtol(*(argv + 1), NULL, 10);
+ ++argv;
+ --argc;
+ } else {
+ printf("\"%s\" is unknown, try \"irm "
+ "bind api\".\n", *argv);
+ return -1;
+ }
+
+ ++argv;
+ --argc;
+ }
+
+ if (api < 0 || name == NULL) {
+ usage();
+ return -1;
+ }
+
+ return irm_bind_api(api, name);
+}
diff --git a/src/tools/irm/irm_ipcp.c b/src/tools/irm/irm_ipcp.c
index f658ead5..1b523feb 100644
--- a/src/tools/irm/irm_ipcp.c
+++ b/src/tools/irm/irm_ipcp.c
@@ -29,7 +29,7 @@ static void usage()
{
printf("Usage: irm ipcp [OPERATION]\n\n"
"where OPERATION = {create destroy\n"
- " bootstrap enroll help\n");
+ " bootstrap enroll help}\n");
}
static int do_help(int argc, char **argv)
diff --git a/src/tools/irm/irm_ops.h b/src/tools/irm/irm_ops.h
index 24eee0df..9a59d69a 100644
--- a/src/tools/irm/irm_ops.h
+++ b/src/tools/irm/irm_ops.h
@@ -26,7 +26,13 @@ int do_destroy_ipcp(int argc, char ** argv);
int do_bootstrap_ipcp(int argc, char ** argv);
int do_enroll_ipcp(int argc, char ** argv);
-int do_bind(int argc, char ** argv);
-int do_unbind(int argc, char ** argv);
+int bind_cmd(int argc, char ** argv);
+int do_bind_ap(int argc, char ** argv);
+int do_bind_api(int argc, char ** argv);
+int do_bind_ipcp(int argc, char ** argv);
+int unbind_cmd(int argc, char ** argv);
+int do_unbind_ap(int argc, char ** argv);
+int do_unbind_api(int argc, char ** argv);
+int do_unbind_ipcp(int argc, char ** argv);
int do_register(int argc, char ** argv);
int do_unregister(int argc, char ** argv);
diff --git a/src/tools/irm/irm_unbind.c b/src/tools/irm/irm_unbind.c
index 9e8f3c9c..0290e678 100644
--- a/src/tools/irm/irm_unbind.c
+++ b/src/tools/irm/irm_unbind.c
@@ -3,6 +3,7 @@
*
* Unbind names in the processing system
*
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
* Sander Vrijders <sander.vrijders@intec.ugent.be>
*
* This program is free software; you can redistribute it and/or modify
@@ -29,35 +30,46 @@
static void usage()
{
- printf("Usage: irm unbind\n"
- " name <name>\n"
- " ap <application process name>\n");
+ printf("Usage: irm unbind [OPERATION]\n"
+ "where OPERATION = {ap api ipcp help}\n");
}
-int do_unbind(int argc, char ** argv)
+static int do_help(int argc, char **argv)
{
- char * name = NULL;
- char * ap_name = NULL;
-
- while (argc > 0) {
- if (matches(*argv, "name") == 0) {
- name = *(argv + 1);
- } else if (matches(*argv, "ap") == 0) {
- ap_name = *(argv + 1);
- } else {
- printf("\"%s\" is unknown, try \"irm "
- "unbind\".\n", *argv);
- return -1;
- }
-
- argc -= 2;
- argv += 2;
- }
+ usage();
+ return 0;
+}
+
+static const struct cmd {
+ const char * cmd;
+ int (* func)(int argc, char ** argv);
+} cmds[] = {
+ { "ap", do_unbind_ap },
+ { "api", do_unbind_api },
+ { "ipcp", do_unbind_ipcp },
+ { "help", do_help },
+ { 0 }
+};
+
+static int do_cmd(const char * argv0, int argc, char ** argv)
+{
+ const struct cmd * c;
- if (name == NULL && ap_name == NULL) {
+ for (c = cmds; c->cmd; ++c)
+ if (!matches(argv0, c->cmd))
+ return c->func(argc, argv);
+
+ fprintf(stderr, "\"%s\" is unknown, try \"irm unbind help\".\n", argv0);
+
+ return -1;
+}
+
+int unbind_cmd(int argc, char ** argv)
+{
+ if (argc < 1) {
usage();
return -1;
}
- return irm_unbind(name, ap_name, 0);
+ return do_cmd(argv[0], argc, argv);
}
diff --git a/src/tools/irm/irm_unbind_ap.c b/src/tools/irm/irm_unbind_ap.c
new file mode 100644
index 00000000..bdfcbaad
--- /dev/null
+++ b/src/tools/irm/irm_unbind_ap.c
@@ -0,0 +1,68 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Unbind AP names
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <ouroboros/irm.h>
+
+#include "irm_ops.h"
+#include "irm_utils.h"
+
+static void usage()
+{
+ printf("Usage: irm unbind ap <ap>\n"
+ " [name <name>, omit: remove all AP info]\n");
+}
+
+int do_unbind_ap(int argc, char ** argv)
+{
+ char * name = NULL;
+ char * ap_name = NULL;
+
+ while (argc > 0) {
+ if (matches(*argv, "name") == 0) {
+ name = *(argv + 1);
+ ++argv;
+ --argc;
+ } else if (matches(*argv, "ap") == 0) {
+ ap_name = *(argv + 1);
+ ++argv;
+ --argc;
+ } else {
+ printf("\"%s\" is unknown, try \"irm "
+ "unbind ap\".\n", *argv);
+ return -1;
+ }
+
+ ++argv;
+ --argc;
+ }
+
+ if (ap_name == NULL) {
+ usage();
+ return -1;
+ }
+
+ return irm_unbind_ap(ap_name, name);
+}
diff --git a/src/tools/irm/irm_unbind_api.c b/src/tools/irm/irm_unbind_api.c
new file mode 100644
index 00000000..b69a4579
--- /dev/null
+++ b/src/tools/irm/irm_unbind_api.c
@@ -0,0 +1,69 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Unbind AP-I names
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <ouroboros/irm.h>
+
+#include "irm_ops.h"
+#include "irm_utils.h"
+
+static void usage()
+{
+ printf("Usage: irm unbind api <pid>\n"
+ " [name <name>, omit: remove all AP-I info]\n");
+}
+
+int do_unbind_api(int argc, char ** argv)
+{
+ pid_t api = -1;
+ char * name = NULL;
+
+ while (argc > 0) {
+ if (matches(*argv, "name") == 0) {
+ name = *(argv + 1);
+ ++argv;
+ --argc;
+ } else if (matches(*argv, "api") == 0) {
+ api = strtol(*(argv + 1), NULL, 10);
+ ++argv;
+ --argc;
+ } else {
+ printf("\"%s\" is unknown, try \"irm "
+ "unbind api\".\n", *argv);
+ return -1;
+ }
+
+ ++argv;
+ --argc;
+ }
+
+ if (api < 0) {
+ usage();
+ return -1;
+ }
+
+ return irm_unbind_api(api, name);
+}
diff --git a/src/tools/oping/oping.c b/src/tools/oping/oping.c
index cf8dc485..2871e79e 100644
--- a/src/tools/oping/oping.c
+++ b/src/tools/oping/oping.c
@@ -60,6 +60,7 @@ struct c {
struct s {
struct timespec times[OPING_MAX_FLOWS];
+ bool flows[OPING_MAX_FLOWS];
pthread_mutex_t lock;
pthread_t cleaner_pt;
@@ -95,11 +96,7 @@ int main(int argc, char ** argv)
int ret = -1;
char * rem = NULL;
bool serv = false;
-
- if (ap_init(argv[0])) {
- printf("Failed to init AP.\n");
- exit(EXIT_FAILURE);
- }
+ char ** argv_dup = argv;
argc--;
argv++;
@@ -138,8 +135,18 @@ int main(int argc, char ** argv)
}
if (serv) {
+ if (ap_init(argv_dup[0])) {
+ printf("Failed to init AP.\n");
+ exit(EXIT_FAILURE);
+ }
+
ret = server_main();
} else {
+ if (ap_init(NULL)) {
+ printf("Failed to init AP.\n");
+ exit(EXIT_FAILURE);
+ }
+
if (client.s_apn == NULL) {
printf("No server specified.\n");
usage();
diff --git a/src/tools/oping/oping_server.c b/src/tools/oping/oping_server.c
index 9e2fa12f..7761110d 100644
--- a/src/tools/oping/oping_server.c
+++ b/src/tools/oping/oping_server.c
@@ -53,8 +53,11 @@ void * cleaner_thread(void * o)
clock_gettime(CLOCK_REALTIME, &now);
pthread_mutex_lock(&server.lock);
for (i = 0; i < OPING_MAX_FLOWS; ++i)
- if (ts_diff_ms(&server.times[i], &now) > deadline_ms)
+ if (server.flows[i] &&
+ ts_diff_ms(&server.times[i], &now) > deadline_ms) {
+ server.flows[i] = false;
flow_dealloc(i);
+ }
pthread_mutex_unlock(&server.lock);
sleep(1);
@@ -123,6 +126,7 @@ void * accept_thread(void * o)
clock_gettime(CLOCK_REALTIME, &now);
pthread_mutex_lock(&server.lock);
+ server.flows[fd] = true;
server.times[fd] = now;
pthread_mutex_unlock(&server.lock);
@@ -135,6 +139,7 @@ void * accept_thread(void * o)
int server_main()
{
struct sigaction sig_act;
+ int i = 0;
memset(&sig_act, 0, sizeof sig_act);
sig_act.sa_sigaction = &shutdown_server;
@@ -148,10 +153,8 @@ int server_main()
return -1;
}
- if (api_bind(NULL) < 0) {
- printf("Failed to bind the server instance.");
- return -1;
- }
+ for (i = 0; i < OPING_MAX_FLOWS; ++i)
+ server.flows[i] = false;
pthread_create(&server.cleaner_pt, NULL, cleaner_thread, NULL);
pthread_create(&server.accept_pt, NULL, accept_thread, NULL);