summaryrefslogtreecommitdiff
path: root/src/tools/oping
diff options
context:
space:
mode:
authordimitri staessens <[email protected]>2016-08-20 10:42:36 +0200
committerdimitri staessens <[email protected]>2016-08-21 18:32:12 +0200
commit0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66 (patch)
tree9c0adf0b6ef3b9350c13939f6d40c79eca7546fd /src/tools/oping
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/oping')
-rw-r--r--src/tools/oping/oping.c17
-rw-r--r--src/tools/oping/oping_server.c13
2 files changed, 20 insertions, 10 deletions
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);