summaryrefslogtreecommitdiff
path: root/application/smm
diff options
context:
space:
mode:
authorBenjamin Decavel2008-11-20 14:12:09 +0100
committerBenjamin Decavel2008-11-20 14:12:09 +0100
commita1650fd7ef2e769777375d5978b6c0e72c16d185 (patch)
tree44b3471cc41e61b0ec2ce80a6c66965c3c1fceb4 /application/smm
parentcc17d1a0225f71ed167ae513e2df4e566566cf40 (diff)
Auto update progress, messages are now acked correctly and the process seems to be working fine in perfect conditions (no lost messages, no nack)
Diffstat (limited to 'application/smm')
-rw-r--r--application/smm/smm-client/inc/smm_comm.h2
-rw-r--r--application/smm/smm-client/src/smmlib.c13
-rw-r--r--application/smm/smm-server/src/smm_req.c74
3 files changed, 64 insertions, 25 deletions
diff --git a/application/smm/smm-client/inc/smm_comm.h b/application/smm/smm-client/inc/smm_comm.h
index 9e028843df..054b68ecd8 100644
--- a/application/smm/smm-client/inc/smm_comm.h
+++ b/application/smm/smm-client/inc/smm_comm.h
@@ -5,7 +5,7 @@
#include <net/ethernet.h>
#include <arpa/inet.h>
-/* #define DEBUG */
+#define DEBUG
#ifdef DEBUG
#include <syslog.h>
diff --git a/application/smm/smm-client/src/smmlib.c b/application/smm/smm-client/src/smmlib.c
index 4f443a69da..7d9a319171 100644
--- a/application/smm/smm-client/src/smmlib.c
+++ b/application/smm/smm-client/src/smmlib.c
@@ -1347,7 +1347,7 @@ smm_set_update(const unsigned char *dest_addr, unsigned int retries, char* md5_s
{
/* Buffer to hold Ethernet frames of request and response messages. */
unsigned char smm_buffer[SMM_HLEN + UPDATE_FRAME_SIZE + 4 + 4];
- size_t buff_len = SMM_HLEN + 40;
+ size_t buff_len = 80;
unsigned char *smmentry = smm_buffer + SMM_HLEN;
@@ -1377,15 +1377,15 @@ smm_set_update(const unsigned char *dest_addr, unsigned int retries, char* md5_s
int frame_size = UPDATE_FRAME_SIZE;
for (i = 0; i <= nb_ack; i++)
{
+ buff_len = SMM_HLEN + UPDATE_FRAME_SIZE + 4 + 4;
if (i != nb_ack)
{
- buff_len = SMM_HLEN + UPDATE_FRAME_SIZE + 4 + 4;
/* Fill request SMMENTRY */
memset(smm_buffer, 0, buff_len);
memcpy(smmentry, &i, 4);
- memcpy(smmentry, &frame_size, 4);
- memcpy(smmentry + 4, image + i * UPDATE_FRAME_SIZE, UPDATE_FRAME_SIZE);
+ memcpy(smmentry + 4, &frame_size, 4);
+ memcpy(smmentry + 8, image + i * UPDATE_FRAME_SIZE, UPDATE_FRAME_SIZE);
/* Send data frame request and get response from slave. */
if (smm_communication(dest_addr, retries, SMM_UPDATE_DATA_REQ, smm_buffer, SMM_HLEN + UPDATE_FRAME_SIZE + 4 + 4, &buff_len) != 0)
@@ -1406,13 +1406,12 @@ smm_set_update(const unsigned char *dest_addr, unsigned int retries, char* md5_s
}
else
{
- buff_len = SMM_HLEN + remain + 4 + 4;
/* Fill request SMMENTRY */
memset(smm_buffer, 0, buff_len);
memcpy(smmentry, &i, 4);
- memcpy(smmentry, &remain, 4);
- memcpy(smmentry + 4, image + nb_ack * UPDATE_FRAME_SIZE, remain);
+ memcpy(smmentry + 4, &remain, 4);
+ memcpy(smmentry + 8, image + nb_ack * UPDATE_FRAME_SIZE, remain);
/* Send last daya frame request and get response from slave. */
if (smm_communication(dest_addr, retries, SMM_UPDATE_DATA_REQ, smm_buffer, SMM_HLEN + remain + 4 + 4, &buff_len) != 0)
diff --git a/application/smm/smm-server/src/smm_req.c b/application/smm/smm-server/src/smm_req.c
index 3319483cb3..c0193a8f8d 100644
--- a/application/smm/smm-server/src/smm_req.c
+++ b/application/smm/smm-server/src/smm_req.c
@@ -23,6 +23,7 @@
pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int running = 0;
+int ready = 0;
int nb_ack = 0;
pthread_t thread;
unsigned char message[512 + 4 + 4 + 1];
@@ -1412,11 +1413,15 @@ void req_update_init(unsigned char *smmentry, size_t *smmentry_len)
/* Retrieve its version number and compare with the proposed image */
/* Same version, refuse */
/*if (strcmp(version_message, desc.version) == 0)
- return;*/
+ {
+ DEBUG_MSG("Same version\n");
+ return;
+ }*/
/* Older version, refuse */
/*if (strcmp(version_message, desc.version) < 0)
{
+ DEBUG_MSG("Older version\n");
smmentry[0] = 0x02;
return;
}*/
@@ -1432,21 +1437,27 @@ void req_update_init(unsigned char *smmentry, size_t *smmentry_len)
}
/* Create thread */
pthread_create(&thread, NULL, update_thread, NULL);
- DEBUG_MSG("thread created\n");
return;
}
void req_update_data(unsigned char *smmentry, size_t *smmentry_len)
{
+ *smmentry_len = 6;
/* Init message has been received previously, accept message and send it to the thread */
if (running)
{
message[0] = 0;
/* Copy entry in the global inter thread variable message */
- int* temp = (int*) (smmentry + 6);
- memcpy(message + 1, smmentry, *temp);
+ int* temp = (int*) (smmentry + 4);
+ memcpy(message + 1, smmentry, *temp + 8);
+ DEBUG_MSG("Message of length %d copied for thread\n", *temp);
+
+ /* Sleep a little to make sure the second thread is waiting for the condition */
+ while (!ready)
+ usleep(1000);
+ usleep(1000);
/* Wake up thread with condition */
pthread_mutex_lock(&mutex);
@@ -1456,14 +1467,15 @@ void req_update_data(unsigned char *smmentry, size_t *smmentry_len)
/* Wait until the thread has processed the message */
while (!message[0])
usleep(1000);
+ DEBUG_MSG("Message processed by thread\n");
/* Copy thread variable message back in entry */
memcpy(smmentry, message + 1, 6);
- *smmentry_len = 6;
}
/* Refuse message */
else
{
+ DEBUG_MSG("Update data message received, but no thread running, refuse\n");
smmentry[0] = 0x02;
}
return;
@@ -1472,6 +1484,7 @@ void req_update_data(unsigned char *smmentry, size_t *smmentry_len)
static void* update_thread(void* none)
{
running = 1;
+ ready = 0;
nb_ack = 0;
char mnt_path[IFNAMSIZ];
spidcom_image_desc_t desc;
@@ -1480,8 +1493,10 @@ static void* update_thread(void* none)
MD5_CTX c;
int pid, status;
+ DEBUG_MSG("Thread created\n");
+
/* Get infos about the unused image in flash and open a file descriptor which will be used later to write the new image in flash */
- if (spidlib_get_image_desc(SPIDLIB_IMAGE_DESC_TYPE_ALTERNATE, &desc, mnt_path) != 0 || ((ff = fopen(mnt_path, "w")) == NULL))
+ if (spidlib_get_image_desc(SPIDLIB_IMAGE_DESC_TYPE_ALTERNATE, &desc, mnt_path) != 0 || ((ff = fopen(mnt_path, "rw")) == NULL))
{
message[1] = 0x01; // R/W error
message[0] = 1; // unblock main thread
@@ -1494,7 +1509,7 @@ static void* update_thread(void* none)
if (pid == -1)
{
- DEBUG_MSG("fork unsuccessfull, abort all\n");
+ DEBUG_MSG("Fork unsuccessfull, abort all\n");
exit(EXIT_FAILURE);
}
else if (pid == 0)
@@ -1509,6 +1524,7 @@ static void* update_thread(void* none)
/* Child is finished, only father process remaining */
MD5_Init(&c);
+ ready = 1;
while(1)
{
@@ -1516,6 +1532,7 @@ static void* update_thread(void* none)
timeout.tv_sec = time(NULL) + TIMEOUT_UPDATE;
timeout.tv_nsec = 0;
+ DEBUG_MSG("Now we're waiting for data to arrive\n");
/* Wait 5s for the next data message to be received */
pthread_mutex_lock(&mutex);
ret = pthread_cond_timedwait(&condition, &mutex, &timeout);
@@ -1524,7 +1541,6 @@ static void* update_thread(void* none)
/* Message received within 5s */
if (!ret)
{
- DEBUG_MSG("data message received\n");
int res = handle_data_message(&c, ff);
message[0] = 1; // unblock main thread
/* Thread must be terminated if handle_data_message function asked to */
@@ -1547,7 +1563,9 @@ static void* update_thread(void* none)
message[1] = 0x03; // timeout error, is it really useful?
message[0] = 1; // unblock main thread, is it really useful?
running = 0;
- pthread_exit(NULL);
+ DEBUG_MSG("Exiting from thread\n");
+
+ return NULL;
}
static int handle_data_message(MD5_CTX *c, FILE *ff)
@@ -1558,6 +1576,8 @@ static int handle_data_message(MD5_CTX *c, FILE *ff)
char* data = message + 9;
+ DEBUG_MSG("Data message received with sequence number %d and length %d\n", *ack, *length);
+
/* Good sequence number */
if (*ack == nb_ack)
{
@@ -1573,18 +1593,36 @@ static int handle_data_message(MD5_CTX *c, FILE *ff)
MD5_Final(md5, c);
if (strcmp(md5, md5_message) != 0)
{
- /* Get the is_valid bit from the image desc */
- char byte;
- fseek(ff, 15, SEEK_SET); //read from flash one byte
- fread(&byte, sizeof(char), 1, ff);
- byte = byte & 0xFE; //change last bit to 0
- fseek(ff, 15, SEEK_SET);
- //fwrite(&byte, sizeof(char), 1, ff); //write change to flash
+ /* Wrong MD5, change is_valid int to 0 */
+ spidcom_image_desc_t temp_desc;
+ fseek(ff, 0, SEEK_SET);
+ fread(&temp_desc, sizeof(spidcom_image_desc_t), 1, ff);
+ temp_desc.is_valid = 0;
+ fseek(ff, 0, SEEK_SET);
+ //fwrite(&temp_desc, sizeof(spidcom_image_desc_t), 1, ff);
return_value = 1;
+ DEBUG_MSG("Wrong MD5\n");
}
else
{
- /* Correct md5 what do we do? */
+ /* Correct md5, change index to index fom current image + 1 */
+ DEBUG_MSG("Correct MD5\n");
+ spidcom_image_desc_t current_desc;
+ char current_path[16];
+ if (spidlib_get_image_desc(SPIDLIB_IMAGE_DESC_TYPE_CURRENT, &current_desc, current_path) != 0)
+ {
+ DEBUG_MSG("Error in final frame, can't get current image desc\n");
+ return_value = 1;
+ return return_value;
+ }
+
+ spidcom_image_desc_t temp_desc;
+ fseek(ff, 0, SEEK_SET);
+ fread(&temp_desc, sizeof(spidcom_image_desc_t), 1, ff);
+ temp_desc.index = current_desc.index + 1;
+ fseek(ff, 0, SEEK_SET);
+ //fwrite(&temp_desc, sizeof(spidcom_image_desc_t), 1, ff);
+ return_value = 1;
}
}
@@ -1601,10 +1639,12 @@ static int handle_data_message(MD5_CTX *c, FILE *ff)
message[2] = 0x01; //nack
int * expected = (int*) (message + 3);
*expected = nb_ack; //expected sequence ack number
+ DEBUG_MSG("Seq num received %d, expected %d\n", *ack, *expected);
}
/* Ordered by master to cancel update, abort everything */
else
{
+ DEBUG_MSG("Seq number 0xFFFFFFFF received, abort all\n");
return_value = 1;
}