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); +}