예제 #1
0
int cw_in_check_disc_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
			 int len,struct sockaddr *from)
{

	cw_action_in_t *mlist[120];
	int n = cw_check_missing_mand(mlist, conn, a);

	conn->capwap_state = CW_STATE_NONE;


	if (n && conn->strict_capwap) {
		cw_dbg_missing_mand(DBG_MSG_ERR, conn, mlist, n, a);
		/* if mandatory elements are missing, in strict 
		   mode send no discovery response */
		cw_dbg(DBG_MSG_ERR,
		       "Ignoring Discovery Request from %s - missing mandatory elements.",
		       sock_addr2str(from));
		return -1;
	}

	if ( n ) {
		/* put a warning here */
		cw_dbg_missing_mand(DBG_RFC, conn, mlist, n, a);
	}

		

	/* ok, send response */
	conn->capwap_state = CW_STATE_JOIN;

	return 0;
}
예제 #2
0
int cw_in_check_join_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
			 int len,struct sockaddr *from)
{

	cw_action_in_t * mlist[60];

	/* Check for mandatory elements */
	int n = cw_check_missing_mand(mlist,conn,a);
	if (n) {
		if ( conn->strict_capwap ){
			cw_dbg_missing_mand(DBG_MSG_ERR,conn,mlist,n,a);
			conn->capwap_state=CW_STATE_JOIN;
			return CW_RESULT_MISSING_MAND_ELEM;
		}
		cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a);
	}

	connlist_lock(conn->connlist);
	struct conn *cc = connlist_get_by_session_id(conn->connlist,conn);
	if (!cc){
		connlist_add_by_session_id(conn->connlist,conn);
	}
	connlist_unlock(conn->connlist);
	if (cc){
		cw_dbg(DBG_ELEM_ERR,"Session already in use %s",format_bin2hex(conn->session_id,16));
		conn->capwap_state=CW_STATE_JOIN;
		return CW_RESULT_JOIN_FAILURE_SESSION_ALREADY_IN_USE;
	}
	
	/* set result code to ok and change to configure state */
	mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);
	conn->capwap_state = CW_STATE_CONFIGURE;

	return 0;
}
int cw_in_check_img_data_req_wtp(struct conn *conn, struct cw_action_in *a, uint8_t * data,
			 int len,struct sockaddr *from)
{

	mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);	
		conn->capwap_state=CW_STATE_IMAGE_DATA;
//usleep(100000);
	return 0;

	return CW_RESULT_IMAGE_DATA_ERROR;
	return 0;


	/* Check for mandatory elements */
	cw_action_in_t * mlist[60];
	int n = cw_check_missing_mand(mlist,conn,a);
	if (n) {
		cw_dbg_missing_mand(DBG_ELEM,conn,mlist,n,a);
		conn->capwap_state=CW_STATE_JOIN;
		return CW_RESULT_MISSING_MAND_ELEM;
	}

	
	struct mbag_item *i = mbag_get(conn->incomming,CW_ITEM_IMAGE_IDENTIFIER);
	if (i) {
		uint32_t vendor_id = vendorstr_get_vendor_id(i->data);

		const char * image_dir;
		image_dir = mbag_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) 
			return CW_RESULT_IMAGE_DATA_ERROR;

		sprintf(image_filename,"%s%04X/%s",image_dir,vendor_id,vendorstr_data(i->data));


		FILE *infile = fopen(image_filename,"rb");
		if (!infile){
			cw_log(LOG_WARNING,"Can't open image file: %s - %s - requestet by WTP",
				image_filename,strerror(errno));
			free(image_filename);
			return CW_RESULT_IMAGE_DATA_ERROR;
		}

		mbag_set_str(conn->outgoing,CW_ITEM_IMAGE_FILENAME,image_filename);
		mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);	
		conn->capwap_state=CW_STATE_IMAGE_DATA;
		return 0;
	}

	

	return CW_RESULT_IMAGE_DATA_ERROR;

}
예제 #4
0
int cw_in_check_join_resp(struct conn *conn, struct cw_action_in *a, uint8_t * data,
			 int len,struct sockaddr *from)
{

	cw_action_in_t * mlist[60];

	mbag_item_t * jresult = mbag_get(conn->incomming,CW_ITEM_RESULT_CODE);
	if  (jresult ) {
		if (!cw_rcok(jresult->dword)){
			return jresult->dword;
		}
	}


	/* Check for mandatory elements */
	int n = cw_check_missing_mand(mlist,conn,a);
	if (n && conn->strict_capwap) {
		cw_dbg_missing_mand(DBG_MSG_ERR,conn,mlist,n,a);
		conn->capwap_state=CW_STATE_JOIN;
		errno=EAGAIN;
		return -1; //CW_RESULT_MISSING_MAND_ELEM;
	}
	if (n){
		cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a);
	}

	


	if ( jresult ) {
		return jresult->dword;
	}

	/* set result code to ok and change to configure state */
//	mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);

	return 0;
}