FossilOrigin-Name: e6352b425bf6574bdaacc571723f7b54394e235d8b64bbaa504c9b7e529b7535bsdmakefiles
parent
c43f85b2a6
commit
5b51751453
@ -0,0 +1,65 @@ |
||||
/*
|
||||
This file is part of libcapwap. |
||||
|
||||
libcapwap 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/>.
|
||||
|
||||
*/ |
||||
|
||||
|
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
|
||||
#include <netinet/in.h> |
||||
#include <arpa/inet.h> |
||||
|
||||
#include "acpriolist.h" |
||||
|
||||
|
||||
static int acprio_cmp(const void *x1, const void *x2) |
||||
{ |
||||
cw_acprio_t * p1 = (cw_acprio_t*)x1; |
||||
cw_acprio_t * p2 = (cw_acprio_t*)x2; |
||||
return strcmp (p1->name,p2->name); |
||||
|
||||
} |
||||
|
||||
static void acprio_del(void *d) |
||||
{ |
||||
cw_acprio_t *p = (cw_acprio_t*)d; |
||||
if ( p->name )
|
||||
free (p->name); |
||||
free(d); |
||||
} |
||||
|
||||
cw_acpriolist_t cw_acpriolist_create() |
||||
{ |
||||
return avltree_create(acprio_cmp, acprio_del); |
||||
} |
||||
|
||||
cw_acprio_t * cw_acpriolist_add(cw_acpriolist_t l, const char *name,int name_len, uint8_t prio) |
||||
{ |
||||
|
||||
cw_acprio_t * s=malloc(sizeof(cw_acprio_t)); |
||||
if (!s) |
||||
return 0; |
||||
s->name=strndup(name,name_len); |
||||
s->prio=prio; |
||||
|
||||
cw_acpriolist_del(l,s); |
||||
return avltree_add(l,s); |
||||
|
||||
} |
||||
|
||||
|
||||
|
@ -0,0 +1,31 @@ |
||||
#ifndef __ACIPRIORITYLIST_H |
||||
#define __ACIPRIORITYLIST_H |
||||
|
||||
|
||||
#include "avltree.h" |
||||
|
||||
struct cw_acprio{ |
||||
char *name; |
||||
uint8_t prio; |
||||
}; |
||||
|
||||
typedef struct cw_acprio cw_acprio_t; |
||||
typedef struct avltree * cw_acpriolist_t; |
||||
|
||||
extern cw_acpriolist_t cw_acpriolist_create(); |
||||
cw_acprio_t * cw_acpriolist_add(cw_acpriolist_t l, const char *name,int name_len, uint8_t prio); |
||||
|
||||
static inline int cw_acpriolist_get(cw_acpriolist_t l, char * acname){ |
||||
cw_acprio_t ps,*pf; |
||||
ps.name=acname; |
||||
|
||||
pf=avltree_get(l,&ps); |
||||
if (!pf) |
||||
return 256; |
||||
return pf->prio; |
||||
} |
||||
|
||||
#define cw_acpriolist_del(l,s) avltree_del(l,s) |
||||
#define cw_acpriolist_set(l,n,nl,p) cw_acpriolist_add(l,n,nl,p) |
||||
|
||||
#endif |
@ -0,0 +1,13 @@ |
||||
|
||||
|
||||
#include "capwap_80211.h" |
||||
#include "capwap_items.h" |
||||
|
||||
#define CW_ACTION_IN_80211_WTP_RADIO_INFORMATION \ |
||||
CW_ELEM80211_WTP_RADIO_INFORMATION, /* Element ID*/ \
|
||||
cw_in_generic, 0, /* start/end callback */ \
|
||||
CW_ITEMTYPE_STR, /* Type of element */ \
|
||||
CW_ITEM_LOCATION_DATA, /* ID to use store */ \
|
||||
5, 5 /* min/max length */ |
||||
|
||||
|
@ -0,0 +1,39 @@ |
||||
|
||||
|
||||
#include "action.h" |
||||
#include "capwap_80211_actions.h" |
||||
#include "capwap.h" |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cw_action_in_t capwap_80211_actions_wtp_in[] = { |
||||
|
||||
|
||||
{0, 0, CW_STATE_DISCOVERY, CW_MSG_DISCOVERY_RESPONSE, |
||||
CW_ACTION_IN_80211_WTP_RADIO_INFORMATION, 1} |
||||
, |
||||
|
||||
|
||||
{0, 0, 0} |
||||
}; |
||||
|
||||
|
||||
int cw_register_actions_capwap_80211_wtp(struct cw_actiondef *def) |
||||
{ |
||||
|
||||
cw_actionlist_in_register_actions(def->in, capwap_80211_actions_wtp_in); |
||||
// cw_actionlist_out_register_actions(def->out, capwap_actions_wtp_out);
|
||||
|
||||
int rc; |
||||
rc = cw_strheap_register_strings(def->strelem, capwap_strings_elem80211); |
||||
printf("80211 Registerd %d\n",rc); |
||||
/*rc += cw_strheap_register_strings(def->strelem, capwap_strings_elem);
|
||||
*/ |
||||
|
||||
|
||||
return 1; |
||||
} |
||||
|
@ -0,0 +1,11 @@ |
||||
#include "capwap_80211.h" |
||||
|
||||
|
||||
struct cw_str capwap_strings_elem80211[] = { |
||||
|
||||
{CW_ELEM80211_WTP_RADIO_INFORMATION, "802.11 WTP Radio Information"}, |
||||
{CW_STR_STOP,"Unknown"} |
||||
|
||||
|
||||
}; |
||||
|
@ -0,0 +1,14 @@ |
||||
#include "capwap.h" |
||||
|
||||
|
||||
struct cw_str capwap_strings_result[] = { |
||||
|
||||
{CW_RESULT_SUCCESS,"Success"}, /* 0 */ |
||||
{CW_RESULT_MISSING_AC_LIST,"AC List Message Element MUST be Present"}, /* 1 */ |
||||
{CW_RESULT_SUCCESS_NAT,"Success - NAT Detected"}, /* 2 */ |
||||
{CW_RESULT_MISSING_MAND_ELEM,"Missing Mandatory Message Element"}, /* 20 */ |
||||
|
||||
{CW_STR_STOP,"Unknown Result Code"} |
||||
|
||||
}; |
||||
|
@ -0,0 +1,9 @@ |
||||
|
||||
|
||||
|
||||
int cw_in_ac_descriptor(struct conn *conn,struct cw_action_in * a,uint8_t *data,int len) |
||||
{ |
||||
|
||||
|
||||
} |
||||
|
@ -0,0 +1,43 @@ |
||||
|
||||
#include <errno.h> |
||||
|
||||
#include "action.h" |
||||
#include "cw_log.h" |
||||
#include "itemstore.h" |
||||
#include "capwap.h" |
||||
#include "capwap_items.h" |
||||
#include "aciplist.h" |
||||
#include "sock.h" |
||||
|
||||
|
||||
|
||||
int cw_in_capwap_control_ipv4_address(struct conn *conn, struct cw_action_in *a, |
||||
uint8_t * data, int len) |
||||
{ |
||||
cw_aciplist_t list = |
||||
cw_itemstore_get_avltree_c(conn->incomming,a->item_id,cw_aciplist_create); |
||||
|
||||
if (!list) { |
||||
cw_log(LOG_ERR, "Error: Can't allocate CAWAP IP Adress List"); |
||||
return -1; |
||||
} |
||||
|
||||
cw_acip_t * acip; |
||||
acip = malloc(sizeof(cw_acip_t)); |
||||
if (!acip) { |
||||
cw_log(LOG_ERR,"Can't allocate memory for acv4ip: %s",strerror(errno)); |
||||
return 1; |
||||
} |
||||
|
||||
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->wtp_count = cw_get_word(data+4); |
||||
cw_aciplist_replace(list,acip); |
||||
|
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,37 @@ |
||||
|
||||
#include <errno.h> |
||||
|
||||
#include "capwap.h" |
||||
#include "intavltree.h" |
||||
#include "dbg.h" |
||||
#include "cw_log.h" |
||||
#include "capwap_items.h" |
||||
|
||||
int cw_in_check_join_resp(struct conn *conn, struct cw_action_in *a, uint8_t * data, |
||||
int len) |
||||
{ |
||||
|
||||
cw_action_in_t * mlist[60]; |
||||
|
||||
/* Check for mandatory elements */ |
||||
int n = cw_check_missing_mand(mlist,conn,a); |
||||
if (n) { |
||||
cw_dbg_missing_mand(DBG_ELEM,conn,mlist,n,a); |
||||
conn->capwap_state=CW_STATE_JOIN; |
||||
errno=EAGAIN; |
||||
return -1; //CW_RESULT_MISSING_MAND_ELEM;
|
||||
} |
||||
|
||||
|
||||
|
||||
cw_item_t * jresult = cw_itemstore_get(conn->incomming, CW_ITEM_RESULT_CODE); |
||||
|
||||
if ( jresult ) { |
||||
return jresult->dword; |
||||
} |
||||
|
||||
/* set result code to ok and change to configure state */ |
||||
// cw_itemstore_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);
|
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,44 @@ |
||||
#include <errno.h> |
||||
|
||||
#include "conn.h" |
||||
#include "capwap.h" |
||||
#include "cw_log.h" |
||||
#include "sock.h" |
||||
|
||||
int cw_send_request(struct conn *conn,int msg_id) |
||||
{ |
||||
cw_init_request(conn, msg_id); |
||||
if ( cw_put_msg(conn, conn->req_buffer) == -1 ) |
||||
return 0; |
||||
conn_send_msg(conn, conn->req_buffer); |
||||
|
||||
|
||||
|
||||
|
||||
int i; |
||||
int rc=-1; |
||||
for (i=0; i<conn->max_retransmit && rc<0; i++){ |
||||
time_t timer = cw_timer_start(conn->retransmit_interval); |
||||
while (!cw_timer_timeout(timer) && rc<0){ |
||||
|
||||
rc =cw_read_messages(conn); |
||||
if(rc<0){ |
||||
if (errno!=EAGAIN) |
||||
break; |
||||
} |
||||
|
||||
} |
||||
if (rc<0){ |
||||
if(errno!=EAGAIN) |
||||
break; |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
if ( rc <0 ) { |
||||
cw_log(LOG_ERR,"Error reading from %s:%s",sock_addr2str(&conn->addr),strerror(errno)); |
||||
} |
||||
|
||||
return rc; |
||||
} |
Loading…
Reference in new issue