diff options
author | dimitri staessens <[email protected]> | 2016-03-25 12:00:26 +0100 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2016-03-25 12:00:26 +0100 |
commit | b76dd5abd20f5773709d375ddbf4a1685bf2c8cb (patch) | |
tree | 38e540f16ccdb7efd4b0a19f5c60074a5581df6f | |
parent | 35b00759a9616033aa19177ba3281eb9643509d2 (diff) | |
download | ouroboros-b76dd5abd20f5773709d375ddbf4a1685bf2c8cb.tar.gz ouroboros-b76dd5abd20f5773709d375ddbf4a1685bf2c8cb.zip |
ipcpd: added shm_pci_t to manipulate PCI in shm
Provides access to the members of the PCI for shm_du_buffs stored in
the shared memory ringbuffer.
-rw-r--r-- | src/ipcpd/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/ipcpd/shm_pci.c | 146 | ||||
-rw-r--r-- | src/ipcpd/shm_pci.h | 43 |
3 files changed, 190 insertions, 0 deletions
diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt index df6ba5e1..bcb5b986 100644 --- a/src/ipcpd/CMakeLists.txt +++ b/src/ipcpd/CMakeLists.txt @@ -8,6 +8,7 @@ set(SOURCE_FILES # Add source files here main.c pci.c + shm_pci.c ) add_executable (ipcpd ${SOURCE_FILES}) diff --git a/src/ipcpd/shm_pci.c b/src/ipcpd/shm_pci.c new file mode 100644 index 00000000..d44e0e8f --- /dev/null +++ b/src/ipcpd/shm_pci.c @@ -0,0 +1,146 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Protocol Control Information in Shared Memory Map + * + * Dimitri Staessens <[email protected]> + * Sander Vrijders <[email protected]> + * + * 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 "shm_pci.h" +#include <malloc.h> +#include <errno.h> + +#define SHM_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 SHM_PCI_TAIL_SIZE(b) b.chk_size + +#define OUROBOROS_PREFIX "ipcpd/shm_pci" + +#include <ouroboros/logs.h> + +struct shm_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; + + struct shm_du_buff * dub; + + struct ipcp_dtp_const dtpc; + struct ipcp_dup_const dupc; + +}; + +shm_pci_t * shm_pci_create(struct shm_du_buff * dub, + const struct ipcp_dtp_const * dtpc, + const struct ipcp_dup_const * dupc) +{ + struct shm_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 shm_pci_destroy(shm_pci_t * pci) +{ + free(pci); +} + +int shm_pci_init(shm_pci_t * pci) +{ + if (pci == NULL) { + LOG_DBGF("Bogus input. Bugging out."); + return -EINVAL; + } + + uint8_t * pci_head = shm_du_buff_head_alloc( + pci->dub, SHM_PCI_HEAD_SIZE(pci->dtpc, pci->dupc)); + uint8_t * pci_tail = shm_du_buff_tail_alloc( + pci->dub, SHM_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 shm_pci_release(shm_pci_t * pci) +{ + if (pci == NULL) + return; + + if (pci->dub == NULL) + return; + + shm_du_buff_head_release(pci->dub, SHM_PCI_HEAD_SIZE(pci->dtpc, + pci->dupc)); + shm_du_buff_tail_release(pci->dub, SHM_PCI_TAIL_SIZE(pci->dupc)); +} diff --git a/src/ipcpd/shm_pci.h b/src/ipcpd/shm_pci.h new file mode 100644 index 00000000..cb8dd5dd --- /dev/null +++ b/src/ipcpd/shm_pci.h @@ -0,0 +1,43 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Protocol Control Information in Shared Memory Map + * + * Dimitri Staessens <[email protected]> + * Sander Vrijders <[email protected]> + * + * 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_SHM_PCI_H +#define OUROBOROS_IPCP_SHM_PCI_H + +#include <ouroboros/shm_du_map.h> + +#include <dt_const.h> + +struct shm_pci; + +typedef struct shm_pci shm_pci_t; + +shm_pci_t * shm_pci_create(struct shm_du_buff * dub, + const struct ipcp_dtp_const * dtpc, + const struct ipcp_dup_const * dupc); +void shm_pci_destroy(shm_pci_t * pci); + +int shm_pci_init(shm_pci_t * pci); +void shm_pci_release(shm_pci_t * pci); + +#endif /* OUROBOROS_IPCP_SHM_PCI_H */ |