summaryrefslogtreecommitdiff
path: root/cleopatre
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre')
-rw-r--r--cleopatre/application/managerd/Makefile2
-rw-r--r--cleopatre/application/managerd/inc/vs_mme.h5
-rw-r--r--cleopatre/application/managerd/src/vs_mme.c51
3 files changed, 47 insertions, 11 deletions
diff --git a/cleopatre/application/managerd/Makefile b/cleopatre/application/managerd/Makefile
index 68a5b686d2..91dd8392ff 100644
--- a/cleopatre/application/managerd/Makefile
+++ b/cleopatre/application/managerd/Makefile
@@ -15,7 +15,7 @@ CC_WITH_CFLAGS=$(CC)
CC_WITHOUT_CFLAGS=$(CC_FOR_TARGET)
endif
EXTRA_CFLAGS=-I$(INCPATH) -I$(LINUX_DIR)/include/asm-arm/arch-spc300 -I$(LIBMME_DIR)/inc -I$(LIBSPID_DIR)/inc -MMD
-LIBS=-L$(LIBMME_DIR) -L$(LIBSPID_DIR) -lmme -lspid
+LIBS=-L$(LIBMME_DIR) -L$(LIBSPID_DIR) -lmme -lspid -lpthread
SRCS=$(subst $(SRCPATH)/,,$(wildcard $(SRCPATH)/*.c))
OBJS=$(addprefix $(OBJPATH)/,$(SRCS:.c=.o))
diff --git a/cleopatre/application/managerd/inc/vs_mme.h b/cleopatre/application/managerd/inc/vs_mme.h
index 4d3832e75c..a81033a532 100644
--- a/cleopatre/application/managerd/inc/vs_mme.h
+++ b/cleopatre/application/managerd/inc/vs_mme.h
@@ -57,6 +57,11 @@ typedef struct {
typedef struct {
uint8_t oui[3];
uint8_t result;
+} __attribute__ ((__packed__)) vs_reset_cnf_t;
+
+typedef struct {
+ uint8_t oui[3];
+ uint8_t result;
uint32_t rx_bytes_low;
uint32_t rx_bytes_high;
uint32_t rx_packets_low;
diff --git a/cleopatre/application/managerd/src/vs_mme.c b/cleopatre/application/managerd/src/vs_mme.c
index 628838fca7..344accdaf3 100644
--- a/cleopatre/application/managerd/src/vs_mme.c
+++ b/cleopatre/application/managerd/src/vs_mme.c
@@ -199,21 +199,52 @@ enum bridge_status vs_mme_eth_stats (struct managerd_ctx *ctx, MME_t *request, M
}
+static void* _reboot_handler (void* arg)
+{
+ sleep(2);
+ libspid_system_reboot();
+ return NULL;
+}
+
/**
- * Process VS_RESET MME
+ * Send a VS_RESET MME to BR interface
*
- * \param ctx managerd context
- * \param buffer frame pointer
- * \param len frame length
+ * \param ctx managerd context
+ * \param request MME containg VS_RESET request
+ * \param confirm MME buffer to put VS_RESET confirm
+ * \param len confirm buffer length
+ * \return error code
*/
-enum bridge_status vs_mme_reset(struct managerd_ctx *ctx, uint8_t *buffer, int *len)
+enum bridge_status vs_mme_reset (struct managerd_ctx *ctx, MME_t *request, MME_t *confirm, int len)
{
- //Check arguments
- assert(ctx != NULL);
- assert(buffer != NULL);
- assert(len != NULL);
+ vs_reset_cnf_t *reset_cnf;
+ pthread_attr_t attr;
+ pthread_t reset_job;
- libspid_system_reboot();
+ assert (NULL != ctx);
+ assert (NULL != request);
+ assert (NULL != confirm);
+ assert (len >= sizeof(vs_reset_cnf_t) + sizeof(MME_t));
+
+ /* check for request content */
+ if (memcmp((char*) request + sizeof(MME_t), OUI_SPIDCOM, 3)) return TO_DROP;
+
+ reset_cnf = (vs_reset_cnf_t *) ((unsigned char*) confirm + sizeof(MME_t));
+
+ /* prepare confirmation packet */
+ _prepare_confirm(ctx, request, confirm, len);
+ memcpy(reset_cnf->oui, OUI_SPIDCOM, 3);
+
+ reset_cnf->result = 0;
+
+ /* send confirmation MME */
+ bridge_send_to_br(ctx, (uint8_t*) confirm, sizeof(MME_t) + sizeof(vs_reset_cnf_t));
+
+ /* reset the modem in a dedicated thread */
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create(&reset_job, &attr, &_reboot_handler, NULL);
+ pthread_attr_destroy(&attr);
return TO_DROP;
}