예제 #1
0
int capwap_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * dst)
{

	mbag_t mbag = conn->config;

	// XXX Dummy WTP Descriptor Header
	uint8_t *d = dst+4;


//int n =conn->radios->count;
//printf("radio count %d\n",n);

	d+=cw_put_byte(d,conn->radios->count);	//max radios
	d+=cw_put_byte(d,2);	//radios in use

	d+=cw_put_encryption_subelems(d,conn->capwap_mode);

	mbag_item_t * i;
	i = mbag_get(mbag,CW_ITEM_WTP_HARDWARE_VERSION);
	if ( i ) {	
	 	d += cw_put_version(d,CW_SUBELEM_WTP_HARDWARE_VERSION,i->data);
		if (bstrv_get_vendor_id(i->data)){
			d += cw_put_dword(d, 0);
			d += cw_put_word(d, CW_SUBELEM_WTP_HARDWARE_VERSION);
			d += cw_put_word(d, bstrv_len(i->data));
			d += cw_put_data(d, bstrv_data(i->data), bstrv_len(i->data));

		}
	}
	else {
		cw_log(LOG_ERR, "Can't send Hardware Version in WTP Descriptor, not set.");
	}


	i = mbag_get(mbag,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.");
	}

	i = mbag_get(mbag,CW_ITEM_WTP_BOOTLOADER_VERSION);
	if ( i ) {	
	 	d += cw_put_version(d,CW_SUBELEM_WTP_BOOTLOADER_VERSION,i->data);
	}
	else {
		cw_log(LOG_ERR, "Can't send Bootloader Version in WTP descriptor, not set.");
	}


	int len = d-dst-4;
	return len + cw_put_elem_hdr(dst,a->elem_id,len);
}	
예제 #2
0
int cw_put_item(uint8_t * dst, struct mbag_item *item)
{
	if (MBAG_STR == item->type ){
		return cw_put_data(dst, item->data, strlen((char *) item->data));
	}

	if (MBAG_BYTE == item->type){
		return cw_put_byte(dst, item->byte);
	}
	if (MBAG_WORD == item->type){
		return cw_put_word(dst, item->word);
	}
	if (MBAG_DWORD == item->type){
		return cw_put_dword(dst, item->dword);
	}
	if (MBAG_BSTR  == item->type) {
		return cw_put_bstr(dst, item->data);
	}

	if ( MBAG_BSTR16 == item->type)
		return cw_put_bstr16(dst,item->data);

	if (MBAG_VENDORSTR == item->type)
	{
		int l=0;
		l+=cw_put_dword(dst, bstrv_get_vendor_id(item->data));
		l+=cw_put_data(dst+4, bstrv_data(item->data),bstrv_len(item->data));
		return l;
	}
	cw_log(LOG_ERR,"No method to put items of type %d",item->type);


	return 0;
}
static int put_ip(void *priv, void *data)
{
	uint8_t ** dptr = (uint8_t **)priv; 
	cw_acip_t *acip=(cw_acip_t*)data;

	uint8_t * dst = *dptr;

	uint8_t *d = dst+4;

	d+=cw_put_sockaddr(d,&acip->ip);
	d+=cw_put_word(d,acip->wtp_count);

	int fam = sock_addrfamily(&acip->ip);
	int elem_id=-1;
	switch (fam) {
		case AF_INET:
			elem_id = CW_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS;
			 break;
		case AF_INET6:
			elem_id = CW_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS;
			break;
		default: 
			cw_log(LOG_ERR,"Unknown adress family %d",fam);
			break;
	}

	if (elem_id != -1 ) {
		d+=cw_put_elem_hdr(dst,elem_id,d-dst-4);
		*dptr = d-4;
	}

	return 1;
}
int capwap_out_capwap_control_ip_address(struct cw_ElemHandler * eh, 
		struct cw_ElemHandlerParams * params, uint8_t * dst)
{
	char key[CW_KTV_MAX_KEY_LEN];
	int i;
	int wtps;
	cw_KTV_t * address;
	uint8_t *d;

	d = dst;
	i=0; 
	do {
/*		uint8_t * msg;*/
		int l;

		sprintf(key,"%s/address.%d",eh->key,i);
		address = cw_ktv_get(params->conn->local_cfg,key,CW_TYPE_IPADDRESS);
		sprintf(key,"%s/wtps.%d",eh->key,i);
		wtps = cw_ktv_get_word(params->conn->local_cfg,key,0);
		i++;
		if (address==NULL){
			break;
		}
		
/*		msg = d;*/
		
		l = address->type->len(address);

		switch(eh->id){
			case CAPWAP_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS:
				if (l!=4){
					continue;
				}
				break;
			case CAPWAP_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS:
				if (l!=16){
					continue;
				}
				break;
			default:
				continue;
		}
		
		l = address->type->put(address,d+4);
		l+=cw_put_word(dst+4+l,wtps);
		l+=cw_put_elem_hdr(d,eh->id,l);
		cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,eh,d+4,l-4);
		
		d+=l;
	}while(address != NULL);


	return d-dst;
}
예제 #5
0
int cw_put_mbag_item(uint8_t * dst, struct mbag_item *item)
{
	if (item->type->put){
		cw_dbg(DBG_X,"User put method to put ");
		return item->type->put(item,dst);
	}


	if (MBAG_STR == item->type ){
		return cw_put_data(dst, item->data, strlen((char *) item->data));
	}

	if (MBAG_DATA == item->type){
		return cw_put_data(dst, item->data+1, *((uint8_t*)item->data));
	}

	if (MBAG_BYTE == item->type){
		return cw_put_byte(dst, item->byte);
	}
	if (MBAG_WORD == item->type){
		return cw_put_word(dst, item->word);
	}
	if (MBAG_DWORD == item->type){
		return cw_put_dword(dst, item->dword);
	}
	if (MBAG_BSTR  == item->type) {
		return cw_put_bstr(dst, item->data);
	}

	if ( MBAG_BSTR16 == item->type)
		return cw_put_bstr16(dst,item->data);

	if (MBAG_VENDORSTR == item->type)
	{
		int l=0;
		l+=cw_put_dword(dst, bstrv_get_vendor_id(item->data));
		l+=cw_put_data(dst+4, bstrv_data(item->data),bstrv_len(item->data));
		return l;
	}

	
	if (MBAG_MBAG == item->type){
		*((void**)dst)=item->data;
		return sizeof(void *);
	}

	cw_log(LOG_ERR,"No method to put items of type %s",item->type->name);


	return 0;
}
예제 #6
0
static int cw_put_encryption_subelems(uint8_t *dst,int capwap_mode)
{
    if (capwap_mode==CW_MODE_CISCO) {
        cw_put_word(dst,0x01);
        return 2;
    }

    int n=2;

    dst+=cw_put_byte(dst,n);

    int i;
    for (i=0; i<n; i++) {
        dst+=cw_put_byte(dst,0);
        dst+=cw_put_byte(dst,0);
        dst+=cw_put_byte(dst,0);
    }

    return 3*n+1;
}
예제 #7
0
파일: dataman.c 프로젝트: yskcg/actube
int dataman_process_keep_alive(struct netconn *nc, uint8_t *rawmsg, int len)
{
	struct dataman * dm = (struct dataman *)(nc->data);

	uint8_t *msgptr = rawmsg + cw_get_hdr_msg_offset(rawmsg);


	int elems_len = cw_get_datamsg_elems_len(msgptr);
	uint8_t * elems_ptr = cw_get_datamsg_elems_ptr(msgptr);
	uint8_t * elem;

	cw_foreach_elem(elem, elems_ptr, elems_len) {

		if (cw_get_elem_id(elem) == CW_ELEM_SESSION_ID){
			uint8_t sessid[16];
			memset(sessid,0,16);

			int sessid_len = cw_get_elem_len(elem);

			printf("Sess id len = %d\n",sessid_len);

			memcpy(sessid,cw_get_elem_data(elem),sessid_len);

			struct wtpman * wtpman = wtplist_get_by_session_id(sessid);
			if (wtpman){
				if (!dm->wtpman)
					dm->wtpman=wtpman;

				uint8_t buffer[128];
				uint8_t * dl = cw_init_data_keep_alive_msg(buffer,NULL);
				uint8_t * d=dl+2;

				int l = cw_put_elem_session_id(d,sessid,sessid_len);
				cw_put_word(dl,l);

				int total_len = dl-buffer + l+2;
				printf("len len %d\n",l);
				printf("Total len = %d\n",total_len);

				netconn_send_capwap_msg(nc,buffer,total_len);
				return len;
					





				printf("Found!i yes I vae found it\n");
					
			}



			int l = cw_get_elem_len(elem);

			printf("ElemID: %d, len = %d\n", cw_get_elem_id(elem),l);
			char cb[64];
			format_hex(cb,sessid,16);
			printf("Session ID: %s",cb);




		}



	}

	errno=EAGAIN;
	return -1;	
}