diff --git a/src/ac/Makefile b/src/ac/Makefile index cbafdcf0..c37f8bde 100644 --- a/src/ac/Makefile +++ b/src/ac/Makefile @@ -56,6 +56,7 @@ AC_MODULES = mod_cipwap.o # list of generated object files for AC. AC_OBJS = \ wtplist.o wtpman.o conf.o ac_main.o \ + dataman.o \ ac_interface.o \ socklist.o \ db.o \ diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index 02ccfcb7..8787f65a 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -45,6 +45,10 @@ #include "ac.h" #include "cw/format.h" + +#include "dataman.h" + + int ac_run(); @@ -134,6 +138,7 @@ int main(int argc, char *argv[]) + ac_global_init(); if (!socklist_init()) goto errX; @@ -141,7 +146,8 @@ int main(int argc, char *argv[]) if (!wtplist_init()) goto errX; - + if (!dataman_list_init()) + goto errX; cw_log(LOG_INFO, "Starting AC-Tube, Name=%s, ID=%s", conf_acname, conf_acid); @@ -289,9 +295,6 @@ int ac_run() if (FD_ISSET(socklist[i].sockfd, &fset)){ -// memset(&srcaddr, 0, sizeof(struct sockaddr_storage)); -// sockaddrlen = sizeof(struct sockaddr_storage); - int len = sock_receive(socklist[i].sockfd, buffer, sizeof(buffer), 0, @@ -311,8 +314,48 @@ int ac_run() void process_cw_data_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len) { + cw_dbg(DBG_X, "There is a data packet now"); + + dataman_list_lock(); + cw_dbg(DBG_X, "Dataman list locked, now getting"); + struct dataman * dm = dataman_list_get(socklist[index].data_sockfd,addr); + cw_dbg(DBG_X, "Dataman list locked, now gotted"); + + cw_dbg(DBG_INFO,"Packet for dataman %s,%d",sock_addr2str_p(addr),socklist[index].data_sockfd); + if (!dm) { + cw_dbg(DBG_INFO,"No dataman %s,%d",sock_addr2str_p(addr),socklist[index].data_sockfd); + dm = dataman_create(socklist[index].data_sockfd,addr); + if (!dm){ + cw_log(LOG_ERR,"Can't create dataman for packet from %s",sock_addr2str_p(addr)); + return; + } + dataman_list_add(dm); + + dataman_start(dm); + + + } + dataman_list_unlock(); + + dataman_add_packet(dm,buffer,len); + + return; + + exit(0); + + + + printf("Data packet received len = %d\n",len); exit(0); + struct wtpman *wtpman = wtplist_get(addr); + if (!wtpman){ + cw_dbg(DBG_PKT_ERR,"Discarding packet on data channel from %s - No wtpman found.",sock_addr2str(addr)); + return; + } + + + wtpman_addpacket(wtpman, buffer, len); } diff --git a/src/ac/wtplist.c b/src/ac/wtplist.c index 04edc952..fc20e93f 100644 --- a/src/ac/wtplist.c +++ b/src/ac/wtplist.c @@ -36,7 +36,7 @@ #include "conf.h" #include "cw/log.h" - +#include "cw/connlist.h" static struct connlist * connlist; @@ -79,6 +79,15 @@ struct wtpman * wtplist_get(const struct sockaddr * addr) } +struct wtpman * wtplist_get_by_session_id(uint8_t *session_id) +{ + struct conn search; + memcpy (search.session_id, session_id,16); + + struct conn * conn = connlist_get_by_session_id(connlist,&search); + return conn->data; +} + struct wtpman * wtplist_add(struct wtpman * wtpman) { diff --git a/src/ac/wtplist.h b/src/ac/wtplist.h index c2fcc706..a001f5a4 100644 --- a/src/ac/wtplist.h +++ b/src/ac/wtplist.h @@ -13,6 +13,7 @@ extern struct wtpman * wtplist_add(struct wtpman * wtpman); extern void wtplist_remove(struct wtpman * wtpman); extern void wtplist_lock(); extern void wtplist_unlock(); +extern struct wtpman * wtplist_get_by_session_id(uint8_t *session_id); #endif diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index de396f3e..b870602e 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -33,6 +33,7 @@ #include "cw/dtls.h" #include "cw/dbg.h" #include "cw/conn.h" +#include "cw/format.h" #include "ac.h" #include "conf.h" @@ -438,7 +439,7 @@ void wtpman_run_data(void *wtpman_arg) cw_log(LOG_ERR, "I am the data thread**********************************************************************\n"); while (1) { sleep(5); - conn->write_data(conn, data, 100); +// conn->write_data(conn, data, 100); cw_log(LOG_ERR, "O was the data thread***********************************************************\n"); } @@ -481,9 +482,17 @@ static void wtpman_run(void *arg) 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); diff --git a/src/cw/send.c b/src/cw/send.c index 65c2535e..45b8e384 100644 --- a/src/cw/send.c +++ b/src/cw/send.c @@ -86,7 +86,7 @@ int conn_send_data_msg(struct conn * conn, uint8_t *rawmsg,int len) cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,mtu,(struct sockaddr*)&conn->addr); - if (conn->write_data(conn,ptr,mtu)<0) +// if (conn->write_data(conn,ptr,mtu)<0) return -1; // XXX Fragmentation stuff.. @@ -108,7 +108,7 @@ int conn_send_data_msg(struct conn * conn, uint8_t *rawmsg,int len) cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,packetlen,(struct sockaddr*)&conn->addr); - return conn->write_data(conn,ptr,packetlen-0); +// return conn->write_data(conn,ptr,packetlen-0); }