aciplist in config file.
FossilOrigin-Name: 0ae2ea51cbbb8c346b811c5ed15b41fb1445a9e97b574379596be9333f051858
This commit is contained in:
		@ -273,7 +273,7 @@ AP = RAD = WTP
 | 
				
			|||||||
   | Counter Type  |       Set     |     Value     |
 | 
					   | Counter Type  |       Set     |     Value     |
 | 
				
			||||||
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
 | 
					   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Type: 207 
 | 
					Type: 240
 | 
				
			||||||
Length: 4
 | 
					Length: 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   Counter Type: 
 | 
					   Counter Type: 
 | 
				
			||||||
@ -287,6 +287,20 @@ Length: 4
 | 
				
			|||||||
   Value: 
 | 
					   Value: 
 | 
				
			||||||
       Value to set.
 | 
					       Value to set.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					249. Cisco AP Venue Settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    0                   1                   2                   3
 | 
				
			||||||
 | 
					    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 | 
				
			||||||
 | 
					   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 | 
				
			||||||
 | 
					   |  Reserved(?)  | Venue Group   |  Venue Type   |   Language ...   
 | 
				
			||||||
 | 
					   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
 | 
				
			||||||
 | 
					          ... Language             |  Venue Name ...   
 | 
				
			||||||
 | 
					   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
254. Cisco SPAM AP LED Flash Config
 | 
					254. Cisco SPAM AP LED Flash Config
 | 
				
			||||||
@ -296,7 +310,7 @@ Length: 4
 | 
				
			|||||||
LWAPP
 | 
					LWAPP
 | 
				
			||||||
=====
 | 
					=====
 | 
				
			||||||
In this section Cisco vendor specific message elements used in LWAPP 
 | 
					In this section Cisco vendor specific message elements used in LWAPP 
 | 
				
			||||||
are listed.
 | 
					are listed. (See RFC5412, message element type 104).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Some of these elements are used  by Cisco in CAPWAP where the
 | 
					Some of these elements are used  by Cisco in CAPWAP where the
 | 
				
			||||||
vendor specific LWAPP message element is encapsulated in a vendor 
 | 
					vendor specific LWAPP message element is encapsulated in a vendor 
 | 
				
			||||||
 | 
				
			|||||||
@ -140,6 +140,7 @@ CAPWAPOBJS= \
 | 
				
			|||||||
	cw_in_cisco_image_identifier.o\
 | 
						cw_in_cisco_image_identifier.o\
 | 
				
			||||||
	cw_out_capwap_control_ip_addr_list.o \
 | 
						cw_out_capwap_control_ip_addr_list.o \
 | 
				
			||||||
	cw_in_capwap_control_ipv4_address.o\
 | 
						cw_in_capwap_control_ipv4_address.o\
 | 
				
			||||||
 | 
						cw_in_radio_administrative_state.o \
 | 
				
			||||||
	strheap.o \
 | 
						strheap.o \
 | 
				
			||||||
	cw_check_missing_mand.o \
 | 
						cw_check_missing_mand.o \
 | 
				
			||||||
	md5sum.o \
 | 
						md5sum.o \
 | 
				
			||||||
 | 
				
			|||||||
@ -44,7 +44,7 @@ static void acprio_del(void *d)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
cw_acpriolist_t cw_acpriolist_create()
 | 
					cw_acpriolist_t cw_acpriolist_create()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return  avltree_create(acprio_cmp, acprio_del);
 | 
						return  mavl_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 * cw_acpriolist_add(cw_acpriolist_t l, const char *name,int name_len, uint8_t prio)
 | 
				
			||||||
@ -57,7 +57,7 @@ cw_acprio_t * cw_acpriolist_add(cw_acpriolist_t l, const char *name,int name_len
 | 
				
			|||||||
	s->prio=prio;
 | 
						s->prio=prio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_acpriolist_del(l,s);
 | 
						cw_acpriolist_del(l,s);
 | 
				
			||||||
	return avltree_add(l,s);
 | 
						return mavl_add(l,s);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
#ifndef __ACIPRIORITYLIST_H
 | 
					#ifndef __ACIPRIORITYLIST_H
 | 
				
			||||||
#define __ACIPRIORITYLIST_H
 | 
					#define __ACIPRIORITYLIST_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mavl.h"
 | 
				
			||||||
#include "avltree.h"
 | 
					//#include "mavl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct cw_acprio{
 | 
					struct cw_acprio{
 | 
				
			||||||
	char *name;
 | 
						char *name;
 | 
				
			||||||
@ -10,7 +10,7 @@ struct cw_acprio{
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct cw_acprio cw_acprio_t;
 | 
					typedef struct cw_acprio cw_acprio_t;
 | 
				
			||||||
typedef struct avltree * cw_acpriolist_t;
 | 
					typedef struct mavl * cw_acpriolist_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern cw_acpriolist_t cw_acpriolist_create();
 | 
					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);
 | 
					cw_acprio_t * cw_acpriolist_add(cw_acpriolist_t l, const char *name,int name_len, uint8_t prio);
 | 
				
			||||||
@ -19,13 +19,13 @@ static inline int cw_acpriolist_get(cw_acpriolist_t l, char * acname){
 | 
				
			|||||||
	cw_acprio_t ps,*pf;
 | 
						cw_acprio_t ps,*pf;
 | 
				
			||||||
	ps.name=acname;
 | 
						ps.name=acname;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	pf=avltree_get(l,&ps);
 | 
						pf=mavl_get(l,&ps);
 | 
				
			||||||
	if (!pf)
 | 
						if (!pf)
 | 
				
			||||||
		return 256;
 | 
							return 256;
 | 
				
			||||||
	return pf->prio;
 | 
						return pf->prio;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define cw_acpriolist_del(l,s) avltree_del(l,s)
 | 
					#define cw_acpriolist_del(l,s) mavl_del(l,s)
 | 
				
			||||||
#define cw_acpriolist_set(l,n,nl,p) cw_acpriolist_add(l,n,nl,p)
 | 
					#define cw_acpriolist_set(l,n,nl,p) cw_acpriolist_add(l,n,nl,p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -1098,6 +1098,8 @@ struct mbag_item *cw_out_get_session_id(struct conn *conn, struct cw_action_out
 | 
				
			|||||||
struct mbag_item *cw_out_get_config(struct conn *conn, struct cw_action_out *a);
 | 
					struct mbag_item *cw_out_get_config(struct conn *conn, struct cw_action_out *a);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int cw_in_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len,
 | 
				
			||||||
 | 
							  struct sockaddr *from);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int cw_send_request(struct conn *conn, int msg_id);
 | 
					int cw_send_request(struct conn *conn, int msg_id);
 | 
				
			||||||
 | 
				
			|||||||
@ -12,11 +12,16 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
cw_action_in_t capwap_80211_actions_wtp_in[] = {
 | 
					cw_action_in_t capwap_80211_actions_wtp_in[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Discovery Response */
 | 
				
			||||||
	{0, 0, CW_STATE_DISCOVERY, CW_MSG_DISCOVERY_RESPONSE,
 | 
						{0, 0, CW_STATE_DISCOVERY, CW_MSG_DISCOVERY_RESPONSE,
 | 
				
			||||||
	 CW_ACTION_IN_80211_WTP_RADIO_INFORMATION, 1}
 | 
						 CW_ACTION_IN_80211_WTP_RADIO_INFORMATION, 1}
 | 
				
			||||||
	,
 | 
						,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Join Response */
 | 
				
			||||||
 | 
						{0, 0, CW_STATE_JOIN, CW_MSG_JOIN_RESPONSE,
 | 
				
			||||||
 | 
						 CW_ACTION_IN_80211_WTP_RADIO_INFORMATION, 1}
 | 
				
			||||||
 | 
						,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{0, 0, 0}
 | 
						{0, 0, 0}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -157,6 +157,13 @@
 | 
				
			|||||||
	CW_ITEM_IDLE_TIMEOUT,				/* ID to use store */		\
 | 
						CW_ITEM_IDLE_TIMEOUT,				/* ID to use store */		\
 | 
				
			||||||
	4, 4						/* min/max length */
 | 
						4, 4						/* min/max length */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CW_ACTION_IN_RADIO_ADMINISTRATIVE_STATE	 	\
 | 
				
			||||||
 | 
						CW_ELEM_RADIO_ADMINISTRATIVE_STATE,		/* Element ID*/			\
 | 
				
			||||||
 | 
						cw_in_radio_administrative_state, 0,		/* start/end callback */	\
 | 
				
			||||||
 | 
						MBAG_DWORD, 					/* Type of element */		\
 | 
				
			||||||
 | 
						0,						/* ID to use store */		\
 | 
				
			||||||
 | 
						4, 4						/* min/max length */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -68,6 +68,15 @@ cw_action_in_t capwap_actions_wtp_in[] = {
 | 
				
			|||||||
	 CW_ACTION_IN_RESULT_CODE, 1}
 | 
						 CW_ACTION_IN_RESULT_CODE, 1}
 | 
				
			||||||
	,
 | 
						,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Element: AC Name */
 | 
				
			||||||
 | 
						{0, 0, CW_STATE_JOIN, CW_MSG_JOIN_RESPONSE,
 | 
				
			||||||
 | 
						 CW_ACTION_IN_AC_NAME, 1}
 | 
				
			||||||
 | 
						,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* ------------------------------------------------------------------------------- */
 | 
						/* ------------------------------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Message Image Data Response */
 | 
						/* Message Image Data Response */
 | 
				
			||||||
 | 
				
			|||||||
@ -88,6 +88,7 @@
 | 
				
			|||||||
#define CW_CISCO_BOARD_DATA_OPTIONS		207
 | 
					#define CW_CISCO_BOARD_DATA_OPTIONS		207
 | 
				
			||||||
#define CW_CISCO_MWAR_TYPE			208
 | 
					#define CW_CISCO_MWAR_TYPE			208
 | 
				
			||||||
#define CW_CISCO_AP_RETRANSMIT_PARAM		240
 | 
					#define CW_CISCO_AP_RETRANSMIT_PARAM		240
 | 
				
			||||||
 | 
					#define CW_CISCO_AP_VENUE_SETTINGS		249
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -112,6 +112,9 @@ const char * cw_cisco_id_to_str(int elem_id)
 | 
				
			|||||||
			return "SPAM AP LED State";
 | 
								return "SPAM AP LED State";
 | 
				
			||||||
		case CW_CISCO_AP_RETRANSMIT_PARAM:
 | 
							case CW_CISCO_AP_RETRANSMIT_PARAM:
 | 
				
			||||||
			return "AP Retransmit Param";
 | 
								return "AP Retransmit Param";
 | 
				
			||||||
 | 
							case CW_CISCO_AP_VENUE_SETTINGS:
 | 
				
			||||||
 | 
								return "AP Venue Settings";
 | 
				
			||||||
 | 
						
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return "Unknown";
 | 
								return "Unknown";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -279,6 +279,16 @@ static inline int mbag_set_avltree(mbag_t s, uint32_t id, struct avltree *t)
 | 
				
			|||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int mbag_set_mavl(mbag_t s, uint32_t id, mavl_t t)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct mbag_item *i = mbag_item_create(s, id);
 | 
				
			||||||
 | 
						if (!i)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						i->type = MBAG_AVLTREE;
 | 
				
			||||||
 | 
						i->data = t;
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline struct avltree *mbag_get_avltree_c(mbag_t s, uint32_t id,
 | 
					static inline struct avltree *mbag_get_avltree_c(mbag_t s, uint32_t id,
 | 
				
			||||||
							 struct avltree *(creator) ())
 | 
												 struct avltree *(creator) ())
 | 
				
			||||||
@ -296,6 +306,22 @@ static inline struct avltree *mbag_get_avltree_c(mbag_t s, uint32_t id,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline mavl_t mbag_get_mavl(mbag_t s, uint32_t id,
 | 
				
			||||||
 | 
												 mavl_t (creator) ())
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct mbag_item *i = mbag_get(s, id);
 | 
				
			||||||
 | 
						if (i)
 | 
				
			||||||
 | 
							return i->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!creator)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						mavl_t avltree = creator();
 | 
				
			||||||
 | 
						if (!avltree)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						mbag_set_mavl(s, id, avltree);
 | 
				
			||||||
 | 
						return avltree;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -56,7 +56,11 @@ extern int sock_set_dontfrag(int sock,int val);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern char * sock_get_primary_if(int family);
 | 
					extern char * sock_get_primary_if(int family);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define sock_addr2str(s) ( sock_addrtostr( (struct sockaddr*)s, (char[64]){0}, 64 ) )
 | 
					
 | 
				
			||||||
 | 
					char *sock_strsockaddr(const struct sockaddr *sa, char *s, size_t maxlen,int addport);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define sock_addr2str(s) ( sock_strsockaddr( (struct sockaddr*)s, (char[64]){0}, 64,0 ) )
 | 
				
			||||||
#define sock_hwaddr2str(s,l) ( sock_hwaddrtostr( s,l, (char[64]){0}, ":" ) )
 | 
					#define sock_hwaddr2str(s,l) ( sock_hwaddrtostr( s,l, (char[64]){0}, ":" ) )
 | 
				
			||||||
#define sock_hwaddr2idstr(s,l) ( sock_hwaddrtostr( s,l, (char[64]){0}, "" ) )
 | 
					#define sock_hwaddr2idstr(s,l) ( sock_hwaddrtostr( s,l, (char[64]){0}, "" ) )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -45,7 +45,10 @@ void sock_hwaddrtostr(const uint8_t *haddr,int len,char *dst)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *sock_addrtostr(const struct sockaddr *sa, char *s, size_t maxlen)
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *sock_strsockaddr(const struct sockaddr *sa, char *s, size_t maxlen,int addport)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int port;
 | 
						int port;
 | 
				
			||||||
@ -54,7 +57,10 @@ char *sock_addrtostr(const struct sockaddr *sa, char *s, size_t maxlen)
 | 
				
			|||||||
		case AF_INET:
 | 
							case AF_INET:
 | 
				
			||||||
			inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, maxlen);
 | 
								inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, maxlen);
 | 
				
			||||||
			port = ((struct sockaddr_in *)sa)->sin_port;
 | 
								port = ((struct sockaddr_in *)sa)->sin_port;
 | 
				
			||||||
			sprintf(s,"%s:%i",s,ntohs(port));
 | 
								if (addport) 
 | 
				
			||||||
 | 
									sprintf(s,"%s:%i",s,ntohs(port));
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									sprintf(s,"%s",s);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	        case AF_INET6:
 | 
						        case AF_INET6:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										119
									
								
								src/wtp/cfg.c
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								src/wtp/cfg.c
									
									
									
									
									
								
							@ -15,6 +15,8 @@
 | 
				
			|||||||
#include "capwap/format.h"
 | 
					#include "capwap/format.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "capwap/file.h"
 | 
					#include "capwap/file.h"
 | 
				
			||||||
 | 
					#include "capwap/aciplist.h"
 | 
				
			||||||
 | 
					#include "capwap/sock.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* json putters */
 | 
					/* json putters */
 | 
				
			||||||
@ -22,6 +24,8 @@ int cfg_json_put_bstr16(char *dst,const char * name, mbag_item_t *i,int n);
 | 
				
			|||||||
int cfg_json_put_vendorstr(char *dst,const char * name, mbag_item_t *i,int n);
 | 
					int cfg_json_put_vendorstr(char *dst,const char * name, mbag_item_t *i,int n);
 | 
				
			||||||
int cfg_json_put_dword(char *dst,const char * name, mbag_item_t *i,int n);
 | 
					int cfg_json_put_dword(char *dst,const char * name, mbag_item_t *i,int n);
 | 
				
			||||||
int cfg_json_put_word(char *dst,const char * name, mbag_item_t *i,int n);
 | 
					int cfg_json_put_word(char *dst,const char * name, mbag_item_t *i,int n);
 | 
				
			||||||
 | 
					int cfg_json_put_ac_ip_list(char *dst,const char * name, mbag_item_t *i,int n);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//static int scn_obj(char *js, jsmntok_t *t, int (vcb)(char*js,jsmntok_t*t,struct mbag_itemdef *defs,mbag_t mbag), struct mbag_itemdef *defs,mbag_t mbag);
 | 
					//static int scn_obj(char *js, jsmntok_t *t, int (vcb)(char*js,jsmntok_t*t,struct mbag_itemdef *defs,mbag_t mbag), struct mbag_itemdef *defs,mbag_t mbag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -90,7 +94,90 @@ static int skip(jsmntok_t *t)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int cfg_json_put_ac_ip_list(char *dst,const char * name, mbag_item_t *i,int n)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char *d = dst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cw_aciplist_t aciplist = i->data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MAVLITER_DEFINE(it,aciplist);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(d,'\t',n);
 | 
				
			||||||
 | 
						d+=n;
 | 
				
			||||||
 | 
						d+=sprintf(d,"\"%s\":",name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d+=sprintf(d,"[\n");
 | 
				
			||||||
 | 
						const char * comma = "";
 | 
				
			||||||
 | 
						mavliter_foreach(&it){
 | 
				
			||||||
 | 
							cw_acip_t * acip = mavliter_get(&it);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							d+=sprintf(d,"%s",comma);
 | 
				
			||||||
 | 
							memset(d,'\t',n+1);
 | 
				
			||||||
 | 
							d+=n+1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							d+=sprintf(d,"\"%s\"",sock_addr2str(&acip->ip));
 | 
				
			||||||
 | 
							comma=",\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d+=sprintf(d,"\n");
 | 
				
			||||||
 | 
						memset(d,'\t',n);
 | 
				
			||||||
 | 
						d+=n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d+=sprintf(d,"]");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return d-dst;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int cfg_json_get_ac_ip_list(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("Get AC IP List len = %d\n",t->size);
 | 
				
			||||||
 | 
						if (t->type != JSMN_ARRAY ) {
 | 
				
			||||||
 | 
							printf("ac_ip_list is not a list\n");
 | 
				
			||||||
 | 
							exit(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						int size = t->size;
 | 
				
			||||||
 | 
						t++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i=0; i<size; i++,t++){
 | 
				
			||||||
 | 
							js[t->end]=0;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							cw_acip_t * acip;	
 | 
				
			||||||
 | 
							acip = malloc(sizeof(cw_acip_t));
 | 
				
			||||||
 | 
							if (!acip)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							/* convert IPv4 adddress */
 | 
				
			||||||
 | 
							rc = inet_pton(AF_INET, js+t->start, &(((struct sockaddr_in *)(&acip->ip))->sin_addr) );
 | 
				
			||||||
 | 
							((struct sockaddr *)(&acip->ip))->sa_family=AF_INET;
 | 
				
			||||||
 | 
							if (!rc) {
 | 
				
			||||||
 | 
								/* If it's not an IPv4 adress, try IPv6 */
 | 
				
			||||||
 | 
								rc = inet_pton(AF_INET6, js+t->start, &(((struct sockaddr_in6 *)(&acip->ip))->sin6_addr) );
 | 
				
			||||||
 | 
								((struct sockaddr *)(&acip->ip))->sa_family=AF_INET6;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( !rc ) {
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								printf("Not an IP adress: %s\n",js+t->start);
 | 
				
			||||||
 | 
								exit(0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							cw_aciplist_t aciplist= mbag_get_mavl(mbag,CW_ITEM_AC_IP_LIST,cw_aciplist_create );
 | 
				
			||||||
 | 
							mavl_replace(aciplist,acip);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -237,6 +324,7 @@ int bstr_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int cfg_json_get_ac_ip_list(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag);
 | 
					int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag);
 | 
				
			||||||
int cfg_json_put_obj(char *dst,const char * name, mbag_item_t *i,int n);
 | 
					int cfg_json_put_obj(char *dst,const char * name, mbag_item_t *i,int n);
 | 
				
			||||||
@ -254,6 +342,7 @@ struct mbag_itemdef general_cfg[] = {
 | 
				
			|||||||
	{CW_RADIO_BSSID, "bssid",cfg_json_get_bstr16,cfg_json_put_bstr16}, 
 | 
						{CW_RADIO_BSSID, "bssid",cfg_json_get_bstr16,cfg_json_put_bstr16}, 
 | 
				
			||||||
	{CW_ITEM_CAPWAP_TIMERS, "capwap_timers",cfg_json_get_word,cfg_json_put_word}, 
 | 
						{CW_ITEM_CAPWAP_TIMERS, "capwap_timers",cfg_json_get_word,cfg_json_put_word}, 
 | 
				
			||||||
	{CW_ITEM_IDLE_TIMEOUT, "idle_timeout",cfg_json_get_dword,cfg_json_put_dword}, 
 | 
						{CW_ITEM_IDLE_TIMEOUT, "idle_timeout",cfg_json_get_dword,cfg_json_put_dword}, 
 | 
				
			||||||
 | 
						{CW_ITEM_AC_IP_LIST,"ac_ip_list",cfg_json_get_ac_ip_list,cfg_json_put_ac_ip_list},
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -372,9 +461,6 @@ int cfg_json_put_obj(char *dst,const char * name, mbag_item_t *i,int n)
 | 
				
			|||||||
	memset(d,'\t',n);
 | 
						memset(d,'\t',n);
 | 
				
			||||||
	d+=n;
 | 
						d+=n;
 | 
				
			||||||
	d+=sprintf(d,"\"%s\":",name);
 | 
						d+=sprintf(d,"\"%s\":",name);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	printf("here we are %s\n",dst);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	d+=mbag_tojson(d,i->data,board_data_cfg,n);
 | 
						d+=mbag_tojson(d,i->data,board_data_cfg,n);
 | 
				
			||||||
	return d-dst;
 | 
						return d-dst;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -436,7 +522,8 @@ int cfg_json_save()
 | 
				
			|||||||
	int n = mbag_tojson(dst,conn->config,general_cfg,0);
 | 
						int n = mbag_tojson(dst,conn->config,general_cfg,0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//printf("Json: %s\n",dst);
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_save_file("cfg.json",dst,n);
 | 
						cw_save_file("cfg.json",dst,n);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -506,7 +593,6 @@ int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t
 | 
				
			|||||||
		printf("Size: %d\n",t->size);
 | 
							printf("Size: %d\n",t->size);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
printf("BOARD DATA SCANER\n");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct conn * conn = get_conn();
 | 
						struct conn * conn = get_conn();
 | 
				
			||||||
	mbag_t bd = mbag_get_mbag(conn->config,CW_ITEM_WTP_BOARD_DATA,NULL);
 | 
						mbag_t bd = mbag_get_mbag(conn->config,CW_ITEM_WTP_BOARD_DATA,NULL);
 | 
				
			||||||
@ -561,29 +647,6 @@ static int set_cfg(char *js,jsmntok_t *t,struct mbag_itemdef *defs,mbag_t mbag){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int setup_conf(struct conn *conn)
 | 
					int setup_conf(struct conn *conn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
	FILE * infile = fopen("cfg.json","rb");
 | 
					 | 
				
			||||||
	if ( !infile ){
 | 
					 | 
				
			||||||
		perror("Can't open cfg.json");
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fseek(infile,0,SEEK_END);
 | 
					 | 
				
			||||||
	int size = ftell(infile);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char *jstr = malloc(size);
 | 
					 | 
				
			||||||
	if ( jstr==NULL){
 | 
					 | 
				
			||||||
		perror("Can't allocate memory");
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fseek(infile,0,SEEK_SET);
 | 
					 | 
				
			||||||
	fread(jstr,1,size,infile);
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	size_t size;
 | 
						size_t size;
 | 
				
			||||||
	char *jstr = cw_load_file("cfg.json",&size);
 | 
						char *jstr = cw_load_file("cfg.json",&size);
 | 
				
			||||||
	if (!jstr) {
 | 
						if (!jstr) {
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,12 @@
 | 
				
			|||||||
		"serial_no":"2045"
 | 
							"serial_no":"2045"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"capwap_timers":"2590",
 | 
						"capwap_timers":"2590",
 | 
				
			||||||
 | 
						"ac_ip_list":[
 | 
				
			||||||
 | 
							"192.168.0.1",
 | 
				
			||||||
 | 
							"192.168.0.13",
 | 
				
			||||||
 | 
							"192.168.0.15",
 | 
				
			||||||
 | 
							"fe80::219:dbff:fee0:9327"
 | 
				
			||||||
 | 
						],
 | 
				
			||||||
	"location_data":"Germany",
 | 
						"location_data":"Germany",
 | 
				
			||||||
	"bssid":""
 | 
						"bssid":""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -182,10 +182,12 @@ int wtpconf_ac_list()
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (bcrc){
 | 
						if (bcrc){
 | 
				
			||||||
		char bcstr[100];
 | 
					//		char bcstr[100];
 | 
				
			||||||
		sock_addrtostr((struct sockaddr*)&bcaddr,bcstr,100);
 | 
							char *bcstr;
 | 
				
			||||||
		char * c = strchr(bcstr,':');
 | 
					//		sock_addrtostr((struct sockaddr*)&bcaddr,bcstr,100);
 | 
				
			||||||
		*c=0;
 | 
							bcstr = sock_addr2str((struct sockaddr*)&bcaddr); 
 | 
				
			||||||
 | 
					//		char * c = strchr(bcstr,':');
 | 
				
			||||||
 | 
					//		*c=0;
 | 
				
			||||||
		conf_ac_list[i]=strdup(bcstr);
 | 
							conf_ac_list[i]=strdup(bcstr);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -138,7 +138,7 @@ mavl_destroy(b);
 | 
				
			|||||||
conn->config=mbag_create();
 | 
					conn->config=mbag_create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setup_conf(conn);
 | 
						setup_conf(conn);
 | 
				
			||||||
 | 
						cfg_json_save();	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mbag_t board_data = mbag_create();
 | 
						mbag_t board_data = mbag_create();
 | 
				
			||||||
	mbag_set_dword(board_data, CW_ITEM_WTP_BOARD_VENDOR, conf_vendor_id);
 | 
						mbag_set_dword(board_data, CW_ITEM_WTP_BOARD_VENDOR, conf_vendor_id);
 | 
				
			||||||
@ -172,7 +172,7 @@ cw_set_msg_end_callback(conn,CW_STATE_CONFIGURE,CW_MSG_CONFIGURATION_STATUS_RESP
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	the_conn->strict_capwap=0;
 | 
						the_conn->strict_capwap=1;
 | 
				
			||||||
	discovery();
 | 
						discovery();
 | 
				
			||||||
	join();
 | 
						join();
 | 
				
			||||||
mavl_destroy(conn->incomming);
 | 
					mavl_destroy(conn->incomming);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user