summaryrefslogtreecommitdiff
path: root/test/gmock_marsio.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/gmock_marsio.cpp')
-rw-r--r--test/gmock_marsio.cpp476
1 files changed, 476 insertions, 0 deletions
diff --git a/test/gmock_marsio.cpp b/test/gmock_marsio.cpp
new file mode 100644
index 0000000..40992eb
--- /dev/null
+++ b/test/gmock_marsio.cpp
@@ -0,0 +1,476 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include "marsio.h"
+
+struct mr_instance
+{
+ marsio_buff_t *current_recv_mbuff_ptr;
+ marsio_buff_t *current_send_mbuff_ptr[128];
+ int send_mbuff_ptr_index;
+ int send_mbuff_ptr_number;
+};
+
+struct mr_vdev
+{
+ struct mr_instance *mr_instance;
+};
+
+struct mr_sendpath
+{
+ struct mr_instance *mr_instance;
+};
+
+struct mrb_metadata_route_ctx
+{
+ uint8_t dir;
+ uint8_t link_id;
+ uint16_t port_ingress;
+ uint16_t port_egress;
+ uint16_t link_db_index;
+ uint32_t hash_usr;
+};
+
+struct mrb_metadata
+{
+ uint8_t dir : 1;
+ uint8_t packet_create_from_nf : 1;
+ uint8_t link_id : 6;
+
+ uint8_t is_ctrlbuf : 1;
+ uint8_t un_used : 7;
+
+ uint16_t payload_offset;
+
+ uint64_t session_id;
+
+ uint8_t start_sid;
+ uint8_t nr_sid;
+ uint16_t cur_sid;
+ uint16_t sids[8];
+
+ uint16_t port_ingress;
+ uint16_t port_egress;
+
+ uint16_t link_db_index;
+ uint16_t user_data_0;
+};
+
+struct mock_marsio_buff_t
+{
+ struct mrb_metadata metadata;
+
+ char *raw_data;
+ int raw_len;
+
+ int buff_size;
+ char *buff_start;
+} __attribute__((__packed__));
+
+struct mr_instance *marsio_create()
+{
+ struct mr_instance *instance = (struct mr_instance *)calloc(1, sizeof(struct mr_instance));
+ instance->send_mbuff_ptr_index = 0;
+ instance->send_mbuff_ptr_number = 0;
+
+ return instance;
+}
+
+int marsio_destory(struct mr_instance *instance)
+{
+ if (instance)
+ {
+ free(instance);
+ instance = NULL;
+ }
+
+ return 0;
+}
+
+struct mr_vdev *marsio_open_device(struct mr_instance *instance, const char *devsym, unsigned int nr_rxstream, unsigned int nr_txstream)
+{
+ struct mr_vdev *vdev = (struct mr_vdev *)calloc(1, sizeof(struct mr_vdev));
+ vdev->mr_instance = instance;
+
+ return vdev;
+}
+
+void marsio_close_device(struct mr_vdev *vdev)
+{
+ if (vdev)
+ {
+ free(vdev);
+ vdev = NULL;
+ }
+}
+
+void marsio_get_device_ether_addr(struct mr_vdev *vdev, void *str_ether_addr, uint8_t size)
+{
+}
+
+struct mr_sendpath *marsio_sendpath_create_by_vdev(struct mr_vdev *dest_device)
+{
+ struct mr_sendpath *sendpath = (struct mr_sendpath *)calloc(1, sizeof(struct mr_sendpath));
+ sendpath->mr_instance = dest_device->mr_instance;
+
+ return sendpath;
+}
+
+void marsio_sendpath_destory(struct mr_sendpath *sendpath)
+{
+ if (sendpath)
+ {
+ free(sendpath);
+ sendpath = NULL;
+ }
+}
+
+int marsio_init(struct mr_instance *instance, const char *appsym)
+{
+ return 0;
+}
+
+int marsio_option_set(struct mr_instance *instance, marsio_opt_type_t opt_type, void *opt, size_t sz_opt)
+{
+ return 0;
+}
+
+int marsio_thread_init(struct mr_instance *instance)
+{
+ return 0;
+}
+
+int marsio_poll_wait(struct mr_instance *instance, struct mr_vdev *vdevs[], unsigned int nr_vdevs, unsigned int tid, int timeout)
+{
+ return 0;
+}
+
+int marsio_buff_set_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+ struct mrb_metadata_route_ctx *route_ctx = NULL;
+
+ switch (type)
+ {
+ case MR_BUFF_ROUTE_CTX:
+ route_ctx = (struct mrb_metadata_route_ctx *)data;
+ assert(route_ctx != NULL);
+
+ mrb_metadata->packet_create_from_nf = 1;
+ mrb_metadata->dir = route_ctx->dir;
+ mrb_metadata->port_ingress = route_ctx->port_ingress;
+ mrb_metadata->port_egress = route_ctx->port_egress;
+ mrb_metadata->link_db_index = route_ctx->link_db_index;
+ mrb_metadata->link_id = route_ctx->link_id;
+ return 0;
+ case MR_BUFF_SESSION_ID:
+ mrb_metadata->session_id = *(uint64_t *)data;
+ return 0;
+ case MR_BUFF_PAYLOAD_OFFSET:
+ mrb_metadata->payload_offset = *(uint16_t *)data;
+ return 0;
+ case MR_BUFF_USER_0:
+ mrb_metadata->user_data_0 = *(uint16_t *)data;
+ return 0;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+int marsio_buff_get_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+ struct mrb_metadata_route_ctx *route_ctx = NULL;
+
+ switch (type)
+ {
+ case MR_BUFF_ROUTE_CTX:
+ if (sz_data < sizeof(struct mrb_metadata_route_ctx))
+ {
+ return -1;
+ }
+
+ route_ctx = (struct mrb_metadata_route_ctx *)data;
+ if (route_ctx != NULL)
+ {
+ route_ctx->dir = mrb_metadata->dir;
+ route_ctx->port_ingress = mrb_metadata->port_ingress;
+ route_ctx->port_egress = mrb_metadata->port_egress;
+ route_ctx->link_db_index = mrb_metadata->link_db_index;
+ route_ctx->link_id = mrb_metadata->link_id;
+ route_ctx->hash_usr = 0;
+ }
+ return sizeof(struct mrb_metadata_route_ctx);
+ case MR_BUFF_DIR:
+ if (sz_data < sizeof(unsigned int))
+ {
+ return -1;
+ }
+ *(unsigned int *)(data) = (unsigned int)mrb_metadata->dir;
+ return sizeof(unsigned int);
+ case MR_BUFF_SESSION_ID:
+ if (sz_data < sizeof(uint64_t))
+ {
+ return -1;
+ }
+ *(uint64_t *)(data) = (uint64_t)mrb_metadata->session_id;
+ return sizeof(uint64_t);
+ case MR_BUFF_PAYLOAD_OFFSET:
+ if (sz_data < sizeof(uint16_t))
+ {
+ return -1;
+ }
+ *(uint16_t *)(data) = (uint16_t)mrb_metadata->payload_offset;
+ return sizeof(uint16_t);
+ case MR_BUFF_USER_0:
+ if (sz_data < sizeof(uint16_t))
+ {
+ return -1;
+ }
+ *(uint16_t *)(data) = (uint16_t)mrb_metadata->user_data_0;
+ return sizeof(uint16_t);
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+int marsio_buff_set_sid_list(marsio_buff_t *m, sid_t *slist, uint8_t sz_slist)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ if (sz_slist > sizeof(mrb_metadata->sids) / sizeof(mrb_metadata->sids[0]))
+ {
+ return -1;
+ }
+
+ for (uint8_t i = 0; i < sz_slist; i++)
+ {
+ mrb_metadata->sids[i] = slist[i];
+ }
+
+ mrb_metadata->start_sid = 0;
+ mrb_metadata->nr_sid = sz_slist;
+ return 0;
+}
+
+int marsio_buff_get_sid_list(marsio_buff_t *m, sid_t *out_slist, uint8_t sz_out_slist)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ uint8_t out_i = 0;
+ for (uint8_t i = mrb_metadata->start_sid; i < mrb_metadata->start_sid + mrb_metadata->nr_sid && out_i < sz_out_slist; i++, out_i++)
+ {
+ out_slist[out_i] = mrb_metadata->sids[i];
+ }
+
+ return out_i;
+}
+
+int marsio_buff_malloc_global(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
+{
+ for (unsigned int i = 0; i < nr_mbufs; i++)
+ {
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)calloc(1, sizeof(struct mock_marsio_buff_t) + 4096);
+
+ mbuf->buff_size = 4096;
+ mbuf->buff_start = (char *)mbuf + sizeof(struct mock_marsio_buff_t);
+ mbuf->raw_data = mbuf->buff_start + 50;
+
+ marsio_buff[i] = mbuf;
+ }
+ return nr_mbufs;
+}
+
+void marsio_buff_free(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
+{
+ for (unsigned int i = 0; i < nr_mbufs; i++)
+ {
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)marsio_buff[i];
+ if (mbuf)
+ {
+ memset(mbuf, 0, sizeof(struct mock_marsio_buff_t));
+
+ free(mbuf);
+ mbuf = NULL;
+ }
+ }
+}
+
+char *marsio_buff_mtod(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ return mbuf->raw_data;
+}
+
+uint32_t marsio_buff_datalen(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ return mbuf->raw_len;
+}
+
+char *marsio_buff_adj(marsio_buff_t *m, uint16_t len)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ mbuf->raw_data += len;
+ mbuf->raw_len -= len;
+ return mbuf->raw_data;
+}
+
+char *marsio_buff_append(marsio_buff_t *m, uint16_t len)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ mbuf->raw_len += len;
+ return mbuf->raw_data;
+}
+
+char *marsio_buff_prepend(marsio_buff_t *m, uint16_t len)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ mbuf->raw_len += len;
+ mbuf->raw_data -= len;
+ return mbuf->raw_data;
+}
+
+void marsio_buff_ctrlzone_reset(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ memset(mrb_metadata, 0, sizeof(struct mrb_metadata));
+}
+
+int marsio_buff_is_ctrlbuf(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ return mrb_metadata->is_ctrlbuf;
+}
+
+void marsio_buff_set_ctrlbuf(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ mrb_metadata->is_ctrlbuf = 1;
+}
+
+int marsio_recv_burst(struct mr_vdev *vdev, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs)
+{
+ mbufs[0] = vdev->mr_instance->current_recv_mbuff_ptr;
+
+ return 1;
+}
+
+int marsio_send_burst(struct mr_sendpath *sendpath, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs)
+{
+ assert(nr_mbufs == 1);
+ sendpath->mr_instance->current_send_mbuff_ptr[sendpath->mr_instance->send_mbuff_ptr_index] = mbufs[0];
+ sendpath->mr_instance->send_mbuff_ptr_index++;
+ sendpath->mr_instance->send_mbuff_ptr_number++;
+
+ return marsio_buff_datalen(mbufs[0]);
+}
+
+int marsio_send_burst_with_options(struct mr_sendpath *sendpath, queue_id_t sid, marsio_buff_t *mbufs[], int nr_mbufs, uint16_t options)
+{
+ return marsio_send_burst(sendpath, sid, mbufs, nr_mbufs);
+}
+
+// new add, only for gtest
+void marsio_set_recv_mbuff(struct mr_instance *instance, marsio_buff_t *mbuff)
+{
+ instance->current_recv_mbuff_ptr = mbuff;
+}
+
+void marsio_set_send_mbuff(struct mr_instance *instance, marsio_buff_t *mbuff)
+{
+ instance->current_send_mbuff_ptr[instance->send_mbuff_ptr_index] = mbuff;
+ instance->send_mbuff_ptr_index++;
+ instance->send_mbuff_ptr_number++;
+}
+
+marsio_buff_t *marsio_get_recv_mbuff(struct mr_instance *instance)
+{
+ return instance->current_recv_mbuff_ptr;
+}
+
+marsio_buff_t *marsio_get_send_mbuff(struct mr_instance *instance)
+{
+ if (instance->send_mbuff_ptr_number)
+ {
+ marsio_buff_t *buff = instance->current_send_mbuff_ptr[instance->send_mbuff_ptr_index - instance->send_mbuff_ptr_number];
+ instance->send_mbuff_ptr_number--;
+ return buff;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+int marsio_mbuff_cmp(marsio_buff_t *mbuff1, marsio_buff_t *mbuff2)
+{
+ struct mock_marsio_buff_t *mbuf1 = (struct mock_marsio_buff_t *)mbuff1;
+ struct mock_marsio_buff_t *mbuf2 = (struct mock_marsio_buff_t *)mbuff2;
+
+ if (mbuf1 == mbuf2)
+ {
+ return 0;
+ }
+
+ if (mbuf1 && mbuf2)
+ {
+ if (memcmp(&mbuf1->metadata, &mbuf2->metadata, sizeof(struct mrb_metadata)) != 0)
+ {
+ return 1;
+ }
+
+ if (mbuf1->raw_len != mbuf2->raw_len)
+ {
+ return 1;
+ }
+ if (memcmp(mbuf1->raw_data, mbuf2->raw_data, mbuf2->raw_len) != 0)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+marsio_buff_t *marsio_mbuff_dup(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *orig = (struct mock_marsio_buff_t *)m;
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)calloc(1, sizeof(struct mock_marsio_buff_t) + 4096);
+
+ mbuf->buff_size = 4096;
+ mbuf->buff_start = (char *)mbuf + sizeof(struct mock_marsio_buff_t);
+ mbuf->raw_data = mbuf->buff_start + 50;
+
+ memcpy(&mbuf->metadata, &orig->metadata, sizeof(struct mrb_metadata));
+ memcpy(mbuf->raw_data, orig->raw_data, orig->raw_len);
+ mbuf->raw_len = orig->raw_len;
+
+ return mbuf;
+} \ No newline at end of file