From dcbbaf28a687a2116cda089f0ba64153edfb92eb Mon Sep 17 00:00:00 2001
From: "7u83@mail.ru" <7u83@mail.ru@noemail.net>
Date: Fri, 23 Feb 2018 23:30:44 +0000
Subject: [PATCH] new message_set functions
FossilOrigin-Name: 8cdf87be9882ec0526b09102abf4e54cbfb944aac8eae0ca0e47af66b80b0b9a
---
 ac.project                         |   1 +
 libcw.project                      |   2 +
 mod_capwap.project                 |   1 -
 src/ac/ac_main.c                   |  12 +++
 src/cw/Makefile                    |   1 +
 src/cw/cw.h                        |   9 ++-
 src/cw/message_set.c               | 117 ++++++++++++++++++++++++++++-
 src/cw/message_set.h               |  11 +++
 src/mod/capwap/capwap_actions_ac.c |  15 ++++
 9 files changed, 162 insertions(+), 7 deletions(-)
diff --git a/ac.project b/ac.project
index 603fab39..873b1a98 100644
--- a/ac.project
+++ b/ac.project
@@ -21,6 +21,7 @@
       
       
       
+      
     
   
   
diff --git a/libcw.project b/libcw.project
index 070e539c..bb9d7294 100644
--- a/libcw.project
+++ b/libcw.project
@@ -303,6 +303,8 @@
       
       
       
+      
+      
     
   
   
diff --git a/mod_capwap.project b/mod_capwap.project
index 3e6dce8d..ff3269b8 100644
--- a/mod_capwap.project
+++ b/mod_capwap.project
@@ -6,7 +6,6 @@
         
         
         
-        
         
         
         
diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c
index 425d6a46..c8837c3c 100644
--- a/src/ac/ac_main.c
+++ b/src/ac/ac_main.c
@@ -92,9 +92,17 @@ extern struct mod_ac * cw_get_mod_ac(const char *name);
 #include "cw/mlist.h"
 
 
+extern void test_sets();
+
 int main(int argc, char *argv[])
 {
 
+
+
+	
+	
+	
+	
 	int rc = 0;
 
 	/* parse arguments */
@@ -117,6 +125,10 @@ int main(int argc, char *argv[])
 	   developers is turned on ;) */
 	DBGX("Attention! %s", "DBG X is ON!");
 
+	test_sets();
+	
+	exit(0);
+
 
 	/* Initialize the database */
 	if (!db_init())
diff --git a/src/cw/Makefile b/src/cw/Makefile
index e492f837..03427153 100644
--- a/src/cw/Makefile
+++ b/src/cw/Makefile
@@ -85,6 +85,7 @@ MAVLOBJS= \
 	mlist.o \
 	cw_load_file.o \
 	cw_save_file.o \
+	message_set.o
 
 
 
diff --git a/src/cw/cw.h b/src/cw/cw.h
index 68315870..d63ec945 100644
--- a/src/cw/cw.h
+++ b/src/cw/cw.h
@@ -115,6 +115,7 @@ typedef struct {
 	int type;
 	int * states;
 	cw_messagedef_t * elements;
+	const char * name;
 }cw_message_t;
 
 typedef struct {
@@ -127,10 +128,10 @@ typedef struct {
 	const char * name;
 }cw_message_element_t;
 
-typefe struct {
-	
-	
-}cw_message_set;
+typedef struct {
+	mavl_t messages;
+	mavl_t all_elems;
+}cw_message_set_t;
 
 
 
diff --git a/src/cw/message_set.c b/src/cw/message_set.c
index 220d4246..f268a09c 100644
--- a/src/cw/message_set.c
+++ b/src/cw/message_set.c
@@ -1,5 +1,118 @@
 
+#include "cw.h"
+#include "mavl.h"
+
+#include "message_set.h"
+
+struct message_search_elem{
+	cw_messagedef_t *message;
+	mavl_t elements_tree;
+	mlist_t elements_list;
+};
+
 
-
-void cw_message_set_create(){
+static inline int cmp_cw_message_element(const void *elem1, const void *elem2){
+	cw_message_element_t * e1 = (cw_message_element_t*)elem1;
+	cw_message_element_t * e2 = (cw_message_element_t*)elem2;
+	int r;
+	r = e1->id - e2->id;
+	if (r!=0)
+		return r;
+	r = e1->vendor - e2->vendor;
+	if (r!=0)
+		return r;
+        r = e1->proto - e2->proto;
+        if (r != 0)
+                return r;
+	return 0;
+}
+
+
+static inline int msg_cmp(const void *elem1, const void *elem2)
+{       
+/*        struct cw_action_in *e1 = (struct cw_action_in *) elem1;
+        struct cw_action_in *e2 = (struct cw_action_in *) elem2;
+        int r;
+
+        r = e1->capwap_state - e2->capwap_state;
+        if (r != 0)
+                return r;
+
+        r = e1->msg_id - e2->msg_id;
+        if (r != 0)
+                return r;
+
+        r = e1->elem_id - e2->elem_id;
+        if (r != 0)
+                return r;
+
+        r = e1->vendor_id - e2->vendor_id;
+        if (r != 0)
+                return r;
+
+        r = e1->proto - e2->proto;
+        if (r != 0)
+                return r;
+*/
+        return 0;
+}
+
+
+void cw_message_set_destroy(cw_message_set_t * set){
+	if (set->messages){
+		mavl_destroy(set->messages);
+	}
+	if (set->all_elems){
+		mavl_destroy(set->all_elems);
+	}
+	free(set);
+}
+
+cw_message_set_t * cw_message_set_create(){
+
+	/* allocate memory for a message_set */
+	cw_message_set_t  * set = malloc(sizeof(cw_message_set_t));
+	if (set==NULL)
+		return NULL;
+
+	memset(set,0,sizeof(cw_message_set_t));
+
+	/* create mavl for all_elems */
+	set->all_elems = mavl_create(cmp_cw_message_element,NULL);
+	if (set->all_elems==NULL){
+		cw_message_set_destroy(set);
+		return NULL;
+	}
+
+	/* create mavl for messages */
+	set->messages = mavl_create(msg_cmp,NULL);
+	if (set->messages==NULL){
+		cw_message_set_destroy(set);
+		return NULL;
+	}
+
+	return set;
+
+}
+
+
+
+void cw_message_set_add(cw_message_set_t * set,
+			cw_message_t * messages, 
+			cw_message_element_t * elements[]){
+	
+	cw_message_element_t ** e;
+	for (e=elements; e->id!=0; e++){
+
+	//	mavl_add(set->all_elems, e);
+
+		printf("Add: %d %d %d %s\n",
+			e->proto,
+			e->vendor,
+			e->id,
+			e->name
+		);
+		
+		
+	}
 }
diff --git a/src/cw/message_set.h b/src/cw/message_set.h
index e69de29b..06479b75 100644
--- a/src/cw/message_set.h
+++ b/src/cw/message_set.h
@@ -0,0 +1,11 @@
+#ifndef __MESSAGE_SET_H
+#define __MESSAGE_SET_H
+
+#include "cw.h"
+
+extern void cw_message_set_destroy(cw_message_set_t * set);
+extern cw_message_set_t * cw_message_set_create();
+extern void cw_message_set_add(cw_message_set_t * set,
+			cw_message_t * messages, 
+			cw_message_element_t * elements[]);
+#endif
\ No newline at end of file
diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c
index 50bcfe48..cb211cdf 100644
--- a/src/mod/capwap/capwap_actions_ac.c
+++ b/src/mod/capwap/capwap_actions_ac.c
@@ -18,11 +18,13 @@
 
 
 #include "cw/cw.h"
+#include "cw/log.h"
 #include "cw/action.h"
 #include "cw/capwap_items.h"
 #include "cw/strheap.h"
 #include "cw/radio.h"
 
+#include "cw/message_set.h"
 
 #include "mod_capwap.h"
 
@@ -37,12 +39,14 @@ static cw_message_element_t elements[] = {
 	},
 	{
 		.id = CAPWAP_ELEM_WTP_BOARD_DATA,
+		.name = "WTP Board Data",
 //	 	.start = cw_in_wtp_board_data, 
 //		.item_id = CW_ITEM_WTP_BOARD_DATA, 
 	},
 
 	{
 		.id = CAPWAP_ELEM_WTP_DESCRIPTOR,
+		.name = "WTP Descriptor",
 	 	//.start = capwap_in_wtp_descriptor, 
 		//.item_id = "wtp_descriptor", 
 
@@ -50,12 +54,14 @@ static cw_message_element_t elements[] = {
 	,
 	{
 		.id = CW_ELEM_WTP_FRAME_TUNNEL_MODE,
+		.name = "WTP Frame Tunnel Mode",
 //	 	.start = cw_in_generic2, 
 //		.item_id = CW_ITEM_WTP_FRAME_TUNNEL_MODE,
 		.min_len = 1, 
 		.max_len = 1
 	}
 	,
+	{.id=0}
 };
 
 static cw_message_t messages[] = {
@@ -73,7 +79,16 @@ static cw_message_t messages[] = {
 	}
 };
 
+void test_sets(){
 
+	cw_message_set_t * set = cw_message_set_create();
+	if (set==NULL){
+		cw_log(LOG_ERR,"No mem");
+		return;
+	}
+	
+	cw_message_set_add(set,messages,&elements);
+}