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; }
static void wtpman_image_data(struct wtpman *wtpman) { struct conn *conn = wtpman->conn; /* Image upload */ const char *filename = mbag_get_str(conn->outgoing, CW_ITEM_IMAGE_FILENAME, NULL); if (!filename) { cw_log(LOG_ERR, "Can't send image to %s. No Image Filename Item found.", sock_addr2str(&conn->addr)); return; } cw_dbg(DBG_INFO, "Sending image file '%s' to '%s'.", filename, sock_addr2str(&conn->addr)); FILE *infile = fopen(filename, "rb"); if (infile == NULL) { cw_log(LOG_ERR, "Can't open image %s: %s", sock_addr2str(&conn->addr), strerror(errno)); return; } CW_CLOCK_DEFINE(clk); cw_clock_start(&clk); mbag_item_t *eof = mbag_set_const_ptr(conn->outgoing, CW_ITEM_IMAGE_FILEHANDLE, infile); int rc = 0; while (conn->capwap_state == CW_STATE_IMAGE_DATA && rc == 0 && eof != NULL) { rc = cw_send_request(conn, CW_MSG_IMAGE_DATA_REQUEST); eof = mbag_get(conn->outgoing, CW_ITEM_IMAGE_FILEHANDLE); } if (rc) { cw_log(LOG_ERR, "Error sending image to %s: %s", sock_addr2str(&conn->addr), cw_strrc(rc)); } else { cw_dbg(DBG_INFO, "Image '%s' sucessful sent to %s in %0.1f seconds.", filename, sock_addr2str(&conn->addr), cw_clock_stop(&clk)); conn->capwap_state = CW_STATE_NONE; } fclose(infile); wtpman_remove(wtpman); }
cw_aciplist_t cw_select_ac(struct conn *conn, mbag_t discs) { /* create a list for results */ cw_aciplist_t resultlist=cw_aciplist_create(); if (!resultlist) return NULL; if (!discs) return resultlist; /* cw_aciplist_t aciplist = cw_aciplist_create(); if (!aciplist) { cw_log(LOG_ERROR, "Can't allocate aciplist"); return NULL; } */ /* get the AC Name with Priority list */ cw_acpriolist_t priolist; priolist = mbag_get_mavl(conn->config, CW_ITEM_AC_NAME_WITH_PRIORITY); if (!priolist ) priolist=cw_acpriolist_create(); /* for each discovery reponse */ DEFINE_AVLITER(i, discs); avliter_foreach(&i){ mbag_t ac = ((mbag_item_t *) (avliter_get(&i)))->data; /* get the ac name */ char *ac_name = mbag_get_str(ac, CW_ITEM_AC_NAME,NULL); int prio = 256; if (ac_name) { /* See if we can find AC Name in Priority List */ if (priolist) prio = cw_acpriolist_get(priolist, ac_name); } /* get the IP list, the current AC has sent */ cw_aciplist_t acips = mbag_get_mavl(ac, CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST); if (!acips) continue; /* for each IP from the current AC add it to the result list * and give it the priority whe have determined */ DEFINE_AVLITER(i2, acips); avliter_foreach(&i2){ cw_acip_t *acip = avliter_get(&i2); cw_acip_t *n = malloc(sizeof(cw_acip_t)); memcpy(n,acip,sizeof(cw_acip_t)); /* we missuse the wtp_count to sort by * priority and wp_count */ n->wtp_count |= prio<<16; cw_aciplist_del(resultlist,n); cw_aciplist_add(resultlist,n); } } return resultlist; }