Inital ...
FossilOrigin-Name: de1632d00be3fc7a95886de81443ce492ab65d7b976fc966ae3b30c2d1d9a204
This commit is contained in:
parent
01d5b87d2b
commit
78f5400fa1
62
src/capwap/cw_check_missing_mand.c
Normal file
62
src/capwap/cw_check_missing_mand.c
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
3
src/capwap/cw_in_check_join_request.c
Normal file
3
src/capwap/cw_in_check_join_request.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
35
src/capwap/cw_in_cisco_image_identifier.c
Normal file
35
src/capwap/cw_in_cisco_image_identifier.c
Normal file
@ -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 (len<a->min_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;
|
||||||
|
}
|
||||||
|
|
66
src/capwap/cw_out_wtp_board_data.c
Normal file
66
src/capwap/cw_out_wtp_board_data.c
Normal file
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
23
src/capwap/dbg.c
Normal file
23
src/capwap/dbg.c
Normal file
@ -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; i<n; i++) {
|
||||||
|
p+=sprintf(p,"%s",delim); delim=", ";
|
||||||
|
p+=sprintf(p,"%s",cw_strelemp(conn->actions,ml[i]->elem_id));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
cw_dbg(DBG_ELEM,"Missing mandatory elements: [%s]",buffer);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user