diff options
author | dimitri staessens <[email protected]> | 2016-07-07 19:01:00 +0200 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2016-07-07 20:54:06 +0200 |
commit | 27b36b690a4b048721f0a568ef0aff03bf8e9855 (patch) | |
tree | 36936ba283d5567c4c2533c1e56675290ff5fc67 /src/irmd/registry.c | |
parent | b3870ef695a256be4a4ed28a991c39aab37bd6f3 (diff) | |
download | ouroboros-27b36b690a4b048721f0a568ef0aff03bf8e9855.tar.gz ouroboros-27b36b690a4b048721f0a568ef0aff03bf8e9855.zip |
irmd: Prioritize local ipcp for local flows
For locally registered processes, the IRMd will first look for the
local, then the normal, then the shim-udp. It will look for a normal,
a shim-eth-llc and ultimately a shim-udp for non-local destinations.
It does not yet check if a remote destination is actually known in a
DIF.
Fixes #18.
Diffstat (limited to 'src/irmd/registry.c')
-rw-r--r-- | src/irmd/registry.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/irmd/registry.c b/src/irmd/registry.c index c5f81d77..e9927b7e 100644 --- a/src/irmd/registry.c +++ b/src/irmd/registry.c @@ -143,6 +143,7 @@ struct reg_entry * reg_entry_init(struct reg_entry * e, INIT_LIST_HEAD(&e->ap_names); INIT_LIST_HEAD(&e->auto_ap_info); INIT_LIST_HEAD(&e->ap_instances); + INIT_LIST_HEAD(&e->difs); e->name = name; e->flags = flags; @@ -228,9 +229,65 @@ void reg_entry_destroy(struct reg_entry * e) free(n); } + list_for_each_safe(pos, n, &e->difs) { + struct reg_dif_name * d = + list_entry(pos, struct reg_dif_name, next); + free(d->dif_name); + free(d); + } + free(e); } +bool reg_entry_is_local_in_dif(struct reg_entry * e, + char * dif_name) +{ + struct list_head * pos = NULL; + + list_for_each(pos, &e->difs) { + struct reg_dif_name * d = + list_entry(pos, struct reg_dif_name, next); + + if (!strcmp(dif_name, d->dif_name)) + return true; + } + + return false; +} + +int reg_entry_add_local_in_dif(struct reg_entry * e, + char * dif_name) +{ + if (!reg_entry_is_local_in_dif(e, dif_name)) { + struct reg_dif_name * rdn = malloc(sizeof(*rdn)); + rdn->dif_name = strdup(dif_name); + if (rdn->dif_name == NULL) + return -1; + list_add(&rdn->next, &e->difs); + return 0; + } + + return 0; /* already registered. Is ok */ +} + +void reg_entry_del_local_from_dif(struct reg_entry * e, + char * dif_name) +{ + struct list_head * pos = NULL; + struct list_head * n = NULL; + + list_for_each_safe(pos, n, &e->difs) { + struct reg_dif_name * d = + list_entry(pos, struct reg_dif_name, next); + + if (!strcmp(dif_name, d->dif_name)) { + list_del(&d->next); + free(d); + } + } +} + + struct reg_ap_name * reg_entry_get_ap_name(struct reg_entry * e, char * ap_name) { |