diff --git a/src/capwap/cw_check_missing_mand.c b/src/capwap/cw_check_missing_mand.c new file mode 100644 index 00000000..96323e4a --- /dev/null +++ b/src/capwap/cw_check_missing_mand.c @@ -0,0 +1,62 @@ + +#include "capwap.h" + + + +struct args { + cw_action_in_t *a; + cw_action_in_t **out; + struct avltree *mand; + int n; +}; + +static int check_mand_cb(void *priv, void *val) +{ + + cw_action_in_t *a = (cw_action_in_t*)val; + struct args *args = (struct args*) priv; + + if ( (args->a->msg_id != a->msg_id) || (args->a->capwap_state != a->capwap_state)) + return 0; + + +// printf("Found wat %d %d %c\n",a->msg_id,a->elem_id, a->mand ? '*':' '); + if (a->mand) { + int i = a->item_id; + void * rc = avltree_del(args->mand,&i); + if (!rc) { + if (args->out) + args->out[args->n]=a; + args->n++; + } + + + } + + return 1; +} + + + +int cw_check_missing_mand(cw_action_in_t ** out, struct conn * conn, cw_action_in_t *a) +{ + cw_action_in_t as; + + as.capwap_state = a->capwap_state; + as.msg_id = a->msg_id; + as.vendor_id = 0; + as.elem_id = 0; + as.proto=0; + + struct args args; + args.a = &as; + args.mand=conn->mand; + args.out=out; + args.n=0; + + avltree_foreach_from_asc(conn->actions->in,&as,check_mand_cb,&args); + + return args.n; +} + + diff --git a/src/capwap/cw_in_check_join_request.c b/src/capwap/cw_in_check_join_request.c new file mode 100644 index 00000000..b28b04f6 --- /dev/null +++ b/src/capwap/cw_in_check_join_request.c @@ -0,0 +1,3 @@ + + + diff --git a/src/capwap/cw_in_cisco_image_identifier.c b/src/capwap/cw_in_cisco_image_identifier.c new file mode 100644 index 00000000..2d1feea7 --- /dev/null +++ b/src/capwap/cw_in_cisco_image_identifier.c @@ -0,0 +1,35 @@ + +#include "action.h" +#include "cw_log.h" +#include "itemstore.h" +#include "capwap.h" + + +int cw_in_cisco_image_identifier(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len) +{ + + if (lenmin_len) { + cw_dbg(DBG_ELEM_ERR,"Message element too short, %d < %d", len,a->min_len); + return 0; + } + + uint32_t vendor_id = cw_get_dword(data); + int dstart; + + switch (vendor_id) { + case CW_VENDOR_ID_ZYXEL: + case CW_VENDOR_ID_CISCO: + case CW_VENDOR_ID_FSF: + case 0: + dstart=4; + len-=4; + default: + vendor_id=CW_VENDOR_ID_CISCO; + dstart=0; + } + +// cw_itemstore_set(conn->remote,a->item_id,a->itemtype,data+dstart,len); + cw_itemstore_set_vendorstr(conn->remote,a->item_id,vendor_id,data+dstart,len); + return 1; +} + diff --git a/src/capwap/cw_out_wtp_board_data.c b/src/capwap/cw_out_wtp_board_data.c new file mode 100644 index 00000000..16f2402f --- /dev/null +++ b/src/capwap/cw_out_wtp_board_data.c @@ -0,0 +1,66 @@ +#include "cw_log.h" +#include "conn.h" + +#include "itemstore.h" +#include "capwap_items.h" +#include "capwap.h" + + +int cw_out_wtp_board_data(struct conn *conn,struct cw_action_out * a,uint8_t *dst) +{ + cw_itemstore_t board_data = cw_itemstore_get_avltree(conn->local,CW_ITEM_WTP_BOARD_DATA); + if (!board_data ) { + cw_log(LOG_ERR,"Error: Can't send WTP Board Data element - not defined"); + return 0; + } + + struct cw_item *i; + i=cw_itemstore_get(board_data,CW_ITEM_WTP_BOARD_VENDOR); + if (!i) { + cw_log(LOG_ERR,"Error: Can't send WTP Board Data element - no vendor defined"); + return 0; + } + + uint8_t *d = dst+4; + d+=cw_put_dword(d,i->dword); + + i=cw_itemstore_get(board_data,CW_ITEM_WTP_BOARD_MODELNO); + if (i) { + d+=cw_put_byte(d,CW_BOARDDATA_MODELNO ); + d+=cw_put_word(d,bstr16_len(i->data)); + d+=cw_put_data(d,bstr16_data(i->data),bstr16_len(i->data)); + } + + i=cw_itemstore_get(board_data,CW_ITEM_WTP_BOARD_SERIALNO); + if (i) { + d+=cw_put_byte(d,CW_BOARDDATA_SERIALNO ); + d+=cw_put_word(d,bstr16_len(i->data)); + d+=cw_put_data(d,bstr16_data(i->data),bstr16_len(i->data)); + } + + i=cw_itemstore_get(board_data,CW_ITEM_WTP_BOARD_ID); + if (i) { + d+=cw_put_byte(d,CW_BOARDDATA_BOARDID ); + d+=cw_put_word(d,bstr16_len(i->data)); + d+=cw_put_data(d,bstr16_data(i->data),bstr16_len(i->data)); + } + + i=cw_itemstore_get(board_data,CW_ITEM_WTP_BOARD_REVISION); + if (i) { + d+=cw_put_byte(d,CW_BOARDDATA_REVISION ); + d+=cw_put_word(d,bstr16_len(i->data)); + d+=cw_put_data(d,bstr16_data(i->data),bstr16_len(i->data)); + } + + i=cw_itemstore_get(board_data,CW_ITEM_WTP_BOARD_MACADDRESS); + if (i) { + d+=cw_put_byte(d,CW_BOARDDATA_MACADDRESS ); + d+=cw_put_word(d,bstr_len(i->data)); + d+=cw_put_data(d,bstr_data(i->data),bstr_len(i->data)); + } + + int l = d-dst; + return l+cw_put_elem_hdr(dst,CW_ELEM_WTP_BOARD_DATA,l-4); + +} + diff --git a/src/capwap/dbg.c b/src/capwap/dbg.c new file mode 100644 index 00000000..2efef61f --- /dev/null +++ b/src/capwap/dbg.c @@ -0,0 +1,23 @@ + + +#include "capwap.h" +#include "dbg.h" +#include "cw_log.h" + +void cw_dbg_missing_mand(int level,struct conn *conn,cw_action_in_t ** ml,int n,cw_action_in_t *a) +{ + if (!cw_dbg_is_level(DBG_ELEM) || n==0) + return; + + char buffer[2000]; + char *p=buffer; + int i; + char *delim=""; + for(i=0; iactions,ml[i]->elem_id)); + + } + + cw_dbg(DBG_ELEM,"Missing mandatory elements: [%s]",buffer); +}