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); }
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; }
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; }
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; }
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; }