mtu discovery padding added
FossilOrigin-Name: 391a17b2ab460b54a220c3e128578a37610e71f524b3d127316f201bf4dfd4af
This commit is contained in:
234
src/cw/msgset.c
234
src/cw/msgset.c
@ -8,66 +8,70 @@
|
||||
|
||||
#include "msget.h"
|
||||
|
||||
static int cmp_cw_elemhandler_by_id(const void * elem1, const void *elem2){
|
||||
const struct cw_ElemHandler * e1 = elem1;
|
||||
const struct cw_ElemHandler * e2 = elem2;
|
||||
static int cmp_cw_elemhandler_by_id(const void *elem1, const void *elem2)
|
||||
{
|
||||
const struct cw_ElemHandler *e1 = elem1;
|
||||
const struct cw_ElemHandler *e2 = elem2;
|
||||
int r;
|
||||
r = e1->id - e2->id;
|
||||
if (r!=0)
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = e1->vendor - e2->vendor;
|
||||
if (r!=0)
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = e1->proto - e2->proto;
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = e1->proto - e2->proto;
|
||||
if (r != 0)
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmp_cw_elemhandler_by_key(const void *elem1, const void *elem2){
|
||||
const struct cw_ElemHandler * e1 = elem1;
|
||||
const struct cw_ElemHandler * e2 = elem2;
|
||||
return strcmp(e1->key,e2->key);
|
||||
static int cmp_cw_elemhandler_by_key(const void *elem1, const void *elem2)
|
||||
{
|
||||
const struct cw_ElemHandler *e1 = elem1;
|
||||
const struct cw_ElemHandler *e2 = elem2;
|
||||
return strcmp(e1->key, e2->key);
|
||||
}
|
||||
|
||||
static int cmp_msgdata(const void * elem1, const void *elem2)
|
||||
{
|
||||
const struct cw_MsgData * e1 = elem1;
|
||||
const struct cw_MsgData * e2 = elem2;
|
||||
static int cmp_msgdata(const void *elem1, const void *elem2)
|
||||
{
|
||||
const struct cw_MsgData *e1 = elem1;
|
||||
const struct cw_MsgData *e2 = elem2;
|
||||
return e1->type - e2->type;
|
||||
}
|
||||
|
||||
static int cmp_elemdata(const void * elem1, const void *elem2)
|
||||
static int cmp_elemdata(const void *elem1, const void *elem2)
|
||||
{
|
||||
const struct cw_ElemData * e1 = elem1;
|
||||
const struct cw_ElemData * e2 = elem2;
|
||||
const struct cw_ElemData *e1 = elem1;
|
||||
const struct cw_ElemData *e2 = elem2;
|
||||
int r;
|
||||
r = e1->id - e2->id;
|
||||
if (r!=0)
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = e1->vendor - e2->vendor;
|
||||
if (r!=0)
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = e1->proto - e2->proto;
|
||||
if (r != 0)
|
||||
return r;
|
||||
r = e1->proto - e2->proto;
|
||||
if (r != 0)
|
||||
return r;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static void msgdata_destroy(struct cw_MsgData *data){
|
||||
static void msgdata_destroy(struct cw_MsgData *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
/* if (data->elements_list)
|
||||
mlist_destroy(data->elements_list);
|
||||
*/
|
||||
if (data->elements_tree)
|
||||
mavl_destroy( data->elements_tree );
|
||||
mavl_destroy(data->elements_tree);
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
||||
static void del_mavl_msdgdata( void * d ){
|
||||
static void del_mavl_msdgdata(void *d)
|
||||
{
|
||||
msgdata_destroy(d);
|
||||
}
|
||||
|
||||
@ -76,7 +80,8 @@ static void del_mavl_msdgdata( void * d ){
|
||||
* @brief Destroy a message set
|
||||
* @param set Message set to destroy
|
||||
*/
|
||||
void cw_msgset_destroy(struct cw_MsgSet * set){
|
||||
void cw_msgset_destroy(struct cw_MsgSet *set)
|
||||
{
|
||||
if (set->msgdata)
|
||||
mavl_destroy(set->msgdata);
|
||||
if (set->handlers_by_id)
|
||||
@ -91,35 +96,36 @@ void cw_msgset_destroy(struct cw_MsgSet * set){
|
||||
* @brief Create a message set
|
||||
* @return Message set create, NULL if an error has occured
|
||||
*/
|
||||
struct cw_MsgSet * cw_msgset_create(){
|
||||
struct cw_MsgSet *cw_msgset_create()
|
||||
{
|
||||
|
||||
/* allocate memory for a message_set */
|
||||
struct cw_MsgSet * set = malloc(sizeof(struct cw_MsgSet ));
|
||||
if (set==NULL)
|
||||
struct cw_MsgSet *set = malloc(sizeof(struct cw_MsgSet));
|
||||
if (set == NULL)
|
||||
return NULL;
|
||||
|
||||
memset(set,0,sizeof(struct cw_MsgSet));
|
||||
memset(set, 0, sizeof(struct cw_MsgSet));
|
||||
|
||||
/* create mavl for all_elems by id */
|
||||
set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id,NULL,
|
||||
sizeof(struct cw_ElemHandler));
|
||||
if (set->handlers_by_id==NULL){
|
||||
set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id, NULL,
|
||||
sizeof(struct cw_ElemHandler));
|
||||
if (set->handlers_by_id == NULL) {
|
||||
cw_msgset_destroy(set);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* create mavl for all_elems by key */
|
||||
set->handlers_by_key = mavl_create(cmp_cw_elemhandler_by_key,NULL,
|
||||
sizeof(struct cw_ElemHandler));
|
||||
if (set->handlers_by_key==NULL){
|
||||
set->handlers_by_key = mavl_create(cmp_cw_elemhandler_by_key, NULL,
|
||||
sizeof(struct cw_ElemHandler));
|
||||
if (set->handlers_by_key == NULL) {
|
||||
cw_msgset_destroy(set);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* create mavl for messages */
|
||||
set->msgdata = mavl_create(cmp_msgdata,del_mavl_msdgdata,
|
||||
sizeof(struct cw_MsgData));
|
||||
if (set->msgdata==NULL){
|
||||
set->msgdata = mavl_create(cmp_msgdata, del_mavl_msdgdata,
|
||||
sizeof(struct cw_MsgData));
|
||||
if (set->msgdata == NULL) {
|
||||
cw_msgset_destroy(set);
|
||||
return NULL;
|
||||
}
|
||||
@ -127,120 +133,107 @@ struct cw_MsgSet * cw_msgset_create(){
|
||||
return set;
|
||||
}
|
||||
|
||||
struct cw_ElemHandler * cw_msgset_get_elemhandler(struct cw_MsgSet * set,
|
||||
int proto, int vendor, int id)
|
||||
struct cw_ElemHandler *cw_msgset_get_elemhandler(struct cw_MsgSet *set,
|
||||
int proto, int vendor, int id)
|
||||
{
|
||||
struct cw_ElemHandler search;
|
||||
search.proto=proto;
|
||||
search.vendor=vendor;
|
||||
search.id=id;
|
||||
return mavl_find(set->handlers_by_id,&search);
|
||||
search.proto = proto;
|
||||
search.vendor = vendor;
|
||||
search.id = id;
|
||||
return mavl_find(set->handlers_by_id, &search);
|
||||
}
|
||||
|
||||
|
||||
static int update_msgdata(struct cw_MsgSet * set, struct cw_MsgData * msgdata,
|
||||
struct cw_MsgDef * msgdef)
|
||||
static int update_msgdata(struct cw_MsgSet *set, struct cw_MsgData *msgdata,
|
||||
struct cw_MsgDef *msgdef)
|
||||
{
|
||||
struct cw_ElemDef * elemdef;
|
||||
struct cw_ElemDef *elemdef;
|
||||
struct cw_ElemData ed, *result;
|
||||
|
||||
|
||||
/* iterate through all defined elements */
|
||||
for(elemdef = msgdef->elements; elemdef->id; elemdef++){
|
||||
struct cw_ElemHandler * handler;
|
||||
for (elemdef = msgdef->elements; elemdef->id; elemdef++) {
|
||||
struct cw_ElemHandler *handler;
|
||||
int replaced;
|
||||
|
||||
|
||||
handler = cw_msgset_get_elemhandler(set,
|
||||
elemdef->proto,
|
||||
elemdef->vendor,
|
||||
elemdef->id);
|
||||
elemdef->proto,
|
||||
elemdef->vendor, elemdef->id);
|
||||
/* check if a handler for our element already exists */
|
||||
if (!handler){
|
||||
if (!handler) {
|
||||
cw_log(LOG_ERR, "No handler for message element: %d %d %d",
|
||||
elemdef->proto,
|
||||
elemdef->vendor,
|
||||
elemdef->id);
|
||||
elemdef->proto, elemdef->vendor, elemdef->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
ed.id=elemdef->id;
|
||||
ed.proto=elemdef->proto;
|
||||
ed.vendor=elemdef->vendor;
|
||||
ed.mand=elemdef->mand;
|
||||
|
||||
|
||||
result = mavl_replace(msgdata->elements_tree, &ed, &replaced);
|
||||
|
||||
if (!replaced){
|
||||
cw_dbg(DBG_MOD, " adding message element %d %d %d - %s",
|
||||
elemdef->proto,
|
||||
elemdef->vendor,
|
||||
elemdef->id,
|
||||
handler->name);
|
||||
}
|
||||
else{
|
||||
cw_dbg(DBG_MOD, " replacing message element %d %d %d - %s",
|
||||
elemdef->proto,
|
||||
elemdef->vendor,
|
||||
elemdef->id,
|
||||
handler->name);
|
||||
}
|
||||
|
||||
ed.id = elemdef->id;
|
||||
ed.proto = elemdef->proto;
|
||||
ed.vendor = elemdef->vendor;
|
||||
ed.mand = elemdef->mand;
|
||||
|
||||
result = mavl_replace(msgdata->elements_tree, &ed, &replaced);
|
||||
|
||||
if (!replaced) {
|
||||
cw_dbg(DBG_MOD, " adding message element %d %d %d - %s",
|
||||
elemdef->proto,
|
||||
elemdef->vendor, elemdef->id, handler->name);
|
||||
} else {
|
||||
cw_dbg(DBG_MOD, " replacing message element %d %d %d - %s",
|
||||
elemdef->proto,
|
||||
elemdef->vendor, elemdef->id, handler->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int cw_msgset_add(struct cw_MsgSet * set,
|
||||
struct cw_MsgDef messages[],
|
||||
struct cw_ElemHandler handlers[]
|
||||
){
|
||||
int cw_msgset_add(struct cw_MsgSet *set,
|
||||
struct cw_MsgDef messages[], struct cw_ElemHandler handlers[]
|
||||
)
|
||||
{
|
||||
|
||||
struct cw_ElemHandler * handler;
|
||||
struct cw_MsgDef * msgdef;
|
||||
struct cw_ElemHandler *handler;
|
||||
struct cw_MsgDef *msgdef;
|
||||
|
||||
/* Create mavl for all handlers */
|
||||
for(handler = handlers; handler->id; handler++){
|
||||
cw_dbg(DBG_MOD,"Adding handler for element %d - %s - with key: %s",
|
||||
handler->id,
|
||||
handler->name,
|
||||
handler->key);
|
||||
mavl_replace(set->handlers_by_id,handler,NULL);
|
||||
mavl_replace(set->handlers_by_key,handler,NULL);
|
||||
for (handler = handlers; handler->id; handler++) {
|
||||
cw_dbg(DBG_MOD, "Adding handler for element %d - %s - with key: %s",
|
||||
handler->id, handler->name, handler->key);
|
||||
mavl_replace(set->handlers_by_id, handler, NULL);
|
||||
mavl_replace(set->handlers_by_key, handler, NULL);
|
||||
}
|
||||
|
||||
|
||||
for (msgdef=messages; msgdef->type !=0; msgdef++){
|
||||
for (msgdef = messages; msgdef->type != 0; msgdef++) {
|
||||
struct cw_MsgData search;
|
||||
struct cw_MsgData *msg;
|
||||
int exists;
|
||||
|
||||
/* Look if message already exists */
|
||||
search.type=msgdef->type;
|
||||
msg = mavl_add(set->msgdata,&search,&exists);
|
||||
|
||||
if (msg == NULL){
|
||||
cw_log(LOG_ERR,"Can't create messae");
|
||||
return 0;
|
||||
/* Look if message already exists */
|
||||
search.type = msgdef->type;
|
||||
msg = mavl_add(set->msgdata, &search, &exists);
|
||||
|
||||
if (msg == NULL) {
|
||||
cw_log(LOG_ERR, "Can't create messae");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!exists){
|
||||
msg->elements_tree = mavl_create(cmp_elemdata,NULL,
|
||||
sizeof(struct cw_ElemData));
|
||||
|
||||
if (!exists) {
|
||||
msg->elements_tree = mavl_create(cmp_elemdata, NULL,
|
||||
sizeof(struct cw_ElemData));
|
||||
}
|
||||
|
||||
/* Overwrite the found message */
|
||||
if (msgdef->name)
|
||||
msg->name=msgdef->name;
|
||||
msg->name = msgdef->name;
|
||||
if (msgdef->states)
|
||||
msg->states=msgdef->states;
|
||||
msg->receiver=msgdef->receiver;
|
||||
msg->states = msgdef->states;
|
||||
msg->receiver = msgdef->receiver;
|
||||
|
||||
|
||||
cw_dbg(DBG_MOD, "Add message Type:%d - %s ",msgdef->type,msgdef->name);
|
||||
cw_dbg(DBG_MOD, "Add message Type:%d - %s ", msgdef->type, msgdef->name);
|
||||
|
||||
|
||||
update_msgdata(set,msg,msgdef);
|
||||
|
||||
update_msgdata(set, msg, msgdef);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -252,8 +245,9 @@ int cw_msgset_add(struct cw_MsgSet * set,
|
||||
* @param type message type to search for
|
||||
* @return message data or NULL if not found
|
||||
*/
|
||||
struct cw_MsgData * cw_msgset_get_msgdata(struct cw_MsgSet *set,int type){
|
||||
struct cw_MsgData *cw_msgset_get_msgdata(struct cw_MsgSet *set, int type)
|
||||
{
|
||||
struct cw_MsgData search;
|
||||
search.type=type;
|
||||
return mavl_find_ptr(set->msgdata,&search);
|
||||
search.type = type;
|
||||
return mavl_find_ptr(set->msgdata, &search);
|
||||
}
|
||||
|
Reference in New Issue
Block a user