Moved join stuff into separate function.

Code will be better readable.

FossilOrigin-Name: 4877a80784ffcf973dbd7ec28c3e9fc45a774a2c5b0559e7f4a6c35466aa8b0b
This commit is contained in:
7u83@mail.ru 2014-08-24 13:07:30 +00:00
parent b702ba6c89
commit be45c3cef0
1 changed files with 129 additions and 59 deletions

View File

@ -56,17 +56,18 @@ static struct cwrmsg * conn_wait_for_message(struct conn * conn, time_t timer)
while (!cw_timer_timeout(timer)){
cwrmsg = conn_get_message(conn);
if (!cwrmsg)
continue;
cw_dbg(DBG_CW_MSG,"Received message from %s, type=%d - %s"
,sock_addr2str(&conn->addr),cwrmsg->type,cw_msgtostr(cwrmsg->type));
if (!cwrmsg){
if (!conn_is_error(conn))
continue;
return 0;
}
if (cwrmsg->type & 1){
if (conn->request_handler){
conn->request_handler(conn->request_handler_param);
continue;
if (conn->request_handler(conn->request_handler_param))
continue;
}
@ -80,15 +81,73 @@ static struct cwrmsg * conn_wait_for_message(struct conn * conn, time_t timer)
}
struct rh_param{
struct conn * conn;
int *msglist;
/*
static struct conn_wait_for_request(struct conn * conn, int *msglist, time_t timer)
};
static int conn_rh(void *param)
{
struct cwrmsg * cwrmsg;
struct rh_param * p = (struct rh_param*)param;
int i;
int *msglist=p->msglist;
for (i=0; msglist[i]!=-1; i++){
if (msglist[i] == p->conn->cwrmsg.type )
return 0;
}
/* unexpected response here */
cw_log(LOG_ERR,"Unexpected message from %s",sock_addr2str(&p->conn->addr));
cwsend_unknown_response(p->conn,p->conn->cwrmsg.seqnum,p->conn->cwrmsg.type);
return 1;
}
*/
static struct cwrmsg * conn_wait_for_request(struct conn * conn, int *msglist, time_t timer)
{
int (*request_handler_save) (void*);
void * request_handler_param_save;
struct rh_param rh_param;
if (msglist){
request_handler_save=conn->request_handler;
request_handler_param_save=conn->request_handler_param;
rh_param.conn=conn;
rh_param.msglist=msglist;
conn->request_handler=conn_rh;
conn->request_handler_param=&rh_param;
}
struct cwrmsg * cwrmsg;
while (!cw_timer_timeout(timer)){
cwrmsg = conn_wait_for_message(conn,timer);
if (!cwrmsg){
if (!conn_is_error(conn))
continue;
break;
}
/* response message? no action*/
if (! (cwrmsg->type & 1) )
continue;
/* it's a request message */
break;
}
if (msglist){
conn->request_handler=request_handler_save;
conn->request_handler_param=request_handler_param_save;
}
return cwrmsg;
}
@ -126,7 +185,7 @@ struct cwrmsg * conn_send_request(struct conn * conn)
}
void wtpman_handle_request(void *p)
int wtpman_handle_request(void *p)
{
struct wtpman * wtpman = (struct wtpman *)p;
struct conn * conn = wtpman->conn;
@ -142,8 +201,8 @@ void wtpman_handle_request(void *p)
default:
printf("Unhandeleed message %d!!!!!!!!!!!!\n",cwrmsg->type);
cwsend_unknown_response(conn,cwrmsg->seqnum,cwrmsg->type);
}
return 1;
}
@ -373,56 +432,26 @@ static int wtpman_establish_dtls(void *arg)
return 1;
}
static void wtpman_run(void *arg)
static int wtpman_join(void *arg,time_t timer)
{
struct wtpman * wtpman = (struct wtpman *)arg;
struct cwrmsg * cwrmsg = conn_get_message(wtpman->conn);
/* timer = cw_timer_start(wtpman->conn->wait_join); */
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;
}
printf("DTLS ready\n");
exit(0);
timer = cw_timer_start(wtpman->conn->wait_join);
/* In join state, wait for join request */
cwrmsg = wtpman_wait_for_message(wtpman,timer);
int join_msgs[] = { CWMSG_JOIN_REQUEST, -1 };
struct cwrmsg * cwrmsg;
cwrmsg = conn_wait_for_request(wtpman->conn, join_msgs, timer);
if (!cwrmsg){
if (conn_is_error(wtpman->conn)){
cw_dbg(DBG_CW_MSG_ERR,"DTLS connection closed while waiting for join request from %s.",CLIENT_IP);
return 0;
}
cw_dbg(DBG_CW_MSG_ERR,"No join request from %s after %d seconds, WTP died.",
sock_addr2str(&wtpman->conn->addr),wtpman->conn->wait_join);
wtpman_remove(wtpman);
return;
}
if (cwrmsg == (struct cwrmsg*)EOF){
cw_dbg(DBG_CW_MSG_ERR,"DTLS connection closed while waiting for join request from %s.",CLIENT_IP);
wtpman_remove(wtpman);
return;
sock_addr2str(&wtpman->conn->addr),wtpman->conn->wait_dtls);
return 0;
}
/* the received message MUST be a join request */
if (cwrmsg->type != CWMSG_JOIN_REQUEST){
cw_dbg(DBG_CW_MSG_ERR,"Join request expected from %s, but got %i",CLIENT_IP,cwrmsg->type);
wtpman_remove(wtpman);
return;
}
process_join_request(&wtpman->wtpinfo,cwrmsg->msgelems,cwrmsg->msgelems_len);
{
@ -445,9 +474,50 @@ static void wtpman_run(void *arg)
wtpman->wtpinfo.name,wtpman->wtpinfo.location,
sock_addr2str(&wtpman->conn->addr));
return 1;
}
static void wtpman_run(void *arg)
{
struct wtpman * wtpman = (struct wtpman *)arg;
struct cwrmsg * cwrmsg = conn_get_message(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;
}
/* here the WTP has joined */
printf("WTP is joined now\n");
exit(0);
int result_code = 0;
struct radioinfo * radioinfo;
cwrmsg = wtpman_wait_for_message(wtpman,timer);
if (!cwrmsg){
cw_dbg(DBG_CW_MSG_ERR,"No config or update request from %s after %d seconds, WTP died.",
@ -461,8 +531,8 @@ static void wtpman_run(void *arg)
cwread_configuration_status_request(&wtpman->wtpinfo,cwrmsg->msgelems, cwrmsg->msgelems_len);
cwsend_conf_status_response(wtpman->conn,cwrmsg->seqnum,result_code,&radioinfo,acinfo,&wtpman->wtpinfo);
// cwread_configuration_status_request(&wtpman->wtpinfo,cwrmsg->msgelems, cwrmsg->msgelems_len);
// cwsend_conf_status_response(wtpman->conn,cwrmsg->seqnum,result_code,&radioinfo,acinfo,&wtpman->wtpinfo);
char wtpinfostr[8192];
wtpinfo_print(wtpinfostr,&wtpman->wtpinfo);
@ -553,7 +623,7 @@ exit(0);
}
/*
if (cwrmsg->type == CWMSG_CONFIGURATION_STATUS_REQUEST){
process_conf_status_request(&wtpman->wtpinfo,cwrmsg->msgelems,cwrmsg->msgelems_len);
{
@ -566,7 +636,7 @@ if (cwrmsg->type == CWMSG_CONFIGURATION_STATUS_REQUEST){
}
*/
msg_counter=0;