int run() { struct conn *conn = get_conn(); conn->capwap_state = CW_STATE_RUN; do { int echo_interval = mbag_get_word(conn->config,CW_ITEM_CAPWAP_TIMERS,CAPWAP_TIMERS)&0xff; time_t timer = cw_timer_start(echo_interval); int rc; while (!cw_timer_timeout(timer) && conn->capwap_state == CW_STATE_RUN) { rc = cw_read_messages(conn); if (rc < 0 && errno == EAGAIN) { continue; } if ( !cw_rcok(rc)) break; } if (rc<0 && errno == EAGAIN){ rc = cw_send_request(conn,CW_MSG_ECHO_REQUEST); if (!cw_rcok(rc)) { cw_log(LOG_ERR,"Error in run state: %d %s",rc,cw_strrc(rc)); break; } continue; } if (!cw_rcok(rc)) { cw_log(LOG_ERR,"Error in run state: %d %s",rc,cw_strrc(rc)); break; } } while (conn->capwap_state == CW_STATE_RUN); // int rc = cw_send_request(conn,CW_MSG_CHANGE_STATE_EVENT_REQUEST); // if ( !cw_rcok(rc) ) { // cw_strresult(rc); // } return 0; }
static void do_update(struct conn * conn) { if (!update) return; update=0; mbag_t result = mbag_create(); update_radios(conn,result); cw_dbg(DBG_INFO, "Saving configuration ..."); cfg_to_json(); /* Change State ... */ int rc = cw_send_request(conn,CW_MSG_CHANGE_STATE_EVENT_REQUEST); if ( !cw_rcok(rc) ) { cw_strresult(rc); return ; } }
int changestate() { struct conn * conn = get_conn(); /* Update operational states, so they will be included in the change Change State Event Request message. */ cw_radio_update_oper_states(conn->radios,0); /* Change State ... */ int rc = cw_send_request(conn,CW_MSG_CHANGE_STATE_EVENT_REQUEST); if ( !cw_rcok(rc) ) { cw_strresult(rc); return 0; } return 1; }
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; }
static void wtpman_run(void *arg) { struct wtpman *wtpman = (struct wtpman *) arg; wtpman->conn->seqnum = 0; struct conn *conn = wtpman->conn; /* reject connections to our multi- or broadcast sockets */ /* if (socklist[wtpman->socklistindex].type != SOCKLIST_UNICAST_SOCKET) { cw_dbg(DBG_DTLS, "Dropping connection from %s to non-unicast socket.", CLIENT_IP); wtpman_remove(wtpman); return; } */ time_t timer = cw_timer_start(wtpman->conn->wait_dtls); /* establish dtls session */ /* if (!wtpman_establish_dtls(wtpman)) { wtpman_remove(wtpman); return; } */ /* dtls is established, goto join state */ if (!wtpman_join(wtpman, timer)) { wtpman_remove(wtpman); return; } conn->msg_start = msg_start_handler; cw_dbg(DBG_INFO, "WTP from %s has joined with session id: %s", sock_addr2str_p(&conn->addr), format_bin2hex(conn->session_id,16)); // cw_dbg(DBG_INFO, "Creating data thread"); // pthread_t thread; // pthread_create(&thread, NULL, (void *) wtpman_run_data, (void *) wtpman); /* here the WTP has joined, now we assume an image data request or an configuration status request. Nothing else. */ int rc = 0; while (!cw_timer_timeout(timer) && wtpman->conn->capwap_state == CW_STATE_CONFIGURE) { rc = cw_read_messages(wtpman->conn); if (rc < 0) { if (errno != EAGAIN) break; } } if (!cw_rcok(rc)) { cw_dbg(DBG_INFO, "WTP Problem: %s", cw_strrc(rc)); wtpman_remove(wtpman); return; } if (conn->capwap_state == CW_STATE_IMAGE_DATA) { wtpman_image_data(wtpman); return; } conn->capwap_state = CW_STATE_RUN; // XXX testing ... // DBGX("Cofig to sql", ""); props_to_sql(conn,conn->incomming,0); radios_to_sql(conn); conn->msg_end=msg_end_handler; /* The main run loop */ reset_echointerval_timer(wtpman); rc = 0; while (wtpman->conn->capwap_state == CW_STATE_RUN) { rc = cw_read_messages(wtpman->conn); if (rc < 0) { if (errno != EAGAIN) break; } // cw_dbg(DBG_X, "Time left: %d", // cw_timer_timeleft(wtpman->echointerval_timer)); if (cw_timer_timeout(wtpman->echointerval_timer)) { cw_dbg(DBG_INFO, "Lost connection to WTP:%s", sock_addr2str_p(&conn->addr)); break; } mavl_del_all(conn->outgoing); conn_clear_upd(conn,1); // props_to_sql(conn,conn->incomming,0); // radios_to_sql(conn); mavl_conststr_t r; r = db_get_update_tasks(conn, sock_addr2str(&conn->addr)); if (r) { if (!conn->outgoing->count) continue; cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr)); rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); mavl_merge(conn->config, conn->outgoing); mavl_destroy(conn->outgoing); conn->outgoing = mbag_create(); props_to_sql(conn,conn->incomming,0); radios_to_sql(conn); mavl_destroy(r); } r = db_get_radio_tasks(conn, sock_addr2str(&conn->addr)); if (r) { if (!conn->radios_upd->count) continue; cw_dbg(DBG_INFO, "Updating Radios for %s",sock_addr2str(&conn->addr)); rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); conn_clear_upd(conn,1); // mavl_destroy(conn->radios_upd); // conn->radios_upd=mbag_i_create(); radios_to_sql(conn); /* rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); mavl_merge(conn->config, conn->outgoing); mavl_destroy(conn->outgoing); conn->outgoing = mbag_create(); config_to_sql(conn); radios_to_sql(conn); mavl_destroy(r); */ } } db_ping_wtp(sock_addr2str_p(&conn->addr), ""); wtpman_remove(wtpman); return; }