summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ouroboros/common.h2
-rw-r--r--include/ouroboros/utils.h3
-rw-r--r--src/irmd/main.c106
-rw-r--r--src/lib/instance_name.c21
-rw-r--r--src/lib/utils.c22
-rw-r--r--src/tools/irm/irm_bootstrap_ipcp.c2
6 files changed, 101 insertions, 55 deletions
diff --git a/include/ouroboros/common.h b/include/ouroboros/common.h
index 7114ed73..658c3618 100644
--- a/include/ouroboros/common.h
+++ b/include/ouroboros/common.h
@@ -45,7 +45,7 @@ struct qos_spec {
/* FIXME: What should be configurable in the DIF? */
struct dif_config {
/* general data */
- struct qos_spec * qosspecs;
+ char * dif_name;
/* TODO: efficient policies */
diff --git a/include/ouroboros/utils.h b/include/ouroboros/utils.h
index 0e50c039..2eaccae9 100644
--- a/include/ouroboros/utils.h
+++ b/include/ouroboros/utils.h
@@ -25,3 +25,6 @@
* need when represented as a string
*/
int n_digits(unsigned i);
+
+/* Returns a copy of the source string */
+char * strdup(const char * src);
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 0256248b..a900b0ed 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -30,31 +30,33 @@
#include <ouroboros/da.h>
#include <ouroboros/list.h>
#include <ouroboros/instance_name.h>
+#include <ouroboros/utils.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <errno.h>
-struct name_to_pid_entry {
+struct ipcp_entry {
struct list_head next;
pid_t pid;
instance_name_t * api;
+ char * dif_name;
};
struct irm {
- struct list_head name_to_pid;
+ struct list_head ipcps;
};
struct irm * instance = NULL;
-static pid_t find_pid_by_name(instance_name_t * api)
+static pid_t find_pid_by_ipcp_name(instance_name_t * api)
{
- struct list_head * pos;
+ struct list_head * pos = NULL;
- list_for_each(pos, &instance->name_to_pid) {
- struct name_to_pid_entry * tmp =
- list_entry(pos, struct name_to_pid_entry, next);
+ list_for_each(pos, &instance->ipcps) {
+ struct ipcp_entry * tmp =
+ list_entry(pos, struct ipcp_entry, next);
LOG_DBG("name is %s", api->name);
@@ -65,11 +67,27 @@ static pid_t find_pid_by_name(instance_name_t * api)
return 0;
}
+static struct ipcp_entry * find_ipcp_by_name(instance_name_t * api)
+{
+ struct ipcp_entry * tmp = NULL;
+ struct list_head * pos = NULL;
+
+ list_for_each(pos, &instance->ipcps) {
+ struct ipcp_entry * tmp =
+ list_entry(pos, struct ipcp_entry, next);
+
+ if (instance_name_cmp(api, tmp->api) == 0)
+ return tmp;
+ }
+
+ return tmp;
+}
+
static int create_ipcp(instance_name_t * api,
char * ipcp_type)
{
pid_t pid;
- struct name_to_pid_entry * tmp;
+ struct ipcp_entry * tmp = NULL;
pid = ipcp_create(api, ipcp_type);
if (pid == -1) {
@@ -90,19 +108,21 @@ static int create_ipcp(instance_name_t * api,
return -1;
}
+ tmp->dif_name = NULL;
+
LOG_DBG("Created IPC process with pid %d", pid);
- list_add(&tmp->next, &instance->name_to_pid);
+ list_add(&tmp->next, &instance->ipcps);
return 0;
}
static int destroy_ipcp(instance_name_t * api)
{
pid_t pid = 0;
- struct list_head * pos;
- struct list_head * n;
+ struct list_head * pos = NULL;
+ struct list_head * n = NULL;
- pid = find_pid_by_name(api);
+ pid = find_pid_by_ipcp_name(api);
if (pid == 0) {
LOG_ERR("No such IPCP");
return -1;
@@ -113,9 +133,9 @@ static int destroy_ipcp(instance_name_t * api)
if (ipcp_destroy(pid))
LOG_ERR("Could not destroy IPCP");
- list_for_each_safe(pos, n, &(instance->name_to_pid)) {
- struct name_to_pid_entry * tmp =
- list_entry(pos, struct name_to_pid_entry, next);
+ list_for_each_safe(pos, n, &(instance->ipcps)) {
+ struct ipcp_entry * tmp =
+ list_entry(pos, struct ipcp_entry, next);
if (instance_name_cmp(api, tmp->api) == 0)
list_del(&tmp->next);
@@ -127,16 +147,24 @@ static int destroy_ipcp(instance_name_t * api)
static int bootstrap_ipcp(instance_name_t * api,
struct dif_config * conf)
{
- pid_t pid = 0;
+ struct ipcp_entry * entry = NULL;
- pid = find_pid_by_name(api);
- if (pid == 0) {
+ entry = find_ipcp_by_name(api);
+ if (entry == NULL) {
LOG_ERR("No such IPCP");
return -1;
}
- if (ipcp_bootstrap(pid, conf)) {
+ entry->dif_name = strdup( conf->dif_name);
+ if (entry->dif_name == NULL) {
+ LOG_ERR("Failed to strdup");
+ return -1;
+ }
+
+ if (ipcp_bootstrap(entry->pid, conf)) {
LOG_ERR("Could not bootstrap IPCP");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
return -1;
}
@@ -146,29 +174,45 @@ static int bootstrap_ipcp(instance_name_t * api,
static int enroll_ipcp(instance_name_t * api,
char * dif_name)
{
- pid_t pid = 0;
- char * member;
+ char * member = NULL;
char ** n_1_difs = NULL;
ssize_t n_1_difs_size = 0;
+ struct ipcp_entry * entry = NULL;
- pid = find_pid_by_name(api);
- if (pid == 0) {
+ entry = find_ipcp_by_name(api);
+ if (entry == NULL) {
LOG_ERR("No such IPCP");
return -1;
}
+ entry->dif_name = strdup(dif_name);
+ if (entry->dif_name == NULL) {
+ LOG_ERR("Failed to strdup");
+ return -1;
+ }
+
member = da_resolve_daf(dif_name);
if (member == NULL) {
LOG_ERR("Could not find a member of that DIF");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
return -1;
}
n_1_difs_size = da_resolve_dap(member, n_1_difs);
- if (n_1_difs_size != 0)
- if (ipcp_enroll(pid, member, n_1_difs[0])) {
- LOG_ERR("Could not enroll IPCP");
- return -1;
- }
+ if (n_1_difs_size < 1) {
+ LOG_ERR("Could not find N-1 DIFs");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
+ return -1;
+ }
+
+ if (ipcp_enroll(entry->pid, member, n_1_difs[0])) {
+ LOG_ERR("Could not enroll IPCP");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
+ return -1;
+ }
return 0;
}
@@ -179,7 +223,7 @@ static int reg_ipcp(instance_name_t * api,
{
pid_t pid = 0;
- pid = find_pid_by_name(api);
+ pid = find_pid_by_ipcp_name(api);
if (pid == 0) {
LOG_ERR("No such IPCP");
return -1;
@@ -199,7 +243,7 @@ static int unreg_ipcp(instance_name_t * api,
{
pid_t pid = 0;
- pid = find_pid_by_name(api);
+ pid = find_pid_by_ipcp_name(api);
if (pid == 0) {
LOG_ERR("No such IPCP");
return -1;
@@ -295,7 +339,7 @@ int main()
if (instance == NULL)
return -1;
- INIT_LIST_HEAD(&instance->name_to_pid);
+ INIT_LIST_HEAD(&instance->ipcps);
sockfd = server_socket_open(IRM_SOCK_PATH);
if (sockfd < 0)
diff --git a/src/lib/instance_name.c b/src/lib/instance_name.c
index 0f666211..e560c0b9 100644
--- a/src/lib/instance_name.c
+++ b/src/lib/instance_name.c
@@ -31,27 +31,6 @@
#include <malloc.h>
#include <stdlib.h>
-#define instance_name_is_equal(a, b) (instance_name_cmp(a, b) == 0)
-
-static char * strdup(const char * src)
-{
- int len = 0;
- char * dst = NULL;
-
- if (src == NULL)
- return NULL;
-
- len = strlen(src) + 1;
-
- dst = malloc(len);
- if (dst == NULL)
- return NULL;
-
- memcpy(dst, src, len);
-
- return dst;
-}
-
instance_name_t * instance_name_create()
{
instance_name_t * tmp;
diff --git a/src/lib/utils.c b/src/lib/utils.c
index ca082642..77a2d44c 100644
--- a/src/lib/utils.c
+++ b/src/lib/utils.c
@@ -20,6 +20,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <stdlib.h>
+#include <string.h>
+
int n_digits(unsigned i)
{
int n = 1;
@@ -31,3 +34,22 @@ int n_digits(unsigned i)
return n;
}
+
+char * strdup(const char * src)
+{
+ int len = 0;
+ char * dst = NULL;
+
+ if (src == NULL)
+ return NULL;
+
+ len = strlen(src) + 1;
+
+ dst = malloc(len);
+ if (dst == NULL)
+ return NULL;
+
+ memcpy(dst, src, len);
+
+ return dst;
+}
diff --git a/src/tools/irm/irm_bootstrap_ipcp.c b/src/tools/irm/irm_bootstrap_ipcp.c
index c7b82c4a..03a913fb 100644
--- a/src/tools/irm/irm_bootstrap_ipcp.c
+++ b/src/tools/irm/irm_bootstrap_ipcp.c
@@ -42,8 +42,6 @@ int do_bootstrap_ipcp(int argc, char ** argv)
instance_name_t api = {NULL, 0};
struct dif_config conf;
- conf.qosspecs = NULL;
-
while (argc > 0) {
if (matches(*argv, "ap") == 0) {
api.name = *(argv + 1);