Some work on WTP.
FossilOrigin-Name: 6ec1370311c5b83dc78adbfb75f8241e0916b171a9c0f939d24ec28ebdf908c8
This commit is contained in:
		| @ -43,7 +43,7 @@ AP = RAD = WTP | ||||
|    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|    |    Radio ID   |   CFG Type    |        Occupancy Limit        | | ||||
|    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|    |    CFP Per    |      CFP Maximum Duration     |     BSS ID    | | ||||
|    |  CFP Period   |      CFP Maximum Duration     |     BSS ID    | | ||||
|    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|    |                            BSS ID                             | | ||||
|    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|  | ||||
| @ -103,10 +103,28 @@ int readelem_cisco_rad_name(struct conn *conn,struct cw_action * a,uint8_t *data | ||||
| #include "capwap/capwap_crypto.h" | ||||
|  | ||||
|  | ||||
| #include "capwap/mbag.h" | ||||
|  | ||||
| int main (int argc, const char * argv[])  | ||||
| { | ||||
|  | ||||
| 	mbag_t data = mbag_create(); | ||||
|  | ||||
| 	mbag_set_byte(data,1,25); | ||||
| 	mbag_set_byte(data,7,125); | ||||
|  | ||||
| 	int b = mbag_get_byte(data,1,255); | ||||
| 	printf("Result: %d\n",b); | ||||
|  | ||||
| 	mbag_del(data,1); | ||||
| 	b = mbag_get_byte(data,1,255); | ||||
| 	printf("Result: %d\n",b); | ||||
|  | ||||
| 	//return 0; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
| 	intavltree_t t = intavltree_create(); | ||||
|  | ||||
| @ -437,7 +437,7 @@ static void wtpman_run(void *arg) | ||||
| 	if (conn->capwap_state == CW_STATE_IMAGE_DATA) { | ||||
| 		/* Image upload */ | ||||
| 		const char *filename = | ||||
| 		    cw_itemstore_get_str(conn->outgoing, CW_ITEM_IMAGE_FILENAME); | ||||
| 		    cw_itemstore_get_str(conn->outgoing, CW_ITEM_IMAGE_FILENAME,NULL); | ||||
| 		if (!filename) { | ||||
| 			cw_log(LOG_ERR, | ||||
| 			       "Can't send image to %s. No Image Filename Item found.", | ||||
| @ -455,7 +455,7 @@ static void wtpman_run(void *arg) | ||||
|  | ||||
|  | ||||
|  | ||||
| 		DEFINE_CLOCK(clk); | ||||
| 		CLOCK_DEFINE(clk); | ||||
| 		cw_clock_start(&clk); | ||||
|  | ||||
| 		cw_item_t *eof = cw_itemstore_set_const_ptr(conn->outgoing, CW_ITEM_IMAGE_FILEHANDLE, | ||||
|  | ||||
| @ -76,6 +76,10 @@ MAVLOBJS= \ | ||||
| 	mavl_del.o \ | ||||
| 	mavl_add.o \ | ||||
| 	mavl_create.o\ | ||||
| 	mavl_get.o\ | ||||
| 	mavl_del_all.o\ | ||||
| 	mavliter_seek.o \ | ||||
| 	mavliter_next.o \ | ||||
| 	utf8.o | ||||
|  | ||||
| #	cw_foreach_msgelem.o \ | ||||
| @ -316,7 +320,12 @@ CWACTION=action.o \ | ||||
| 	capwap_strings_result.o\ | ||||
| 	cw_put_msg.o \ | ||||
| 	capwap_action_helpers.o \ | ||||
| 	cw_put_image_data.o | ||||
| 	cw_put_image_data.o \ | ||||
| 	cisco.o \ | ||||
| 	item_strings.o \ | ||||
| 	mbag.o\ | ||||
| 	radio.o \ | ||||
| 	cw_out_radio_info.o | ||||
|  | ||||
| #	cw_process_msg.o \ | ||||
|  | ||||
|  | ||||
| @ -132,14 +132,14 @@ struct capwap_ctrlhdr | ||||
| //extern int capwap_parse_ctrlhdr(struct capwap_ctrlhdr * ch,uint8_t * msg, int len); | ||||
|  | ||||
| /**  | ||||
|  *@defgroup CAPWAPMessages CAPWAP Messages | ||||
|  *@addtogroup CAPWAPConstants  | ||||
|  *@{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * CAPWAP message types as defined in RFC 5416  | ||||
|  */ | ||||
| typedef enum { | ||||
| enum cw_message_types{ | ||||
|  | ||||
| /**Discovery Request */ | ||||
| CW_MSG_DISCOVERY_REQUEST = 			1, | ||||
| @ -183,7 +183,9 @@ CW_STATION_CONFIGURATION_RESPONSE = 		26, | ||||
|  | ||||
| CW_MSG_MAXMSG	=				26 | ||||
|  | ||||
| }cw_msg_t; | ||||
| }; | ||||
|  | ||||
| //cw_msg_t; | ||||
|  | ||||
| /**@}*/ | ||||
|  | ||||
| @ -590,6 +592,7 @@ extern int cw_readmsg_configuration_update_request(uint8_t * elems, int elems_le | ||||
| #define cw_put_dword lw_put_dword | ||||
| #define cw_put_data lw_put_data | ||||
| #define cw_put_bstr lw_put_bstr | ||||
| #define cw_put_bstr16 lw_put_bstr16 | ||||
|  | ||||
| #define cw_set_dword lw_set_dword | ||||
|  | ||||
| @ -929,6 +932,9 @@ extern struct cw_str capwap_strings_state[]; | ||||
| extern struct cw_str capwap_strings_vendor[]; | ||||
| extern struct cw_str capwap_strings_elem[]; | ||||
| extern struct cw_str capwap_strings_result[]; | ||||
| extern struct cw_str cw_item_strings[]; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id) | ||||
| @ -937,6 +943,8 @@ extern struct cw_str capwap_strings_result[]; | ||||
| #define cw_strvendor(id) cw_strlist_get_str(capwap_strings_vendor,id) | ||||
| #define cw_strresult(id) cw_strlist_get_str(capwap_strings_result,(id)) | ||||
|  | ||||
| #define cw_stritem(id) cw_strlist_get_str(cw_item_strings,(id)) | ||||
|  | ||||
| /* | ||||
| #define cw_strrc(rc) \ | ||||
| 	((rc)<0 ? ((rc)!=EAGAIN ? strerror(errno):"Timed out"): cw_strresult(rc)) | ||||
|  | ||||
| @ -13,10 +13,12 @@ | ||||
| #define CWMSG_80211_WLAN_CONFIGURATION_REQUEST	3398913 | ||||
| #define CWMSG_80211_WLAN_CONFIGURATION_REPONSE	3398914 | ||||
|  | ||||
|  | ||||
|  | ||||
| #define CW_ELEM80211_ADD_WLAN				1024 | ||||
| #define CW_ELEM80211_ANTENNA				1025 | ||||
| /** 802.11 Message Elements */ | ||||
| enum radioelems { | ||||
| 	/** Add WLAN Message element */ | ||||
| 	CW_ELEM80211_ADD_WLAN	=1024, | ||||
| 	/** Antenna Message element */ | ||||
| 	CW_ELEM80211_ANTENNA 	=1025, | ||||
| /* | ||||
|    IEEE 802.11 Assigned WTP BSSID                     1026 | ||||
|    IEEE 802.11 Delete WLAN                            1027 | ||||
| @ -26,8 +28,10 @@ | ||||
|    IEEE 802.11 MIC Countermeasures                    1031 | ||||
|    IEEE 802.11 Multi-Domain Capability                1032 | ||||
|    IEEE 802.11 OFDM Control                           1033 | ||||
|    IEEE 802.11 Rate Set                               1034 | ||||
|    IEEE 802.11 RSNA Error Report From Station         1035 | ||||
| */ | ||||
| 	/** Supported WLAN Rates */ | ||||
| 	CW_ELEM80211_RATE_SET=1034, | ||||
| /*   IEEE 802.11 RSNA Error Report From Station         1035 | ||||
|    IEEE 802.11 Station                                1036 | ||||
|    IEEE 802.11 Station QoS Profile                    1037 | ||||
|    IEEE 802.11 Station Session Key                    1038 | ||||
| @ -42,7 +46,9 @@ | ||||
|    IEEE 802.11 WTP Radio Fail Alarm Indication        1047 | ||||
| */    | ||||
|  | ||||
| #define CW_ELEM80211_WTP_RADIO_INFORMATION		1048 | ||||
| 	/** Radio Information Message Element */ | ||||
| 	CW_ELEM80211_WTP_RADIO_INFORMATION=1048 | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -80,6 +86,7 @@ struct cw_wlan { | ||||
|  | ||||
|  | ||||
|  | ||||
| int cw_out_radio_infos(struct conn *conn, struct cw_action_out *a, uint8_t * dst); | ||||
|  | ||||
|  | ||||
| extern int cw_register_actions_capwap_80211_wtp(struct cw_actiondef *def); | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
|  | ||||
| #include "action.h" | ||||
| #include "capwap_80211_actions.h" | ||||
| #include "capwap_80211.h" | ||||
| #include "capwap.h" | ||||
|  | ||||
|  | ||||
| @ -21,11 +22,20 @@ cw_action_in_t capwap_80211_actions_wtp_in[] = { | ||||
| }; | ||||
|  | ||||
|  | ||||
| cw_action_out_t capwap_80211_actions_wtp_out[]={ | ||||
| 	/* Session ID */ | ||||
| 	{CW_MSG_JOIN_REQUEST, CW_ELEM80211_WTP_RADIO_INFORMATION, 0, | ||||
| 	 CW_ELEM80211_WTP_RADIO_INFORMATION, NULL,cw_out_radio_infos, NULL,1} | ||||
| 	 | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| 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); | ||||
| 	cw_actionlist_out_register_actions(def->out, capwap_80211_actions_wtp_out); | ||||
|  | ||||
| 	int rc; | ||||
| 	rc = cw_strheap_register_strings(def->strelem, capwap_strings_elem80211); | ||||
|  | ||||
| @ -41,7 +41,7 @@ struct cw_item * cw_out_get_session_id(struct conn *conn,struct cw_action_out * | ||||
|  | ||||
| 	int slen; | ||||
| 	if ( conn->capwap_mode == CW_MODE_CISCO){ | ||||
| 		slen=4; | ||||
| 		slen=2; | ||||
| 	} | ||||
| 	else | ||||
| 		slen=16; | ||||
|  | ||||
| @ -91,6 +91,50 @@ cw_action_in_t capwap_actions_wtp_in[] = { | ||||
| 		 | ||||
|  | ||||
|  | ||||
| 	/* ------------------------------------------------------------------------------- */ | ||||
|  | ||||
| 	/* Message Config Status Response IN */ | ||||
| 	{0, 0, CW_STATE_CONFIGURE, CW_MSG_CONFIGURATION_STATUS_RESPONSE, 0, | ||||
| 	 0,0  } | ||||
| 	, | ||||
|  | ||||
| 	{0, 0, CW_STATE_CONFIGURE, CW_MSG_CONFIGURATION_STATUS_RESPONSE, | ||||
| 	 CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD, 0} | ||||
| 	, | ||||
|  | ||||
| 	/* ------------------------------------------------------------------------------- */ | ||||
|  | ||||
| 	/* Message Change State Response IN */ | ||||
| 	{0, 0, CW_STATE_CONFIGURE, CW_MSG_CHANGE_STATE_EVENT_RESPONSE, 0, | ||||
| 	 0,0  } | ||||
| 	, | ||||
|  | ||||
|  | ||||
| 	/* Message Change State Response IN */ | ||||
| 	{0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST,  | ||||
| 	0, 0,0  } | ||||
| 	, | ||||
|  | ||||
| 	/* Element: Vendor Specific */ | ||||
| 	{0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST, | ||||
| 	 CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD, 0} | ||||
| 	, | ||||
|  | ||||
|  | ||||
|  | ||||
| 	/* Echo Response Response IN */ | ||||
| 	{0, 0, CW_STATE_RUN, CW_MSG_ECHO_RESPONSE, 0, | ||||
| 	 0,0  } | ||||
| 	, | ||||
|  | ||||
| 	/* Element: Vendor Specific */ | ||||
| 	{0, 0, CW_STATE_RUN, CW_MSG_ECHO_RESPONSE, | ||||
| 	 CW_ACTION_IN_VENDOR_SPECIFIC_PAYLOAD, 0} | ||||
| 	, | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| 	{0, 0, 0} | ||||
| }; | ||||
|  | ||||
| @ -202,11 +246,33 @@ cw_action_out_t capwap_actions_wtp_out[] = { | ||||
| 	 */ | ||||
| 	{CW_MSG_CONFIGURATION_STATUS_REQUEST, CW_ITEM_NONE} | ||||
| 	, | ||||
| 	/* AC Name */ | ||||
| 	{CW_MSG_CONFIGURATION_STATUS_REQUEST, CW_ITEM_AC_NAME, 0, | ||||
| 	CW_ELEM_AC_NAME, NULL, cw_out_generic, cw_out_get_local,1} | ||||
| 	, | ||||
|  | ||||
|  | ||||
|  | ||||
| 	/* ------------------------------------------------------------------------------- | ||||
| 	 * Configuration Status Request OUT | ||||
| 	 */ | ||||
| 	{CW_MSG_CHANGE_STATE_EVENT_REQUEST, CW_ITEM_NONE} | ||||
| 	, | ||||
|  | ||||
|  | ||||
|  | ||||
| 	/* ------------------------------------------------------------------------------- | ||||
| 	 * Echo Request Request OUT | ||||
| 	 */ | ||||
| 	{CW_MSG_ECHO_REQUEST, CW_ITEM_NONE} | ||||
| 	, | ||||
|  | ||||
| 	/* ------------------------------------------------------------------------------- | ||||
| 	 * Echo Request Request OUT | ||||
| 	 */ | ||||
| 	{CW_MSG_CONFIGURATION_UPDATE_RESPONSE, CW_ITEM_NONE} | ||||
| 	, | ||||
|  | ||||
| 	{0, 0} | ||||
|  | ||||
| }; | ||||
|  | ||||
| @ -63,6 +63,7 @@ | ||||
| #define CW_CISCO_AP_STATIC_IP_ADDR		83 | ||||
|  | ||||
| #define CW_CISCO_AC_NAME_WITH_INDEX		91 | ||||
| #define CW_CISCO_SPAM_DOMAIN_SECRET		96 | ||||
|  | ||||
| #define CW_CISCO_SPAM_VENDOR_SPECIFIC		104 | ||||
|  | ||||
| @ -203,6 +204,8 @@ int cw_in_check_cipwap_join_req(struct conn *conn, struct cw_action_in *a, uint8 | ||||
|  | ||||
|  | ||||
|  | ||||
| int cw_out_cisco_wtp_radio_cfg(struct conn *conn, struct cw_action_out *a, uint8_t * dst); | ||||
|  | ||||
|  | ||||
| /* | ||||
| #define cw_addelem_cisco_rad(dst,acinfo)\ | ||||
| @ -213,6 +216,8 @@ int cw_in_check_cipwap_join_req(struct conn *conn, struct cw_action_in *a, uint8 | ||||
|  | ||||
|  | ||||
| /* cwmsg methods */ | ||||
|  | ||||
| /* | ||||
| #define cwmsg_addelem_cisco_ap_timesync(cwmsg,time,type)\ | ||||
| 	(cwmsg)->pos+=cw_addelem_cisco_ap_timesync(((cwmsg)->msgelems+(cwmsg)->pos),time,type) | ||||
|  | ||||
| @ -234,5 +239,7 @@ int cw_in_check_cipwap_join_req(struct conn *conn, struct cw_action_in *a, uint8 | ||||
| #define cwmsg_addelem_cisco_wtp_radio_cfg(cwmsg,radioinfo)\ | ||||
| 	(cwmsg)->pos+=cw_addelem_cisco_wtp_radio_cfg(((cwmsg)->msgelems+(cwmsg)->pos),radioinfo) | ||||
|  | ||||
| */ | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @ -56,7 +56,11 @@ enum capwap_items { | ||||
| 	CW_ITEM_IMAGE_FILENAME,		/* Full path of image filename */ | ||||
| 	CW_ITEM_DISCOVERIES, | ||||
| 	CW_ITEM_AC_PRIO_LIST,		/* AC Name with Priority list */ | ||||
| 	CW_ITEM_IMAGE_FILEHANDLE	/* FILE handle for uploading and downloading images  */ | ||||
| 	 | ||||
| 	/** FILE handle for uploading and downloading images  */ | ||||
| 	CW_ITEM_IMAGE_FILEHANDLE,	 | ||||
|  | ||||
| 	CW_ITEM_RADIO_CFG | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| @ -21,7 +21,7 @@ struct cw_str capwap_strings_elem[] = { | ||||
| 	{CW_ELEM_DATA_TRANSFER_DATA, "Data Transfer Data"}, | ||||
| 	{CW_ELEM_DATA_TRANSFER_MODE, "Data Transfer Mode"}, | ||||
| 	{CW_ELEM_DECRYPTION_ERROR_REPORT, "Encryption Error Report"}, | ||||
| 	{CW_ELEM_DECRYPTION_ERROR_REPORT_PERIOD, "Encryption Error Report Period"}, | ||||
| 	{CW_ELEM_DECRYPTION_ERROR_REPORT_PERIOD, "Decryption Error Report Period"}, | ||||
| 	{CW_ELEM_DELETE_MAC_ACL_ENTRY, "Delete MAC ACL Entry"}, | ||||
| 	{CW_ELEM_DELETE_STATION, "Delete Station"}, | ||||
| 	{CW_ELEM_RESERVED_19, "Reserved 19"}, | ||||
|  | ||||
| @ -3,9 +3,10 @@ | ||||
|  | ||||
| struct cw_str capwap_strings_elem80211[] = { | ||||
|  | ||||
| 	{CW_ELEM80211_ADD_WLAN, "802.11 Add WLAN"}, | ||||
| 	{CW_ELEM80211_ANTENNA, "802.11 Antenna"}, | ||||
| 	{CW_ELEM80211_RATE_SET, " 802.11 Rate Set"}, | ||||
| 	{CW_ELEM80211_WTP_RADIO_INFORMATION, " 802.11 WTP Radio Information"}, | ||||
| 	{CW_STR_STOP, " Unknown "} | ||||
|  | ||||
|  | ||||
| }; | ||||
| 	 | ||||
|  | ||||
| @ -30,7 +30,7 @@ | ||||
| 	cw_in_generic, 0,		/* start/end callback */	\ | ||||
| 	CW_ITEMTYPE_BSTR, 		/* Type of element */		\ | ||||
| 	CW_ITEM_SESSION_ID,		/* ID to use store */		\ | ||||
| 	4, 16				/* min/max length */ | ||||
| 	2, 16				/* min/max length */ | ||||
|  | ||||
| #define CW_ACTION_IN_CIPWAP_AC_NAME	 	\ | ||||
| 	CW_ELEM_AC_NAME, 		/* Element ID*/			\ | ||||
|  | ||||
| @ -1,12 +1,16 @@ | ||||
|  | ||||
| #include "capwap.h" | ||||
| #include "cipwap.h" | ||||
| #include "capwap_cisco.h" | ||||
|  | ||||
|  | ||||
| struct cw_str cipwap_strings_elem[] = { | ||||
|  | ||||
| 	{CW_ELEM_WTP_IPV4_IP_ADDRESS, "WTP IPv4 IP Address"}, | ||||
| 	{CW_ELEM_WTP_IPV6_IP_ADDRESS, "WTP IPv6 IP Address"}, | ||||
|  | ||||
| 	{CW_CISCO_AP_GROUP_NAME, "WTP Group Name" }, | ||||
|  | ||||
| 	{0,"Unknown Element"} | ||||
| 	 | ||||
| }; | ||||
|  | ||||
| @ -40,6 +40,8 @@ | ||||
| #include "itemstore.h" | ||||
| #include "intavltree.h" | ||||
|  | ||||
| #include "mbag.h" | ||||
|  | ||||
| /** | ||||
|  * Connection Object | ||||
|  */  | ||||
| @ -53,6 +55,8 @@ struct conn { | ||||
| 	cw_itemstore_t remote; | ||||
| 	cw_itemstore_t local; | ||||
|  | ||||
| 	mbag_t radios; | ||||
|  | ||||
| 	/** base_mac */ | ||||
| 	bstr_t base_rmac; | ||||
| 	 | ||||
|  | ||||
| @ -444,9 +444,12 @@ int conn_process_packet(struct conn *conn, uint8_t * packet, int len,struct sock | ||||
| 		/* fragmented, add the packet to fragman */ | ||||
| 		uint8_t *f; | ||||
| 		f = fragman_add(conn->fragman, packet, offs, payloadlen); | ||||
| 		if (f == NULL) | ||||
| 			return 0; | ||||
| 		if (f == NULL){ | ||||
| 			errno=EAGAIN; | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		cw_dbg_pkt(DBG_PKT_IN, conn, f+4, *(uint32_t*)f,from); | ||||
| 		cw_dbg_msg(DBG_MSG_IN, conn, f+4, *(uint32_t*)f,from); | ||||
| 		int rc = process_message(conn, f + 4, *(uint32_t *) f, from); | ||||
|  | ||||
|  | ||||
| @ -105,6 +105,8 @@ const char * cw_cisco_id_to_str(int elem_id) | ||||
| 			return "Antenna Payload"; | ||||
| 		case CW_CISCO_SUPPORTED_RATES: | ||||
| 			return "Supported Rates"; | ||||
| 		case CW_CISCO_SPAM_DOMAIN_SECRET: | ||||
| 			return "SPAM Domain Secret"; | ||||
|  | ||||
|  | ||||
| 		default: | ||||
|  | ||||
| @ -25,9 +25,7 @@ int cw_in_check_img_data_req_ac(struct conn *conn, struct cw_action_in *a, uint8 | ||||
| 		uint32_t vendor_id = vendorstr_get_vendor_id(i->data); | ||||
|  | ||||
| 		const char * image_dir; | ||||
| 		image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR); | ||||
| 		if ( !image_dir )  | ||||
| 			image_dir="./img/"; //XXX | ||||
| 		image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR,"./img"); | ||||
|  | ||||
| 		char * image_filename = malloc(6+vendorstr_len(i->data)+1+strlen(image_dir)); | ||||
| 		if (!image_filename)  | ||||
|  | ||||
| @ -36,9 +36,7 @@ int cw_in_check_img_data_req_wtp(struct conn *conn, struct cw_action_in *a, uint | ||||
| 		uint32_t vendor_id = vendorstr_get_vendor_id(i->data); | ||||
|  | ||||
| 		const char * image_dir; | ||||
| 		image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR); | ||||
| 		if ( !image_dir )  | ||||
| 			image_dir="./img/"; //XXX | ||||
| 		image_dir = cw_itemstore_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR,"./img"); | ||||
|  | ||||
| 		char * image_filename = malloc(6+vendorstr_len(i->data)+1+strlen(image_dir)); | ||||
| 		if (!image_filename)  | ||||
|  | ||||
| @ -21,6 +21,8 @@ int cw_put_item(uint8_t * dst, struct cw_item *item) | ||||
| 			return cw_put_dword(dst, item->dword); | ||||
| 		case CW_ITEMTYPE_BSTR: | ||||
| 			return cw_put_bstr(dst, item->data); | ||||
| 		case CW_ITEMTYPE_BSTR16: | ||||
| 			return cw_put_bstr16(dst,item->data); | ||||
| 		case CW_ITEMTYPE_VENDORSTR: | ||||
| 		{ | ||||
| 			int l=0; | ||||
| @ -54,15 +56,21 @@ int cw_out_generic(struct conn *conn, struct cw_action_out *a, uint8_t * dst)	// | ||||
|  | ||||
| 	int len; | ||||
| 	if (!item) { | ||||
| 		const char *vendor=""; | ||||
| 		if ( a->vendor_id ) { | ||||
| 			vendor=cw_strvendor(a->vendor_id); | ||||
| 		} | ||||
| 		if (a->mand) { | ||||
| 			cw_log(LOG_ERR, | ||||
| 			       "Can't put mandatory element %d - (%s) into %s. No value found.", | ||||
| 			       "Can't put mandatory element %s%d - (%s) into %s. No value found.", | ||||
| 				vendor, | ||||
| 			       a->elem_id, cw_strelemp(conn->actions, a->elem_id) | ||||
| 			       , cw_strmsg(a->msg_id) | ||||
| 			    ); | ||||
| 		} | ||||
| 		else{ | ||||
| 			cw_dbg(DBG_WARN,"No output for element %d -(%s) in %s. Item %d not found.", | ||||
| 			cw_dbg(DBG_WARN,"No output for element %s%d -(%s) in %s. Item %d not found.", | ||||
| 				vendor, | ||||
| 			       a->elem_id, cw_strelemp(conn->actions, a->elem_id) | ||||
| 			       , cw_strmsg(a->msg_id),a->item_id); | ||||
|  | ||||
|  | ||||
| @ -32,16 +32,24 @@ int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * | ||||
| 	uint8_t *d = dst+4; | ||||
|  | ||||
| 	d+=cw_put_byte(d,2);	//max radios | ||||
| 	d+=cw_put_byte(d,0);	//radios in use | ||||
| 	d+=cw_put_byte(d,2);	//radios in use | ||||
| 	d+=cw_put_encryption_subelems(d); | ||||
|  | ||||
| 	cw_item_t * i; | ||||
| 	i = cw_itemstore_get(conn->outgoing,CW_ITEM_WTP_HARDWARE_VERSION); | ||||
| 	i = cw_itemstore_get(conn->local,CW_ITEM_WTP_HARDWARE_VERSION); | ||||
| 	if ( i ) {	 | ||||
| 	 	d += cw_put_version(d,CW_SUBELEM_WTP_HARDWARE_VERSION,i->data); | ||||
| 	} | ||||
| 	else { | ||||
| 		cw_log(LOG_ERR, "Can't send hard version in WTP descriptor, not set."); | ||||
| 		cw_log(LOG_ERR, "Can't send Hardware Version in WTP Descriptor, not set."); | ||||
| 	} | ||||
|  | ||||
| 	i = cw_itemstore_get(conn->local,CW_ITEM_WTP_SOFTWARE_VERSION); | ||||
| 	if ( i ) {	 | ||||
| 	 	d += cw_put_version(d,CW_SUBELEM_WTP_SOFTWARE_VERSION,i->data); | ||||
| 	} | ||||
| 	else { | ||||
| 		cw_log(LOG_ERR, "Can't send Software Version in WTP descriptor, not set."); | ||||
| 	} | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -495,5 +495,45 @@ void cw_dbg_colored(int level, const char *file, int line, const char *format, . | ||||
|  | ||||
| } | ||||
|  | ||||
| int cw_is_utf8(unsigned char *str, size_t len); | ||||
|  | ||||
|  | ||||
| int cw_format_item(char *dst,cw_item_t * item) | ||||
| { | ||||
| 	*dst=0; | ||||
| 	switch (item->type) { | ||||
| 		case CW_ITEMTYPE_BSTR16: | ||||
| 			strncpy(dst,bstr16_data(item->data),bstr16_len(item->data)); | ||||
| 			*(dst+bstr16_len(item->data))=0; | ||||
| 			return bstr16_len(item->data); | ||||
|  | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void dbg_istore_dmp(cw_itemstore_t s) | ||||
| { | ||||
| 	DEFINE_AVLITER(it,s); | ||||
| 	avliter_foreach(&it) { | ||||
|  | ||||
| 		cw_item_t *i = avliter_get(&it); | ||||
|  | ||||
| 		char buffer[1000]; | ||||
|  | ||||
| 		struct cw_str * strings = cw_item_strings; | ||||
| 		 | ||||
| 		const char * in = cw_strlist_get_str(strings,i->id); | ||||
| 		 | ||||
| 		cw_format_item(buffer,i); | ||||
| 		printf("Item ID %d-%s: %s\n",i->id,in,buffer); | ||||
| 				 | ||||
|  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /**@}*/ | ||||
|  | ||||
|  | ||||
| @ -88,15 +88,17 @@ int cw_itemstore_set_bstr16n(cw_itemstore_t s, uint32_t id, uint8_t * data, int | ||||
| extern int cw_itemstore_set_data(cw_itemstore_t s, uint32_t id, const uint8_t * data, | ||||
| 				 int len); | ||||
|  | ||||
| static inline char *cw_itemstore_get_str(cw_itemstore_t s, uint32_t id) | ||||
| static inline char *cw_itemstore_get_str(cw_itemstore_t s, uint32_t id, char *def) | ||||
| { | ||||
| 	struct cw_item *i = cw_itemstore_get(s, id); | ||||
| 	if (!i) | ||||
| 		return NULL; | ||||
| 		return def; | ||||
| 	return i->data; | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| static inline struct avltree *cw_itemstore_get_avltree(cw_itemstore_t s, uint32_t id) | ||||
| { | ||||
| 	struct cw_item *i = cw_itemstore_get(s, id); | ||||
| @ -139,5 +141,34 @@ int cw_itemstore_set(cw_itemstore_t itemstore, uint32_t item_id, int item_type, | ||||
| struct cw_item *cw_item_create(cw_itemstore_t s, uint32_t id); | ||||
|  | ||||
|  | ||||
| static inline void * cw_istore_get_data(cw_itemstore_t s,int id,void *def) | ||||
| { | ||||
| 	struct cw_item *i = cw_itemstore_get(s, id); | ||||
| 	if (!i) | ||||
| 		return def; | ||||
| 	return i->data; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| static inline uint8_t cw_istore_get_byte(cw_itemstore_t s, uint32_t id, uint8_t def) | ||||
| { | ||||
| 	struct cw_item *i = cw_itemstore_get(s, id); | ||||
| 	if (!i) | ||||
| 		return def; | ||||
| 	return i->byte; | ||||
| } | ||||
|  | ||||
| static inline uint16_t cw_istore_get_word(cw_itemstore_t s, uint32_t id, uint8_t def) | ||||
| { | ||||
| 	struct cw_item *i = cw_itemstore_get(s, id); | ||||
| 	if (!i) | ||||
| 		return def; | ||||
| 	return i->word; | ||||
| } | ||||
|  | ||||
| #define cw_istore_get_bstr(s,id,def) cw_istore_get_data(s,id,def) | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @ -226,6 +226,13 @@ static inline int lw_put_bstr(uint8_t * dst, const bstr_t b){ | ||||
| 	return bstr_len(b); | ||||
| } | ||||
|  | ||||
| static inline int lw_put_bstr16(uint8_t * dst, const bstr16_t b){ | ||||
| 	lw_put_data(dst,bstr16_data(b),bstr16_len(b)); | ||||
| 	return bstr16_len(b); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| static inline int lw_put_str(uint8_t*dst,const uint8_t *str) { | ||||
| 	return lw_put_data(dst,str,strlen((char*)str)); | ||||
| } | ||||
|  | ||||
| @ -21,8 +21,15 @@ | ||||
|  * @brief Yet another avl tree implementation! | ||||
|  */ | ||||
|  | ||||
| #ifndef __AVLTREE_H | ||||
| #define __AVLTREE_H | ||||
|  | ||||
| /**  | ||||
|  * @defgroup MavlFunctions MAVL Functions | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __MAVL_H | ||||
| #define __MAVL_H | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| @ -34,7 +41,7 @@ | ||||
|     The number of nodes is calculated by 2^depth. | ||||
|     So a value of 32 should be enough for around 4  | ||||
|     billion nodes. */ | ||||
| #define AVLTREE_MAX_DEPTH	32 | ||||
| #define MAVL_MAX_DEPTH	32 | ||||
|  | ||||
| /** | ||||
|  * Defines the structure of an AVL Node. | ||||
| @ -50,12 +57,19 @@ struct mavlnode { | ||||
|  * AVL Tree | ||||
|  */  | ||||
| struct mavl { | ||||
| 	/** Pointer to root node */ | ||||
| 	struct mavlnode *root; | ||||
| 	/** Compare function */ | ||||
| 	int (*cmp) (const void *, const void *); | ||||
| 	/** Delete element function */ | ||||
| 	void (*del) (void *); | ||||
| 	/** Number of elements currently stored in the tree */ | ||||
| 	int count; | ||||
| }; | ||||
|  | ||||
| /**  | ||||
|  * MAVL AVL Tree type | ||||
|  */  | ||||
| typedef struct mavl * mavl_t; | ||||
|  | ||||
|  | ||||
| @ -64,6 +78,7 @@ typedef struct mavl * mavl_t; | ||||
| struct mavl *mavl_create(int (*cmp) (const void *, const void *), | ||||
| 			       void (*del) (void *)); | ||||
| //void mavl_destroy(struct mavl *t); | ||||
| void mavlnode_destroy(struct mavl *t, struct mavlnode *n); | ||||
|  | ||||
| void mavl_del_all(struct mavl *t); | ||||
| void *mavl_del(struct mavl *t, void *data); | ||||
| @ -120,7 +135,7 @@ static inline void mavl_destroy(struct mavl *t) | ||||
|  | ||||
|  | ||||
| struct mavliter{ | ||||
| 	struct mavlnode *stack[AVLTREE_MAX_DEPTH*2]; | ||||
| 	struct mavlnode *stack[MAVL_MAX_DEPTH*2]; | ||||
|  | ||||
| 	struct mavlnode *cur; | ||||
| 	int stack_ptr; | ||||
| @ -171,11 +186,17 @@ static inline void * mavliter_get(mavliter_t *i){ | ||||
|  | ||||
| extern void * mavliter_seek(mavliter_t *i,void *d); | ||||
|  | ||||
|  | ||||
| #define DEFINE_MAVLITER(i,t)\ | ||||
| /**  | ||||
|  * Define a AVL Iterator Varialble and acciciate it with  | ||||
|  * an AVL Tree. | ||||
|  * @param i Name of Variable to define | ||||
|  * @param t #mavl_t Tree to associate. | ||||
|  */  | ||||
| #define MAVLITER_DEFINE(i,t)\ | ||||
| 	mavliter_t i; mavliter_init(&i,t) | ||||
|  | ||||
|  | ||||
|  | ||||
| #define mavliter_foreach(i)\ | ||||
| 	for (mavliter_seek_set(i); NULL != mavliter_get(i); mavliter_next(i)) | ||||
|  | ||||
| @ -186,6 +207,7 @@ extern void * mavliter_seek(mavliter_t *i,void *d); | ||||
| 	while(NULL != (val = mavliter_next(iter))) | ||||
|  | ||||
| 	 | ||||
| /** @} */ | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #include "mavl.h" | ||||
|  | ||||
| static void mavlnode_destroy(struct mavl *t, struct mavlnode *n) | ||||
| void mavlnode_destroy(struct mavl *t, struct mavlnode *n) | ||||
| { | ||||
| 	if (t->del) { | ||||
| 		t->del(n->data); | ||||
|  | ||||
| @ -31,7 +31,7 @@ | ||||
|  */  | ||||
| void * mavl_get(struct mavl *t ,void *data) | ||||
| { | ||||
| 	struct avlnode *n = t->root; | ||||
| 	struct mavlnode *n = t->root; | ||||
| 	while(n){ | ||||
| 		int rc=t->cmp(data,n->data); | ||||
| 		if (rc==0) | ||||
|  | ||||
| @ -28,6 +28,12 @@ | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| /**  | ||||
|  * CAPWAP timer type, used in #cw_timer_start and #cw_timer_timeout. | ||||
|  */ | ||||
| typedef time_t cw_timer_t; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Start a timer. | ||||
|  * @param t number of seconds until the timer expires | ||||
| @ -55,7 +61,7 @@ | ||||
|  *  | ||||
|  * @param c name of the variable | ||||
|  */  | ||||
| #define DEFINE_CLOCK(c)\ | ||||
| #define CLOCK_DEFINE(c)\ | ||||
| 	struct timeval c;  | ||||
|  | ||||
| /** | ||||
|  | ||||
| @ -95,6 +95,7 @@ OBJS += join.o | ||||
| OBJS += run.o | ||||
| OBJS += sulking.o | ||||
| OBJS += configure.o | ||||
| OBJS += changestate.o | ||||
| OBJS += $(CONFOBJS) | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
| #include "jsmn.h" | ||||
| #include "wtp.h" | ||||
| #include "capwap/bstr.h" | ||||
| #include "capwap/radio.h" | ||||
|  | ||||
| struct cw_itemdef { | ||||
| 	int item_id; | ||||
| @ -95,6 +96,41 @@ printf("GET BYTE\n"); | ||||
| } | ||||
|  | ||||
|  | ||||
| int vendorstr_local(struct cw_itemdef *idef,char *js, jsmntok_t *t) | ||||
| { | ||||
| 	int item_id = idef->item_id; | ||||
| 	struct conn * conn = get_conn(); | ||||
|  | ||||
| 	*(js+t->end)=0; | ||||
| 	char *str = js+t->start; | ||||
| 	if (t->type != JSMN_ARRAY || t->type!=2){ | ||||
| 		printf("Error: No ARRAY or to short: %s\n",str); | ||||
| 		exit(1); | ||||
| 			 | ||||
| 	} | ||||
| //	*(js+t->end)=0; | ||||
|  | ||||
| 	char * val = js+(t+1)->start; | ||||
| 	*(js+(t+1)->end)=0; | ||||
| 	printf("Val: %s\n",val); | ||||
|  | ||||
| 	uint32_t vendor_id = atoi(val); | ||||
|  | ||||
| 	str = (uint8_t*)js+(t+2)->start; | ||||
|  | ||||
| 	*((t+2)->end+js)=0; | ||||
| 	bstr16_t v = bstr16cfgstr(str); | ||||
|  | ||||
| printf("Vendor: %d %s\n",vendor_id,str); | ||||
| 	 | ||||
| 	cw_itemstore_set_vendorstr(conn->local,item_id,vendor_id,bstr16_data(v),bstr16_len(v)); | ||||
| 	free(v); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -116,6 +152,31 @@ int bstr16_local(struct cw_itemdef *idef,char *js, jsmntok_t *t) | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int bstr_local(struct cw_itemdef *idef,char *js, jsmntok_t *t) | ||||
| { | ||||
| 	int item_id = idef->item_id; | ||||
| 	struct conn * conn = get_conn(); | ||||
|  | ||||
| 	*(js+t->end)=0; | ||||
| 	char *str = js+t->start; | ||||
| 	if (t->type != JSMN_STRING){ | ||||
| 		printf("Error: No Str: %s\n",str); | ||||
| 		return 1; | ||||
| 			 | ||||
| 	} | ||||
| //	*(js+t->end)=0; | ||||
| 	printf("Set str: %d %s\n", item_id,str); | ||||
|  | ||||
| 	bstr16_t v = bstr16cfgstr(str); | ||||
|  | ||||
| 	cw_itemstore_set_bstrn(conn->local,item_id,bstr16_data(v),bstr16_len(v)); //(uint8_t*)js+t->start,t->end-t->start); | ||||
| 	free (v); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int wtp_board_data_local(struct cw_itemdef *idef,char *js, jsmntok_t *t); | ||||
|  | ||||
|  | ||||
| @ -123,13 +184,17 @@ int wtp_board_data_local(struct cw_itemdef *idef,char *js, jsmntok_t *t); | ||||
|  | ||||
|  | ||||
| struct cw_itemdef general_cfg[] = { | ||||
| 	{CW_ITEM_WTP_HARDWARE_VERSION, "hardware_version",bstr16_local},  | ||||
| 	{CW_ITEM_WTP_SOFTWARE_VERSION, "software_version",bstr16_local},  | ||||
| 	{CW_ITEM_AC_NAME, "ac_name",bstr16_local},  | ||||
| 	{CW_ITEM_WTP_NAME, "wtp_name",bstr16_local},  | ||||
| 	{CW_ITEM_WTP_HARDWARE_VERSION, "hardware_version",vendorstr_local},  | ||||
| 	{CW_ITEM_WTP_SOFTWARE_VERSION, "software_version",vendorstr_local},  | ||||
| 	{CW_ITEM_WTP_BOARD_MODELNO, "modelno",bstr16_local},  | ||||
| 	{CW_ITEM_WTP_BOARD_DATA,"wtp_board_data",wtp_board_data_local}, | ||||
| 	{CW_ITEM_WTP_FRAME_TUNNEL_MODE,"frame_tunnel_mode",byte_local}, | ||||
| 	{CW_ITEM_WTP_MAC_TYPE,"mac_type",byte_local}, | ||||
| 	{CW_ITEM_LOCATION_DATA,"location_data",bstr16_local}, | ||||
| 	{CW_ITEM_WTP_GROUP_NAME,"group_name",bstr16_local}, | ||||
| 	{CW_RADIO_BSSID,"bssid",bstr_local}, | ||||
|  | ||||
| 	{0, 0, 0} | ||||
| }; | ||||
| @ -289,8 +354,9 @@ int setup_conf(struct conn *conn) | ||||
|  | ||||
|  | ||||
|  | ||||
| void dbg_istore_dmp(cw_itemstore_t s); | ||||
|  | ||||
|  | ||||
| dbg_istore_dmp(conn->local); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -2,22 +2,27 @@ | ||||
|  | ||||
|  | ||||
| 	"dbg":[o1,o2,o3], | ||||
| 	"Tube" :   "tabbe", | ||||
|  | ||||
| 	"hardware_version": "12345", | ||||
| 	"software_version": "98765", | ||||
| 	"hardware_version": ["4232704",".x01000000"], | ||||
| 	"software_version": ["4232704",".x08006E00"], | ||||
|  | ||||
| 	"comment": "** The following is debug info **", | ||||
| 	"location_data": "Berlin", | ||||
| 	"location_data": "China", | ||||
|  | ||||
| 	"frame_tunnel_mode": "4", | ||||
| 	"mac_type": 2, | ||||
|  | ||||
| 	"group_name" : "XGroup", | ||||
|  | ||||
| 	"wtp_name" : "TubeWTP", | ||||
| 	"ac_name" : "LAC_AC", | ||||
|  | ||||
| 	"bssid": ".x003a9902fac0", | ||||
|  | ||||
| 	"wtp_board_data" : { | ||||
| 		"vendor_id": 4232704, | ||||
| 		"model_no": "Moodle", | ||||
| 		"serial_no": "2045", | ||||
| 		"vendor_id": "4232704", | ||||
| 		"model_no": "AIR-LAP1131AG-E-K9", | ||||
| 		"serial_no": "2045" | ||||
| 	}, | ||||
|  | ||||
|  | ||||
| @ -36,6 +41,12 @@ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	"radios": { | ||||
| 		"1": { | ||||
| 			"domain" | ||||
| 			 | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| }  | ||||
|  | ||||
|  | ||||
| @ -1,4 +1,3 @@ | ||||
| #include <stdlib.h> //Tube | ||||
|  | ||||
| #include "capwap/capwap.h" | ||||
| #include "capwap/conn.h" | ||||
|  | ||||
| @ -64,7 +64,7 @@ cw_aciplist_t cw_select_ac(struct conn *conn, cw_itemstore_t dis) | ||||
| 	avliter_foreach(&i){ | ||||
| 		cw_itemstore_t ac = ((cw_item_t *) (avliter_get(&i)))->data; | ||||
|  | ||||
| 		char *ac_name = cw_itemstore_get_str(ac, CW_ITEM_AC_NAME); | ||||
| 		char *ac_name = cw_itemstore_get_str(ac, CW_ITEM_AC_NAME,NULL); | ||||
|  | ||||
| 		int prio = 256; | ||||
| 		if (ac_name) { | ||||
|  | ||||
| @ -14,6 +14,80 @@ | ||||
|  | ||||
| #include "wtp_conf.h" | ||||
|  | ||||
|  | ||||
| #include "capwap/timer.h" | ||||
|  | ||||
|  | ||||
|  | ||||
| #include "capwap/capwap.h" | ||||
| #include "capwap/conn.h" | ||||
| #include "wtp_interface.h" | ||||
|  | ||||
|  | ||||
| int run() | ||||
| { | ||||
|  | ||||
|  | ||||
|  | ||||
| 	struct conn *conn = get_conn(); | ||||
| 	conn->capwap_state = CW_STATE_RUN; | ||||
|  | ||||
| 	do { | ||||
| 		time_t timer = cw_timer_start(25); | ||||
| 		int rc; | ||||
|  | ||||
| 		 | ||||
|  | ||||
|  | ||||
| 		while (!cw_timer_timeout(timer) && conn->capwap_state == CW_STATE_RUN) { | ||||
| 			rc = cw_read_messages(conn); | ||||
| 			if (rc < 0 && errno == EAGAIN) { | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			if ( !cw_rcok(rc)) | ||||
| 				break; | ||||
|  | ||||
| 		} | ||||
| 		if (rc<0 && errno == EAGAIN){ | ||||
| 			rc = cw_send_request(conn,CW_MSG_ECHO_REQUEST); | ||||
| 		 | ||||
| 			if (!cw_rcok(rc)) { | ||||
| 				cw_log(LOG_ERR,"Error in run state: %d %s",rc,cw_strrc(rc)); | ||||
| 				break; | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		if (!cw_rcok(rc)) { | ||||
| 			cw_log(LOG_ERR,"Error in run state: %d %s",rc,cw_strrc(rc)); | ||||
| 			break; | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
|  | ||||
|  | ||||
| 	} while (conn->capwap_state == CW_STATE_RUN); | ||||
|  | ||||
|  | ||||
|  | ||||
| //      int rc = cw_send_request(conn,CW_MSG_CHANGE_STATE_EVENT_REQUEST); | ||||
|  | ||||
| //      if ( !cw_rcok(rc) ) { | ||||
| //              cw_strresult(rc); | ||||
| //      } | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
| static int echo_interval_timer; | ||||
|  | ||||
|  | ||||
| @ -10,6 +10,8 @@ | ||||
| #include "capwap/log.h" | ||||
| #include "capwap/dtls.h" | ||||
| #include "capwap/acpriolist.h" | ||||
| #include "capwap/capwap_80211.h" | ||||
| #include "capwap/radio.h" | ||||
|  | ||||
| #include "wtp.h" | ||||
| #include "wtp_conf.h" | ||||
| @ -63,8 +65,26 @@ int main() | ||||
| 	the_conn = conn_create_noq(-1, NULL); | ||||
| 	struct conn *conn = the_conn; | ||||
|  | ||||
| 	conn->radios = mbag_create(); | ||||
| 	mbag_set_mbag(conn->radios,0,mbag_create()); | ||||
| 	mbag_set_mbag(conn->radios,1,mbag_create()); | ||||
| //	mbag_set_mbag(conn->radios,0xff,mbag_create()); | ||||
| 	 | ||||
|  | ||||
| 	mbag_t r; | ||||
| 	r  = mbag_get_mbag(conn->radios,0,NULL); | ||||
| 	mbag_set_dword(r,CW_RADIO_TYPE,1); | ||||
| 	r  = mbag_get_mbag(conn->radios,1,NULL); | ||||
| 	mbag_set_dword(r,CW_RADIO_TYPE,2); | ||||
| //	r  = mbag_get_mbag(conn->radios,1,NULL); | ||||
| //	mbag_set_dword(r,CW_RADIO_TYPE,1); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| 	cw_register_actions_cipwap_wtp(&capwap_actions); | ||||
| 	cw_register_actions_capwap_80211_wtp(&capwap_actions); | ||||
|  | ||||
| 	////cw_register_actions_capwap_80211_wtp(&capwap_actions); | ||||
|  | ||||
| 	conn->actions = &capwap_actions; | ||||
| @ -101,7 +121,7 @@ int main() | ||||
| 	cw_itemstore_set_avltree(conn->local,CW_ITEM_AC_PRIO_LIST,acprios); | ||||
|  | ||||
| 	cw_itemstore_set_str(conn->local,CW_ITEM_LOCATION_DATA,"Berlin"); | ||||
| 	cw_itemstore_set_str(conn->local,CW_ITEM_WTP_NAME,"WTP Tube"); | ||||
| //	cw_itemstore_set_str(conn->local,CW_ITEM_WTP_NAME,"WTP Tube"); | ||||
|  | ||||
| 	cw_itemstore_set_byte(conn->local,CW_ITEM_WTP_MAC_TYPE,0); | ||||
| 	cw_itemstore_set_byte(conn->local,CW_ITEM_WTP_FRAME_TUNNEL_MODE,0); | ||||
| @ -111,6 +131,9 @@ int main() | ||||
| 	discovery(); | ||||
| 	join(); | ||||
| 	configure(); | ||||
| 	changestate(); | ||||
| 	run(); | ||||
|  | ||||
| 	//image_update(); | ||||
|  | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user