Compare commits
	
		
			7 Commits
		
	
	
		
			b292b88d49
			...
			cisco
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5423709dda | |||
| e974b3ae2d | |||
| 07257f51fe | |||
| dec1cf2003 | |||
| 40427b3816 | |||
| 435b3f823e | |||
| ae686f4634 | 
| @ -9,7 +9,7 @@ OBJS = \ | |||||||
| 	discovery_cache.o\ | 	discovery_cache.o\ | ||||||
| 	rpc.o\ | 	rpc.o\ | ||||||
| 	statemachine.o\ | 	statemachine.o\ | ||||||
| 	hapd.o | 	#hapd.o | ||||||
|  |  | ||||||
| ACTOBJS = \ | ACTOBJS = \ | ||||||
| 	act.o  | 	act.o  | ||||||
| @ -27,7 +27,6 @@ LIBS+=-lnettle | |||||||
| LIBS+=-lssl | LIBS+=-lssl | ||||||
| LIBS+=-lcrypto | LIBS+=-lcrypto | ||||||
| LIBS+=-ledit | LIBS+=-ledit | ||||||
| LIBS+=-lwifi |  | ||||||
| #LIBS+=-l:libhapd.a | #LIBS+=-l:libhapd.a | ||||||
|  |  | ||||||
| INCL_DIRS=-I../ -I/usr/local/include -I./ -I../../include -I../../include/hostapd -I../../include/hostapd/utils | INCL_DIRS=-I../ -I/usr/local/include -I./ -I../../include -I../../include/hostapd -I../../include/hostapd/utils | ||||||
|  | |||||||
| @ -237,7 +237,7 @@ int main (int argc, char *argv[]) | |||||||
| 		goto errX; | 		goto errX; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| hapd_run(); // init | //hapd_run(); // init | ||||||
| //stop(); | //stop(); | ||||||
| //const char *ttt = cw_cfg_get(global_cfg,"cisco/ssl-cipher",NULL); | //const char *ttt = cw_cfg_get(global_cfg,"cisco/ssl-cipher",NULL); | ||||||
| //printf("CFG: %s\n",ttt); | //printf("CFG: %s\n",ttt); | ||||||
|  | |||||||
| @ -169,7 +169,6 @@ int dataman_process_keep_alive(struct cw_Conn *nc, uint8_t *rawmsg, int len) | |||||||
| 	return -1;	 | 	return -1;	 | ||||||
| } | } | ||||||
|  |  | ||||||
| #include <libwifi.h> |  | ||||||
|  |  | ||||||
| int dataman_process_message0(struct cw_Conn *nc, uint8_t * rawmsg, int len, | int dataman_process_message0(struct cw_Conn *nc, uint8_t * rawmsg, int len, | ||||||
| 			struct sockaddr *from) | 			struct sockaddr *from) | ||||||
| @ -192,13 +191,10 @@ int dataman_process_message0(struct cw_Conn *nc, uint8_t * rawmsg, int len, | |||||||
| //	ppacket (dot11frame,len-cw_get_hdr_msg_offset(rawmsg)); | //	ppacket (dot11frame,len-cw_get_hdr_msg_offset(rawmsg)); | ||||||
|  |  | ||||||
|  |  | ||||||
| 	struct libwifi_frame frame = {0}; |  | ||||||
| 	struct libwifi_frame resp={0}; |  | ||||||
|  |  | ||||||
| //	cw_dbg(DBG_X,"802.11 - %s",dot11_get_frame_name(dot11frame)); | //	cw_dbg(DBG_X,"802.11 - %s",dot11_get_frame_name(dot11frame)); | ||||||
| //	cw_dbg(DBG_X,"802.11 - T&S: %d %d",dot11_get_type(dot11frame),dot11_get_subtype(dot11frame)); | //	cw_dbg(DBG_X,"802.11 - T&S: %d %d",dot11_get_type(dot11frame),dot11_get_subtype(dot11frame)); | ||||||
|  |  | ||||||
| 	rc = libwifi_get_wifi_frame(&frame, (unsigned char*)(dot11frame+1), dot11len-1, 0); |  | ||||||
|  |  | ||||||
| //	cw_dbg(DBG_X,"Frame CTL:%d,%d",frame.frame_control.type, frame.frame_control.subtype); | //	cw_dbg(DBG_X,"Frame CTL:%d,%d",frame.frame_control.type, frame.frame_control.subtype); | ||||||
|  |  | ||||||
| @ -213,22 +209,6 @@ int dataman_process_message0(struct cw_Conn *nc, uint8_t * rawmsg, int len, | |||||||
| // | // | ||||||
| // | // | ||||||
|  |  | ||||||
| 	if (frame.frame_control.type == TYPE_MANAGEMENT && |  | ||||||
| 		frame.frame_control.subtype == SUBTYPE_ASSOC_REQ){ |  | ||||||
| //		cw_dbg(DBG_X,"ASSOC REQ RECEIVED"); |  | ||||||
| /*		libwifi_create_assoc_resp(&resp, |  | ||||||
| 				frame.frame_control.transmitter, |  | ||||||
| 				frame.frame_control.receiver, |  | ||||||
| 				frame.frame_control.transmitter, |  | ||||||
| 				1 |  | ||||||
| 				);*/ |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //		stop(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -266,7 +246,7 @@ int dataman_process_message(struct cw_Conn *nc, uint8_t * rawmsg, int len, | |||||||
|  |  | ||||||
| 	extern void ppacket(uint8_t * p, int len); | 	extern void ppacket(uint8_t * p, int len); | ||||||
|  |  | ||||||
| 	ppacket (rawmsg,len); | //	ppacket (rawmsg,len); | ||||||
|  |  | ||||||
| 	cw_dbg(DBG_X,"There was someting else than dataman"); | 	cw_dbg(DBG_X,"There was someting else than dataman"); | ||||||
|  |  | ||||||
|  | |||||||
| @ -317,19 +317,51 @@ int run_update(struct wtpman *wtpman) | |||||||
| static int dataman_process_msg(struct cw_Conn *nc, uint8_t * rawmsg, int len, | static int dataman_process_msg(struct cw_Conn *nc, uint8_t * rawmsg, int len, | ||||||
| 			struct sockaddr *from) | 			struct sockaddr *from) | ||||||
| { | { | ||||||
|  | 	char rframe[1000]; | ||||||
| 	int offs =  cw_get_hdr_msg_offset(rawmsg); | 	int offs =  cw_get_hdr_msg_offset(rawmsg); | ||||||
| 	uint8_t * dot11frame = rawmsg + offs; | 	uint8_t * frame = rawmsg + offs; | ||||||
| 	int dot11len = len-offs; | 	int frame_len = len-offs; | ||||||
| 	cw_dbg_dot11_frame(dot11frame,dot11len); | 	cw_dbg_dot11_frame(frame,frame_len); | ||||||
|  |  | ||||||
| 	char frame[1000]; | /*	dot11_init_assoc_resp(frame); | ||||||
| 	dot11_init_assoc_resp(frame); |  | ||||||
|  |  | ||||||
| 	dot11_copy_mac(dot11_get_sa(dot11frame),dot11_get_da(frame)); | 	dot11_copy_mac(dot11_get_sa(dot11frame),dot11_get_da(frame)); | ||||||
| 	dot11_copy_mac(dot11_get_bssid(dot11frame),dot11_get_bssid(frame)); | 	dot11_copy_mac(dot11_get_bssid(dot11frame),dot11_get_bssid(frame)); | ||||||
| 	dot11_copy_mac(dot11_get_da(dot11frame),dot11_get_sa(frame)); | 	dot11_copy_mac(dot11_get_da(dot11frame),dot11_get_sa(frame)); | ||||||
| 	dot11_set_seq(frame,0); | 	dot11_set_seq(frame,0); | ||||||
|  | */ | ||||||
|  | 	if ( dot11_get_type_and_subtype(frame) == DOT11_ASSOC_REQ){ | ||||||
|  | 		int l; | ||||||
|  | 		uint8_t rates[] = { | ||||||
|  | 			12,0x82,0x84,0x8b,0x96,0x0c,0x12,0x18,0x24,0x30,0x48,0x60,0x6c	 | ||||||
|  | 		};  | ||||||
|  | 		cw_dbg(DBG_X, "there is an assoc request!"); | ||||||
|  |  | ||||||
|  | 		uint8_t  rframe[1000]; | ||||||
|  | 		nc->mtu=800; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         	dot11_init_assoc_resp(rframe); | ||||||
|  | 		dot11_set_duration(rframe,100); | ||||||
|  |  | ||||||
|  | 		dot11_copy_mac(dot11_get_sa(frame),dot11_get_da(rframe)); | ||||||
|  | 		dot11_copy_mac(dot11_get_bssid(frame),dot11_get_bssid(rframe)); | ||||||
|  | 		dot11_copy_mac(dot11_get_da(frame),dot11_get_sa(rframe)); | ||||||
|  | 		dot11_set_seq(rframe,dot11_get_seq(frame)); | ||||||
|  | 		dot11_assoc_resp_set_cap(rframe,dot11_assoc_req_get_cap(frame)); | ||||||
|  | 		dot11_assoc_resp_set_status_code(rframe,0); | ||||||
|  | 		dot11_assoc_resp_set_assoc_id(rframe,17); | ||||||
|  | 		l=24+6; | ||||||
|  | 		l+=dot11_put_supported_rates(rframe+l,rates); | ||||||
|  | 		cw_dbg_dot11_frame(rframe,l); | ||||||
|  |  | ||||||
|  | 		uint8_t buf[1024]; | ||||||
|  | 		int hlen; | ||||||
|  | 		hlen = cw_init_capwap_packet(buf,1,0,NULL,NULL); | ||||||
|  | 		cw_set_hdr_flags(buf, CAPWAP_FLAG_HDR_T, 1); | ||||||
|  | 		cw_send_capwap_packet(nc,buf,hlen,rframe,l); | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
| 	 | 	 | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|  | |||||||
| @ -53,10 +53,10 @@ int conn_send_msg(struct cw_Conn * conn, uint8_t *rawmsg) | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	/* Zyxel doesn't count msg element length from | 	//  Zyxel doesn't count msg element length from | ||||||
| 	   behind seqnum */ | //	   behind seqnum * / | ||||||
| //	if (conn->capwap_mode == CW_MODE_ZYXEL){ | //	if (conn->capwap_mode == CW_MODE_ZYXEL){ | ||||||
| /*		// XXX val-=3; */ | // *		// XXX val-=3; * / | ||||||
| //	} | //	} | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -75,7 +75,7 @@ mtu = 9440; | |||||||
| 	 int offset = cw_get_hdr_msg_offset(rawmsg); | 	 int offset = cw_get_hdr_msg_offset(rawmsg); | ||||||
| 	return cw_send_msg(conn,rawmsg+offset); | 	return cw_send_msg(conn,rawmsg+offset); | ||||||
|  |  | ||||||
|  | /* | ||||||
| 	if (packetlen>mtu){ | 	if (packetlen>mtu){ | ||||||
| 		cw_set_hdr_flags(ptr,CAPWAP_FLAG_HDR_F,1); | 		cw_set_hdr_flags(ptr,CAPWAP_FLAG_HDR_F,1); | ||||||
| 		cw_set_dword(ptr+4, conn->fragid<<16 | fragoffset<<3 ); | 		cw_set_dword(ptr+4, conn->fragid<<16 | fragoffset<<3 ); | ||||||
| @ -103,7 +103,7 @@ mtu = 9440; | |||||||
| 		if (conn->write(conn,ptr,mtu)<0) | 		if (conn->write(conn,ptr,mtu)<0) | ||||||
| 			return -1; | 			return -1; | ||||||
|  |  | ||||||
| /*		// XXX Fragmentation stuff.. */ | / *		// XXX Fragmentation stuff.. * / | ||||||
| 		ptr +=mtu-hlen; | 		ptr +=mtu-hlen; | ||||||
| 		fragoffset+=(mtu-hlen)/8; | 		fragoffset+=(mtu-hlen)/8; | ||||||
|  |  | ||||||
| @ -122,6 +122,6 @@ mtu = 9440; | |||||||
|  |  | ||||||
| 	cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,packetlen,(struct sockaddr*)&conn->addr); | 	cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,packetlen,(struct sockaddr*)&conn->addr); | ||||||
|  |  | ||||||
| 	return conn->write(conn,ptr,packetlen-0); | 	return conn->write(conn,ptr,packetlen-0); */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								src/cw/cw.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/cw/cw.h
									
									
									
									
									
								
							| @ -219,7 +219,7 @@ void cw_set_hdr_rid(uint8_t * th, int rid); | |||||||
|  * @see #cw_is_request |  * @see #cw_is_request | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define cw_is_response(msg_id) (!is_response(msg_id)) | #define cw_is_response(msg_id) (!cw_is_resquest(msg_id)) | ||||||
|  |  | ||||||
|  |  | ||||||
| uint8_t *cw_get_hdr_msg_elems_ptr(uint8_t * m); | uint8_t *cw_get_hdr_msg_elems_ptr(uint8_t * m); | ||||||
| @ -565,6 +565,14 @@ int cw_out_generic_walk(struct cw_ElemHandler * handler, struct cw_ElemHandlerPa | |||||||
| int cw_out_generic0(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params | int cw_out_generic0(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params | ||||||
| 			, uint8_t * dst,const char *key); | 			, uint8_t * dst,const char *key); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int cw_init_capwap_packet( uint8_t * buf, int wbid ,int rid, bstr_t rmac, bstr_t wd); | ||||||
|  | int cw_send_capwap_packet(struct cw_Conn * conn, uint8_t * buf, int hlen, uint8_t * data, int len); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  *@} |  *@} | ||||||
|  */ |  */ | ||||||
|  | |||||||
| @ -1,12 +0,0 @@ | |||||||
| #ifndef __CW_80211_H |  | ||||||
| #define __CW_80211_H |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  |  | ||||||
| int cw_in_80211_mac_operation(struct conn *conn, struct cw_action_in *a, uint8_t * data, |  | ||||||
| 			 int len, struct sockaddr *from); |  | ||||||
|  |  | ||||||
| int cw_read_80211_mac_operation(uint8_t *data,mbag_t r); |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @ -136,7 +136,7 @@ int cw_set_hdr_rmac(uint8_t * th, bstr_t rmac) | |||||||
| 		hlen++; | 		hlen++; | ||||||
| 	} | 	} | ||||||
| 	cw_set_hdr_hlen(th, hlen); | 	cw_set_hdr_hlen(th, hlen); | ||||||
| 	return 1; | 	return rmac_len; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										151
									
								
								src/cw/dbg.c
									
									
									
									
									
								
							
							
						
						
									
										151
									
								
								src/cw/dbg.c
									
									
									
									
									
								
							| @ -38,19 +38,14 @@ | |||||||
|  *@{ |  *@{ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  /* |  | ||||||
|   * @defgroup DebugFunctions Debug Functions |  | ||||||
|   * @{ |  | ||||||
|   */ |  | ||||||
|  |  | ||||||
| uint32_t cw_dbg_opt_display = DBG_DISP_COLORS; | uint32_t cw_dbg_opt_display = DBG_DISP_COLORS; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Current debug level |  * Contains all debuglevels currently set | ||||||
|  */ |  */ | ||||||
| //static uint32_t cw_dbg_opt_level = 0; |  | ||||||
| // |  | ||||||
| static struct mavl * cw_dbg_opt_level = NULL; | static struct mavl * cw_dbg_opt_level = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
| static int dbg_cmp(const void *a, const void*b) | static int dbg_cmp(const void *a, const void*b) | ||||||
| { | { | ||||||
| 	return (*((int*)a)-*((int*)b)); | 	return (*((int*)a)-*((int*)b)); | ||||||
| @ -81,19 +76,16 @@ static const char * dbg_level_elem_detail[] = { | |||||||
| 	"elem_detail_in", "elem_detail_out", NULL | 	"elem_detail_in", "elem_detail_out", NULL | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | static const char * dbg_level_elem_dmp[] = { | ||||||
|  | 	"elem_dmp_in", "elem_dmp_out", NULL | ||||||
|  | }; | ||||||
|  | 	 | ||||||
| static const char * dbg_level_elem_all[] = { | static const char * dbg_level_elem_all[] = { | ||||||
| 	"elem", "elem_dmp", "elem_detail",NULL | 	"elem", "elem_dmp", "elem_detail",NULL | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static const char * dbg_level_std[] = { | static const char * dbg_level_std[] = { | ||||||
| 	"msg","elem","msg_err", "elem_err", "pkt_err", "rfc", "warn", "state", "info", NULL | 	"msg","elem","msg_err", "elem_err", "pkt_err", "rfc", "warn", "state", "info", NULL | ||||||
| /*		 |  | ||||||
| 	DBG_MSG_IN, DBG_MSG_OUT, |  | ||||||
| 	DBG_ELEM_IN, DBG_ELEM_OUT, |  | ||||||
| 	DBG_MSG_ERR, DBG_ELEM_ERR, |  | ||||||
| 	DBG_PKT_ERR, DBG_RFC, DBG_WARN, |  | ||||||
| 	DBG_STATE, DBG_INFO, |  | ||||||
| 	0*/ |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -106,6 +98,7 @@ struct cw_DbgStr cw_dbg_strings[] = { | |||||||
| 	{ 0,			"pkt", dbg_level_pkt, "packet headers" }, | 	{ 0,			"pkt", dbg_level_pkt, "packet headers" }, | ||||||
| 	{ 0,			"elem", dbg_level_elem, "message elemenst" }, | 	{ 0,			"elem", dbg_level_elem, "message elemenst" }, | ||||||
| 	{ 0, 			"elem_detail", dbg_level_elem_detail, "details for message elements"}, | 	{ 0, 			"elem_detail", dbg_level_elem_detail, "details for message elements"}, | ||||||
|  | 	{ 0, 			"elem_dmp", dbg_level_elem_dmp,"hexdump element"}, | ||||||
| 	{ 0, 			"elem_all", dbg_level_elem_all,"all possible elem options"}, | 	{ 0, 			"elem_all", dbg_level_elem_all,"all possible elem options"}, | ||||||
|  |  | ||||||
| 	{ DBG_WARN,		"warn", NULL, "warnings" }, | 	{ DBG_WARN,		"warn", NULL, "warnings" }, | ||||||
| @ -137,7 +130,8 @@ struct cw_DbgStr cw_dbg_strings[] = { | |||||||
| 	{ DBG_ELEM_OUT, 	"elem_out", NULL, "elements of outgoing messages"}, | 	{ DBG_ELEM_OUT, 	"elem_out", NULL, "elements of outgoing messages"}, | ||||||
| 	{ DBG_ELEM_DETAIL_IN, 	"elem_detail_in", NULL, "details of incomming message elements" }, | 	{ DBG_ELEM_DETAIL_IN, 	"elem_detail_in", NULL, "details of incomming message elements" }, | ||||||
| 	{ DBG_ELEM_DETAIL_OUT, 	"elem_detail_out",NULL, "details of outgoing message elememnts" }, | 	{ DBG_ELEM_DETAIL_OUT, 	"elem_detail_out",NULL, "details of outgoing message elememnts" }, | ||||||
| 	{ DBG_ELEM_DMP, 	"elem_dmp", NULL, "hex-dump of each message element"}, | 	{ DBG_ELEM_DMP_IN, 	"elem_dmp_in", NULL, "hex-dump of incoming elements"}, | ||||||
|  | 	{ DBG_ELEM_DMP_OUT, 	"elem_dmp_out", NULL, "hex-dump of outgoing elements"}, | ||||||
| 	{ DBG_ELEM_VNDR,	"elem_vndr", NULL, "expand vendor specific payloads"},	 | 	{ DBG_ELEM_VNDR,	"elem_vndr", NULL, "expand vendor specific payloads"},	 | ||||||
| 	 | 	 | ||||||
| 	{ DBG_DTLS, 		"dtls",NULL, "DTLS related stuff"}, | 	{ DBG_DTLS, 		"dtls",NULL, "DTLS related stuff"}, | ||||||
| @ -153,14 +147,6 @@ struct cw_DbgStr cw_dbg_strings[] = { | |||||||
| 	{ 0, NULL }  | 	{ 0, NULL }  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /** |  | ||||||
|  *@} |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| static struct cw_StrListElem theme0[] = { | static struct cw_StrListElem theme0[] = { | ||||||
| @ -211,7 +197,6 @@ static struct cw_StrListElem * color_on = theme0; | |||||||
|  |  | ||||||
| struct cw_StrListElem color_ontext[] = { | struct cw_StrListElem color_ontext[] = { | ||||||
|  |  | ||||||
| /*	{DBG_ELEM_DMP, "\x1b[37m"},*/ |  | ||||||
| 	{DBG_ELEM_DMP_OUT, ANSI_BBLACK ANSI_ITALIC}, | 	{DBG_ELEM_DMP_OUT, ANSI_BBLACK ANSI_ITALIC}, | ||||||
| 	{DBG_ELEM_DMP_IN,  ANSI_BBLACK}, | 	{DBG_ELEM_DMP_IN,  ANSI_BBLACK}, | ||||||
|  |  | ||||||
| @ -290,22 +275,36 @@ const char *get_dbg_color_ontext(int level) | |||||||
|  * @param level Level to check |  * @param level Level to check | ||||||
|  * @return 0 if leveln is not set, otherwise level is set |  * @return 0 if leveln is not set, otherwise level is set | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| int cw_dbg_is_level(int level) | int cw_dbg_is_level(int level) | ||||||
| { | { | ||||||
| 	if (cw_dbg_opt_level == NULL) | 	if (cw_dbg_opt_level == NULL) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| 	return mavl_get(cw_dbg_opt_level,&level) == NULL ? 0:1; | 	return mavl_get(cw_dbg_opt_level,&level) == NULL ? 0:1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |   * Set debug level | ||||||
|  |   * @param level debug level to set, allowed values are enumberated in #cw_dbg_levels structure. | ||||||
|  |   * @param on 1: turns the specified debug level on, 0: turns the specified debug level off. | ||||||
|  |   * | ||||||
|  |   * To check if a specific debug level is set, call #cw_dbg_is_level. | ||||||
|  |   */ | ||||||
|  | void cw_dbg_set_level (int level, int on) | ||||||
|  | { | ||||||
|  | 	int exists; | ||||||
|  |  | ||||||
| //	if (level > 1 && (level &1)) | 	if (cw_dbg_opt_level == NULL){ | ||||||
| 		return 1; | 		cw_dbg_opt_level = mavl_create(dbg_cmp,NULL,sizeof(int)); | ||||||
|  | 		if (cw_dbg_opt_level == NULL) | ||||||
|  | 			return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| /*	if (level >= DBG_ALL ){ | 	if (on){ | ||||||
| 		return 1; | 		mavl_insert(cw_dbg_opt_level,&level,&exists); | ||||||
| 	}*/ | 	} | ||||||
| //	return (cw_dbg_opt_level & (level)); | 	else  | ||||||
|  | 		mavl_del(cw_dbg_opt_level,&level); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -325,48 +324,12 @@ static void cw_dbg_vlog_line(struct cw_LogWriter * writer, | |||||||
| 				 | 				 | ||||||
| 	} | 	} | ||||||
| 	writer->write(LOG_DEBUG,fbuf,args,writer); | 	writer->write(LOG_DEBUG,fbuf,args,writer); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Put a list of missing mandatory message elements to debug output |  * Display a packet on debugger | ||||||
|  */ |  | ||||||
| void cw_dbg_missing_mand(int level, struct cw_Conn *conn, int ** ml, int n, |  | ||||||
| 			 int  * a) |  | ||||||
| { |  | ||||||
| 	/* |  | ||||||
| //      if (!cw_dbg_is_level(DBG_MSG_ERR) || n == 0) |  | ||||||
| //              return; |  | ||||||
| */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	char buffer[2000]; |  | ||||||
| /*	char *p = buffer; */ |  | ||||||
| 	int i; |  | ||||||
| /*	char *delim = "";*/ |  | ||||||
| 	 |  | ||||||
| 	if (!cw_dbg_is_level(level) || n == 0) |  | ||||||
| 		return; |  | ||||||
| 	 |  | ||||||
| /* |  | ||||||
| 	// TODO XXXX |  | ||||||
| */ |  | ||||||
| 	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(level, "Missing mandatory elements: [%s]", buffer); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Display a packet on for debugger |  | ||||||
|  */ |  */ | ||||||
| void cw_dbg_pkt(int level, struct cw_Conn *conn, uint8_t * packet, int len, | void cw_dbg_pkt(int level, struct cw_Conn *conn, uint8_t * packet, int len, | ||||||
| 		struct sockaddr *from) | 		struct sockaddr *from) | ||||||
| @ -538,7 +501,7 @@ void cw_dbg_elem(int level, struct cw_Conn *conn, int msg, | |||||||
| 	cw_dbg(level,"%s %d (%s), len=%d ",vendorname,handler->id, | 	cw_dbg(level,"%s %d (%s), len=%d ",vendorname,handler->id, | ||||||
| 			handler->name,len); | 			handler->name,len); | ||||||
| 	 | 	 | ||||||
| 	if (cw_dbg_is_level(DBG_ELEM_DMP)) { | 	if (cw_dbg_is_level(DBG_ELEM_DMP_OUT) || cw_dbg_is_level(DBG_ELEM_DMP_IN)) { | ||||||
| 		if (level == DBG_ELEM_OUT) | 		if (level == DBG_ELEM_OUT) | ||||||
| 			cw_dbg_dmp(DBG_ELEM_DMP_OUT,msgbuf,len,""); | 			cw_dbg_dmp(DBG_ELEM_DMP_OUT,msgbuf,len,""); | ||||||
| 		else  | 		else  | ||||||
| @ -552,46 +515,6 @@ void cw_dbg_elem(int level, struct cw_Conn *conn, int msg, | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|   * Set debug level |  | ||||||
|   * @param level debug level to set, allowed values are enumberated in #cw_dbg_levels structure. |  | ||||||
|   * @param on 1: turns the specified debug level on, 0: turns the specified debug level off. |  | ||||||
|   */ |  | ||||||
|  |  | ||||||
| void cw_dbg_set_level (int level, int on) |  | ||||||
| { |  | ||||||
| 	int exists; |  | ||||||
|  |  | ||||||
| 	if (cw_dbg_opt_level == NULL){ |  | ||||||
| 		cw_dbg_opt_level = mavl_create(dbg_cmp,NULL,sizeof(int)); |  | ||||||
| 		if (cw_dbg_opt_level == NULL) |  | ||||||
| 			return; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if (on){ |  | ||||||
| 		mavl_insert(cw_dbg_opt_level,&level,&exists); |  | ||||||
| 	} |  | ||||||
| 	else  |  | ||||||
| 		mavl_del(cw_dbg_opt_level,&level); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| 	switch (level) { |  | ||||||
| 		case DBG_ALL: |  | ||||||
| 			if (on) |  | ||||||
| 				cw_dbg_opt_level = 0xffffffff; |  | ||||||
| 			else |  | ||||||
| 				cw_dbg_opt_level = 0; |  | ||||||
| 			break; |  | ||||||
| 		default: |  | ||||||
| 			if (on) |  | ||||||
| 				cw_dbg_opt_level |= (level); |  | ||||||
| 			else  |  | ||||||
| 				cw_dbg_opt_level &= (0xffffffff) ^ (level); |  | ||||||
| 	} |  | ||||||
| 	*/ |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int cw_dbg_set_level_from_str0(const char *level,int on) | int cw_dbg_set_level_from_str0(const char *level,int on) | ||||||
| { | { | ||||||
| @ -707,7 +630,12 @@ void cw_dbg_dot11_frame(uint8_t * frame,int len) | |||||||
| 			cw_dbg_dot11_elems(frame+28,len-28); | 			cw_dbg_dot11_elems(frame+28,len-28); | ||||||
| 			break; | 			break; | ||||||
| 		case DOT11_ASSOC_RESP: | 		case DOT11_ASSOC_RESP: | ||||||
| 			cw_dbg_dot11_elems((frame),len-6); | 			cw_dbg(DBG_X,"  Capapility info: %04X",dot11_assoc_resp_get_cap(frame));  | ||||||
|  | 			cw_dbg(DBG_X,"  Status CodeCapapility info: %04X",dot11_assoc_resp_get_status_code(frame)); | ||||||
|  | 			cw_dbg(DBG_X,"  Assoc ID: %04X",dot11_assoc_resp_get_assoc_id(frame));  | ||||||
|  |  | ||||||
|  | 			cw_dbg_dot11_elems((frame+DOT11_BODY_POS+DOT11_ASSOC_RESP_BODY_LEN), | ||||||
|  | 					len-DOT11_BODY_POS-DOT11_ASSOC_RESP_BODY_LEN); | ||||||
| 			break; | 			break; | ||||||
| 			 | 			 | ||||||
| 	} | 	} | ||||||
| @ -717,4 +645,3 @@ void cw_dbg_dot11_frame(uint8_t * frame,int len) | |||||||
| /**@}*/ | /**@}*/ | ||||||
|  |  | ||||||
|  |  | ||||||
| /**@}*/ |  | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								src/cw/dbg.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/cw/dbg.h
									
									
									
									
									
								
							| @ -39,7 +39,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  *@addtogroup LOGDBG |  *@addtogroup DBG | ||||||
|  *@{ |  *@{ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @ -82,9 +82,6 @@ enum cw_dbg_levels{ | |||||||
| 	/** Error in msg elements */ | 	/** Error in msg elements */ | ||||||
| 	DBG_ELEM_ERR, | 	DBG_ELEM_ERR, | ||||||
|  |  | ||||||
| 	/** hex dump elements */	 |  | ||||||
| 	DBG_ELEM_DMP, |  | ||||||
|  |  | ||||||
| 	/** General infos, like CAPWAP state */ | 	/** General infos, like CAPWAP state */ | ||||||
| 	DBG_INFO,	 | 	DBG_INFO,	 | ||||||
|  |  | ||||||
| @ -116,11 +113,13 @@ enum cw_dbg_levels{ | |||||||
|        	/**Debug State machine */ |        	/**Debug State machine */ | ||||||
| 	DBG_STATE, | 	DBG_STATE, | ||||||
| 	 | 	 | ||||||
| 	 | 	/** Infos about nessage composing */	 | ||||||
| 	DBG_MSG_COMPOSE, | 	DBG_MSG_COMPOSE, | ||||||
|  |  | ||||||
|  | 	/** Debug Configuration updates */ | ||||||
| 	DBG_CFG_UPDATES, | 	DBG_CFG_UPDATES, | ||||||
|  |  | ||||||
|  | 	/** Debug Vendor elements */ | ||||||
| 	DBG_ELEM_VNDR, | 	DBG_ELEM_VNDR, | ||||||
| 	 | 	 | ||||||
| 	 | 	 | ||||||
| @ -130,11 +129,11 @@ enum cw_dbg_levels{ | |||||||
|  |  | ||||||
| 	DBG_ALL, | 	DBG_ALL, | ||||||
|  |  | ||||||
|  | 	/** Hexdump incoming msg elemenets */ | ||||||
| 	DBG_ELEM_DMP_IN, | 	DBG_ELEM_DMP_IN, | ||||||
|  | 	/** Hexdump outgoing msg elemenst */ | ||||||
| 	DBG_ELEM_DMP_OUT, | 	DBG_ELEM_DMP_OUT, | ||||||
|  |  | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define DBG_MSG (DBG_MSG_IN | DBG_MSG_OUT) | #define DBG_MSG (DBG_MSG_IN | DBG_MSG_OUT) | ||||||
| @ -220,8 +219,6 @@ void cw_dbg_msg(int level,struct cw_Conn *conn, uint8_t * packet, int len,struct | |||||||
| char * cw_dbg_mkdmp(const uint8_t * data, int len); | char * cw_dbg_mkdmp(const uint8_t * data, int len); | ||||||
| //void cw_dbg_version_subelem(int level, const char *context, int subtype,  | //void cw_dbg_version_subelem(int level, const char *context, int subtype,  | ||||||
| //		uint32_t vendor_id, const uint8_t * vstr, int len); | //		uint32_t vendor_id, const uint8_t * vstr, int len); | ||||||
| void cw_dbg_ktv_dump(mavl_t ktv, uint32_t dbglevel,  |  | ||||||
| 		const char *header, const char *prefix, const char *footer ); |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   * Set debug level |   * Set debug level | ||||||
|  | |||||||
| @ -1,135 +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  |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "dbg.h" |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  *@addtogroup DbgOptions  |  | ||||||
|  *@{ |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Debug strings |  | ||||||
|  */ |  | ||||||
| struct cw_StrListElem cw_dbg_strings[] = { |  | ||||||
| 	{ DBG_INFO,		"info",  }, |  | ||||||
| 	{ DBG_PKT_IN,		"pkt_in"  }, |  | ||||||
| 	{ DBG_PKT_OUT,		"pkt_out" }, |  | ||||||
| 	{ DBG_PKT_ERR,		"pkt_err" }, |  | ||||||
| 	{ DBG_PKT_DMP_IN,	"pkt_dmp_in" }, |  | ||||||
| 	{ DBG_PKT_DMP_OUT,	"pkt_dmp_out" }, |  | ||||||
|  |  | ||||||
| 	{ DBG_MSG_IN,		"msg_in"  }, |  | ||||||
| 	{ DBG_MSG_OUT,		"msg_out" }, |  | ||||||
| 	{ DBG_MSG_DMP_IN,	"msg_dmp_in"  }, |  | ||||||
| 	{ DBG_MSG_DMP_OUT,	"msg_dmp_out" }, |  | ||||||
| 	 |  | ||||||
| 	{ DBG_MSG_ERR,		"msg_err"}, |  | ||||||
|  |  | ||||||
| 	{ DBG_RFC,		"rfc", 	 }, |  | ||||||
|  |  | ||||||
| 	{ DBG_ELEM_IN,  	"elem_in"}, |  | ||||||
| 	{ DBG_ELEM_OUT, 	"elem_out"}, |  | ||||||
| 	{ DBG_ELEM_DMP, 	"elem_dmp"}, |  | ||||||
| 	{ DBG_ELEM_ERR, 	"elem_err" }, |  | ||||||
| 	{ DBG_ELEM_DETAIL_IN, 	"elem_detail_in" }, |  | ||||||
| 	{ DBG_ELEM_DETAIL_OUT, 	"elem_detail_out" }, |  | ||||||
| 	{ DBG_ELEM_VNDR,	"elem_vndr"},	 |  | ||||||
| 	 |  | ||||||
| 	{ DBG_DTLS, 		"dtls" }, |  | ||||||
| 	{ DBG_DTLS_BIO,		"dtls_bio" }, |  | ||||||
| 	{ DBG_DTLS_BIO_DMP,	"dtls_bio_dmp"}, |  | ||||||
| 	{ DBG_DTLS_DETAIL, 	"dtls_detail"}, |  | ||||||
|  |  | ||||||
| 	{ DBG_CFG_UPDATES, 	"cfg_updates" }, |  | ||||||
| 	{ DBG_X,		"x" }, |  | ||||||
|  |  | ||||||
| 	 |  | ||||||
| //	{DBG_CFG_DMP, "cfg_dmp" }, |  | ||||||
| 	 |  | ||||||
| 	{ DBG_WARN,		"warn" }, |  | ||||||
| 		 |  | ||||||
| 	{ DBG_MOD,		"mod"}, |  | ||||||
| 	{ DBG_STATE,		"state" }, |  | ||||||
| 	{ DBG_MSG_COMPOSE,	"msg_compose" }, |  | ||||||
|  |  | ||||||
| 	{ (DBG_MSG_IN | DBG_MSG_OUT), "msg" }, |  | ||||||
| 	{ (DBG_PKT_IN | DBG_PKT_OUT), "pkt" }, |  | ||||||
| 	{ (DBG_ELEM_IN | DBG_ELEM_OUT), "elem" }, |  | ||||||
| 	{ (DBG_ELEM_DETAIL_IN | DBG_ELEM_DETAIL_OUT), "elem_detail" }, |  | ||||||
| 	{ (DBG_ELEM_IN | DBG_ELEM_OUT | DBG_ELEM_DMP | DBG_ELEM_DETAIL_IN | DBG_ELEM_DETAIL_OUT), "elem_all" }, |  | ||||||
|  |  | ||||||
| 	{ (	DBG_MSG_IN | DBG_MSG_OUT |  |  | ||||||
| 		DBG_ELEM_IN | DBG_ELEM_OUT | |  | ||||||
| 		DBG_MSG_ERR | DBG_ELEM_ERR | |  | ||||||
| 		DBG_PKT_ERR | DBG_RFC | DBG_WARN |  | ||||||
| 		| DBG_STATE | DBG_INFO), 			"std" }, |  | ||||||
|  |  | ||||||
| 	{ DBG_ALL, 		"all"}, |  | ||||||
|  |  | ||||||
| 	 |  | ||||||
| 	{ CW_STR_STOP, NULL }  |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  *@} |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* |  | ||||||
| struct cw_dbg_cfgstrs cw_dbg_cfgstrs[] = { |  | ||||||
|  |  | ||||||
| 	{"info",DBG_CW_INFO}, |  | ||||||
| 	{"msg",DBG_MSG}, |  | ||||||
| 	{"elem",DBG_ELEM}, |  | ||||||
| 	{"elem_dmp",DBG_ELEM_DMP}, |  | ||||||
| 	{"rfc",DBG_CW_RFC}, |  | ||||||
| 	{"pkt_in",DBG_CW_PKT_IN}, |  | ||||||
| 	{"pkt_out",DBG_CW_PKT_OUT}, |  | ||||||
| 	{"pkt_dtl",DBG_CW_PKT_DTL}, |  | ||||||
| 	{"pkt",(DBG_CW_PKT_IN | DBG_CW_PKT_OUT)}, |  | ||||||
| 	{"pkt_dmp",DBG_CW_PKT_DMP}, |  | ||||||
| 	{"pkt_err",DBG_CW_PKT_ERR}, |  | ||||||
| 	{"msg_err",DBG_MSG_ERR}, |  | ||||||
| 	{"img_dtl",DBG_CW_IMG_DTL}, |  | ||||||
| 	{"elem_err",DBG_ELEM_ERR}, |  | ||||||
|  |  | ||||||
| 	{"dtls",DBG_DTLS}, |  | ||||||
| 	{"dtls_detail",DBG_DTLS_DETAIL}, |  | ||||||
| 	{"dtls_bio",DBG_DTLS_BIO}, |  | ||||||
| 	{"dtls_bio_dmp",DBG_DTLS_BIO_DMP}, |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	{"all",DBG_ALL}, |  | ||||||
| 	{"err",DBG_ERR}, |  | ||||||
| 	{0,0} |  | ||||||
|  |  | ||||||
| }; |  | ||||||
| */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -21,6 +21,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include "strlist.h" | #include "strlist.h" | ||||||
|  | #include "bstr.h" | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @defgroup DOT11_FRAME_TYPES Frame Types |  * @defgroup DOT11_FRAME_TYPES Frame Types | ||||||
| @ -238,7 +239,9 @@ int  dot11_put_ssid(uint8_t *dst,uint8_t * ssid,int len); | |||||||
|  */ |  */ | ||||||
| #define dot11_rate2float(rate) (((float)(rate))/2.0) | #define dot11_rate2float(rate) (((float)(rate))/2.0) | ||||||
|  |  | ||||||
| int dot11_put_supported_rates(uint8_t *dst, float *basic, float *rates); | int dot11_put_supported_rates(uint8_t *dst, bstr_t src); | ||||||
|  |  | ||||||
|  | //		float *basic, float *rates); | ||||||
| int dot11_put_dsss_param_set(uint8_t *dst,int ch); | int dot11_put_dsss_param_set(uint8_t *dst,int ch); | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -271,12 +274,15 @@ extern struct cw_StrListElem dot11_names[]; | |||||||
| #define dot11_get_seq(frame) dot11_get_word((frame)+22) | #define dot11_get_seq(frame) dot11_get_word((frame)+22) | ||||||
| #define dot11_get_body(frame) ((frame)+24) | #define dot11_get_body(frame) ((frame)+24) | ||||||
|  |  | ||||||
|  | #define DOT11_BODY_POS 24 | ||||||
|  |  | ||||||
|  |  | ||||||
| #define dot11_set_duration(frame,d) dot11_set_word(frame+2,d) | #define dot11_set_duration(frame,d) dot11_set_word(frame+2,d) | ||||||
| #define dot11_set_seq(frame,s) dot11_set_word((frame)+22,s) | #define dot11_set_seq(frame,s) dot11_set_word((frame)+22,s) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define DOT11_ASSOC_RESP_BODY_LEN 6 | ||||||
|  |  | ||||||
| #define dot11_assoc_req_get_cap(frame) \ | #define dot11_assoc_req_get_cap(frame) \ | ||||||
| 		dot11_get_word((frame)+24) | 		dot11_get_word((frame)+24) | ||||||
| #define dot11_assoc_req_get_listen_interval(frame) \ | #define dot11_assoc_req_get_listen_interval(frame) \ | ||||||
| @ -292,10 +298,22 @@ extern struct cw_StrListElem dot11_names[]; | |||||||
| */ | */ | ||||||
| #define dot11_assoc_resp_set_cap(frame,cap)\ | #define dot11_assoc_resp_set_cap(frame,cap)\ | ||||||
| 	dot11_set_word(dot11_get_body(frame),cap) | 	dot11_set_word(dot11_get_body(frame),cap) | ||||||
|  | #define dot11_assoc_resp_get_cap(frame)\ | ||||||
|  | 	dot11_get_word(dot11_get_body(frame)) | ||||||
|  |  | ||||||
|  |  | ||||||
| #define dot11_assoc_resp_set_status_code(frame,code)\ | #define dot11_assoc_resp_set_status_code(frame,code)\ | ||||||
| 	dot11_set_word(dot11_get_body(frame)+2,code) | 	dot11_set_word(dot11_get_body(frame)+2,code) | ||||||
|  | #define dot11_assoc_resp_get_status_code(frame)\ | ||||||
|  | 	dot11_get_word(dot11_get_body(frame)+2) | ||||||
|  |  | ||||||
|  |  | ||||||
| #define dot11_assoc_resp_set_assoc_id(frame,id)\ | #define dot11_assoc_resp_set_assoc_id(frame,id)\ | ||||||
| 	dot11_set_word(dot11_get_body(frame)+4,id) | 	dot11_set_word(dot11_get_body(frame)+4,id) | ||||||
|  | #define dot11_assoc_resp_get_assoc_id(frame)\ | ||||||
|  | 	dot11_get_word(dot11_get_body(frame)+4) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //#define dot11_assoce_resp_get_var_body(frame)  | //#define dot11_assoce_resp_get_var_body(frame)  | ||||||
| //	(get_frame_body(frame)+6) | //	(get_frame_body(frame)+6) | ||||||
| @ -306,6 +324,12 @@ extern struct cw_StrListElem dot11_names[]; | |||||||
| 	memcpy(dst,src,6); | 	memcpy(dst,src,6); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct cw_Dot11Elemenst { | ||||||
|  |  | ||||||
|  | 	bstr_t supportet_rates; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int dot11_init_assoc_resp(uint8_t * dst); | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  | |||||||
| @ -45,7 +45,9 @@ int  dot11_put_ssid(uint8_t *dst,uint8_t * ssid,int len){ | |||||||
| 	return len; | 	return len; | ||||||
| } | } | ||||||
|  |  | ||||||
| int dot11_put_supported_rates(uint8_t *dst, float *basic, float *rates){ |  | ||||||
|  |  | ||||||
|  | int dot11_convert_supported_rates(uint8_t *dst, float *basic, float *rates){ | ||||||
| 	uint8_t *d = dst+2; | 	uint8_t *d = dst+2; | ||||||
| 	while(*basic != 0.0){ | 	while(*basic != 0.0){ | ||||||
| 		*d++ = 0x80 | dot11_float2rate(*basic); | 		*d++ = 0x80 | dot11_float2rate(*basic); | ||||||
| @ -62,6 +64,15 @@ int dot11_put_supported_rates(uint8_t *dst, float *basic, float *rates){ | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int dot11_put_supported_rates(uint8_t * dst, bstr_t src) | ||||||
|  | { | ||||||
|  | 	int l = bstr_len(src); | ||||||
|  | 	dot11_set_byte(dst,DOT11_ELEM_SUPPORTED_RATES); | ||||||
|  | 	memcpy(dst+1, src,l+1); | ||||||
|  | 	return l+2; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int dot11_put_dsss_param_set(uint8_t *dst,int ch) { | int dot11_put_dsss_param_set(uint8_t *dst,int ch) { | ||||||
|  |  | ||||||
| 	dot11_set_byte(dst,DOT11_ELEM_DSSS_PARAM_SET); | 	dot11_set_byte(dst,DOT11_ELEM_DSSS_PARAM_SET); | ||||||
|  | |||||||
							
								
								
									
										135
									
								
								src/cw/send.c
									
									
									
									
									
								
							
							
						
						
									
										135
									
								
								src/cw/send.c
									
									
									
									
									
								
							| @ -90,10 +90,143 @@ int conn_send_data_msg(struct cw_Conn * conn, uint8_t *rawmsg,int len) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #define MAX_MTU 9500 | #define MAX_MTU 9500 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Initialize a capwap header | ||||||
|  |  * | ||||||
|  |  * @param buf	Buffer to be initialized | ||||||
|  |  * @param wbid  Wireless Binding ID  | ||||||
|  |  * @param rid 	Radio ID | ||||||
|  |  * @param rmac	Radio MAC, NULL if not present | ||||||
|  |  * @param wd	Wireless Data, NULL if not present | ||||||
|  |  * | ||||||
|  |  * @return Length of the header that was initialized | ||||||
|  |  */ | ||||||
|  | int  | ||||||
|  | cw_init_capwap_packet( uint8_t * buf, int wbid ,int rid, bstr_t rmac, bstr_t wd) | ||||||
|  | { | ||||||
|  | 	int len,hlen; | ||||||
|  |  | ||||||
|  | 	/* header len */ | ||||||
|  | 	len = 8; | ||||||
|  |  | ||||||
|  | 	/* zero the first 8 bytes */ | ||||||
|  | 	cw_set_dword(buf + 0, 0); | ||||||
|  | 	cw_set_dword(buf + 4, 0); | ||||||
|  |  | ||||||
|  | 	/* capwap version/unencrypted */ | ||||||
|  | 	#if CAPWAP_VERSION != 0  | ||||||
|  | 		cw_set_hdr_preamble(buf, CAPWAP_VERSION << 4 | 0); | ||||||
|  | 	#endif | ||||||
|  |  | ||||||
|  | 	/* set wbid and rid */ | ||||||
|  | 	cw_set_hdr_wbid(buf, wbid); | ||||||
|  | 	cw_set_hdr_rid(buf, rid); | ||||||
|  |  | ||||||
|  | 	/* add rmac if present */ | ||||||
|  | 	if (rmac != NULL){ | ||||||
|  | 		int rmac_len = bstr_len(rmac); | ||||||
|  | 		memcpy(cw_get_hdr_rmac(buf), rmac, rmac_len + 1); | ||||||
|  | 		cw_set_hdr_flags(buf, CAPWAP_FLAG_HDR_M, 1); | ||||||
|  | 		len+=rmac_len+1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Add wireless data if present */ | ||||||
|  | 	if (wd!=NULL){ | ||||||
|  | 		int wd_len = bstr_len(wd); | ||||||
|  | 		memcpy(buf+len, wd, wd_len + 1); | ||||||
|  | 		cw_set_hdr_flags(buf, CAPWAP_FLAG_HDR_M, 1); | ||||||
|  | 		len+=wd_len; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	hlen = len / 4; | ||||||
|  | 	if (len % 4 != 0) { | ||||||
|  | 		hlen++; | ||||||
|  | 	} | ||||||
|  | 	cw_set_hdr_hlen(buf, hlen); | ||||||
|  |  | ||||||
|  | 	return hlen*4; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Send a CAPWAP packet and fragment it if nececerry | ||||||
|  |  * @param conn connection where to send packet over | ||||||
|  |  * @param buf pointer to a buffer initialized with #cw_init_capwap_packet | ||||||
|  |  * @param hlen length of header, which is the value returned by #cw_init_capwap_packet | ||||||
|  |  * @param data payload | ||||||
|  |  * @param len length of payload  | ||||||
|  |  */ | ||||||
|  | int cw_send_capwap_packet(struct cw_Conn * conn, uint8_t * buf, int hlen, uint8_t * data, int len) | ||||||
|  | { | ||||||
|  | 	int fragoffset,mtu; | ||||||
|  | 	int fragid; | ||||||
|  |  | ||||||
|  | 	/* get mtu and align it to 8 */ | ||||||
|  | 	mtu = conn->mtu; | ||||||
|  | 	mtu &= ~3; | ||||||
|  |  | ||||||
|  | 	/* initialize fragid and fragoffset */ | ||||||
|  | 	fragoffset = 0; | ||||||
|  | 	if (len + hlen > mtu) | ||||||
|  | 		fragid = conn->fragid++; | ||||||
|  | 	else | ||||||
|  | 		fragid = 0; | ||||||
|  |  | ||||||
|  | 	/* create all fragments */ | ||||||
|  | 	while (len + hlen > mtu){ | ||||||
|  | 		memcpy(buf+hlen,data+(fragoffset*8),mtu-hlen); | ||||||
|  | 		len -= (mtu - hlen); | ||||||
|  |  | ||||||
|  | 		cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_F,1); | ||||||
|  | 		cw_set_dword(buf+4, fragid<<16 | fragoffset<<3 ); | ||||||
|  |  | ||||||
|  | 		cw_dbg_pkt(DBG_PKT_OUT,conn,buf,mtu,(struct sockaddr*)&conn->addr); | ||||||
|  | 		if (conn->write(conn,buf,mtu)<0) | ||||||
|  | 			return -1; | ||||||
|  | 	 | ||||||
|  | 		fragoffset+=(mtu-hlen)/8; | ||||||
|  |  | ||||||
|  | 		/* put rmac and wireless data only into the 1st fragment */ | ||||||
|  | 		if (hlen!=8){ | ||||||
|  | 			cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_M,0); | ||||||
|  | 			cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_W,0); | ||||||
|  | 			hlen = 8; | ||||||
|  | 			cw_set_hdr_hlen(buf,hlen/4); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (fragoffset) | ||||||
|  | 		cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_F | CAPWAP_FLAG_HDR_L,1); | ||||||
|  | 	else | ||||||
|  | 		cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_F,0); | ||||||
|  |  | ||||||
|  | 	memcpy(buf+hlen,data+(fragoffset*8),len); | ||||||
|  |  | ||||||
|  | 	cw_set_dword(buf+4, fragid<<16 | fragoffset<<3 ); | ||||||
|  |  | ||||||
|  | 	cw_dbg_pkt(DBG_PKT_OUT,conn,buf,len+hlen,(struct sockaddr*)&conn->addr); | ||||||
|  |  | ||||||
|  | 	return conn->write(conn,buf,len + hlen); | ||||||
|  | } | ||||||
|  |  | ||||||
| int  | int  | ||||||
| cw_send_msg( struct cw_Conn * conn, uint8_t *msg) | cw_send_msg( struct cw_Conn * conn, uint8_t *msg) | ||||||
|  | { | ||||||
|  | 	uint8_t buf[MAX_MTU]; | ||||||
|  | 	int hlen,msglen; | ||||||
|  | 	hlen = cw_init_capwap_packet(buf,1,0,NULL,NULL); | ||||||
|  | 	msglen = cw_get_msg_elems_len(msg) + 8; | ||||||
|  | 	return cw_send_capwap_packet(conn,buf,hlen,msg,msglen); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int  | ||||||
|  | cw_send_msg_old( struct cw_Conn * conn, uint8_t *msg) | ||||||
| { | { | ||||||
| 	uint8_t buf[MAX_MTU]; | 	uint8_t buf[MAX_MTU]; | ||||||
| 	int fragoffset,hlen,mtu; | 	int fragoffset,hlen,mtu; | ||||||
|  | |||||||
| @ -5,9 +5,9 @@ OBJDIR=./o | |||||||
| LIBDIR		:= ../../lib | LIBDIR		:= ../../lib | ||||||
| LIBARCHDIR	:= $(LIBDIR)/$(KERNEL)/$(ARCH) | LIBARCHDIR	:= $(LIBDIR)/$(KERNEL)/$(ARCH) | ||||||
|  |  | ||||||
| CFLAGS+=-I../ -DUSE_OPENSSL -I../../include | CFLAGS+=-I../ -DUSE_OPENSSL -I../../include -I/usr/include/libnl3 | ||||||
| LDFLAGS+=-L$(LIBARCHDIR) -L/usr/local/lib | LDFLAGS+=-L$(LIBARCHDIR) -L/usr/local/lib | ||||||
| LIBS+=-lcw -lnettle -lssl -lcrypto -ldl -lpthread -lmavl -lwifi | LIBS+=-lcw -lnettle -lssl -lcrypto -ldl -lpthread -lmavl -lnl-3 -lnl-genl-3 | ||||||
|  |  | ||||||
| SOURCES=\ | SOURCES=\ | ||||||
|      	wtp_main.c\ |      	wtp_main.c\ | ||||||
| @ -15,6 +15,7 @@ SOURCES=\ | |||||||
| 	join.c\ | 	join.c\ | ||||||
| 	configure.c\ | 	configure.c\ | ||||||
| 	run.c\ | 	run.c\ | ||||||
| 	changestate.c | 	changestate.c \ | ||||||
|  | 	nlt.c | ||||||
|  |  | ||||||
| include ../prog.mk | include ../prog.mk | ||||||
|  | |||||||
| @ -1,16 +1,17 @@ | |||||||
| #include "netlink/netlink.h" | #include <netlink/netlink.h> | ||||||
| #include "netlink/genl/genl.h" | #include <netlink/genl/genl.h> | ||||||
| #include "netlink/genl/ctrl.h" | #include <netlink/genl/ctrl.h> | ||||||
| #include <netlink/msg.h> | #include <netlink/msg.h> | ||||||
|  |  | ||||||
| #include "cw/log.h" | #include "cw/log.h" | ||||||
| #include "cw/dbg.h" | #include "cw/dbg.h" | ||||||
| #include "cw/avltree.h" |  | ||||||
|  | #include <mavl.h> | ||||||
|  |  | ||||||
| #include "nlt.h" | #include "nlt.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  |  | ||||||
| static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) | static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) | ||||||
| { | { | ||||||
| @ -32,21 +33,22 @@ static int wiphylist_cmp(const void * d1,const void *d2) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| struct avltree * wiphylist_create() | struct mavl * wiphylist_create() | ||||||
| { | { | ||||||
| 	return avltree_create(wiphylist_cmp,0); | 	return mavl_create(wiphylist_cmp,0,sizeof(struct nlt_wiphyinfo)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| struct nlt_wiphyinfo * wiphylist_get( struct avltree * l,int idx) | struct nlt_wiphyinfo * wiphylist_get( struct mavl * l,int idx) | ||||||
| { | { | ||||||
| 	//return avltree_get(l); | 	//return avltree_get(l); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| struct nlt_wiphyinfo * nlt_wiphylist_add(struct avltree * t, struct nlt_wiphyinfo * wi) | struct nlt_wiphyinfo * nlt_wiphylist_add(struct mavl * t, struct nlt_wiphyinfo * wi) | ||||||
| { | { | ||||||
| 	return avltree_add(t,wi); | 	int exists; | ||||||
|  | 	return mavl_insert(t,wi,exists); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -258,7 +260,7 @@ static int nlCallback(struct nl_msg *msg, void *arg) | |||||||
| 		       genlmsg_attrlen(ghdr, 0), NULL); | 		       genlmsg_attrlen(ghdr, 0), NULL); | ||||||
|  |  | ||||||
| 	if (rc < 0) { | 	if (rc < 0) { | ||||||
| 		cw_dbg(DBG_DRV_ERR, "nla_parse failed: %d %d", rc, nl_geterror(rc)); | 		cw_dbg(DBG_X, "nla_parse failed: %d %d", rc, nl_geterror(rc)); | ||||||
| 		return NL_SKIP; | 		return NL_SKIP; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -267,7 +269,7 @@ static int nlCallback(struct nl_msg *msg, void *arg) | |||||||
|  |  | ||||||
| 	switch (cmd) { | 	switch (cmd) { | ||||||
| 		case NL80211_CMD_NEW_WIPHY: | 		case NL80211_CMD_NEW_WIPHY: | ||||||
| 			add_wiphy_data(msgattribs, arg); | 			//add_wiphy_data(msgattribs, arg); | ||||||
| 			break; | 			break; | ||||||
| //              case NL80211_CMD_NEW_INTERFACE: | //              case NL80211_CMD_NEW_INTERFACE: | ||||||
| //                      add_interface_data(msgattribs); | //                      add_interface_data(msgattribs); | ||||||
| @ -337,7 +339,6 @@ static int get_wiphy_info_cb(struct nl_msg * msg,void * arg) | |||||||
|  |  | ||||||
| int nlt_get_wiphy_list(struct nl_sock *sk) | int nlt_get_wiphy_list(struct nl_sock *sk) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	struct nlt_wiphyinfo ** wi = malloc (sizeof(struct nlt_wiphyinfo *)*NLT_MAX_WIPHYINDEX); | 	struct nlt_wiphyinfo ** wi = malloc (sizeof(struct nlt_wiphyinfo *)*NLT_MAX_WIPHYINDEX); | ||||||
| 	if (wi==0) | 	if (wi==0) | ||||||
| 		return 0; | 		return 0; | ||||||
| @ -347,9 +348,9 @@ int nlt_get_wiphy_list(struct nl_sock *sk) | |||||||
| 	struct nl_msg * msg = nlt_nl_msg_new(sk,NL80211_CMD_GET_WIPHY,NLM_F_DUMP); | 	struct nl_msg * msg = nlt_nl_msg_new(sk,NL80211_CMD_GET_WIPHY,NLM_F_DUMP); | ||||||
| 	nl_send_auto(sk, msg); | 	nl_send_auto(sk, msg); | ||||||
| 	struct nl_cb *nl_cb = get_nl_cb(get_wiphy_info_cb,wi); | 	struct nl_cb *nl_cb = get_nl_cb(get_wiphy_info_cb,wi); | ||||||
| //	while(1){ | 	while(1){ | ||||||
| 		int nlr = nl_recvmsgs(sk, nl_cb); | 		int nlr = nl_recvmsgs(sk, nl_cb); | ||||||
| //	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| 	int i; | 	int i; | ||||||
| @ -364,4 +365,15 @@ int nlt_get_wiphy_list(struct nl_sock *sk) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| */ | nlt_test() | ||||||
|  | { | ||||||
|  | 	struct nl_sock *nl; | ||||||
|  | 	nl = nl_socket_alloc(); | ||||||
|  | 	if (!nl) { | ||||||
|  | 		fprintf(stderr, "Failed to allocate netlink socket.\n"); | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	nlt_get_wiphy_list(nl); | ||||||
|  |  | ||||||
|  | } | ||||||
|  | |||||||
| @ -89,7 +89,6 @@ struct bootcfg bootcfg; | |||||||
|  |  | ||||||
|  |  | ||||||
| #include "cw/file.h" | #include "cw/file.h" | ||||||
| #include <libwifi.h> |  | ||||||
|  |  | ||||||
| #include "cw/dot11.h" | #include "cw/dot11.h" | ||||||
|  |  | ||||||
| @ -100,6 +99,11 @@ int test() | |||||||
| 	size_t len; | 	size_t len; | ||||||
| 	f=(uint8_t*)cw_load_file("wificap-002",&len); | 	f=(uint8_t*)cw_load_file("wificap-002",&len); | ||||||
| 	cw_dbg(DBG_X, "Loaded %d bytes",len); | 	cw_dbg(DBG_X, "Loaded %d bytes",len); | ||||||
|  | 	int l; | ||||||
|  |  | ||||||
|  | 	uint8_t rates[] = { | ||||||
|  | 		12,0x82,0x84,0x8b,0x96,0x0c,0x12,0x18,0x24,0x30,0x48,0x60,0x6c	 | ||||||
|  | 	};  | ||||||
|  |  | ||||||
| //	static int got_radiotap = 0; | //	static int got_radiotap = 0; | ||||||
| //	struct libwifi_frame frame = {0}; | //	struct libwifi_frame frame = {0}; | ||||||
| @ -145,8 +149,12 @@ int test() | |||||||
| 	dot11_assoc_resp_set_cap(rframe,dot11_assoc_req_get_cap(frame)); | 	dot11_assoc_resp_set_cap(rframe,dot11_assoc_req_get_cap(frame)); | ||||||
| 	dot11_assoc_resp_set_status_code(rframe,0); | 	dot11_assoc_resp_set_status_code(rframe,0); | ||||||
| 	dot11_assoc_resp_set_assoc_id(rframe,17); | 	dot11_assoc_resp_set_assoc_id(rframe,17); | ||||||
|  | 	l=24+6; | ||||||
|  |  | ||||||
| 	cw_dbg_dot11_frame(rframe,24+6); |  | ||||||
|  | 	l+=dot11_put_supported_rates(rframe+l,rates); | ||||||
|  |  | ||||||
|  | 	cw_dbg_dot11_frame(rframe,l); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -205,6 +213,7 @@ int main (int argc, char **argv) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	test(); | 	test(); | ||||||
|  | 	nlt_test(); | ||||||
| 	stop(); | 	stop(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user