diff options
| author | Dimitri Staessens <dimitri.staessens@intec.ugent.be> | 2016-03-11 17:30:45 +0100 | 
|---|---|---|
| committer | Dimitri Staessens <dimitri.staessens@intec.ugent.be> | 2016-03-11 17:30:45 +0100 | 
| commit | d6897a45d8b45d5bc00f1a6dcd627a14aa535120 (patch) | |
| tree | e37582961e744a7d56e29c134ba147df2da1a061 /src/lib | |
| parent | b68c90fbf9f4a60e4fc406903e38d20453ba8253 (diff) | |
| parent | 328078c1ee01d64733328b3dad3e7db68dcd6d2d (diff) | |
| download | ouroboros-d6897a45d8b45d5bc00f1a6dcd627a14aa535120.tar.gz ouroboros-d6897a45d8b45d5bc00f1a6dcd627a14aa535120.zip | |
Merged in sandervrijders/ouroboros/be-irmd (pull request #26)
Helper functions for naming and extension of the irmd code
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/lib/da.c | 34 | ||||
| -rw-r--r-- | src/lib/ipcp.c | 64 | ||||
| -rw-r--r-- | src/lib/irm.c | 32 | ||||
| -rw-r--r-- | src/lib/rina_name.c | 331 | ||||
| -rw-r--r-- | src/lib/sockets.c | 33 | 
6 files changed, 474 insertions, 23 deletions
| diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 5dad9153..c52a5609 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -8,8 +8,11 @@ set(SOURCE_FILES          # Add source files here          bitmap.c          cdap.c +        da.c          du_buff.c +        ipcp.c          irm.c +        rina_name.c          sockets.c  ) diff --git a/src/lib/da.c b/src/lib/da.c new file mode 100644 index 00000000..ef59a409 --- /dev/null +++ b/src/lib/da.c @@ -0,0 +1,34 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * The API to instruct the DIF Allocator + * + *    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 <ouroboros/da.h> + +rina_name_t * da_resolve_daf(char * daf_name) +{ +        return NULL; +} + +ssize_t       da_resolve_dap(rina_name_t * name, +                             char ** n_1_difs) +{ +        return 0; +} diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c new file mode 100644 index 00000000..935330d5 --- /dev/null +++ b/src/lib/ipcp.c @@ -0,0 +1,64 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * The API to instruct IPCPs + * + *    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 <ouroboros/ipcp.h> + +int ipcp_create(rina_name_t name, +                char * ipcp_type) +{ +        /* zero means failure */ +        return 0; +} + +int ipcp_destroy(int pid) +{ +        return -1; +} + +int ipcp_reg(int pid, +             char ** difs, +             size_t difs_size) +{ +        return -1; +} + +int ipcp_unreg(int pid, +               char ** difs, +               size_t difs_size) +{ +        return -1; +} + +int ipcp_bootstrap(int pid, +                   struct dif_config conf) +{ +        return -1; +} + +int ipcp_enroll(int pid, +                char * dif_name, +                rina_name_t member, +                char ** n_1_difs, +                ssize_t n_1_difs_size) +{ +        return -1; +} diff --git a/src/lib/irm.c b/src/lib/irm.c index 519b4eb8..a1847eed 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -40,7 +40,7 @@ static int send_irm_msg(struct irm_msg * msg)         buf = serialize_irm_msg(msg);         if (buf == NULL) {                 close(sockfd); -                return -1; +               return -1;         }         if (write(sockfd, buf->data, buf->size) == -1) { @@ -63,6 +63,11 @@ int irm_create_ipcp(rina_name_t name,          if (ipcp_type == NULL)                  return -1; +        if (!name_is_ok(&name)) { +                LOG_ERR("Bad name"); +                return -1; +        } +          msg.code = IRM_CREATE_IPCP;          msg.name = &name;          msg.ipcp_type = ipcp_type; @@ -79,6 +84,11 @@ int irm_destroy_ipcp(rina_name_t name)  {          struct irm_msg msg; +        if (!name_is_ok(&name)) { +                LOG_ERR("Bad name"); +                return -1; +        } +          msg.code = IRM_DESTROY_IPCP;          msg.name = &name; @@ -95,6 +105,11 @@ int irm_bootstrap_ipcp(rina_name_t name,  {          struct irm_msg msg; +        if (!name_is_ok(&name)) { +                LOG_ERR("Bad name"); +                return -1; +        } +          msg.code = IRM_BOOTSTRAP_IPCP;          msg.name = &name;          msg.conf = &conf; @@ -112,6 +127,11 @@ int irm_enroll_ipcp(rina_name_t name,  {          struct irm_msg msg; +        if (!name_is_ok(&name)) { +                LOG_ERR("Bad name"); +                return -1; +        } +          msg.code = IRM_ENROLL_IPCP;          msg.name = &name;          msg.dif_name = dif_name; @@ -130,6 +150,11 @@ int irm_reg_ipcp(rina_name_t name,  {          struct irm_msg msg; +        if (!name_is_ok(&name)) { +                LOG_ERR("Bad name"); +                return -1; +        } +          msg.code = IRM_REG_IPCP;          msg.name = &name;          msg.difs = difs; @@ -149,6 +174,11 @@ int irm_unreg_ipcp(rina_name_t name,  {          struct irm_msg msg; +        if (!name_is_ok(&name)) { +                LOG_ERR("Bad name"); +                return -1; +        } +          msg.code = IRM_UNREG_IPCP;          msg.name = &name;          msg.difs = difs; diff --git a/src/lib/rina_name.c b/src/lib/rina_name.c new file mode 100644 index 00000000..b9044277 --- /dev/null +++ b/src/lib/rina_name.c @@ -0,0 +1,331 @@ +/* + * RINA naming related utilities + * + *    Sander Vrijders       <sander.vrijders@intec.ugent.be> + *    Francesco Salvestrini <f.salvestrini@nextworks.it> + * + * 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. + */ + +#define OUROBOROS_PREFIX "name-utils" + +#include <ouroboros/logs.h> +#include <ouroboros/common.h> +#include <ouroboros/rina_name.h> + +#include <string.h> +#include <math.h> +#include <malloc.h> +#include <stdlib.h> + +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; +} + +rina_name_t * name_create() +{ +        rina_name_t * tmp; + +        tmp = malloc(sizeof(rina_name_t)); + +        tmp->ap_name = NULL; +        tmp->api_id  = 0; +        tmp->ae_name = NULL; +        tmp->aei_id  = 0; + +        return tmp; +} + +rina_name_t * name_init_from(rina_name_t * dst, +                             const char *  ap_name, +                             unsigned int  api_id, +                             const char *  ae_name, +                             unsigned int  aei_id) +{ +        if (dst == NULL) +                return NULL; + +        /* Clean up the destination, leftovers might be there ... */ +        name_fini(dst); + +        dst->ap_name = strdup(ap_name); +        dst->api_id = api_id; +        dst->ae_name = strdup(ae_name); +        dst->aei_id = aei_id; + +        if (dst->ap_name == NULL || +            dst->ae_name == NULL) { +                name_fini(dst); +                return NULL; +        } + +        return dst; +} + +rina_name_t * name_init_with(rina_name_t * dst, +                             char *        ap_name, +                             unsigned int  api_id, +                             char *        ae_name, +                             unsigned int  aei_id) +{ +        if (dst == NULL) +                return NULL; + +        /* Clean up the destination, leftovers might be there ... */ +        name_fini(dst); + +        dst->ap_name = ap_name; +        dst->api_id  = api_id; +        dst->ae_name = ae_name; +        dst->aei_id  = aei_id; + +        return dst; +} + +void name_fini(rina_name_t * n) +{ +        if (n == NULL) +                return; + +        if (n->ap_name != NULL) { +                free(n->ap_name); +                n->ap_name = NULL; +        } + +        if (n->ae_name != NULL) { +                free(n->ae_name); +                n->ae_name = NULL; +        } +} + +void name_destroy(rina_name_t * ptr) +{ +        if (ptr == NULL) +                return; + +        name_fini(ptr); + +        free(ptr); +} + +int name_cpy(const rina_name_t * src, +             rina_name_t *       dst) +{ +        rina_name_t * res; + +        if (src == NULL || dst == NULL) +                return -1; + +        res = name_init_from(dst, +                             src->ap_name, +                             src->api_id, +                             src->ae_name, +                             src->aei_id); +        if (res == NULL) +                return -1; + +        return 0; +} + +rina_name_t * name_dup(const rina_name_t * src) +{ +        rina_name_t * tmp; + +        if (src == NULL) +                return NULL; + +        tmp = name_create(); +        if (tmp == NULL) +                return NULL; + +        if (name_cpy(src, tmp)) { +                name_destroy(tmp); +                return NULL; +        } + +        return tmp; +} + +#define NAME_CMP_FIELD(X, Y, FIELD)                           \ +        ((X->FIELD != NULL && Y->FIELD != NULL) ?             \ +         strcmp(X->FIELD, Y->FIELD) :                         \ +         ((X->FIELD == NULL && Y->FIELD == NULL) ? 0 : -1)) + +bool name_is_ok(const rina_name_t * n) +{ return (n != NULL && +          n->ap_name != NULL && +          strlen(n->ap_name) && +          n->ae_name != NULL); } + +bool name_cmp(uint8_t             flags, +              const rina_name_t * a, +              const rina_name_t * b) +{ +        if (a == b) +                return true; + +        if (a == NULL || b == NULL) +                return false; + +        if (!(flags & NAME_CMP_ALL)) +                LOG_DBG("No flags, name comparison will be meaningless ..."); + +        if (flags & NAME_CMP_APN) +                if (NAME_CMP_FIELD(a, b, ap_name)) +                        return false; + +        if (flags & NAME_CMP_API) +                if (a->api_id !=  b->api_id) +                        return false; + +        if (flags & NAME_CMP_AEN) +                if (NAME_CMP_FIELD(a, b, ae_name)) +                        return false; + +        if (flags & NAME_CMP_AEI) +                if (a->aei_id != b->aei_id) +                        return false; + +        return true; +} + +bool name_is_equal(const rina_name_t * a, +                   const rina_name_t * b) +{ return name_cmp(NAME_CMP_ALL, a, b); } + +static int n_digits(unsigned i) +{ +    int n = 1; + +    while (i > 9) { +        n++; +        i /= 10; +    } + +    return n; +} + +#define DELIMITER "/" + +char * name_to_string(const rina_name_t * n) +{ +        char *       tmp; +        size_t       size; +        const char * none     = ""; +        size_t       none_len = strlen(none); + +        if (n == NULL) +                return NULL; + +        size  = 0; + +        size += (n->ap_name != NULL ? +                 strlen(n->ap_name) : none_len); +        size += strlen(DELIMITER); + +        size += (n->api_id == 0 ? +                 1 : n_digits(n->api_id)); +        size += strlen(DELIMITER); + +        size += (n->ae_name != NULL ? +                 strlen(n->ae_name) : none_len); +        size += strlen(DELIMITER); + +        size += (n->aei_id == 0 ? +                 1 : n_digits(n->aei_id)); +        size += strlen(DELIMITER); + +        tmp = malloc(size); +        if (!tmp) +                return NULL; + +        if (sprintf(tmp, "%s%s%d%s%s%s%d", +                    (n->ap_name != NULL ? n->ap_name : none), +                    DELIMITER, n->api_id, +                    DELIMITER, (n->ae_name != NULL ? n->ae_name : none), +                    DELIMITER, n->aei_id) +            != size - 1) { +                free(tmp); +                return NULL; +        } + +        return tmp; +} + +rina_name_t * string_to_name(const char * s) +{ +        rina_name_t * name; + +        char *       tmp1      = NULL; +        char *       tmp_ap    = NULL; +        char *       tmp_s_api = NULL; +        unsigned int tmp_api   = 0; +        char *       tmp_ae    = NULL; +        char *       tmp_s_aei = NULL; +        unsigned int tmp_aei   = 0; +        char *       tmp2; + +        if (s == NULL) +                return NULL; + +        tmp1 = strdup(s); +        if (tmp1 == NULL) { +                return NULL; +        } + +        tmp_ap = strtok(tmp1, DELIMITER); +        tmp_s_api = strtok(NULL, DELIMITER); +        if (tmp_s_api != NULL) +                tmp_api = (unsigned int) strtol(tmp_s_api, &tmp2, 10); +        tmp_ae = strtok(NULL, DELIMITER); +        tmp_s_aei = strtok(NULL, DELIMITER); +        if (tmp_s_aei != NULL) +                tmp_aei = (unsigned int) strtol(tmp_s_aei, &tmp2, 10); + +        name = name_create(); +        if (name == NULL) { +                if (tmp1 != NULL) +                        free(tmp1); +                return NULL; +        } + +        if (!name_init_from(name, tmp_ap, tmp_api, +                            tmp_ae, tmp_aei)) { +                name_destroy(name); +                if (tmp1 != NULL) +                        free(tmp1); +                return NULL; +        } + +        if (tmp1 != NULL) +                free(tmp1); + +        return name; +} diff --git a/src/lib/sockets.c b/src/lib/sockets.c index eebd223b..90117c5c 100644 --- a/src/lib/sockets.c +++ b/src/lib/sockets.c @@ -137,7 +137,7 @@ static int deser_copy_string(uint8_t * data,  }  static void deser_copy_int(uint8_t * data, -                           int * dst, +                           unsigned int * dst,                             int * offset)  {          *dst = 0; @@ -185,9 +185,7 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)          ser_copy_value(sizeof(enum irm_msg_code), data, &msg->code, &offset); -        if (msg->name == NULL || -            msg->name->ap_name == NULL || -            msg->name->ae_name == NULL ) { +        if (!name_is_ok(msg->name)) {                  LOG_ERR("Null pointer passed");                  free(buf->data);                  free(buf); @@ -285,7 +283,7 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)          deser_copy_enum(data->data, &msg->code, &offset); -        msg->name = malloc(sizeof(*(msg->name))); +        msg->name = name_create();          if (msg->name == NULL) {                  LOG_ERR("Failed to alloc memory");                  free(msg); @@ -295,7 +293,7 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)          if (deser_copy_string(data->data,                                &msg->name->ap_name,                                &offset)) { -                free(msg->name); +                name_destroy(msg->name);                  free(msg);                  return NULL;          } @@ -305,8 +303,7 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)          if (deser_copy_string(data->data,                                &msg->name->ae_name,                                &offset)) { -                free(msg->name->ap_name); -                free(msg->name); +                name_destroy(msg->name);                  free(msg);                  return NULL;          } @@ -318,11 +315,9 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)                     if (deser_copy_string(data->data,                                           &msg->ipcp_type,                                           &offset)) { -                        free(msg->name->ae_name); -                        free(msg->name->ap_name); -                        free(msg->name); -                        free(msg); -                        return NULL; +                           name_destroy(msg->name); +                           free(msg); +                           return NULL;                  }                  break; @@ -334,9 +329,7 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)                  if (deser_copy_string(data->data,                                        &msg->dif_name,                                        &offset)) { -                        free(msg->name->ae_name); -                        free(msg->name->ap_name); -                        free(msg->name); +                        name_destroy(msg->name);                          free(msg);                          return NULL;                  } @@ -348,9 +341,7 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)                  msg->difs = malloc(sizeof(*(msg->difs)) * difs_size);                  if (msg->difs == NULL) { -                        free(msg->name->ae_name); -                        free(msg->name->ap_name); -                        free(msg->name); +                        name_destroy(msg->name);                          free(msg);                          return NULL;                  } @@ -362,9 +353,7 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data)                                  for (j = 0; j < i; j++)                                          free(msg->difs[j]);                                  free(msg->difs); -                                free(msg->name->ae_name); -                                free(msg->name->ap_name); -                                free(msg->name); +                                name_destroy(msg->name);                                  free(msg);                                  return NULL;                          } | 
