diff options
| -rw-r--r-- | include/ouroboros/common.h | 32 | ||||
| -rw-r--r-- | src/ipcpd/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/ipcpd/dt_const.h | 44 | ||||
| -rw-r--r-- | src/ipcpd/pci.c | 142 | ||||
| -rw-r--r-- | src/ipcpd/pci.h | 45 | 
5 files changed, 256 insertions, 8 deletions
| diff --git a/include/ouroboros/common.h b/include/ouroboros/common.h index 02361f20..36f6171c 100644 --- a/include/ouroboros/common.h +++ b/include/ouroboros/common.h @@ -37,22 +37,38 @@ typedef struct {  typedef struct {          char * ap_name; -        int api_id; +        int    api_id;          char * ae_name; -        int aei_id; +        int    aei_id;  } rina_name_t;  /* FIXME: To be extended to have all QoS params */  struct qos_spec { -        char * name; -        char * dif_name; -        double delay; -        double jitter; +        uint32_t delay; +        uint32_t jitter; +}; + +struct dt_const { +        /* dt field sizes in octets */ +        uint8_t addr_size; +        uint8_t cep_id_size; +        uint8_t pdu_length_size; +        uint8_t qos_id_size; +        uint8_t seqno_size; +        /* uint8_t ctrl_sqnum_sz;  is this in the spec?? */ + +        /* constants for dup */ +        uint8_t ttl_size; +        uint8_t chk_size;  };  /* FIXME: What should be configurable in the DIF? */  struct dif_info { -        int cep_id_size; +        /* values, octets */ +        uint32_t min_pdu_size; +        uint32_t max_pdu_size; + +        struct dt_const dtc;  }; -#endif +#endif /* OUROBOROS_COMMON_H */ diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt index b16413cc..00ace9d5 100644 --- a/src/ipcpd/CMakeLists.txt +++ b/src/ipcpd/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories(${CMAKE_BINARY_DIR}/include)  set(SOURCE_FILES          # Add source files here          main.c +        pci.c  )  add_executable (ipcpd ${SOURCE_FILES}) diff --git a/src/ipcpd/dt_const.h b/src/ipcpd/dt_const.h new file mode 100644 index 00000000..bc0c1466 --- /dev/null +++ b/src/ipcpd/dt_const.h @@ -0,0 +1,44 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Data Transfer Constants for the IPCP + * + *    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. + */ + +#ifndef IPCP_DT_CONST_H +#define IPCP_DT_CONST_H + +#include "ouroboros/common.h" + +struct ipcp_dtp_const { +        /* sizes in octets */ +        uint8_t addr_size; +        uint8_t cep_id_size; +        uint8_t pdu_length_size; +        uint8_t seqno_size; +        uint8_t qos_id_size; +        /* uint8_t ctrl_sqnum_sz;  is this in the spec?? */ +}; + +struct ipcp_dup_const { +        uint8_t ttl_size; +        uint8_t chk_size; +}; + +#endif /* IPCP_DT_CONST_H */ diff --git a/src/ipcpd/pci.c b/src/ipcpd/pci.c new file mode 100644 index 00000000..19c42e53 --- /dev/null +++ b/src/ipcpd/pci.c @@ -0,0 +1,142 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Protocol Control Information + * + *    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 "pci.h" +#include <malloc.h> +#include <errno.h> + +#define PCI_HEAD_SIZE(a, b) a.addr_size * 2 +  \ +        a.cep_id_size * 2 +                    \ +        a.pdu_length_size +                    \ +        b.ttl_size +                           \ +        a.seqno_size +                         \ +        a.qos_id_size +#define PCI_TAIL_SIZE(b) b.chk_size + + +struct pci { +        /* head */ +        uint8_t * dst_addr; +        uint8_t * src_addr; +        uint8_t * dst_cep_id; +        uint8_t * src_cep_id; +        uint8_t * pdu_length; +        uint8_t * ttl; +        uint8_t * seqno; +        uint8_t * qos_id; + +        uint8_t * chk; + +        du_buff_t * dub; + +        struct ipcp_dtp_const dtpc; +        struct ipcp_dup_const dupc; + +}; + +pci_t * pci_create(du_buff_t                   * dub, +                   const struct ipcp_dtp_const * dtpc, +                   const struct ipcp_dup_const * dupc) +{ +        struct pci * p; + +        if (dub == NULL) { +                LOG_DBGF("Bogus input. Bugging out."); +                return NULL; +        } + +        p = malloc(sizeof *p); + +        if (p == NULL) +                return NULL; + +        p->dub = dub; + +        p->dtpc = *dtpc; +        p->dupc = *dupc; + +        p->dst_addr   = NULL; +        p->src_addr   = NULL; +        p->dst_cep_id = NULL; +        p->src_cep_id = NULL; +        p->pdu_length = NULL; +        p->ttl        = NULL; +        p->seqno      = NULL; +        p->qos_id     = NULL; +        p->chk        = NULL; + +        return p; +} + +void pci_destroy(pci_t * pci) +{ +        free(pci); +} + +int pci_init(pci_t                 * pci) +{ +        if (pci == NULL) { +                LOG_DBGF("Bogus input. Bugging out."); +                return -EINVAL; +        } + +        uint8_t * pci_head = du_buff_head_alloc(pci->dub, PCI_HEAD_SIZE( +                                                        pci->dtpc,pci->dupc)); +        uint8_t * pci_tail = du_buff_tail_alloc(pci->dub, PCI_TAIL_SIZE( +                                                        pci->dupc)); + +        if (pci_head == NULL) { +                LOG_DBG("Failed to allocate space for PCI at head."); +                return -ENOBUFS; +        } + +        if (pci_tail == NULL) { +                LOG_DBG("Failed to allocate space for PCI at tail."); +                return -ENOBUFS; +        } + +        pci->dst_addr   = pci_head; +        pci->src_addr   = (pci_head += pci->dtpc.addr_size); +        pci->dst_cep_id = (pci_head += pci->dtpc.addr_size); +        pci->src_cep_id = (pci_head += pci->dtpc.cep_id_size); +        pci->pdu_length = (pci_head += pci->dtpc.cep_id_size); +        pci->ttl        = (pci_head += pci->dtpc.pdu_length_size); +        pci->seqno      = (pci_head += pci->dupc.ttl_size); +        pci->qos_id     = (pci_head += pci->dtpc.seqno_size); + +        pci->chk        = (pci_tail); + +        return 0; +} + +void pci_release(pci_t * pci) +{ +        if (pci == NULL) +                return; + +        if (pci->dub == NULL) +                return; + +        du_buff_head_release(pci->dub, PCI_HEAD_SIZE(pci->dtpc, pci->dupc)); +        du_buff_tail_release(pci->dub, PCI_TAIL_SIZE(pci->dupc)); +} diff --git a/src/ipcpd/pci.h b/src/ipcpd/pci.h new file mode 100644 index 00000000..c7095bbd --- /dev/null +++ b/src/ipcpd/pci.h @@ -0,0 +1,45 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Protocol Control Information + * + *    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. + */ + +#ifndef OUROBOROS_IPCP_PCI_H +#define OUROBOROS_IPCP_PCI_H + +#define OUROBOROS_PREFIX "ipcp/pci" + +#include "ouroboros/du_buff.h" +#include "ouroboros/logs.h" +#include "dt_const.h" + +struct pci; + +typedef struct pci pci_t; + +pci_t * pci_create(du_buff_t                   * dub, +                   const struct ipcp_dtp_const * dtpc, +                   const struct ipcp_dup_const * dupc); +void    pci_destroy(pci_t * pci); + +int     pci_init(pci_t * pci); +void    pci_release(pci_t * pci); + +#endif /* OUROBOROS_IPCP_PCI_H */ | 
