2015-04-10 17:16:33 +02:00
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
#include "conn.h"
|
|
|
|
#include "capwap.h"
|
2015-04-10 17:52:01 +02:00
|
|
|
#include "log.h"
|
2015-04-10 17:16:33 +02:00
|
|
|
#include "sock.h"
|
2015-04-11 19:00:51 +02:00
|
|
|
#include "timer.h"
|
2015-04-10 17:16:33 +02:00
|
|
|
|
|
|
|
int cw_send_request(struct conn *conn,int msg_id)
|
|
|
|
{
|
|
|
|
cw_init_request(conn, msg_id);
|
|
|
|
if ( cw_put_msg(conn, conn->req_buffer) == -1 )
|
|
|
|
return 0;
|
|
|
|
conn_send_msg(conn, conn->req_buffer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
int rc=-1;
|
|
|
|
for (i=0; i<conn->max_retransmit && rc<0; i++){
|
2015-04-11 19:00:51 +02:00
|
|
|
if ( i>0 ){
|
|
|
|
cw_log(LOG_WARNING,"Retransmitting request ... %d",i);
|
|
|
|
}
|
2015-04-10 17:16:33 +02:00
|
|
|
time_t timer = cw_timer_start(conn->retransmit_interval);
|
|
|
|
while (!cw_timer_timeout(timer) && rc<0){
|
|
|
|
|
|
|
|
rc =cw_read_messages(conn);
|
|
|
|
if(rc<0){
|
|
|
|
if (errno!=EAGAIN)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
if (rc<0){
|
|
|
|
if(errno!=EAGAIN)
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-04-11 19:00:51 +02:00
|
|
|
if ( rc <0 && errno != EAGAIN) {
|
2015-04-10 17:16:33 +02:00
|
|
|
cw_log(LOG_ERR,"Error reading from %s:%s",sock_addr2str(&conn->addr),strerror(errno));
|
|
|
|
}
|
2015-04-11 19:00:51 +02:00
|
|
|
if ( rc <0 && errno == EAGAIN) {
|
|
|
|
errno=ETIMEDOUT;
|
|
|
|
rc=-1;
|
|
|
|
}
|
2015-04-10 17:16:33 +02:00
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|