From: <cha...@us...> - 2008-01-08 22:01:53
|
Revision: 409 http://sipp.svn.sourceforge.net/sipp/?rev=409&view=rev Author: charlespwright Date: 2008-01-08 14:01:51 -0800 (Tue, 08 Jan 2008) Log Message: ----------- Enh: Store UAS reply addresses on a per-call basis. Modified Paths: -------------- sipp/trunk/call.cpp sipp/trunk/call.hpp sipp/trunk/sipp.cpp sipp/trunk/sipp.hpp Modified: sipp/trunk/call.cpp =================================================================== --- sipp/trunk/call.cpp 2008-01-08 22:01:38 UTC (rev 408) +++ sipp/trunk/call.cpp 2008-01-08 22:01:51 UTC (rev 409) @@ -280,23 +280,19 @@ } /******************* Call class implementation ****************/ -call::call(char * p_id, int userId, bool ipv6, bool isAutomatic) : listener(p_id, true) { - init(main_scenario, NULL, p_id, userId, ipv6, isAutomatic); +call::call(char *p_id, bool use_ipv6, int userId, struct sockaddr_storage *dest) : listener(p_id, true) { + init(main_scenario, NULL, dest, p_id, userId, use_ipv6, false); } -call::call(char *p_id, bool use_ipv6, int userId) : listener(p_id, true) { - init(main_scenario, NULL, p_id, userId, use_ipv6, false); +call::call(char *p_id, struct sipp_socket *socket, struct sockaddr_storage *dest) : listener(p_id, true) { + init(main_scenario, socket, dest, p_id, 0 /* No User. */, socket->ss_ipv6, false /* Not Auto. */); } -call::call(char *p_id, struct sipp_socket *socket) : listener(p_id, true) { - init(main_scenario, socket, p_id, 0 /* No User. */, socket->ss_ipv6, false /* Not Auto. */); +call::call(scenario * call_scenario, struct sipp_socket *socket, struct sockaddr_storage *dest, char * p_id, int userId, bool ipv6, bool isAutomatic) : listener(p_id, true) { + init(call_scenario, socket, dest, p_id, userId, ipv6, isAutomatic); } -call::call(scenario * call_scenario, struct sipp_socket *socket, char * p_id, int userId, bool ipv6, bool isAutomatic) : listener(p_id, true) { - init(call_scenario, socket, p_id, userId, ipv6, isAutomatic); -} - -call *call::add_call(int userId, bool ipv6) +call *call::add_call(int userId, bool ipv6, struct sockaddr_storage *dest) { static char call_id[MAX_HEADER_LEN]; @@ -328,11 +324,11 @@ } call_id[count] = 0; - return new call(main_scenario, NULL, call_id, userId, ipv6, false /* Not Auto. */); + return new call(main_scenario, NULL, dest, call_id, userId, ipv6, false /* Not Auto. */); } -void call::init(scenario * call_scenario, struct sipp_socket *socket, char * p_id, int userId, bool ipv6, bool isAutomatic) +void call::init(scenario * call_scenario, struct sipp_socket *socket, struct sockaddr_storage *dest, char * p_id, int userId, bool ipv6, bool isAutomatic) { this->call_scenario = call_scenario; zombie = false; @@ -394,6 +390,11 @@ } else { call_socket = NULL; } + if (dest) { + memcpy(&call_peer, dest, SOCK_ADDR_SIZE(dest)); + } else { + memset(&call_peer, 0, sizeof(call_peer)); + } // initialising the CallVariable with the Scenario variable int i; @@ -458,21 +459,27 @@ send_timeout = 0; timewait = false; - number = next_number++; - if (use_tdmmap) { - tdm_map_number = get_tdm_map_number(); - if (tdm_map_number == 0) { - /* Can't create the new call */ - WARNING("Can't create new outgoing call: all tdm_map circuits busy"); - computeStat(CStat::E_CALL_FAILED); - computeStat(CStat::E_FAILED_OUTBOUND_CONGESTION); - this->zombie = true; - return; + if (!isAutomatic) { + /* Not advancing the number is safe, because for automatic calls we do not + * assign the identifier, the only other place it is used is for the auto + * media port. */ + number = next_number++; + + if (use_tdmmap) { + tdm_map_number = get_tdm_map_number(); + if (tdm_map_number == 0) { + /* Can't create the new call */ + WARNING("Can't create new outgoing call: all tdm_map circuits busy"); + computeStat(CStat::E_CALL_FAILED); + computeStat(CStat::E_FAILED_OUTBOUND_CONGESTION); + this->zombie = true; + return; + } + /* Mark the entry in the list as busy */ + tdm_map[tdm_map_number - 1] = true; + } else { + tdm_map_number = 0; } - /* Mark the entry in the list as busy */ - tdm_map[tdm_map_number - 1] = true; - } else { - tdm_map_number = 0; } setRunning(); @@ -758,7 +765,7 @@ sock=call_remote_socket ; } - rc = write_socket(sock, msg, strlen(msg), WS_BUFFER); + rc = write_socket(sock, msg, strlen(msg), WS_BUFFER, &call_peer); if(rc == -1 && errno == EWOULDBLOCK) { return -1; } @@ -1811,9 +1818,9 @@ peer_dest = curmsg->peer_dest; if(peer_dest){ peer_socket = get_peer_socket(peer_dest); - rc = write_socket(*peer_socket, dest, strlen(dest), WS_BUFFER); + rc = write_socket(*peer_socket, dest, strlen(dest), WS_BUFFER, &call_peer); }else { - rc = write_socket(twinSippSocket, dest, strlen(dest), WS_BUFFER); + rc = write_socket(twinSippSocket, dest, strlen(dest), WS_BUFFER, &call_peer); } if(rc < 0) { computeStat(CStat::E_CALL_FAILED); @@ -1842,7 +1849,7 @@ strcat(dest, delimitor); - rc = write_socket(twinSippSocket, dest, strlen(dest), WS_BUFFER); + rc = write_socket(twinSippSocket, dest, strlen(dest), WS_BUFFER, &twinSippSocket->ss_remote_sockaddr); if(rc < 0) { computeStat(CStat::E_CALL_FAILED); computeStat(CStat::E_FAILED_CMD_NOT_SENT); Modified: sipp/trunk/call.hpp =================================================================== --- sipp/trunk/call.hpp 2008-01-08 22:01:38 UTC (rev 408) +++ sipp/trunk/call.hpp 2008-01-08 22:01:51 UTC (rev 409) @@ -55,11 +55,11 @@ class call : virtual public task, virtual public listener, public virtual socketowner { public: /* These are wrappers for various circumstances, (private) init does the real work. */ - call(char * p_id, int userId, bool ipv6, bool isAutomatic); - call(char *p_id, bool use_ipv6, int userId); - call(char *p_id, struct sipp_socket *socket); - static call *add_call(int userId, bool ipv6); - call(scenario * call_scenario, struct sipp_socket *socket, char * p_id, int userId, bool ipv6, bool isAutomatic); + //call(char * p_id, int userId, bool ipv6, bool isAutomatic); + call(char *p_id, bool use_ipv6, int userId, struct sockaddr_storage *dest); + call(char *p_id, struct sipp_socket *socket, struct sockaddr_storage *dest); + static call *add_call(int userId, bool ipv6, struct sockaddr_storage *dest); + call(scenario * call_scenario, struct sipp_socket *socket, struct sockaddr_storage *dest, char * p_id, int userId, bool ipv6, bool isAutomatic); virtual ~call(); @@ -95,8 +95,10 @@ private: /* This is the core constructor function. */ - void init(scenario * call_scenario, struct sipp_socket *socket, char * p_id, int userId, bool ipv6, bool isAutomatic); + void init(scenario * call_scenario, struct sipp_socket *socket, struct sockaddr_storage *dest, char * p_id, int userId, bool ipv6, bool isAutomatic); + struct sockaddr_storage call_peer; + scenario *call_scenario; unsigned int number; unsigned int tdm_map_number; Modified: sipp/trunk/sipp.cpp =================================================================== --- sipp/trunk/sipp.cpp 2008-01-08 22:01:38 UTC (rev 408) +++ sipp/trunk/sipp.cpp 2008-01-08 22:01:51 UTC (rev 409) @@ -57,6 +57,8 @@ #endif unsigned long calls_since_last_rate_change = 0; +bool do_hide = true; +bool show_index = false; static struct sipp_socket *sipp_allocate_socket(bool use_ipv6, int transport, int fd, int accepting); struct sipp_socket *ctrl_socket = NULL; @@ -861,9 +863,12 @@ index ++) { message *curmsg = display_scenario->messages[index]; - if(curmsg->hide) { + if(do_hide && curmsg->hide) { continue; } + if (show_index) { + fprintf(f, "%-02d:", index); + } if(SendingMessage *src = curmsg -> send_scheme) { if (src->isResponse()) { @@ -1600,6 +1605,22 @@ } else { WARNING("Unknown display scenario: %s", rest); } + } else if (!strcmp(what, "hide")) { + if (!strcmp(rest, "true")) { + do_hide = true; + } else if (!strcmp(rest, "false")) { + do_hide = false; + } else { + WARNING("Invalid bool: %s", rest); + } + } else if (!strcmp(what, "index")) { + if (!strcmp(rest, "true")) { + show_index = true; + } else if (!strcmp(rest, "false")) { + show_index = false; + } else { + WARNING("Invalid bool: %s", rest); + } } else { WARNING("Unknown set attribute: %s", what); } @@ -2054,7 +2075,7 @@ /*************************** I/O functions ***************************/ /* Allocate a socket buffer. */ -struct socketbuf *alloc_socketbuf(char *buffer, size_t size, int copy) { +struct socketbuf *alloc_socketbuf(char *buffer, size_t size, int copy, struct sockaddr_storage *dest) { struct socketbuf *socketbuf; socketbuf = (struct socketbuf *)malloc(sizeof(struct socketbuf)); @@ -2072,6 +2093,9 @@ } socketbuf->len = size; socketbuf->offset = 0; + if (dest) { + memcpy(&socketbuf->addr, dest, SOCK_ADDR_SIZE(dest)); + } socketbuf->next = NULL; return socketbuf; @@ -2188,7 +2212,7 @@ } } -static ssize_t socket_write_primitive(struct sipp_socket *socket, char *buffer, size_t len) { +static ssize_t socket_write_primitive(struct sipp_socket *socket, char *buffer, size_t len, struct sockaddr_storage *dest) { ssize_t rc; /* Refuse to write to invalid sockets. */ @@ -2230,15 +2254,8 @@ TRACE_MSG("---\nCompressed message len: %d\n", len); } - { - // different remote sending address from received - struct sockaddr_storage *L_dest = &socket->ss_remote_sockaddr; - if (use_remote_sending_addr) { - L_dest = &remote_sending_sockaddr ; - } + rc = sendto(socket->ss_fd, buffer, len, 0, (struct sockaddr *)dest, SOCK_ADDR_SIZE(dest)); - rc = sendto(socket->ss_fd, buffer, len, 0, (struct sockaddr *)L_dest, SOCK_ADDR_SIZE(L_dest)); - } break; default: ERROR("Internal error, unknown transport type %d\n", socket->ss_transport); @@ -2383,7 +2400,7 @@ while ((buf = socket->ss_out)) { ssize_t size = buf->len - buf->offset; - ret = socket_write_primitive(socket, buf->buf + buf->offset, size); + ret = socket_write_primitive(socket, buf->buf + buf->offset, size, &buf->addr); TRACE_MSG("Wrote %d of %d bytes in an output buffer.", ret, size); if (ret == size) { /* Everything is great, throw away this buffer. */ @@ -2404,12 +2421,12 @@ return 0; } -void buffer_write(struct sipp_socket *socket, char *buffer, size_t len) { +void buffer_write(struct sipp_socket *socket, char *buffer, size_t len, struct sockaddr_storage *dest) { struct socketbuf *buf = socket->ss_out; struct socketbuf *prev = buf; if (!buf) { - socket->ss_out = alloc_socketbuf(buffer, len, DO_COPY); + socket->ss_out = alloc_socketbuf(buffer, len, DO_COPY, dest); TRACE_MSG("Added first buffered message to socket %d\n", socket->ss_fd); return; } @@ -2419,7 +2436,7 @@ buf = buf->next; } - prev->next = alloc_socketbuf(buffer, len, DO_COPY); + prev->next = alloc_socketbuf(buffer, len, DO_COPY, dest); TRACE_MSG("Appended buffered message to socket %d\n", socket->ss_fd); } @@ -2441,7 +2458,7 @@ } /* Write data to a socket. */ -int write_socket(struct sipp_socket *socket, char *buffer, ssize_t len, int flags) { +int write_socket(struct sipp_socket *socket, char *buffer, ssize_t len, int flags, struct sockaddr_storage *dest) { int rc; if (socket->ss_out) { @@ -2449,7 +2466,7 @@ TRACE_MSG("Attempted socket flush returned %d\r\n", rc); if (rc < 0) { if ((errno == EWOULDBLOCK) && (flags & WS_BUFFER)) { - buffer_write(socket, buffer, len); + buffer_write(socket, buffer, len, dest); return len; } else { return rc; @@ -2457,7 +2474,7 @@ } } - rc = socket_write_primitive(socket, buffer, len); + rc = socket_write_primitive(socket, buffer, len, dest); if (rc == len) { /* Everything is great. */ @@ -2473,7 +2490,7 @@ } } else if (rc <= 0) { if ((errno == EWOULDBLOCK) && (flags & WS_BUFFER)) { - buffer_write(socket, buffer, len); + buffer_write(socket, buffer, len, dest); return len; } if (useMessagef == 1) { @@ -2497,7 +2514,7 @@ TRANSPORT_TO_STRING(socket->ss_transport), rc, len, len, buffer); } - buffer_write(socket, buffer + rc, len - rc); + buffer_write(socket, buffer + rc, len - rc, dest); } return rc; @@ -2670,24 +2687,18 @@ * the Via, Contact, and Route headers. But for now SIPp always sends to the * host specified on the command line; or for UAS mode to the address that * sent the last message. */ - struct sockaddr *new_destination = NULL; - sipp_socklen_t addrlen = 0; + sipp_socklen_t addrlen = sizeof(struct sockaddr_storage); - if (toolMode == MODE_SERVER && socket->ss_transport == T_UDP) { - new_destination = (struct sockaddr *) &socket->ss_remote_sockaddr; - addrlen = sizeof(socket->ss_remote_sockaddr); - } - buffer = (char *)malloc(readsize); if (!buffer) { ERROR("Could not allocate memory for read!"); } - socketbuf = alloc_socketbuf(buffer, readsize, NO_COPY); + socketbuf = alloc_socketbuf(buffer, readsize, NO_COPY, NULL); switch(socket->ss_transport) { case T_TCP: case T_UDP: - ret = recvfrom(socket->ss_fd, buffer, readsize, 0, new_destination, &addrlen); + ret = recvfrom(socket->ss_fd, buffer, readsize, 0, (struct sockaddr *)&socketbuf->addr, &addrlen); break; case T_TLS: #ifdef _USE_OPENSSL @@ -2767,7 +2778,7 @@ free(socket); } -static ssize_t read_message(struct sipp_socket *socket, char *buf, size_t len) { +static ssize_t read_message(struct sipp_socket *socket, char *buf, size_t len, struct sockaddr_storage *src) { size_t avail; if (!socket->ss_msglen) @@ -2783,12 +2794,13 @@ } memcpy(buf, socket->ss_in->buf + socket->ss_in->offset, avail); + memcpy(src, &socket->ss_in->addr, SOCK_ADDR_SIZE(&socket->ss_in->addr)); /* Update our buffer and return value. */ buf[avail] = '\0'; /* For CMD Message the escape char is the end of message */ if((socket->ss_control) && buf[avail-1] == 27 ) buf[avail-1] = '\0'; - + socket->ss_in->offset += avail; /* Have we emptied the buffer? */ @@ -2819,7 +2831,7 @@ return avail; } -void process_message(struct sipp_socket *socket, char *msg, ssize_t msg_size) { +void process_message(struct sipp_socket *socket, char *msg, ssize_t msg_size, struct sockaddr_storage *src) { // TRACE_MSG(" msg_size %d and pollset_index is %d \n", msg_size, pollset_index)); if(msg_size <= 0) { return; @@ -2855,8 +2867,7 @@ // Adding a new INCOMING call ! main_scenario->stats->computeStat(CStat::E_CREATE_INCOMING_CALL); - - listener_ptr = new call(call_id, socket); + listener_ptr = new call(call_id, socket, src); if (!listener_ptr) { ERROR("Out of memory allocating a call!"); } @@ -2866,7 +2877,7 @@ { // Adding a new OUTGOING call ! main_scenario->stats->computeStat(CStat::E_CREATE_OUTGOING_CALL); - call *new_ptr = new call(call_id, is_ipv6, 0); + call *new_ptr = new call(call_id, is_ipv6, 0, use_remote_sending_addr ? &remote_sending_sockaddr : &remote_sockaddr); if (!new_ptr) { ERROR("Out of memory allocating a call!"); } @@ -2904,8 +2915,9 @@ // with automaticResponseMode // call is discarded before exiting the block if(!get_reply_code(msg)){ - ooc_scenario->stats->computeStat(CStat::E_CREATE_OUTGOING_CALL); - call *call_ptr = new call(ooc_scenario, socket, call_id, 0 /* no user. */, socket->ss_ipv6, true); + ooc_scenario->stats->computeStat(CStat::E_CREATE_INCOMING_CALL); + /* This should have the real address that the message came from. */ + call *call_ptr = new call(ooc_scenario, socket, src, call_id, 0 /* no user. */, socket->ss_ipv6, true); if (!call_ptr) { ERROR("Out of memory allocating a call!"); } @@ -2956,10 +2968,11 @@ while (pending_messages && (loops-- > 0)) { clock_tick = getmilliseconds(); if (sockets[read_index]->ss_msglen) { + struct sockaddr_storage src; char msg[SIPP_MAX_MSG_SIZE]; - ssize_t len = read_message(sockets[read_index], msg, sizeof(msg)); + ssize_t len = read_message(sockets[read_index], msg, sizeof(msg), &src); if (len > 0) { - process_message(sockets[read_index], msg, len); + process_message(sockets[read_index], msg, len, &src); } else { assert(0); } @@ -3050,11 +3063,12 @@ if (sockets[read_index]->ss_msglen) { char msg[SIPP_MAX_MSG_SIZE]; + struct sockaddr_storage src; ssize_t len; - len = read_message(sockets[read_index], msg, sizeof(msg)); + len = read_message(sockets[read_index], msg, sizeof(msg), &src); if (len > 0) { - process_message(sockets[read_index], msg, len); + process_message(sockets[read_index], msg, len, &src); } else { assert(0); } @@ -3163,7 +3177,7 @@ // adding a new OUTGOING CALL main_scenario->stats->computeStat(CStat::E_CREATE_OUTGOING_CALL); - call * call_ptr = call::add_call(userid, is_ipv6); + call * call_ptr = call::add_call(userid, is_ipv6, use_remote_sending_addr ? &remote_sending_sockaddr : &remote_sockaddr); if(!call_ptr) { ERROR("Out of memory allocating call!"); } Modified: sipp/trunk/sipp.hpp =================================================================== --- sipp/trunk/sipp.hpp 2008-01-08 22:01:38 UTC (rev 408) +++ sipp/trunk/sipp.hpp 2008-01-08 22:01:51 UTC (rev 409) @@ -470,6 +470,7 @@ char *buf; size_t len; size_t offset; + struct sockaddr_storage addr; struct socketbuf *next; }; @@ -503,7 +504,7 @@ }; /* Write data to a socket. */ -int write_socket(struct sipp_socket *socket, char *buffer, ssize_t len, int flags); +int write_socket(struct sipp_socket *socket, char *buffer, ssize_t len, int flags, struct sockaddr_storage *dest); /* Mark a socket as "bad". */ void sipp_socket_invalidate(struct sipp_socket *socket); /* Actually free the socket. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |