summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal/shm_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipcpd/normal/shm_pci.c')
-rw-r--r--src/ipcpd/normal/shm_pci.c198
1 files changed, 101 insertions, 97 deletions
diff --git a/src/ipcpd/normal/shm_pci.c b/src/ipcpd/normal/shm_pci.c
index 4d66bf06..735bdee1 100644
--- a/src/ipcpd/normal/shm_pci.c
+++ b/src/ipcpd/normal/shm_pci.c
@@ -20,91 +20,119 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#define OUROBOROS_PREFIX "ipcpd/shm_pci"
+#define OUROBOROS_PREFIX "shm-pci"
+#include <ouroboros/config.h>
#include <ouroboros/logs.h>
#include <ouroboros/errno.h>
#include <ouroboros/crc32.h>
+#include <ouroboros/rib.h>
+
+#include "shm_pci.h"
+#include "dt_const.h"
#include <stdlib.h>
#include <string.h>
-#include "shm_pci.h"
-#include "frct.h"
-#include "ribmgr.h"
-
#define PDU_TYPE_SIZE 1
#define QOS_ID_SIZE 1
#define DEFAULT_TTL 60
#define TTL_SIZE 1
#define CHK_SIZE 4
-static size_t shm_pci_head_size(struct dt_const * dtc)
-{
- size_t len = 0;
+#define BOOT_PATH "/" BOOT_NAME
- len = PDU_TYPE_SIZE + dtc->addr_size * 2 + dtc->cep_id_size * 2
- + dtc->pdu_length_size + dtc->seqno_size + QOS_ID_SIZE;
+struct {
+ struct dt_const dtc;
+ size_t head_size;
+ size_t tail_size;
+} pci_info;
- if (dtc->has_ttl)
- len += TTL_SIZE;
- return len;
-}
-
-static size_t shm_pci_tail_size(struct dt_const * dtc)
-{
- return dtc->has_chk ? CHK_SIZE : 0;
-}
-
-static void ser_pci_head(uint8_t * head,
- struct pci * pci,
- struct dt_const * dtc)
+static void ser_pci_head(uint8_t * head,
+ struct pci * pci)
{
int offset = 0;
uint8_t ttl = DEFAULT_TTL;
memcpy(head, &pci->pdu_type, PDU_TYPE_SIZE);
offset += PDU_TYPE_SIZE;
- memcpy(head + offset, &pci->dst_addr, dtc->addr_size);
- offset += dtc->addr_size;
- memcpy(head + offset, &pci->src_addr, dtc->addr_size);
- offset += dtc->addr_size;
- memcpy(head + offset, &pci->dst_cep_id, dtc->cep_id_size);
- offset += dtc->cep_id_size;
- memcpy(head + offset, &pci->src_cep_id, dtc->cep_id_size);
- offset += dtc->cep_id_size;
- memcpy(head + offset, &pci->pdu_length, dtc->pdu_length_size);
- offset += dtc->pdu_length_size;
- memcpy(head + offset, &pci->seqno, dtc->seqno_size);
- offset += dtc->seqno_size;
+ memcpy(head + offset, &pci->dst_addr, pci_info.dtc.addr_size);
+ offset += pci_info.dtc.addr_size;
+ memcpy(head + offset, &pci->src_addr, pci_info.dtc.addr_size);
+ offset += pci_info.dtc.addr_size;
+ memcpy(head + offset, &pci->dst_cep_id, pci_info.dtc.cep_id_size);
+ offset += pci_info.dtc.cep_id_size;
+ memcpy(head + offset, &pci->src_cep_id, pci_info.dtc.cep_id_size);
+ offset += pci_info.dtc.cep_id_size;
+ memcpy(head + offset, &pci->pdu_length, pci_info.dtc.pdu_length_size);
+ offset += pci_info.dtc.pdu_length_size;
+ memcpy(head + offset, &pci->seqno, pci_info.dtc.seqno_size);
+ offset += pci_info.dtc.seqno_size;
memcpy(head + offset, &pci->qos_id, QOS_ID_SIZE);
offset += QOS_ID_SIZE;
- if (dtc->has_ttl)
+ if (pci_info.dtc.has_ttl)
memcpy(head + offset, &ttl, TTL_SIZE);
}
+int shm_pci_init(void)
+{
+ /* read dt constants from the RIB */
+ if (rib_read(BOOT_PATH "/dt/const/addr_size",
+ &pci_info.dtc.addr_size,
+ sizeof(pci_info.dtc.addr_size)) ||
+ rib_read(BOOT_PATH "/dt/const/cep_id_size",
+ &pci_info.dtc.cep_id_size,
+ sizeof(pci_info.dtc.cep_id_size)) ||
+ rib_read(BOOT_PATH "/dt/const/seqno_size",
+ &pci_info.dtc.seqno_size,
+ sizeof(pci_info.dtc.seqno_size)) ||
+ rib_read(BOOT_PATH "/dt/const/has_ttl",
+ &pci_info.dtc.has_ttl,
+ sizeof(pci_info.dtc.has_ttl)) ||
+ rib_read(BOOT_PATH "/dt/const/has_chk",
+ &pci_info.dtc.has_chk,
+ sizeof(pci_info.dtc.has_chk)) ||
+ rib_read(BOOT_PATH "/dt/const/min_pdu_size",
+ &pci_info.dtc.min_pdu_size,
+ sizeof(pci_info.dtc.min_pdu_size)) ||
+ rib_read(BOOT_PATH "/dt/const/max_pdu_size",
+ &pci_info.dtc.max_pdu_size,
+ sizeof(pci_info.dtc.max_pdu_size)))
+ return -1;
+
+ pci_info.head_size = PDU_TYPE_SIZE + pci_info.dtc.addr_size * 2 +
+ pci_info.dtc.cep_id_size * 2 + pci_info.dtc.pdu_length_size +
+ pci_info.dtc.seqno_size + QOS_ID_SIZE;
+
+ if (pci_info.dtc.has_ttl)
+ pci_info.head_size += TTL_SIZE;
+
+ pci_info.tail_size = pci_info.dtc.has_chk ? CHK_SIZE : 0;
+
+ return 0;
+}
+
+void shm_pci_fini(void) {
+ return ;
+}
+
int shm_pci_ser(struct shm_du_buff * sdb,
struct pci * pci)
{
uint8_t * head;
uint8_t * tail;
- struct dt_const * dtc;
- dtc = ribmgr_dt_const();
- if (dtc == NULL)
- return -1;
-
- head = shm_du_buff_head_alloc(sdb, shm_pci_head_size(dtc));
+ head = shm_du_buff_head_alloc(sdb, pci_info.head_size);
if (head == NULL)
return -1;
- ser_pci_head(head, pci, dtc);
+ ser_pci_head(head, pci);
- if (dtc->has_chk) {
- tail = shm_du_buff_tail_alloc(sdb, shm_pci_tail_size(dtc));
+ if (pci_info.dtc.has_chk) {
+ tail = shm_du_buff_tail_alloc(sdb, pci_info.tail_size);
if (tail == NULL) {
- shm_du_buff_head_release(sdb, shm_pci_tail_size(dtc));
+ shm_du_buff_head_release(sdb, pci_info.head_size);
return -1;
}
@@ -118,22 +146,16 @@ buffer_t * shm_pci_ser_buf(buffer_t * buf,
struct pci * pci)
{
buffer_t * buffer;
- struct dt_const * dtc;
if (buf == NULL || pci == NULL)
return NULL;
- dtc = ribmgr_dt_const();
- if (dtc == NULL)
- return NULL;
-
buffer = malloc(sizeof(*buffer));
if (buffer == NULL)
return NULL;
- buffer->len = buf->len +
- shm_pci_head_size(dtc) +
- shm_pci_tail_size(dtc);
+ buffer->len = buf->len + pci_info.head_size +
+ pci_info.tail_size;
buffer->data = malloc(buffer->len);
if (buffer->data == NULL) {
@@ -141,17 +163,17 @@ buffer_t * shm_pci_ser_buf(buffer_t * buf,
return NULL;
}
- ser_pci_head(buffer->data, pci, dtc);
- memcpy(buffer->data + shm_pci_head_size(dtc),
+ ser_pci_head(buffer->data, pci);
+ memcpy(buffer->data + pci_info.head_size,
buf->data, buf->len);
free(buf->data);
- if (dtc->has_chk)
- crc32((uint32_t *) buffer->data +
- shm_pci_head_size(dtc) + buf->len,
+ if (pci_info.dtc.has_chk)
+ crc32((uint32_t *) (buffer->data +
+ pci_info.head_size + buf->len),
buffer->data,
- shm_pci_head_size(dtc) + buf->len);
+ pci_info.head_size + buf->len);
return buffer;
}
@@ -161,38 +183,34 @@ struct pci * shm_pci_des(struct shm_du_buff * sdb)
uint8_t * head;
struct pci * pci;
int offset = 0;
- struct dt_const * dtc;
if (sdb == NULL)
return NULL;
head = shm_du_buff_head(sdb);
- dtc = ribmgr_dt_const();
- if (dtc == NULL)
- return NULL;
-
pci = malloc(sizeof(*pci));
if (pci == NULL)
return NULL;
memcpy(&pci->pdu_type, head, PDU_TYPE_SIZE);
offset += PDU_TYPE_SIZE;
- memcpy(&pci->dst_addr, head + offset, dtc->addr_size);
- offset += dtc->addr_size;
- memcpy(&pci->src_addr, head + offset, dtc->addr_size);
- offset += dtc->addr_size;
- memcpy(&pci->dst_cep_id, head + offset, dtc->cep_id_size);
- offset += dtc->cep_id_size;
- memcpy(&pci->src_cep_id, head + offset, dtc->cep_id_size);
- offset += dtc->cep_id_size;
- memcpy(&pci->pdu_length, head + offset, dtc->pdu_length_size);
- offset += dtc->pdu_length_size;
- memcpy(&pci->seqno, head + offset, dtc->seqno_size);
- offset += dtc->seqno_size;
+ memcpy(&pci->dst_addr, head + offset, pci_info.dtc.addr_size);
+ offset += pci_info.dtc.addr_size;
+ memcpy(&pci->src_addr, head + offset, pci_info.dtc.addr_size);
+ offset += pci_info.dtc.addr_size;
+ memcpy(&pci->dst_cep_id, head + offset, pci_info.dtc.cep_id_size);
+ offset += pci_info.dtc.cep_id_size;
+ memcpy(&pci->src_cep_id, head + offset, pci_info.dtc.cep_id_size);
+ offset += pci_info.dtc.cep_id_size;
+ memcpy(&pci->pdu_length, head + offset, pci_info.dtc.pdu_length_size);
+ offset += pci_info.dtc.pdu_length_size;
+ memcpy(&pci->seqno, head + offset, pci_info.dtc.seqno_size);
+ offset += pci_info.dtc.seqno_size;
memcpy(&pci->qos_id, head + offset, QOS_ID_SIZE);
offset += QOS_ID_SIZE;
- if (dtc->has_ttl)
+ pci->has_ttl = pci_info.dtc.has_ttl;
+ if (pci_info.dtc.has_ttl)
memcpy(&pci->ttl, head + offset, TTL_SIZE);
return pci;
@@ -200,21 +218,15 @@ struct pci * shm_pci_des(struct shm_du_buff * sdb)
int shm_pci_shrink(struct shm_du_buff * sdb)
{
- struct dt_const * dtc;
-
if (sdb == NULL)
return -1;
- dtc = ribmgr_dt_const();
- if (dtc == NULL)
- return -1;
-
- if (shm_du_buff_head_release(sdb, shm_pci_head_size(dtc))) {
+ if (shm_du_buff_head_release(sdb, pci_info.head_size)) {
LOG_ERR("Failed to shrink head.");
return -1;
}
- if (shm_du_buff_tail_release(sdb, shm_pci_tail_size(dtc))) {
+ if (shm_du_buff_tail_release(sdb, pci_info.tail_size)) {
LOG_ERR("Failed to shrink tail.");
return -1;
}
@@ -224,27 +236,19 @@ int shm_pci_shrink(struct shm_du_buff * sdb)
int shm_pci_dec_ttl(struct shm_du_buff * sdb)
{
- struct dt_const * dtc;
- size_t offset = 0;
uint8_t * head;
uint8_t * tail;
- dtc = ribmgr_dt_const();
- if (dtc == NULL)
- return -1;
-
- if (dtc->has_ttl == false)
+ if (pci_info.dtc.has_ttl == false)
return 0;
- offset = shm_pci_head_size(dtc) - 1;
-
head = shm_du_buff_head(sdb);
if (head == NULL)
return -1;
- head[offset]--;
+ head[pci_info.head_size - TTL_SIZE]--;
- if (dtc->has_chk) {
+ if (pci_info.dtc.has_chk) {
tail = shm_du_buff_tail(sdb);
if (tail == NULL)
return -1;