ac descriptor works

FossilOrigin-Name: 8e68ed51a2c8ee448474ab13ef8d0edbd8cfda5b5384684e2ed9ffa1fca4e799
This commit is contained in:
7u83@mail.ru
2018-03-24 06:56:05 +00:00
parent a9bb2d523c
commit 257f1189b0
39 changed files with 337 additions and 199 deletions

View File

@ -66,7 +66,15 @@
#define cw_get_word lw_get_word
#define cw_get_dword lw_get_dword
#define cw_set_byte lw_set_byte
#define cw_set_word lw_set_word
#define cw_set_dword lw_set_dword
/*
#define cw_get_str(data, maxlen) (strndup((char*)(data),maxlen))
*/
/**
* Macro to isolate bits from a dword

View File

@ -1,88 +0,0 @@
/*
This file is part of actube.
actube is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libcapwap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file
* @brief Implements cw_in_capwap_control_ip_address
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include "log.h"
#include "cw.h"
#include "aciplist.h"
#include "sock.h"
int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len,struct sockaddr *from)
{
/* cw_acip_t * acip;
cw_aciplist_t list =
mbag_get_mavl_c(conn->incomming,a->item_id,cw_aciplist_create);
if (!list) {
cw_log(LOG_ERR, "Error: Can't allocate CAWPAP IP Adress List");
return 0;
}
acip = malloc(sizeof(cw_acip_t));
if (!acip) {
cw_log(LOG_ERR,"Can't allocate memory for acv4ip: %s",strerror(errno));
return 0;
}
if (a->elem_id == CW_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS) {
struct sockaddr_in addr;
memcpy(&addr.sin_addr,data,4);
addr.sin_family=AF_INET;
sock_setport((struct sockaddr*)&addr,CAPWAP_CONTROL_PORT);
memcpy(&acip->ip,&addr,sizeof(addr));
acip->index = cw_get_word(data+4);
}
if (a->elem_id == CW_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS) {
struct sockaddr_in6 addr;
memset (&addr,0,sizeof(addr));
memcpy(&addr.sin6_addr,data,16);
addr.sin6_family=AF_INET6;
sock_setport((struct sockaddr*)&addr,CAPWAP_CONTROL_PORT);
memcpy(&acip->ip,&addr,sizeof(addr));
acip->index = cw_get_word(data+16);
}
cw_aciplist_replace(list,acip);
*/
return 1;
}

View File

@ -4,7 +4,8 @@
#include "log.h"
#include "dbg.h"
const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key, const struct cw_Type *type,
const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key,
const struct cw_Type *type,
const char * str)
{
cw_KTV_t mdata, *mresult;

View File

@ -1,3 +0,0 @@
#include "ktv.h"
#include "dbg.h"

View File

@ -1,8 +1,73 @@
#include "ktv.h"
cw_KTV_t * cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type)
void * ktvn(struct mavl *t ,const void *search)
{
struct mavlnode *n,*lastl,*lastb;
lastb = NULL; lastl=NULL;
n = t->root;
while(n){
int rc;
const cw_KTV_t *c1,*c2;
c1=search;
c2=mavlnode_dataptr(n);
rc = t->cmp(search,mavlnode_dataptr(n));
/*printf("Compare: %s %s = %d\n",c1->key,c2->key, rc);*/
if (rc==0){
return NULL;
}
if (rc<0){
lastl = n;
if (n->left==NULL){
return mavlnode_dataptr(lastb);
}
n=n->left;
}
else{
lastb=n;
if(n->right==NULL){
return mavlnode_dataptr(lastb);
}
n=n->right;
}
}
return NULL;
}
int cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type)
{
char ikey[CW_KTV_MAX_KEY_LEN];
sprintf(ikey,"%s.%d",key,idx);
return cw_ktv_get(ktv,ikey,type);
cw_KTV_t search, * result;
char *d;
sprintf(ikey,"%s.%d",key,65536);
search.key=ikey;
result = ktvn(ktv,&search);
if (result == NULL){
return -1;
}
d = strchr(result->key,'.');
if (d==NULL){
return -1;
}
if (strncmp(result->key,ikey,d-result->key)!=0)
return -1;
return atoi(d+1);
}

View File

@ -2,5 +2,30 @@
int cw_ktv_mavlcmp(const void *v1, const void *v2)
{
return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key);
char *d1,*d2;
int l1,l2,rc,i1,i2;
d1 = strchr(((cw_KTV_t *) v1)->key,'.');
d2 = strchr(((cw_KTV_t *) v2)->key,'.');
if (d1==NULL || d2==NULL)
return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key);
l1=d1-((cw_KTV_t *) v1)->key;
l2=d2-((cw_KTV_t *) v2)->key;
if (l1!=l2){
return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key);
}
rc = strncmp(((cw_KTV_t *) v1)->key,((cw_KTV_t *) v2)->key,l1);
if (rc!=0){
return rc;
}
i1 = atoi(d1+1);
i2 = atoi(d2+1);
return i1-i2;
}

View File

@ -13,7 +13,7 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
{
char detail[128];
struct cw_KTV * elem, search;
int start, len;
int start, len, l;
/* Get the element to put */
search.key=(char*)handler->key;
@ -50,16 +50,18 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
handler->type->to_str(elem,detail,120);
sprintf(params->debug_details, " Value = %s", detail);
params->elem = elem;
/*(cw_put_mbag_item(dst + start, item);*/
if (handler->vendor)
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
return len + cw_put_elem_hdr(dst, handler->id, len);
l = len + cw_put_elem_hdr(dst, handler->id, len);
cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,handler,dst,l);
return l;
}

View File

@ -2,6 +2,7 @@
#include "cw.h"
#include "dbg.h"
#include "log.h"
/**
* @brief Process a CAPWAP message element
@ -66,6 +67,10 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
cw_dbg_elem(DBG_ELEM_IN, params->conn, params->msgdata->type, handler,
data,len);
if (handler->get == NULL){
cw_log(LOG_ERR,"No get method defined for %d %s",handler->id,handler->name);
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
}
rc = handler->get(handler, params, data, len);

View File

@ -94,12 +94,12 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
l = handler->put(handler,&params,dst+len);
if(l>0)
/* if(l>0)
cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,dst+len,l);
if (strlen(details)){
cw_dbg(DBG_ELEM_DETAIL," %s",params.debug_details);
}
len += l;
*/ len += l;
}
cw_set_msg_elems_len(msgptr, len);
@ -111,7 +111,7 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
cw_set_msg_seqnum(msgptr,s);
}
return len;
return CAPWAP_RESULT_SUCCESS;
}

View File

@ -1,16 +1,24 @@
#include "cw.h"
#include "dbg.h"
#include "ktv.h"
/*
int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len,
static struct cw_DescriptorSubelemDef allowed_default[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1},
{0,0, NULL,0, 0}
};
int cw_read_ac_descriptor(mavl_t store, uint8_t *data, int len,
struct cw_DescriptorSubelemDef *allowed)
{
struct cw_ac_status *status = malloc(sizeof(struct cw_ac_status));
if (!status)
return 0;
char key[CW_KTV_MAX_KEY_LEN];
cw_KTV_t * stations, *limit;
status->stations = cw_get_word(data);
stations = cw_ktv_add(store,"ac-descriptor/stations",CW_TYPE_WORD,data,4);
/* status->stations = cw_get_word(data);
status->limit = cw_get_word(data + 2);
status->active_wtps = cw_get_word(data + 4);
status->max_wtps = cw_get_word(data + 6);
@ -22,14 +30,9 @@ int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len,
"AC Descriptor: WTPs:%d/%d, Stations:%d/%d, Security:%d, Rmac:%d, DTLS-Policy:%d",
status->active_wtps, status->max_wtps, status->stations, status->limit,
status->security, status->rmac_field, status->dtls_policy);
*/
/* mbag_set_ptr(store, CW_ITEM_AC_STATUS, status);*/
mbag_set_ptr(store, CW_ITEM_AC_STATUS, status);
static struct cw_DescriptorSubelemDef allowed_default[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1},
{0,0, NULL,0, 0}
};
if (!allowed)
allowed=allowed_default;
@ -38,4 +41,4 @@ int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len,
}
*/

View File

@ -35,9 +35,9 @@ static int put(const cw_KTV_t *data, uint8_t * dst)
static int to_str(const cw_KTV_t *data, char *dst, int max_len)
{
if (max_len<3){
/*if (max_len<3){
return 0;
}
}*/
return sprintf(dst, "%d", data->val.byte);
}

View File

@ -94,7 +94,7 @@ static struct cw_KTV *from_str ( struct cw_KTV * data, const char *src )
}
static int len ( struct cw_KTV * data ){
return bstr16_len(data->val.ptr);
return bstr_len(data->val.ptr);
}

View File

@ -114,7 +114,7 @@ cw_KTV_t * cw_ktv_get(mavl_t ktv, const char *key, const cw_Type_t * type);
uint8_t cw_ktv_get_byte(mavl_t ktv,const char *key, uint8_t def);
uint16_t cw_ktv_get_word(mavl_t ktv,const char *key, uint16_t def);
cw_KTV_t * cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type);
int cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type);
extern const cw_Type_t * cw_ktv_std_types[];

View File

@ -55,7 +55,7 @@
/**
* Same as #lw_set_word, but no return value
*/
#define lw_set_word(dst,b) \
#define lw_set_word(dst,w) \
(*((uint16_t*)(dst)) = htons(w))
/**

View File

@ -7,16 +7,16 @@ const char * lw_elem_id_to_str(int elem_id)
{
switch (elem_id){
case LW_ELEM_AC_ADDRESS:
case LWAPP_ELEM_AC_ADDRESS:
return "AC Address";
case LW_ELEM_WTP_DESCRIPTOR:
case LWAPP_ELEM_WTP_DESCRIPTOR:
return "WTP Descriptor";
case LW_ELEM_WTP_NAME:
case LWAPP_ELEM_WTP_NAME:
return "WTP Name";
case LW_ELEM_AC_DESCRIPTOR:
case LWAPP_ELEM_AC_DESCRIPTOR:
return "AC Descriptor";
case LW_ELEM_AC_NAME:

View File

@ -14,16 +14,6 @@ int lw_put_data(uint8_t*dst,const uint8_t*data,uint16_t len)
return len;
}
/**
* Put a #bstr_t to an output buffer
* @param dst Destination
* @param b bstr to put
* @return The number of bytes put
*/
int lw_put_bstr(uint8_t * dst, const bstr_t b){
lw_put_data(dst,bstr_data(b),bstr_len(b));
return bstr_len(b);
}
/**
* Put a #bstr16_t to an output buffer

12
src/cw/lw_put_bstr.c Normal file
View File

@ -0,0 +1,12 @@
#include "lw.h"
/**
* Put a #bstr_t to an output buffer
* @param dst Destination
* @param b bstr to put
* @return The number of bytes put
*/
int lw_put_bstr(uint8_t * dst, const bstr_t b){
lw_put_data(dst,bstr_data(b),bstr_len(b));
return bstr_len(b);
}

View File

@ -9,7 +9,7 @@ int lw_put_image_data(uint8_t *dst,FILE *infile)
return 1;
}
int bytes = fread(dst+3,1,LW_BLOCKSIZE_IMAGE_DATA,infile);
int bytes = fread(dst+3,1,LWAPP_BLOCKSIZE_IMAGE_DATA,infile);
if ( ferror(infile)) {
lw_put_byte(dst+0,5);

View File

@ -38,7 +38,7 @@
*/
int lw_readelem_wtp_name(uint8_t ** dst, int type, uint8_t * msgelem, int len)
{
if (type != LW_ELEM_WTP_NAME)
if (type != LWAPP_ELEM_WTP_NAME)
return 0;

View File

@ -49,7 +49,7 @@
#define LWAPP_DATA_PORT_STR "12223"
/** Block Size for Image Data */
#define LW_BLOCKSIZE_IMAGE_DATA 1024
#define LWAPP_BLOCKSIZE_IMAGE_DATA 1024
/**@}*/
@ -91,11 +91,11 @@
*/
#define LW_MSG_DISCOVERY_REQUEST 1
#define LW_MSG_DISCOVERY_RESPONSE 2
#define LWAPP_MSG_DISCOVERY_REQUEST 1
#define LWAPP_MSG_DISCOVERY_RESPONSE 2
#define LW_MSG_JOIN_REQUEST 3
#define LW_MSG_JOIN_RESPONSE 4
#define LWAPP_MSG_JOIN_REQUEST 3
#define LWAPP_MSG_JOIN_RESPONSE 4
/*
Join ACK 5
@ -125,11 +125,11 @@
/* LWAPP message elements */
#define LW_ELEM_AC_ADDRESS 2
#define LW_ELEM_WTP_DESCRIPTOR 3
#define LW_ELEM_WTP_NAME 5
#define LW_ELEM_AC_DESCRIPTOR 6
#define LW_ELEM_ADD_WLAN 7
#define LWAPP_ELEM_AC_ADDRESS 2
#define LWAPP_ELEM_WTP_DESCRIPTOR 3
#define LWAPP_ELEM_WTP_NAME 5
#define LWAPP_ELEM_AC_DESCRIPTOR 6
#define LWAPP_ELEM_ADD_WLAN 7
#define LW_ELEM_MAC_OPERATION 11
#define LW_ELEM_TX_POWER 12

View File

@ -115,7 +115,7 @@ typedef struct mavl * mavl_t;
/**
* @param node node
*/
#define mavlnode_dataptr(node) (((uint8_t*)(node))+sizeof(struct mavlnode))
#define mavlnode_dataptr(node) ((void*)(((uint8_t*)(node))+sizeof(struct mavlnode)))
struct mavl *mavl_create ( int ( *cmp ) ( const void *, const void * ),
void ( *del ) ( void * ), size_t data_size );
@ -129,8 +129,9 @@ void mavl_destroy ( struct mavl *t );
void mavl_del_all ( struct mavl *t );
void mavl_merge ( mavl_t m, mavl_t t );
void mavlnode_destroy ( struct mavl *t, struct mavlnode *n );
struct mavlnode *mavl_get_node ( struct mavl *t, void *data );
struct mavlnode *mavlnode_get ( struct mavl *t, void *data );
struct mavlnode * mavl_get_node_cmp(struct mavl *t ,void *data,
int ( *cmp ) ( const void *, const void * ));

View File

@ -20,7 +20,6 @@
* @brief Implementation of mavl_get
*/
#include <stdio.h>
#include "mavl.h"

View File

@ -17,12 +17,10 @@
*/
#include <stdio.h>
#include "mavl.h"
struct mavlnode * mavl_get_node(struct mavl *t ,void *data)
struct mavlnode * mavlnode_get(struct mavl *t ,void *data)
{
struct mavlnode *n = t->root;
while(n){
@ -36,4 +34,3 @@ struct mavlnode * mavl_get_node(struct mavl *t ,void *data)
}
return NULL;
}

View File

@ -0,0 +1,18 @@
#include "mavl.h"
struct mavlnode * mavl_get_node_cmp(struct mavl *t ,void *data,
int ( *cmp ) ( const void *, const void * ))
{
struct mavlnode *n = t->root;
while(n){
int rc=cmp(data,mavlnode_dataptr(n));
if (rc==0)
return n;
if (rc<0)
n=n->left;
else
n=n->right;
}
return NULL;
}

View File

@ -27,7 +27,7 @@
static void mavlnode_move(mavl_t m,mavl_t t, struct mavlnode *n)
{
struct mavlnode * mn = mavl_get_node(m,mavlnode_dataptr(n));
struct mavlnode * mn = mavlnode_get(m,mavlnode_dataptr(n));
if (mn) {
if (m->del) {
m->del(mavlnode_dataptr(mn));