int ac_global_init() { // mod_set_actions_registered_cb(setup_actions); ac_config = mbag_create(); mbag_set_str(ac_config, CW_ITEM_AC_NAME, conf_acname); mbag_set_ptr(ac_config, CW_ITEM_AC_STATUS, &ac_status); ac_status.stations = 0; ac_status.limit = 1000; ac_status.active_wtps = 10; ac_status.max_wtps = 200; ac_status.security = CW_FLAG_AC_SECURITY_X | CW_FLAG_AC_SECURITY_S; ac_status.rmac_field = CW_FLAG_RMAC_SUPPORTED; ac_status.dtls_policy = CW_FLAG_DTLS_POLICY_C; // | CW_FLAG_DTLS_POLICY_D; mbag_set_bstrv(ac_config, CW_ITEM_AC_HARDWARE_VERSION, 0, bstr_data(conf_hardware_version), bstr_len(conf_hardware_version)); mbag_set_bstrv(ac_config, CW_ITEM_AC_SOFTWARE_VERSION, 0, bstr_data(conf_software_version), bstr_len(conf_software_version)); mbag_set_str(ac_config,CW_ITEM_AC_IMAGE_DIR,conf_image_dir); // mbag_set_avltree(ac_config, CW_ITEM_AC_IP_LIST, aciplist); mbag_set_fun(ac_config, CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST, get_iplist,release_iplist,(void*)771); return 1; }
int bstr_to_str(char *dst, bstr_t str,char * def) { if (!str){ if (!def) return 0; return sprintf(dst,"%s",def); } int printable = cw_is_printable(bstr_data(str),bstr_len(str)); int l=bstr_len(str); if (printable){ memcpy((char*)dst,bstr_data(str),l); *(dst+l)=0; return l; } int i; int c=0; char *s = dst; for (i=0; i<l; i++){ if (!c){ s += sprintf(s,"%02X",bstr_data(str)[i]); c=1; } else s += sprintf(s,",%02X",bstr_data(str)[i]); } return s-dst; }
void cwmsg_addelem_80211_add_wlan(struct cwmsg *cwmsg,struct cwwlan *wlan) { uint16_t capab=htons(wlan->capab); uint16_t keylen=htons(wlan->key_length); cwmsg_vaddelem(cwmsg,CW_ELEM_80211_ADD_WLAN, &wlan->rid,1, &wlan->wid,1, &capab,2, &wlan->key_index,1, &wlan->key_status,1, &keylen,2, wlan->key,wlan->key_length, wlan->group_tsc,6, &wlan->qos,1, &wlan->auth_type,1, &wlan->mac_mode,1, &wlan->tunnel_mode,1, &wlan->suppress_ssid,1, bstr_data(wlan->ssid),bstr_len(wlan->ssid), NULL ); }
static int to_str ( const struct cw_KTV *data, char *dst, int max_len ) { int l; struct sockaddr_storage addr; l = bstr_len(data->val.ptr); if (l==4){ addr.ss_family = AF_INET; memcpy(&(((struct sockaddr_in*)&addr)->sin_addr),bstr_data(data->val.ptr),4); sock_addr2str(&addr,dst); return 4; } if (l==16){ addr.ss_family = AF_INET6; memcpy(&(((struct sockaddr_in6*)&addr)->sin6_addr),bstr_data(data->val.ptr),16); sock_addr2str(&addr,dst); return 16; } *dst=0; return 0; }
static void * data(cw_KTV_t * data) { return bstr_data(data->val.ptr); }
int hdr_print(char *str, uint8_t *packet, int len) { char *s = str; if (len<1){ s+=sprintf(s,"\tNo info available."); return s-str; } int preamble = cw_get_hdr_preamble(packet); //CWTH_GET_PREAMBLE(packet); if (preamble==01){ s+=sprintf(s,"\tEncrypted data."); return s-str; } if (preamble!=00){ s+=sprintf(s,"\tWrong CAPWAP version or encryption type."); return s-str; } if (len < 4){ s+=sprintf(s,"\tNo more data. Packet too short."); return s-str; } int hlen = cw_get_hdr_hlen(packet); //CWTH_GET_HLEN(packet); int rid = cw_get_hdr_rid(packet); int wbid = cw_get_hdr_wbid(packet); s+=sprintf(s,"\tHLEN: %d, RID: %02X, WBID %02X",hlen,rid,wbid); s+=sprintf(s," Flags: (T=%d,F=%d,L=%d,W=%d,M=%d,K=%d)\n", cw_get_hdr_flag_t(packet), cw_get_hdr_flag_f(packet), cw_get_hdr_flag_l(packet), cw_get_hdr_flag_w(packet), cw_get_hdr_flag_m(packet), cw_get_hdr_flag_k(packet) ); if (cw_get_hdr_flag_m(packet)){ uint8_t * rmac = cw_get_hdr_rmac(packet); s+=sprintf(s,"\tRadio MAC: %s\n",sock_hwaddr2str(bstr_data(rmac), bstr_len(rmac))); } if (len < 8){ s+=sprintf(s,"\tNo more data. Packet too short."); return s-str; } int frag_id = cw_get_hdr_fragid(packet); int frag_offs = cw_get_hdr_fragoffset(packet); s+=sprintf(s,"\tFrag Id: %d, Frag Offs:: %d\n",frag_id,frag_offs); int bhlen = 4*hlen; if (cw_get_hdr_flag_f(packet) && frag_offs!=0){ s+=sprintf(s,"\tFragment data ..."); return s-str; } if (len<bhlen+4){ s+=sprintf(s,"\tNo more data. Packet too short."); return s-str; } int msgtype = ntohl(*((uint32_t*)(packet+bhlen))); s+=sprintf(s,"\tMsgType: %d",msgtype); if (len<bhlen+8){ s+=sprintf(s,"\n\tNo more data. Packet too short."); return s-str; } int seqnum = (ntohl(*((uint32_t*)(packet+bhlen+4))))>>24; int msgelemlen = 0xFF & ((ntohl(*((uint32_t*)(packet+bhlen+4))))>>8); s+=sprintf(s,", SeqNum: %d, MsgelemLen:%d",seqnum,msgelemlen); return s-str; }
int wtpinfo_print(char *str, struct wtpinfo * wtpinfo) { char hstr[64]; char *s = str; s+=sprintf (s,"\tWTP Name: %s\n", (!wtpinfo->name ? (uint8_t*)"Not set" : wtpinfo->name) ); s+=sprintf (s,"\tLocation: %s\n", (!wtpinfo->location ? (uint8_t*)"Not set" : wtpinfo->location) ); s+=sprintf (s,"\tMAC Adress: "); if (wtpinfo->macaddress){ sock_hwaddrtostr(wtpinfo->macaddress,wtpinfo->macaddress_len,hstr,":"); s+=sprintf(s,"%s\n",hstr); } else s+=sprintf(s,"Not set\n"); char disctypestr[32]; switch(wtpinfo->discovery_type){ case CW_DISCOVERY_TYPE_STATIC: sprintf(disctypestr,"Static"); break; case CW_DISCOVERY_TYPE_DHCP: sprintf(disctypestr,"DHCP"); break; case CW_DISCOVERY_TYPE_DNS: sprintf(disctypestr,"DNS"); break; case CW_DISCOVERY_TYPE_AC_REFERRAL: sprintf(disctypestr,"AC Referral"); break; default: sprintf(disctypestr,"Unknown"); break; } s+=sprintf (s,"\tDiscovery Type: %s\n",disctypestr); // sock_addrtostr((struct sockaddr*)&wtpinfo->local_ip,hstr,64); /* int i0; for (i0=0; i0<10; i0++){ printf("%d\n", ((char*)(&wtpinfo->local_ip))[i0] ); } */ s+=sprintf (s,"\tLocal IP: %s\n",sock_addr2str(&(wtpinfo->local_ip))); s+=sprintf (s,"\tVendor ID: %d, %s\n", wtpinfo->vendor_id,lw_vendor_id_to_str(wtpinfo->vendor_id) ); s+=sprintf (s,"\tModel No.: "); //, (!wtpinfo->model_no ? (uint8_t*)"Not set" : wtpinfo->model_no) ); s+=bstr_to_str(s,wtpinfo->model_no,0); s+=sprintf(s,"\n"); // s+=sprintf (s,"\tSerial No.: %s\n", (!wtpinfo->serial_no ? (uint8_t*)"Not set" : wtpinfo->serial_no) ); s+=sprintf (s,"\tSerial No.: "); s+=bstr_to_str(s,wtpinfo->serial_no,0); s+=sprintf(s,"\n"); s+=sprintf (s,"\tBoard ID: "); s+=bstr_to_str(s,wtpinfo->board_id,0); s+=sprintf(s,"\n"); s+=sprintf (s,"\tBoard Revision: "); s+=bstr_to_str(s,wtpinfo->board_revision,0); s+=sprintf(s,"\n"); // s+=sprintf (s,"\tBoard Id: %s\n", (!wtpinfo->board_id ? (uint8_t*)"Not set" : wtpinfo->board_id) ); s+=sprintf (s,"\tSoftware Version: "); // s+=version_print(s,wtpinfo->software_version,wtpinfo->software_version_len,wtpinfo->software_vendor_id); s+=cw_format_version(s,wtpinfo->software_version,wtpinfo->software_vendor_id,"Not set"); s+=sprintf (s,"\n"); s+=sprintf (s,"\tHardware Version: "); s+=version_print(s,wtpinfo->hardware_version,wtpinfo->hardware_version_len,wtpinfo->hardware_vendor_id); s+=sprintf (s,"\tBootloader Version: "); s+=version_print(s,wtpinfo->bootloader_version,wtpinfo->bootloader_version_len,wtpinfo->bootloader_vendor_id); //, (!wtpinfo->software_version ? (uint8_t*)"Not set" : wtpinfo->software_version) ); // s+=sprintf (s,"\tHardware Version: %s\n", (!wtpinfo->hardware_version ? (uint8_t*)"Not set" : wtpinfo->hardware_version) ); s+=sprintf (s,"\tMax Radios: %d\n",wtpinfo->max_radios); s+=sprintf (s,"\tRadios in use: %d\n",wtpinfo->radios_in_use); s+=sprintf (s,"\tSession ID: "); if (wtpinfo->session_id) { int i; for (i=0; i<bstr_len(wtpinfo->session_id); i++) s+=sprintf(s,"%02X",bstr_data(wtpinfo->session_id)[i]); } else s+=sprintf(s,"Not set"); s+=sprintf(s,"\n"); s+=sprintf (s,"\tMAC Type: "); switch (wtpinfo->mac_type){ case WTP_MAC_TYPE_LOCAL: s+=sprintf(s,"local"); break; case WTP_MAC_TYPE_SPLIT: s+=sprintf(s,"split"); break; case WTP_MAC_TYPE_BOTH: s+=sprintf(s,"local, split"); break; } s+=sprintf(s,"\n"); s+=sprintf (s,"\tFrame Tunnel Mode: "); s+=sprintf(s,"(%08X)",wtpinfo->frame_tunnel_mode); char * c=""; if (wtpinfo->frame_tunnel_mode & WTP_FRAME_TUNNEL_MODE_N){ s+=printf (s,"%snative",c);c=", "; } if (wtpinfo->frame_tunnel_mode & WTP_FRAME_TUNNEL_MODE_E){ s+=sprintf (s,"%s802.3",c);c=", "; } if (wtpinfo->frame_tunnel_mode & WTP_FRAME_TUNNEL_MODE_L){ s+=sprintf (s,"%sLocal bridging",c);c=", "; } if (wtpinfo->frame_tunnel_mode == 0) s+=sprintf(s," None"); s+=sprintf(s,"\n"); s+=sprintf(s,"\tRadios: %d\n",wtpinfo->max_radios); int i; char ristr[2048]; char *r = ristr; for (i=0; i<wtpinfo->max_radios; i++){ if (wtpinfo->radioinfo[i].set) r+=radioinfo_print(r,&wtpinfo->radioinfo[i]); } s+=sprintf(s,"%s",ristr); s+=sprintf(s,"Encryption: %08x\n",wtpinfo->encryption_cap); s+=wtp_reboot_statistics_print(s,&wtpinfo->reboot_statistics); return s-str; }