summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorburet2008-06-27 16:10:30 +0000
committerburet2008-06-27 16:10:30 +0000
commited506b66157e9bbe77e454ed6e851cd1aa17a2fb (patch)
treeaf71c753e3a217d001f8c45c39f17eeff9811bbf /cesar
parentbc75914c389813ea2d9faafbfb9b425ffae5591e (diff)
[Maximus proto] Hope I found THE bug in fcall. To be further tested.
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@2477 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar')
-rw-r--r--cesar/host/fcall/src/fcall.c9
-rw-r--r--cesar/host/fcall/src/probe.c31
-rw-r--r--cesar/interface/fcall/src/interface_fcall.c33
-rw-r--r--cesar/interface/fcall/test/src/test_interface_fcall.c83
-rw-r--r--cesar/maximus/prototest/fcall/src/test_fcall.c8
-rw-r--r--cesar/maximus/python/lib/proto/maximus_proto.py4
-rw-r--r--cesar/maximus/python/test/test_lib_proto.py2
7 files changed, 125 insertions, 45 deletions
diff --git a/cesar/host/fcall/src/fcall.c b/cesar/host/fcall/src/fcall.c
index 0719f8261f..57634449ef 100644
--- a/cesar/host/fcall/src/fcall.c
+++ b/cesar/host/fcall/src/fcall.c
@@ -155,7 +155,7 @@ int fcall_fill_hdr(
errno = EINVAL;
return -1;
}
-
+
param->id[FUNCTION_CALL_ID_MAX_SIZE - 1] = '\0'; /* just for security */
/* add the function id */
if(sci_msg_push(msg, strlen(param->id) + 1) < (int)strlen(param->id) + 1)
@@ -165,7 +165,7 @@ int fcall_fill_hdr(
return -1;
}
memcpy(msg->data_begin, param->id, strlen(param->id) + 1);
-
+
/* add fcall header */
if(sci_msg_push(msg, sizeof(struct fcall_msg_hdr)) < (int)sizeof(struct fcall_msg_hdr))
{
@@ -180,7 +180,7 @@ int fcall_fill_hdr(
msg->hdr.fcall->param_nb = param->param_nb;
msg->hdr.fcall->msg_id = htons(param->msg_id);
msg->hdr.fcall->flags = flags;
-
+
return 0;
}
@@ -421,6 +421,9 @@ int fcall_recv(sci_msg_t *msg, void *fcall_data)
return -1;
}
+ /* RESET THE MESSAGE DATA BEGIN POINTER!!! */
+ msg->data_begin = msg->data_end;
+
/* call the function */
station_log(fcall->sci->station, STATION_LOG_INFO, STATION_LOGTYPE_FCALL,
"%s calling function '%s'(%p) with %d parameters",
diff --git a/cesar/host/fcall/src/probe.c b/cesar/host/fcall/src/probe.c
index 4986821477..76a09e3da3 100644
--- a/cesar/host/fcall/src/probe.c
+++ b/cesar/host/fcall/src/probe.c
@@ -140,9 +140,7 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
int index_param, index_var;
probe_ctx_t *probe;
static fcall_param_t param_result;
- static sci_msg_t msg_result;
- static unsigned char buffer[FUNCTION_CALL_PARAM_MAX_SIZE];
-
+
probe = (probe_ctx_t *)data;
DBG_ASSERT(fcall);
@@ -161,16 +159,10 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
errno = EINVAL;
return -1;
}
-
+
/* init result structures */
fcall_param_init(&param_result, (*param)->id, (*param)->msg_id);
- if(sci_msg_init(&msg_result, buffer, sizeof(buffer)) < 0)
- {
- station_log(fcall->sci->station, STATION_LOG_ERROR, STATION_LOGTYPE_PROBE,
- "%s: errno = %d because cannot init result structures", __FUNCTION__, errno);
- return -1;
- }
-
+
if((*param)->param_nb == 0)
{
/* we want all the var list */
@@ -180,7 +172,7 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
{
fcall_param_add(
&param_result,
- &msg_result,
+ *msg,
probe->var_table[index_var].id,
probe->var_table[index_var].length,
probe->var_table[index_var].addr
@@ -188,7 +180,7 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
}
}
}
-
+
else
{
/* normal get or set request */
@@ -213,7 +205,7 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
);
fcall_param_add(
&param_result,
- &msg_result,
+ *msg,
probe->var_table[index_var].id,
probe->var_table[index_var].length,
probe->var_table[index_var].addr
@@ -243,7 +235,7 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
);
fcall_param_add(
&param_result,
- &msg_result,
+ *msg,
probe->var_table[index_var].id,
0,
NULL
@@ -256,8 +248,8 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
if(index_var >= probe->var_nb)
{
/* variable not registered */
- msg_result.hdr.fcall->param_nb = 0;
- msg_result.hdr.fcall->flags |= FUNCTION_CALL_FLAG_FAILED;
+ (*msg)->hdr.fcall->param_nb = 0;
+ (*msg)->hdr.fcall->flags |= FUNCTION_CALL_FLAG_FAILED;
station_log(fcall->sci->station, STATION_LOG_NOTICE, STATION_LOGTYPE_PROBE,
"%s var '%s' not registered",
__FUNCTION__,
@@ -266,10 +258,9 @@ int probe_recv(fcall_ctx_t *fcall, fcall_param_t **param, sci_msg_t **msg, void
}
}
}
-
+
/* switch param and msg for result */
*param = &param_result;
- *msg = &msg_result;
-
+
return param_result.param_nb;
}
diff --git a/cesar/interface/fcall/src/interface_fcall.c b/cesar/interface/fcall/src/interface_fcall.c
index e1e8be76fd..25cca2063d 100644
--- a/cesar/interface/fcall/src/interface_fcall.c
+++ b/cesar/interface/fcall/src/interface_fcall.c
@@ -47,10 +47,13 @@ interface_fcall_init (interface_fcall_send_message_cb_t send_cb,
void *user_data)
{
static interface_fcall_t ctx;
- static sci_ctx_t sci_ctx;
static fcall_ctx_t fcall_ctx;
static probe_ctx_t probe_ctx;
+#ifdef FCALL_PROTO
+ static sci_ctx_t sci_ctx;
+#endif /* FCALL_PROTO */
+
dbg_assert_ptr(send_cb);
dbg_assert_ptr(send_done_cb);
dbg_assert_ptr(buffer_get_cb);
@@ -127,7 +130,7 @@ interface_fcall_mme_recv (void *data, u8 *mme)
interface_fcall_t *ctx = NULL;
static sci_msg_t msg;
static unsigned char buffer[SCI_MSG_MAX_SIZE];
- uint length = 0;
+ uint length = 0, i = 0;
dbg_assert_ptr(data);
dbg_assert_ptr(mme);
@@ -148,7 +151,21 @@ interface_fcall_mme_recv (void *data, u8 *mme)
/** Read payload length (BIG-ENDIAN). */
length = swap16(read_u16_from_word(mme + INTERFACE_FCALL_PAYLOAD_OFFSET - sizeof(u16))) + INTERFACE_FCALL_PAYLOAD_OFFSET;
- diag_printf("interface_fcall_mme_recv: payload length = %d octets\n", length);
+ diag_printf("interface_fcall_mme_recv: payload length = %d octets / message length = %d octets\n", length - INTERFACE_FCALL_PAYLOAD_OFFSET, length);
+ diag_printf("interface_fcall_mme_recv: mme =");
+ for (i=0; i<length; i++)
+ {
+ if (0 == i%16)
+ {
+ diag_printf("\n");
+ }
+ else if (0 == i%8)
+ {
+ diag_printf("\t");
+ }
+ diag_printf(" %02x", *(mme + i));
+ }
+ diag_printf("\n");
/** Initialize SCI message with maximum size. */
memset(buffer, '\0', SCI_MSG_MAX_SIZE);
@@ -170,7 +187,7 @@ interface_fcall_mme_recv (void *data, u8 *mme)
bitstream_init (&ctx->bitstream_ctx, mme, length, BITSTREAM_READ);
bitstream_access_buf (&ctx->bitstream_ctx, msg.data_begin, length);
bitstream_finalise (&ctx->bitstream_ctx);
- diag_printf("interface_fcall_mme_recv: payload copied @ 0x%08x\n", (uint)msg.data_begin);
+ diag_printf("interface_fcall_mme_recv: payload copied from @ 0x%08x to @ 0x%08x\n", (uint)mme, (uint)msg.data_begin);
/** Increment message data pointer to the beginning of function call header. */
if (INTERFACE_FCALL_PAYLOAD_OFFSET != sci_msg_pop(&msg, INTERFACE_FCALL_PAYLOAD_OFFSET))
@@ -193,8 +210,8 @@ interface_fcall_mme_recv (void *data, u8 *mme)
if (NULL != ctx->send_done_cb)
{
(*ctx->send_done_cb)(ctx->user_data, mme);
+ diag_printf("interface_fcall_mme_recv: SEND DONE\n");
}
- diag_printf("interface_fcall_mme_recv: SEND DONE\n");
}
/**
@@ -226,11 +243,11 @@ interface_fcall_mme_send (void *data, sci_msg_t *msg)
memset(buffer, '\0', SCI_MSG_MAX_SIZE);
/** Copy message. */
- diag_printf("interface_fcall_mme_send: message length = %d octets\n", msg->length);
+ diag_printf("interface_fcall_mme_send: payload length = %d octets / message length = %d octets\n", msg->length, msg->length + INTERFACE_FCALL_PAYLOAD_OFFSET);
bitstream_init (&ctx->bitstream_ctx, buffer + INTERFACE_FCALL_PAYLOAD_OFFSET, msg->length, BITSTREAM_WRITE);
bitstream_access_buf (&ctx->bitstream_ctx, msg->data_begin, msg->length);
bitstream_finalise (&ctx->bitstream_ctx);
- diag_printf("interface_fcall_mme_send: message copied @ 0x%08x\n", (uint)buffer);
+ diag_printf("interface_fcall_mme_send: message copied from @ 0x%08x to @ 0x%08x\n", (uint)msg->data_begin, (uint)buffer + INTERFACE_FCALL_PAYLOAD_OFFSET);
// Fill the MME Header.
bitstream_init (&ctx->bitstream_ctx, buffer, INTERFACE_FCALL_PAYLOAD_OFFSET, BITSTREAM_WRITE);
@@ -280,6 +297,6 @@ interface_fcall_mme_send (void *data, sci_msg_t *msg)
if (NULL != ctx->send_cb)
{
(*ctx->send_cb)(ctx->user_data, word, 2);
+ diag_printf("interface_fcall_mme_send: TX\n");
}
- diag_printf("interface_fcall_mme_send: TX\n");
}
diff --git a/cesar/interface/fcall/test/src/test_interface_fcall.c b/cesar/interface/fcall/test/src/test_interface_fcall.c
index b6d193a5e1..c80137e2bc 100644
--- a/cesar/interface/fcall/test/src/test_interface_fcall.c
+++ b/cesar/interface/fcall/test/src/test_interface_fcall.c
@@ -23,18 +23,54 @@
u32 maximus_pending_isrs;
interface_fcall_t *ctx;
-char test[] = "test";
+char fcall_test[] = "fcall_test";
+u16 probe_test = 0x1234;
+u16 probe_len = sizeof(u16);
void
interface_fcall_send_message_cb (void *user_data, uint *message, uint length)
{
+ static int test_nb = 1;
u8 *data;
dbg_assert_ptr(user_data);
dbg_assert_ptr(message);
dbg_assert(2 == length);
data = (u8*)(*(message + 1));
- dbg_assert_print((0 == memcmp(data + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(struct fcall_msg_hdr), test, strlen(test) + 1)),
- "registered send function");
+ if (1 == test_nb)
+ {
+ test_nb++;
+ dbg_assert_print((0 == memcmp(data + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(struct fcall_msg_hdr), fcall_test, strlen(fcall_test) + 1)),
+ "registered send function");
+ }
+ else if (2 == test_nb)
+ {
+ u16 probe_len = ntohs(sizeof(u16));
+ u8 index = INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(struct fcall_msg_hdr);
+ test_nb++;
+ dbg_assert_print((0 == memcmp(data + index, "probe", strlen("probe") + 1)),
+ "registered probe");
+ index += strlen("probe") + 1;
+ dbg_assert_print((0 == memcmp(data + index, "probe_test", strlen("probe_test") + 1)),
+ "registered probe");
+ index += strlen("probe_test") + 1;
+ dbg_assert_print((0 == memcmp(data + index, &probe_len, sizeof(u16))),
+ "registered probe");
+ index += sizeof(u16);
+ dbg_assert_print((0 == memcmp(data + index, &probe_test, sizeof(u16))),
+ "registered probe");
+ dbg_assert(0x1234 == probe_test);
+ }
+ else if (3 == test_nb)
+ {
+ u8 index = INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(struct fcall_msg_hdr);
+ test_nb++;
+ dbg_assert_print((0 == memcmp(data + index, "probe", strlen("probe") + 1)),
+ "registered probe");
+ index += strlen("probe") + 1;
+ dbg_assert_print((0 == memcmp(data + index, "probe_test", strlen("probe_test") + 1)),
+ "registered probe");
+ //dbg_assert(0x5678 == probe_test);
+ }
free(data);
return;
}
@@ -194,14 +230,45 @@ interface_fcall_mme_recv_test_case(test_t t)
test_begin(t, "check mme recv")
{
- u16 length = swap16(sizeof(struct fcall_msg_hdr) + strlen(test) + 1);
- fcall_register(ctx->fcall_ctx, test, (void*)&host_fcall_test, NULL);
+ u16 probe_len = htons(sizeof(u16));
+ u16 val = 0x5678;
+
+ u16 length = swap16(sizeof(struct fcall_msg_hdr) + strlen(fcall_test) + 1);
+ fcall_register(ctx->fcall_ctx, fcall_test, (void*)&host_fcall_test, NULL);
memset(&fcall_hdr, '\0', sizeof(fcall_hdr));
fcall_hdr.version = FUNCTION_CALL_VERSION;
fcall_hdr.type = FUNCTION_CALL_TYPE_REQ;
memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET - sizeof(u16), &length, sizeof(u16));
memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET, &fcall_hdr, sizeof(fcall_hdr));
- strcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr), test);
+ strcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr), fcall_test);
+ interface_fcall_mme_recv (ctx, mme);
+ test_fail_unless(
+ (errno != EINVAL)
+ );
+
+ mme = malloc(SCI_MSG_MAX_SIZE);
+ length = swap16(sizeof(struct fcall_msg_hdr) + strlen("probe") + 1 + strlen("probe_test") + 1 + sizeof(u16));
+ probe_register(ctx->probe_ctx, "probe_test", sizeof(u16), &probe_test);
+ fcall_hdr.param_nb = 1;
+ memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET - sizeof(u16), &length, sizeof(u16));
+ memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET, &fcall_hdr, sizeof(fcall_hdr));
+ strcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr), "probe");
+ strcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr) + strlen("probe") + 1, "probe_test");
+ interface_fcall_mme_recv (ctx, mme);
+ test_fail_unless(
+ (errno != EINVAL)
+ );
+
+ mme = malloc(SCI_MSG_MAX_SIZE);
+ length = swap16(sizeof(struct fcall_msg_hdr) + strlen("probe") + 1 + strlen("probe_test") + 1 + 2 * sizeof(u16) );
+ probe_register(ctx->probe_ctx, "probe_test", sizeof(u16), &probe_test);
+ fcall_hdr.param_nb = 1;
+ memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET - sizeof(u16), &length, sizeof(u16));
+ memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET, &fcall_hdr, sizeof(fcall_hdr));
+ strcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr), "probe");
+ strcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr) + strlen("probe") + 1, "probe_test");
+ memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr) + strlen("probe") + 1 + strlen("probe_test") + 1, &probe_len, sizeof(u16));
+ memcpy((char*)mme + INTERFACE_FCALL_PAYLOAD_OFFSET + sizeof(fcall_hdr) + strlen("probe") + 1 + strlen("probe_test") + 1 + sizeof(u16), &val, sizeof(u16));
interface_fcall_mme_recv (ctx, mme);
test_fail_unless(
(errno != EINVAL)
@@ -249,9 +316,9 @@ interface_fcall_mme_send_test_case(test_t t)
sci_msg_init(&msg, buffer, SCI_MSG_MAX_SIZE) >= 0
);
test_fail_unless(
- sci_msg_push(&msg, strlen(test) + 1) >= 0
+ sci_msg_push(&msg, strlen(fcall_test) + 1) >= 0
);
- strcpy((char*)msg.data_begin, test);
+ strcpy((char*)msg.data_begin, fcall_test);
test_fail_unless(
sci_msg_push(&msg, sizeof(struct fcall_msg_hdr)) >= 0
);
diff --git a/cesar/maximus/prototest/fcall/src/test_fcall.c b/cesar/maximus/prototest/fcall/src/test_fcall.c
index 3dc3056d8b..5bd8bd5d1e 100644
--- a/cesar/maximus/prototest/fcall/src/test_fcall.c
+++ b/cesar/maximus/prototest/fcall/src/test_fcall.c
@@ -41,7 +41,9 @@ void my_thread(cyg_addrword_t index)
diag_write_string("=> my_thread\n");
while(1)
{
+ len = 0;
my_mme = malloc(SCI_MSG_MAX_SIZE);
+ memset(my_mme, '\0', SCI_MSG_MAX_SIZE);
while (INTERFACE_FCALL_PAYLOAD_OFFSET != len)
{
len = read(proto_in_fd, my_mme, INTERFACE_FCALL_PAYLOAD_OFFSET);
@@ -50,7 +52,7 @@ void my_thread(cyg_addrword_t index)
data_length = swap16(read_u16_from_word(my_mme + INTERFACE_FCALL_PAYLOAD_OFFSET - sizeof(u16)));
if ((len = read(proto_in_fd, my_mme + INTERFACE_FCALL_PAYLOAD_OFFSET, data_length)) < 0)
{
- diag_printf("errno = %d: error when reading proto in file\n", errno);
+ diag_printf("errno = %d: error when reading proto in file (data_length = %d)\n", errno, data_length);
return;
}
diag_printf("READ len = %d - data length = %d\n", len, data_length);
@@ -328,12 +330,12 @@ cyg_user_start(void)
diag_write_string("error when creating proto inout files\n");
return;
}
- if ((proto_in_fd = open("/tmp/proto_in", O_RDWR | O_NONBLOCK, S_IRWXU | S_IRWXG)) < 0)
+ if ((proto_in_fd = open("/tmp/proto_in", O_RDWR, S_IRWXU | S_IRWXG)) < 0)
{
diag_write_string("error when opening proto in file\n");
return;
}
- if ((proto_out_fd = open("/tmp/proto_out", O_RDWR | O_NONBLOCK, S_IRWXU | S_IRWXG)) < 0)
+ if ((proto_out_fd = open("/tmp/proto_out", O_RDWR, S_IRWXU | S_IRWXG)) < 0)
{
diag_write_string("error when opening proto out file\n");
return;
diff --git a/cesar/maximus/python/lib/proto/maximus_proto.py b/cesar/maximus/python/lib/proto/maximus_proto.py
index ece6ad2289..7246476be2 100644
--- a/cesar/maximus/python/lib/proto/maximus_proto.py
+++ b/cesar/maximus/python/lib/proto/maximus_proto.py
@@ -129,8 +129,8 @@ class MaximusProto:
self.background = Proto(argv[i+1])
self.background.start()
sleep(2)
- self.read_file = os.open(FUNCTION_CALL_READ_FILE, os.O_RDWR | os.O_NONBLOCK)
- self.write_file = os.open(FUNCTION_CALL_WRITE_FILE, os.O_RDWR | os.O_NONBLOCK)
+ self.read_file = os.open(FUNCTION_CALL_READ_FILE, os.O_RDWR)
+ self.write_file = os.open(FUNCTION_CALL_WRITE_FILE, os.O_RDWR)
print "Configuration:"
print "mac address =", self.mac_address
diff --git a/cesar/maximus/python/test/test_lib_proto.py b/cesar/maximus/python/test/test_lib_proto.py
index 6ee91712b2..6c25c00c40 100644
--- a/cesar/maximus/python/test/test_lib_proto.py
+++ b/cesar/maximus/python/test/test_lib_proto.py
@@ -314,7 +314,7 @@ class TestFcallFunctions(unittest.TestCase):
# and get the result
#
probe = self.maximus.create_probe().set_sta(self.station).add_param("param_6").send()
- self.assertEqual(probe.bind_param_ulong("param_6"),0x0000007B)
+ self.assertEqual(probe.bind_param_ulong("param_6"),789)
def test_is_param(self):