diff --git a/docker/ubuntu-16.04/Dockerfile b/docker/ubuntu-16.04/Dockerfile index 18d5448..5665e1c 100644 --- a/docker/ubuntu-16.04/Dockerfile +++ b/docker/ubuntu-16.04/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:16.04 as builder RUN apt update \ - && apt install -y build-essential curl git libglib2.0-dev ksh bison flex vim + && apt install -y build-essential curl git libglib2.0-dev ksh bison flex vim libsctp-dev RUN mkdir -p ~/opt/src \ && cd ~/opt/src \ @@ -24,7 +24,7 @@ RUN tar czf /root/bin.tgz ~/opt/src/seagull/seagull/trunk/src/bin/* \ FROM ubuntu:16.04 as distro RUN apt update \ - && apt install -y ksh locales \ + && apt install -y ksh locales libsctp1 \ && apt upgrade -y \ && locale-gen en_US.UTF-8 \ && dpkg-reconfigure --frontend noninteractive locales \ diff --git a/docker/ubuntu-18.04/Dockerfile b/docker/ubuntu-18.04/Dockerfile index 88a5419..7953b6f 100644 --- a/docker/ubuntu-18.04/Dockerfile +++ b/docker/ubuntu-18.04/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:18.04 as builder RUN apt update \ - && apt install -y build-essential curl git libglib2.0-dev ksh bison flex vim + && apt install -y build-essential curl git libglib2.0-dev ksh bison flex vim libsctp-dev RUN mkdir -p ~/opt/src \ && cd ~/opt/src \ @@ -24,7 +24,7 @@ RUN tar czf /root/bin.tgz ~/opt/src/seagull/seagull/trunk/src/bin/* \ FROM ubuntu:18.04 as distro RUN apt update \ - && apt install -y ksh locales \ + && apt install -y ksh locales libsctp1 \ && apt upgrade -y \ && locale-gen en_US.UTF-8 \ && dpkg-reconfigure --frontend noninteractive locales \ diff --git a/seagull/branches/AtosOrigin/src/library-trans-extsctp/C_SocketSCTP.cpp b/seagull/branches/AtosOrigin/src/library-trans-extsctp/C_SocketSCTP.cpp index 444e424..642a5f3 100755 --- a/seagull/branches/AtosOrigin/src/library-trans-extsctp/C_SocketSCTP.cpp +++ b/seagull/branches/AtosOrigin/src/library-trans-extsctp/C_SocketSCTP.cpp @@ -31,9 +31,9 @@ -#define SOCKET_ERROR(l,m) iostream_error << m << iostream_endl << iostream_flush +#define SOCKET_ERROR(l,m) iostream_error << m << iostream_flush << iostream_endl #ifdef DEBUG_MODE -#define SOCKET_DEBUG(l,m) iostream_error << m << iostream_endl << iostream_flush +#define SOCKET_DEBUG(l,m) iostream_error << m << iostream_flush << iostream_endl #else #define SOCKET_DEBUG(l,m) #endif diff --git a/seagull/branches/AtosOrigin/src/library-trans-extsctp/socketSCTP_t.hpp b/seagull/branches/AtosOrigin/src/library-trans-extsctp/socketSCTP_t.hpp index d7819d6..180b4aa 100755 --- a/seagull/branches/AtosOrigin/src/library-trans-extsctp/socketSCTP_t.hpp +++ b/seagull/branches/AtosOrigin/src/library-trans-extsctp/socketSCTP_t.hpp @@ -19,8 +19,7 @@ #ifndef _SOCKETSCTP_T_HPP #define _SOCKETSCTP_T_HPP -#include -#include +#include #ifndef AF_INET6 #define USE_IPV4_ONLY diff --git a/seagull/trunk/src/build-ext-lib.conf b/seagull/trunk/src/build-ext-lib.conf index d154659..bfc532e 100755 --- a/seagull/trunk/src/build-ext-lib.conf +++ b/seagull/trunk/src/build-ext-lib.conf @@ -70,19 +70,19 @@ function gen_lib_with_path { # sctp library -EXTBUILD_1_TYPE=lib -EXTBUILD_1_FILE=sctplib-1.0.15.tar.gz -EXTBUILD_1_DIR=sctplib-1.0.15 -EXTBUILD_1_GENSCRIPT=gen_lib -EXTBUILD_1_ENDSCRIPT=extract_files +# EXTBUILD_1_TYPE=lib +# EXTBUILD_1_FILE=sctplib-1.0.15.tar.gz +# EXTBUILD_1_DIR=sctplib-1.0.15 +# EXTBUILD_1_GENSCRIPT=gen_lib +# EXTBUILD_1_ENDSCRIPT=extract_files -# sctp socket library +# # sctp socket library -EXTBUILD_2_TYPE=lib -EXTBUILD_2_FILE=socketapi-2.2.8.tar.gz -EXTBUILD_2_DIR=socketapi-2.2.8 -EXTBUILD_2_GENSCRIPT=gen_lib_with_path -EXTBUILD_2_ENDSCRIPT=extract_files +# EXTBUILD_2_TYPE=lib +# EXTBUILD_2_FILE=socketapi-2.2.8.tar.gz +# EXTBUILD_2_DIR=socketapi-2.2.8 +# EXTBUILD_2_GENSCRIPT=gen_lib_with_path +# EXTBUILD_2_ENDSCRIPT=extract_files # openssl library diff --git a/seagull/trunk/src/build.conf b/seagull/trunk/src/build.conf index 1ff664b..d849f25 100644 --- a/seagull/trunk/src/build.conf +++ b/seagull/trunk/src/build.conf @@ -138,7 +138,7 @@ BUILD_LIBEXTSCTP_CC_LINUX=g++ BUILD_LIBEXTSCTP_CC_FLAGS_LINUX="-I`check_sctp_external_lib`/include -D_GNU_SOURCE -D_REENTRANT -DSCTP_SOCKET_API -shared -Wall -fPIC -Werror" BUILD_LIBEXTSCTP_LD_LINUX=g++ BUILD_LIBEXTSCTP_LD_FLAGS_LINUX="-fPIC -shared" -BUILD_LIBEXTSCTP_LD_LIBS_LINUX="-L`check_sctp_external_lib`/lib -lsctplib -lsctpsocket" +BUILD_LIBEXTSCTP_LD_LIBS_LINUX="-L`check_sctp_external_lib`/lib -lsctp" # Linux library generation definition for using TCAP lib #BUILD_TCAP_LIB_CC_LINUX=g++ @@ -160,7 +160,7 @@ BUILD_TEST_CC_LINUX=g++ BUILD_TEST_CC_FLAGS_LINUX="-D_GNU_SOURCE -D_REENTRANT -I/usr/local/include -Wall -fPIC" BUILD_TEST_LD_LINUX=g++ BUILD_TEST_LD_FLAGS_LINUX="" -BUILD_TEST_LD_LIBS_LINUX="-lpthread -L/usr/local/lib -lsctplib -lsctpsocket" +BUILD_TEST_LD_LIBS_LINUX="-lpthread -L/usr/local/lib -lsctp" BUILD_TEST_LEX_LINUX=flex BUILD_TEST_LEX_FLAGS_LINUX="-l" BUILD_TEST_YACC_LINUX=bison diff --git a/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp b/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp index 25e0747..2c87153 100755 --- a/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp +++ b/seagull/trunk/src/library-trans-extsctp/C_SocketSCTP.cpp @@ -23,6 +23,10 @@ #include "C_Socket.hpp" #include "C_SocketSCTP.hpp" +#include +#include +#include + #define MSGFLAG 0 #define MAX_OUTGOING 128 @@ -30,7 +34,6 @@ - #define SOCKET_ERROR(l,m) iostream_error << m << iostream_endl << iostream_flush #ifdef DEBUG_MODE #define SOCKET_DEBUG(l,m) iostream_error << m << iostream_endl << iostream_flush @@ -50,20 +53,16 @@ C_SocketSCTPListen::C_SocketSCTPListen(T_SocketType P_type, P_channel_id, P_read_buf_size, P_segm_buf_size) { - } C_SocketSCTPListen::C_SocketSCTPListen(C_SocketSCTPListen &P_Socket) : C_SocketListen(P_Socket){ - } C_SocketSCTPListen::~C_SocketSCTPListen() { } void C_SocketSCTPListen::set_properties() { - - unsigned int L_max_buf_size ; struct linger L_linger ; int L_flags ; @@ -72,7 +71,7 @@ void C_SocketSCTPListen::set_properties() { // max wait time after a close L_linger.l_onoff = 1; L_linger.l_linger = 0; - if (ext_setsockopt (m_socket_id, SOL_SOCKET, SO_LINGER, + if (setsockopt (m_socket_id, SOL_SOCKET, SO_LINGER, &L_linger, sizeof (L_linger)) < 0) { SOCKET_ERROR(1, "Unable to set SO_LINGER option"); } @@ -87,7 +86,7 @@ void C_SocketSCTPListen::set_properties() { init.sinit_max_instreams = MAX_INCOMING; init.sinit_max_attempts = 3; init.sinit_max_init_timeo = 60; - if(ext_setsockopt(m_socket_id, IPPROTO_SCTP, + if(setsockopt(m_socket_id, IPPROTO_SCTP, SCTP_INITMSG, (void*)&init, sizeof(init)) < 0) { SOCKET_ERROR(1, "Unable to set SCTP_INITMSG option"); } @@ -100,32 +99,31 @@ void C_SocketSCTPListen::set_properties() { events.sctp_partial_delivery_event = 1; events.sctp_adaptation_layer_event = 1; - if(ext_setsockopt(m_socket_id, IPPROTO_SCTP, + if(setsockopt(m_socket_id, IPPROTO_SCTP, SCTP_EVENTS,&events,sizeof(events)) < 0) { SOCKET_ERROR(1, "Unable to set SCTP_EVENTS option"); } - // SCTP END } // size of recv buf L_max_buf_size = m_buffer_size ; - if(ext_setsockopt(m_socket_id, SOL_SOCKET, SO_SNDBUF, + if(setsockopt(m_socket_id, SOL_SOCKET, SO_SNDBUF, &L_max_buf_size, sizeof(L_max_buf_size))) { SOCKET_ERROR(1,"Unable to set socket sndbuf"); } // size of send buff L_max_buf_size = m_buffer_size ; - if(ext_setsockopt(m_socket_id, SOL_SOCKET, SO_RCVBUF, + if(setsockopt(m_socket_id, SOL_SOCKET, SO_RCVBUF, &L_max_buf_size, sizeof(L_max_buf_size))) { SOCKET_ERROR(1, "Unable to set socket rcvbuf"); } // non blocking mode - L_flags = ext_fcntl(m_socket_id, F_GETFL , NULL); + L_flags = fcntl(m_socket_id, F_GETFL , NULL); L_flags |= O_NONBLOCK; - ext_fcntl(m_socket_id, F_SETFL , L_flags); + fcntl(m_socket_id, F_SETFL , L_flags); } @@ -157,7 +155,7 @@ int C_SocketSCTPListen::_open_init(int P_socket_domain, /* allocate a free socket */ /* Internet address family, Stream socket */ - m_socket_id = ext_socket(L_socket_domain, L_socketSCTP_type, IPPROTO_SCTP); + m_socket_id = socket(L_socket_domain, L_socketSCTP_type, IPPROTO_SCTP); SOCKET_DEBUG(1, "m_socket_id [" << m_socket_id << "]"); if (m_socket_id < 0) { @@ -187,10 +185,26 @@ int C_SocketSCTPListen::_open (size_t P_buffer_size, // set_properties() ; /* bind the socket to the newly formed address */ - L_rc = ext_bind(m_socket_id, - (sockaddr *)(void *)&(m_source_addr_info->m_addr), - SOCKADDR_IN_SIZE(&(m_source_addr_info->m_addr))); - /* check there was no error */ + + struct sockaddr_storage *bind_addr = NULL; + unsigned int cc = 0; + SOCKET_DEBUG(0, "bind1 start"); + unsigned int bind_addr_count = m_source_addr_info->m_addrs_src.size(); + for (unsigned int i = 0; i < bind_addr_count; i++) { + sockaddr_in *so = (sockaddr_in *)(m_source_addr_info->m_addrs_src[i]->ai_addr); + size_t addrlen = m_source_addr_info->m_addrs_src[i]->ai_addrlen; + SOCKET_DEBUG(0, "bind to " << inet_ntoa(so->sin_addr) + << ":" << ntohs(so->sin_port)); + bind_addr = (sockaddr_storage*)realloc(bind_addr, cc + addrlen); + memcpy((char*)bind_addr + cc, so, addrlen); + cc += addrlen; + } + + SOCKET_DEBUG(0, "binding stop"); + L_rc = sctp_bindx(m_socket_id, + (struct sockaddr*)bind_addr, + bind_addr_count, SCTP_BINDX_ADD_ADDR); + /* check there was no error */ if (L_rc) { SOCKET_ERROR(1, "bind [" << strerror(errno) << "]"); } else { @@ -201,7 +215,7 @@ int C_SocketSCTPListen::_open (size_t P_buffer_size, /* 5 pending connection requests will be queued by the */ /* system, if we are not directly awaiting them using */ /* the accept() system call, when they arrive. */ - L_rc = ext_listen(m_socket_id, 5); + L_rc = listen(m_socket_id, 5); /* check there was no error */ if (L_rc) { @@ -250,8 +264,8 @@ C_Socket* C_SocketSCTPListen::process_fd_set (fd_set *P_rSet, void C_SocketSCTPListen::_close () { SOCKET_DEBUG(1, "C_Socket::_close ()"); - ext_shutdown(m_socket_id, SHUT_RDWR); - if (ext_close(m_socket_id) != 0) { + shutdown(m_socket_id, SHUT_RDWR); + if (close(m_socket_id) != 0) { SOCKET_ERROR(0, "close socket [" << m_socket_id @@ -320,7 +334,7 @@ int C_SocketSCTPWithData::_open(int P_socket_domain, /* allocate a free socket */ /* Internet address family, Stream socket */ - m_socket_id = ext_socket(L_socket_domain, L_socketSCTP_type, IPPROTO_SCTP); + m_socket_id = socket(L_socket_domain, L_socketSCTP_type, IPPROTO_SCTP); SOCKET_DEBUG(1, "m_socket_id [" << m_socket_id << "]"); if (m_socket_id < 0) { @@ -336,8 +350,8 @@ int C_SocketSCTPWithData::_open(int P_socket_domain, void C_SocketSCTPWithData::_close () { SOCKET_DEBUG(1, "C_Socket::_close ()"); - ext_shutdown(m_socket_id, SHUT_RDWR); - if (ext_close(m_socket_id) != 0) { + shutdown(m_socket_id, SHUT_RDWR); + if (close(m_socket_id) != 0) { SOCKET_ERROR(0, "close socket [" << m_socket_id @@ -362,7 +376,7 @@ void C_SocketSCTPWithData::set_properties() { // max wait time after a close L_linger.l_onoff = 1; L_linger.l_linger = 0; - if (ext_setsockopt (m_socket_id, SOL_SOCKET, SO_LINGER, + if (setsockopt (m_socket_id, SOL_SOCKET, SO_LINGER, &L_linger, sizeof (L_linger)) < 0) { SOCKET_ERROR(1, "Unable to set SO_LINGER option"); } @@ -379,7 +393,7 @@ void C_SocketSCTPWithData::set_properties() { init.sinit_max_instreams = MAX_INCOMING; init.sinit_max_attempts = 3; init.sinit_max_init_timeo = 30; - if(ext_setsockopt(m_socket_id, IPPROTO_SCTP, + if(setsockopt(m_socket_id, IPPROTO_SCTP, SCTP_INITMSG, (void*)&init, sizeof(init)) < 0) { SOCKET_ERROR(1, "Unable to set SCTP_INITMSG option"); } @@ -393,7 +407,7 @@ void C_SocketSCTPWithData::set_properties() { events.sctp_partial_delivery_event = 1; events.sctp_adaptation_layer_event = 1; - if(ext_setsockopt(m_socket_id, IPPROTO_SCTP, + if(setsockopt(m_socket_id, IPPROTO_SCTP, SCTP_EVENTS,&events,sizeof(events)) < 0) { SOCKET_ERROR(1, "Unable to set SCTP_EVENTS option"); } @@ -404,22 +418,22 @@ void C_SocketSCTPWithData::set_properties() { // size of recv buf L_max_buf_size = m_buffer_size ; - if(ext_setsockopt(m_socket_id, SOL_SOCKET, SO_SNDBUF, + if(setsockopt(m_socket_id, SOL_SOCKET, SO_SNDBUF, &L_max_buf_size, sizeof(L_max_buf_size))) { SOCKET_ERROR(1,"Unable to set socket sndbuf (sctp)"); } // size of send buff L_max_buf_size = m_buffer_size ; - if(ext_setsockopt(m_socket_id, SOL_SOCKET, SO_RCVBUF, + if(setsockopt(m_socket_id, SOL_SOCKET, SO_RCVBUF, &L_max_buf_size, sizeof(L_max_buf_size))) { SOCKET_ERROR(1, "Unable to set socket rcvbuf (sctp)"); } // non blocking mode - L_flags = ext_fcntl(m_socket_id, F_GETFL , NULL); + L_flags = fcntl(m_socket_id, F_GETFL, NULL); L_flags |= O_NONBLOCK; - ext_fcntl(m_socket_id, F_SETFL , L_flags); + fcntl(m_socket_id, F_SETFL , L_flags); } @@ -511,9 +525,9 @@ void C_SocketSCTPWithData::sctp_event_handler (C_TransportEvent *P_event) { spc = &snp->sn_paddr_change; switch(spc->spc_state) { - case SCTP_ADDR_REACHABLE: + case SCTP_ADDR_AVAILABLE: SOCKET_DEBUG(0, "C_SocketSCTPWithData::sctp_event_handler() " << - "ASSOC PEER: ADDRESS REACHABLE"); + "ASSOC PEER: ADDRESS AVAILABLE"); break; case SCTP_ADDR_UNREACHABLE: SOCKET_DEBUG(0, "C_SocketSCTPWithData::sctp_event_handler() " << @@ -592,7 +606,7 @@ bool C_SocketSCTPWithData::sctp_recv_msg (struct msghdr *msg, msg->msg_flags = MSGFLAG ; msg->msg_controllen = cmsglen; - nnr = ext_recvmsg(m_socket_id, msg, 0); + nnr = recvmsg(m_socket_id, msg, 0); if (nnr <= 0) { /* EOF or error */ @@ -718,7 +732,7 @@ C_SocketSCTPWithData* C_SocketSCTPWithData::process_fd_set (fd_set *P_ int C_SocketSCTPWithData::_write(unsigned char* P_data, size_t P_size) { - return (ext_sendto(m_socket_id, P_data, P_size, + return (sendto(m_socket_id, P_data, P_size, 0, (struct sockaddr*)(void*)m_remote_sockaddr_ptr, (tool_socklen_t)*m_len_remote_sockaddr_ptr)) ; @@ -727,7 +741,7 @@ int C_SocketSCTPWithData::_write(unsigned char* P_data, int C_SocketSCTPWithData::_call_write(unsigned char* P_data, size_t P_size) { - return (ext_send(m_socket_id, P_data, P_size, 0)); + return (send(m_socket_id, P_data, P_size, 0)); } @@ -761,7 +775,7 @@ size_t C_SocketSCTPWithData::received_buffer(unsigned char *P_data, } int C_SocketSCTPWithData::_call_read() { - return (ext_read(m_socket_id, m_read_buf, m_read_buf_size)) ; + return (read(m_socket_id, m_read_buf, m_read_buf_size)) ; } C_SocketSCTPServer::C_SocketSCTPServer (C_SocketSCTPServer& P_Socket) @@ -814,9 +828,22 @@ int C_SocketSCTPServer::_open_udp (size_t P_buffer_size, m_buffer_size = P_buffer_size ; /* bind the socket to the newly formed address */ - L_rc = ext_bind(m_socket_id, - (sockaddr *)(void *)&(m_source_udp_addr_info->m_addr), - SOCKADDR_IN_SIZE(&(m_source_udp_addr_info->m_addr))); + struct sockaddr_storage *bind_addr = NULL; + unsigned int cc = 0; + unsigned int bind_addr_count = m_source_udp_addr_info->m_addrs_src.size(); + for (unsigned int i = 0; i < bind_addr_count; i++) { + sockaddr_in *so = (sockaddr_in *)(m_source_udp_addr_info->m_addrs_src[i]->ai_addr); + size_t addrlen = m_source_udp_addr_info->m_addrs_src[i]->ai_addrlen; + SOCKET_DEBUG(0, "bind to " << inet_ntoa(so->sin_addr) + << ":" << ntohs(so->sin_port)); + bind_addr = (sockaddr_storage*)realloc(bind_addr, cc + addrlen); + memcpy((char*)bind_addr + cc, so, addrlen); + cc += addrlen; + } + + L_rc = sctp_bindx(m_socket_id, + (struct sockaddr*)bind_addr, + bind_addr_count, SCTP_BINDX_ADD_ADDR); /* check there was no error */ if (L_rc) { SOCKET_ERROR(1, "bind [" << strerror(errno) << "]"); @@ -845,7 +872,7 @@ int C_SocketSCTPServer::_open(size_t P_buffer_size, L_size = SOCKADDR_IN_SIZE(m_listen_sock->get_source_address()); memset(&m_accepted_addr, 0, L_size); - m_socket_id = ext_accept (m_listen_sock->get_id(), + m_socket_id = accept (m_listen_sock->get_id(), (sockaddr *)(void *)&m_accepted_addr, &L_size); @@ -899,13 +926,45 @@ int C_SocketSCTPClient::_open(T_pOpenStatus P_status, if (L_rc == 0) { if (m_type == E_SOCKET_TCP_MODE) { + // SCTP MULTIHOMING CLIENT BINDING + struct sockaddr_storage *bind_addr = NULL; + unsigned int cc = 0; + unsigned int bind_addr_count = m_remote_addr_info->m_addrs_src.size(); + for (unsigned int i = 0; i < bind_addr_count; i++) { + sockaddr_in *so = (sockaddr_in *)(m_remote_addr_info->m_addrs_src[i]->ai_addr); + size_t addrlen = m_remote_addr_info->m_addrs_src[i]->ai_addrlen; + SOCKET_DEBUG(0, "bind to " << inet_ntoa(so->sin_addr) + << ":" << ntohs(so->sin_port)); + bind_addr = (sockaddr_storage*)realloc(bind_addr, cc + addrlen); + memcpy((char*)bind_addr + cc, so, addrlen); + cc += addrlen; + } - + if(bind_addr_count > 0) { + if(sctp_bindx(m_socket_id, + (struct sockaddr*)bind_addr, + bind_addr_count, SCTP_BINDX_ADD_ADDR)) { + SOCKET_ERROR(1, "error bind client [" << strerror(errno) << "]"); + } + } - L_rc = ext_connect (m_socket_id, - (struct sockaddr*)(void*)&(m_remote_addr_info->m_addr), - SOCKADDR_IN_SIZE(&(m_remote_addr_info->m_addr))) ; - + + struct sockaddr_storage *connect_addr = NULL; + cc = 0; + unsigned int connect_addr_count = m_remote_addr_info->m_addrs_dst.size(); + for (unsigned int i = 0; i < connect_addr_count; i++) { + sockaddr_in *so = (sockaddr_in *)(m_remote_addr_info->m_addrs_dst[i]->ai_addr); + size_t addrlen = m_remote_addr_info->m_addrs_dst[i]->ai_addrlen; + SOCKET_DEBUG(0, "connect to " << inet_ntoa(so->sin_addr) + << ":" << ntohs(so->sin_port)); + connect_addr = (sockaddr_storage*)realloc(connect_addr, cc + addrlen); + memcpy((char*)connect_addr + cc, so, addrlen); + cc += addrlen; + } + + L_rc = sctp_connectx(m_socket_id, + (struct sockaddr*)connect_addr, + connect_addr_count, 0); if (L_rc) { if (errno != EINPROGRESS) { SOCKET_ERROR(1, "connect failed [" @@ -924,9 +983,23 @@ int C_SocketSCTPClient::_open(T_pOpenStatus P_status, *P_status = E_OPEN_OK ; } } else { - L_rc = ext_bind(m_socket_id, - (sockaddr *)(void *)&(m_remote_addr_info->m_addr_src), - SOCKADDR_IN_SIZE(&(m_remote_addr_info->m_addr_src))); + struct sockaddr_storage *bind_addr = NULL; + unsigned int cc = 0; + SOCKET_DEBUG(0, "bind start"); + unsigned int bind_addr_count = m_remote_addr_info->m_addrs_src.size(); + for (unsigned int i = 0; i < bind_addr_count; i++) { + sockaddr_in *so = (sockaddr_in *)(m_remote_addr_info->m_addrs_src[i]->ai_addr); + size_t addrlen = m_remote_addr_info->m_addrs_src[i]->ai_addrlen; + SOCKET_DEBUG(0, "bind to " << inet_ntoa(so->sin_addr) + << ":" << ntohs(so->sin_port)); + bind_addr = (sockaddr_storage*)realloc(bind_addr, cc + addrlen); + memcpy((char*)bind_addr + cc, so, addrlen); + cc += addrlen; + } + + L_rc = sctp_bindx(m_socket_id, + (struct sockaddr*)bind_addr, + bind_addr_count, SCTP_BINDX_ADD_ADDR); if (L_rc) { SOCKET_ERROR(1, "bind [" << strerror(errno) << "]"); @@ -944,7 +1017,7 @@ int C_SocketSCTPClient::_open(T_pOpenStatus P_status, return (L_rc); } int C_SocketSCTPServer::_read () { - return (ext_recvfrom(m_socket_id, + return (recvfrom(m_socket_id, m_read_buf, m_read_buf_size, 0, @@ -953,7 +1026,7 @@ int C_SocketSCTPServer::_read () { } int C_SocketSCTPClient::_read () { - return (ext_recvfrom(m_socket_id, + return (recvfrom(m_socket_id, m_read_buf, m_read_buf_size, 0, diff --git a/seagull/trunk/src/library-trans-extsctp/C_TransSCTP.cpp b/seagull/trunk/src/library-trans-extsctp/C_TransSCTP.cpp index 6ac7202..ff5879a 100755 --- a/seagull/trunk/src/library-trans-extsctp/C_TransSCTP.cpp +++ b/seagull/trunk/src/library-trans-extsctp/C_TransSCTP.cpp @@ -38,7 +38,7 @@ int C_TransSCTP::config (T_pConfigValueList P_config_param_list) { - GEN_DEBUG(1, "C_TransIP::config ()"); + GEN_DEBUG(1, "C_TransSCTP::config ()"); m_logInfo = NULL ; m_logError = NULL ; @@ -64,7 +64,6 @@ int C_TransSCTP::analyze_config(T_ConfigValue& P_config) { C_TransSCTP::C_TransSCTP() : C_TransIP() { - sctp_initLibrary(); } C_TransSCTP::~C_TransSCTP() { @@ -72,7 +71,7 @@ C_TransSCTP::~C_TransSCTP() { T_SelectDef C_TransSCTP::select_definition() { GEN_DEBUG(0, "C_TransSCTP::select_definition () "); - return (&ext_select); + return (&select); } C_Socket* C_TransSCTP::open (int P_channel_id, @@ -86,7 +85,7 @@ C_Socket* C_TransSCTP::open (int P_channel_id, - GEN_DEBUG(1, "C_TransIPTLS::open ()"); + GEN_DEBUG(1, "C_TransSCTP::open ()"); switch (P_Addr->m_umode) { case E_IP_USAGE_MODE_SERVER: { diff --git a/seagull/trunk/src/library-trans-extsctp/socketSCTP_t.hpp b/seagull/trunk/src/library-trans-extsctp/socketSCTP_t.hpp index d7819d6..bc19431 100755 --- a/seagull/trunk/src/library-trans-extsctp/socketSCTP_t.hpp +++ b/seagull/trunk/src/library-trans-extsctp/socketSCTP_t.hpp @@ -19,8 +19,9 @@ #ifndef _SOCKETSCTP_T_HPP #define _SOCKETSCTP_T_HPP -#include -#include +#include +#include +#include #ifndef AF_INET6 #define USE_IPV4_ONLY diff --git a/seagull/trunk/src/library-trans-ip/C_TransIP.cpp b/seagull/trunk/src/library-trans-ip/C_TransIP.cpp index 6fb026c..c75c869 100644 --- a/seagull/trunk/src/library-trans-ip/C_TransIP.cpp +++ b/seagull/trunk/src/library-trans-ip/C_TransIP.cpp @@ -21,7 +21,11 @@ #include "Utils.hpp" #include +#include #include +#include +#include +#include #include @@ -743,7 +747,7 @@ bool C_TransIP::analyze_init_string(char *P_buf) { bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) { - char L_tmp [255] ; + char L_tmp [255], L_tmp_port[255]; char L_tmp_lag [255] ; char *L_buf, *L_ptr ; @@ -775,10 +779,46 @@ bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) { char*,sizeof(char), strlen(L_tmp)+1); strcpy(P_addr->m_open_src, L_tmp); - } + + L_ptr = L_buf; + while(1) { + L_ptr = strstr(L_ptr, "source="); + if (L_ptr != NULL) { + struct addrinfo *addr; + struct addrinfo L_hints; + memset((char*)&L_hints, 0, sizeof(L_hints)); + L_hints.ai_flags = AI_PASSIVE; + L_hints.ai_family = PF_UNSPEC; + + sscanf(L_ptr+7, "%[^;]*s", L_tmp); + + L_tmp_port[0] = '\0'; + char* delem = strstr(L_tmp, ":"); + if(delem != NULL) { + strncpy(L_tmp_port, delem + 1, 254); + (*delem) = '\0'; + } + + GEN_DEBUG(1, "source [" << L_tmp << ":" << L_tmp_port << "]"); + if (getaddrinfo(L_tmp, + L_tmp_port, + &L_hints, + &addr) != 0) { + GEN_DEBUG(1, "Unknown host: [" << L_tmp << "]"); + } else { + GEN_DEBUG(1, "add src to m_addrs_dst"); + P_addr->m_addrs_src.push_back(addr); + } + L_ptr = L_ptr + 7; + } else { + break; + } + } + } } if (m_active) { + GEN_DEBUG(1, "C_TransIP::m_active: true"); L_buf = P_buf ; L_ptr = strstr(L_buf, "dest="); if (L_ptr != NULL) { @@ -790,8 +830,43 @@ bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) { strlen(L_tmp)+1); strcpy(P_addr->m_open, L_tmp); } + + L_ptr = L_buf; + while(1) { + L_ptr = strstr(L_ptr, "dest="); + if (L_ptr != NULL) { + struct addrinfo *addr; + struct addrinfo L_hints; + memset((char*)&L_hints, 0, sizeof(L_hints)); + L_hints.ai_flags = AI_PASSIVE; + L_hints.ai_family = PF_UNSPEC; + + sscanf(L_ptr + 5, "%[^;]*s", L_tmp); + + L_tmp_port[0] = '\0'; + char* delem = strstr(L_tmp, ":"); + if(delem != NULL) { + strncpy(L_tmp_port, delem + 1, 254); + (*delem) = '\0'; + } + GEN_DEBUG(1, "dst a[" << L_tmp << ":" << L_tmp_port << "]"); + if (getaddrinfo(L_tmp, + L_tmp_port, + &L_hints, + &addr) != 0) { + GEN_DEBUG(1, "Unknown host: [" << L_tmp << "]"); + } else { + GEN_DEBUG(1, "add dst to m_addrs_dst"); + P_addr->m_addrs_dst.push_back(addr); + } + L_ptr = L_ptr + 5; + } else { + break; + } + } } } else { + GEN_DEBUG(1, "C_TransIP::m_active: false"); L_buf = P_buf ; L_ptr = strstr(L_buf, "standby="); if (L_ptr != NULL) { @@ -804,6 +879,7 @@ bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) { strcpy(P_addr->m_open, L_tmp_lag); } else { + GEN_DEBUG(1, "C_TransIP::without standby"); // if standby is not provided, default is dest L_buf = P_buf ; L_ptr = strstr(L_buf, "dest="); @@ -816,8 +892,41 @@ bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) { strlen(L_tmp)+1); strcpy(P_addr->m_open, L_tmp); } + L_ptr = L_buf; + while(1) { + L_ptr = strstr(L_ptr, "dest="); + if (L_ptr != NULL) { + struct addrinfo *addr; + struct addrinfo L_hints; + memset((char*)&L_hints, 0, sizeof(L_hints)); + L_hints.ai_flags = AI_PASSIVE; + L_hints.ai_family = PF_UNSPEC; + + sscanf(L_ptr + 5, "%[^;]*s", L_tmp); + + L_tmp_port[0] = '\0'; + char* delem = strstr(L_tmp, ":"); + if(delem != NULL) { + strncpy(L_tmp_port, delem + 1, 254); + (*delem) = '\0'; + } + + GEN_DEBUG(1, "dst b[" << L_tmp << ":" << L_tmp_port<< "]"); + if (getaddrinfo(L_tmp, + L_tmp_port, + &L_hints, + &addr) != 0) { + GEN_DEBUG(1, "Unknown host: [" << L_tmp << "]"); + } else { + GEN_DEBUG(1, "add dst to m_addrs_dst"); + P_addr->m_addrs_dst.push_back(addr); + } + L_ptr = L_ptr + 5; + } else { + break; + } + } } - } } } diff --git a/seagull/trunk/src/library-trans-ip/S_IpAddr.hpp b/seagull/trunk/src/library-trans-ip/S_IpAddr.hpp index f66c6a3..ebfa409 100644 --- a/seagull/trunk/src/library-trans-ip/S_IpAddr.hpp +++ b/seagull/trunk/src/library-trans-ip/S_IpAddr.hpp @@ -22,6 +22,7 @@ #include "socket_t.hpp" #include "list_t.hpp" +#include "vector_t.hpp" #include "map_t.hpp" @@ -47,7 +48,8 @@ typedef struct _struct_ip_addr { long m_port_src ; char *m_ip_src ; T_SockAddrStorage m_addr_src ; - + vector_tm_addrs_src; + vector_tm_addrs_dst; } T_IpAddr, *T_pIpAddr ; void clear_IpAddr(T_pIpAddr P_IpAddr) ;