summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/normal/fmgr.c42
-rw-r--r--src/ipcpd/normal/shm_pci.c175
-rw-r--r--src/ipcpd/normal/shm_pci.h9
-rw-r--r--src/lib/shm_rdrbuff.c20
4 files changed, 98 insertions, 148 deletions
diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c
index 6b21cdbf..b79d20b4 100644
--- a/src/ipcpd/normal/fmgr.c
+++ b/src/ipcpd/normal/fmgr.c
@@ -129,13 +129,15 @@ void * fmgr_nm1_sdu_reader(void * o)
{
struct timespec timeout = {0, FD_UPDATE_TIMEOUT};
struct shm_du_buff * sdb;
- struct pci * pci;
+ struct pci pci;
int fd;
int i = 0;
int ret;
(void) o;
+ memset(&pci, 0, sizeof(pci));
+
while (true) {
/* FIXME: replace with scheduling policy call */
i = (i + 1) % QOS_CUBE_MAX;
@@ -157,30 +159,15 @@ void * fmgr_nm1_sdu_reader(void * o)
continue;
}
- pci = shm_pci_des(sdb);
- if (pci == NULL) {
- LOG_ERR("Failed to get PCI.");
- ipcp_flow_del(sdb);
- continue;
- }
+ shm_pci_des(sdb, &pci);
- if (pci->dst_addr != ipcpi.address) {
+ if (pci.dst_addr != ipcpi.address) {
LOG_DBG("PDU needs to be forwarded.");
- if (pci->has_ttl) {
- if (pci->ttl == 0) {
- LOG_DBG("TTL was zero.");
- ipcp_flow_del(sdb);
- free(pci);
- continue;
- }
-
- if (shm_pci_dec_ttl(sdb)) {
- LOG_ERR("Failed to dec TTL.");
- ipcp_flow_del(sdb);
- free(pci);
- continue;
- }
+ if (pci.ttl == 0) {
+ LOG_DBG("TTL was zero.");
+ ipcp_flow_del(sdb);
+ continue;
}
/*
@@ -188,21 +175,14 @@ void * fmgr_nm1_sdu_reader(void * o)
* we don't have a PFF yet
*/
ipcp_flow_del(sdb);
- free(pci);
continue;
}
- if (shm_pci_shrink(sdb)) {
- LOG_ERR("Failed to shrink PDU.");
- ipcp_flow_del(sdb);
- free(pci);
- continue;
- }
+ shm_pci_shrink(sdb);
- if (frct_nm1_post_sdu(pci, sdb)) {
+ if (frct_nm1_post_sdu(&pci, sdb)) {
LOG_ERR("Failed to hand PDU to FRCT.");
ipcp_flow_del(sdb);
- free(pci);
continue;
}
}
diff --git a/src/ipcpd/normal/shm_pci.c b/src/ipcpd/normal/shm_pci.c
index 735bdee1..1c2cee54 100644
--- a/src/ipcpd/normal/shm_pci.c
+++ b/src/ipcpd/normal/shm_pci.c
@@ -20,10 +20,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#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>
@@ -33,6 +30,7 @@
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#define PDU_TYPE_SIZE 1
#define QOS_ID_SIZE 1
@@ -46,33 +44,44 @@ struct {
struct dt_const dtc;
size_t head_size;
size_t tail_size;
+
+ /* offsets */
+ size_t dst_addr_o;
+ size_t src_addr_o;
+ size_t dst_cep_id_o;
+ size_t src_cep_id_o;
+ size_t pdu_length_o;
+ size_t seqno_o;
+ size_t qos_id_o;
+ size_t ttl_o;
} pci_info;
static void ser_pci_head(uint8_t * head,
struct pci * pci)
{
- int offset = 0;
uint8_t ttl = DEFAULT_TTL;
+ assert(head);
+ assert(pci);
+
+ /* FIXME: Add check and operations for Big Endian machines */
memcpy(head, &pci->pdu_type, PDU_TYPE_SIZE);
- offset += PDU_TYPE_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;
+ memcpy(head + pci_info.dst_addr_o, &pci->dst_addr,
+ pci_info.dtc.addr_size);
+ memcpy(head + pci_info.src_addr_o, &pci->src_addr,
+ pci_info.dtc.addr_size);
+ memcpy(head + pci_info.dst_cep_id_o, &pci->dst_cep_id,
+ pci_info.dtc.cep_id_size);
+ memcpy(head + pci_info.src_cep_id_o, &pci->src_cep_id,
+ pci_info.dtc.cep_id_size);
+ memcpy(head + pci_info.pdu_length_o, &pci->pdu_length,
+ pci_info.dtc.pdu_length_size);
+ memcpy(head + pci_info.seqno_o, &pci->seqno,
+ pci_info.dtc.seqno_size);
+ memcpy(head + pci_info.qos_id_o, &pci->qos_id, QOS_ID_SIZE);
if (pci_info.dtc.has_ttl)
- memcpy(head + offset, &ttl, TTL_SIZE);
+ memcpy(head + pci_info.ttl_o, &ttl, TTL_SIZE);
}
int shm_pci_init(void)
@@ -101,9 +110,19 @@ int shm_pci_init(void)
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;
+ pci_info.dst_addr_o = PDU_TYPE_SIZE;
+ pci_info.src_addr_o = pci_info.dst_addr_o + pci_info.dtc.addr_size;
+ pci_info.dst_cep_id_o = pci_info.dst_addr_o + pci_info.dtc.addr_size;
+ pci_info.dst_cep_id_o = pci_info.src_addr_o + pci_info.dtc.addr_size;
+ pci_info.src_cep_id_o = pci_info.dst_cep_id_o
+ + pci_info.dtc.cep_id_size;
+ pci_info.pdu_length_o = pci_info.src_cep_id_o
+ + pci_info.dtc.cep_id_size;
+ pci_info.seqno_o = pci_info.pdu_length_o + pci_info.dtc.pdu_length_size;
+ pci_info.qos_id_o = pci_info.seqno_o + pci_info.dtc.seqno_size;
+ pci_info.ttl_o = pci_info.qos_id_o + QOS_ID_SIZE;
+
+ pci_info.head_size = pci_info.ttl_o;
if (pci_info.dtc.has_ttl)
pci_info.head_size += TTL_SIZE;
@@ -118,14 +137,17 @@ void shm_pci_fini(void) {
}
int shm_pci_ser(struct shm_du_buff * sdb,
- struct pci * pci)
+ struct pci * pci)
{
uint8_t * head;
uint8_t * tail;
+ assert(sdb);
+ assert(pci);
+
head = shm_du_buff_head_alloc(sdb, pci_info.head_size);
if (head == NULL)
- return -1;
+ return -EPERM;
ser_pci_head(head, pci);
@@ -133,7 +155,7 @@ int shm_pci_ser(struct shm_du_buff * sdb,
tail = shm_du_buff_tail_alloc(sdb, pci_info.tail_size);
if (tail == NULL) {
shm_du_buff_head_release(sdb, pci_info.head_size);
- return -1;
+ return -EPERM;
}
crc32((uint32_t *) tail, head, tail - head);
@@ -147,8 +169,8 @@ buffer_t * shm_pci_ser_buf(buffer_t * buf,
{
buffer_t * buffer;
- if (buf == NULL || pci == NULL)
- return NULL;
+ assert(buf);
+ assert(pci);
buffer = malloc(sizeof(*buffer));
if (buffer == NULL)
@@ -178,85 +200,44 @@ buffer_t * shm_pci_ser_buf(buffer_t * buf,
return buffer;
}
-struct pci * shm_pci_des(struct shm_du_buff * sdb)
+void shm_pci_des(struct shm_du_buff * sdb,
+ struct pci * pci)
{
uint8_t * head;
- struct pci * pci;
- int offset = 0;
- if (sdb == NULL)
- return NULL;
+ assert(sdb);
+ assert(pci);
head = shm_du_buff_head(sdb);
- pci = malloc(sizeof(*pci));
- if (pci == NULL)
- return NULL;
-
+ /* FIXME: Add check and operations for Big Endian machines */
memcpy(&pci->pdu_type, head, PDU_TYPE_SIZE);
- offset += PDU_TYPE_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;
- pci->has_ttl = pci_info.dtc.has_ttl;
- if (pci_info.dtc.has_ttl)
- memcpy(&pci->ttl, head + offset, TTL_SIZE);
-
- return pci;
-}
-
-int shm_pci_shrink(struct shm_du_buff * sdb)
-{
- if (sdb == NULL)
- return -1;
-
- 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, pci_info.tail_size)) {
- LOG_ERR("Failed to shrink tail.");
- return -1;
+ memcpy(&pci->dst_addr, head + pci_info.dst_addr_o,
+ pci_info.dtc.addr_size);
+ memcpy(&pci->src_addr, head + pci_info.src_addr_o,
+ pci_info.dtc.addr_size);
+ memcpy(&pci->dst_cep_id, head + pci_info.dst_cep_id_o,
+ pci_info.dtc.cep_id_size);
+ memcpy(&pci->src_cep_id, head + pci_info.src_cep_id_o,
+ pci_info.dtc.cep_id_size);
+ memcpy(&pci->pdu_length, head + pci_info.pdu_length_o,
+ pci_info.dtc.pdu_length_size);
+ memcpy(&pci->seqno, head + pci_info.seqno_o,
+ pci_info.dtc.seqno_size);
+ memcpy(&pci->qos_id, head + pci_info.qos_id_o, QOS_ID_SIZE);
+
+ if (pci_info.dtc.has_ttl) {
+ --*(head + pci_info.ttl_o); /* decrease TTL */
+ memcpy(&pci->ttl, head + pci_info.ttl_o, TTL_SIZE);
+ } else {
+ pci->ttl = 1;
}
-
- return 0;
}
-int shm_pci_dec_ttl(struct shm_du_buff * sdb)
+void shm_pci_shrink(struct shm_du_buff * sdb)
{
- uint8_t * head;
- uint8_t * tail;
-
- if (pci_info.dtc.has_ttl == false)
- return 0;
+ assert(sdb);
- head = shm_du_buff_head(sdb);
- if (head == NULL)
- return -1;
-
- head[pci_info.head_size - TTL_SIZE]--;
-
- if (pci_info.dtc.has_chk) {
- tail = shm_du_buff_tail(sdb);
- if (tail == NULL)
- return -1;
-
- tail -= CHK_SIZE;
-
- crc32((uint32_t *) tail, head, tail - head);
- }
-
- return 0;
+ shm_du_buff_head_release(sdb, pci_info.head_size);
+ shm_du_buff_tail_release(sdb, pci_info.tail_size);
}
diff --git a/src/ipcpd/normal/shm_pci.h b/src/ipcpd/normal/shm_pci.h
index 9fe3d9aa..17ce5cdd 100644
--- a/src/ipcpd/normal/shm_pci.h
+++ b/src/ipcpd/normal/shm_pci.h
@@ -44,8 +44,6 @@ struct pci {
uint32_t pdu_length;
uint64_t seqno;
uint8_t ttl;
- /* FIXME: Deprecate this and the dec_ttl call */
- int has_ttl;
};
int shm_pci_init(void);
@@ -58,10 +56,9 @@ int shm_pci_ser(struct shm_du_buff * sdb,
buffer_t * shm_pci_ser_buf(buffer_t * buf,
struct pci * pci);
-struct pci * shm_pci_des(struct shm_du_buff * sdb);
-
-int shm_pci_shrink(struct shm_du_buff * sdb);
+void shm_pci_des(struct shm_du_buff * sdb,
+ struct pci * pci);
-int shm_pci_dec_ttl(struct shm_du_buff * sdb);
+void shm_pci_shrink(struct shm_du_buff * sdb);
#endif /* OUROBOROS_IPCPD_NORMAL_SHM_PCI_H */
diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c
index ce81d171..55047aa5 100644
--- a/src/lib/shm_rdrbuff.c
+++ b/src/lib/shm_rdrbuff.c
@@ -619,28 +619,20 @@ uint8_t * shm_du_buff_tail_alloc(struct shm_du_buff * sdb,
return buf;
}
-int shm_du_buff_head_release(struct shm_du_buff * sdb,
- size_t size)
+void shm_du_buff_head_release(struct shm_du_buff * sdb,
+ size_t size)
{
assert(sdb);
-
- if (size > sdb->du_tail - sdb->du_head)
- return -EOVERFLOW;
+ assert(!(size > sdb->du_tail - sdb->du_head));
sdb->du_head += size;
-
- return 0;
}
-int shm_du_buff_tail_release(struct shm_du_buff * sdb,
- size_t size)
+void shm_du_buff_tail_release(struct shm_du_buff * sdb,
+ size_t size)
{
assert(sdb);
-
- if (size > sdb->du_tail - sdb->du_head)
- return -EOVERFLOW;
+ assert(!(size > sdb->du_tail - sdb->du_head));
sdb->du_tail -= size;
-
- return 0;
}