You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
(2) |
Dec
(6) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(12) |
Feb
(9) |
Mar
(8) |
Apr
(5) |
May
(10) |
Jun
(13) |
Jul
(7) |
Aug
(15) |
Sep
(17) |
Oct
(23) |
Nov
(51) |
Dec
(9) |
2007 |
Jan
(27) |
Feb
(11) |
Mar
(14) |
Apr
(21) |
May
(55) |
Jun
(15) |
Jul
(16) |
Aug
(8) |
Sep
(15) |
Oct
(24) |
Nov
(19) |
Dec
(47) |
2008 |
Jan
(33) |
Feb
(1) |
Mar
(14) |
Apr
(10) |
May
(8) |
Jun
(33) |
Jul
(33) |
Aug
(10) |
Sep
(13) |
Oct
(10) |
Nov
(1) |
Dec
(11) |
2009 |
Jan
(3) |
Feb
|
Mar
(8) |
Apr
(5) |
May
(1) |
Jun
|
Jul
(3) |
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
(3) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
(2) |
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(20) |
2013 |
Jan
(3) |
Feb
(20) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2019 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Olivier J. <oja...@us...> - 2006-01-10 16:46:56
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19319 Modified Files: Tag: cumulus send_packets.c Log Message: Removed errx in pcapplay/send_packets.c - provided by Guillaume Teissier. Index: send_packets.c =================================================================== RCS file: /cvsroot/sipp/sipp/Attic/send_packets.c,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -C2 -d -r1.1.2.3 -r1.1.2.4 *** send_packets.c 10 Jan 2006 16:18:50 -0000 1.1.2.3 --- send_packets.c 10 Jan 2006 16:46:47 -0000 1.1.2.4 *************** *** 247,251 **** if (gettimeofday (&now, NULL) < 0) { ! errx (1, "Error gettimeofday: %s", strerror (errno)); } --- 247,251 ---- if (gettimeofday (&now, NULL) < 0) { ! fprintf (stderr, "Error gettimeofday: %s\n", strerror (errno)); } *************** *** 288,289 **** --- 288,291 ---- } } + + |
From: Olivier J. <oja...@us...> - 2006-01-10 16:18:59
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14193 Modified Files: Tag: cumulus Makefile call.cpp call.hpp send_packets.c send_packets.h Log Message: Add IPv6 support for pcapplay feature, add lib64 in libs for AMD64 processor, creation of only one IPv4/6 pblock per send_packets call (was created every new RTP packet before) - provided by Guillaume Teissier. Index: call.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/call.cpp,v retrieving revision 1.9.2.40 retrieving revision 1.9.2.41 diff -C2 -d -r1.9.2.40 -r1.9.2.41 *** call.cpp 20 Dec 2005 16:56:52 -0000 1.9.2.40 --- call.cpp 10 Jan 2006 16:18:50 -0000 1.9.2.41 *************** *** 198,201 **** --- 198,229 ---- /* + * Look for "c=IN IP6 " pattern in the message and extract the following value + * which should be IPv6 address + */ + struct in6_addr get_remote_ipv6_media(char *msg) + { + char pattern[] = "c=IN IP6 "; + char *begin, *end; + char ip[128]; + in6_addr ipv6; + begin = strstr(msg, pattern); + if (!begin) { + fprintf(stderr, "%s", msg); + ERROR("No media IPv6 found"); + } + begin += sizeof("c=IN IP6 ") - 1; + end = strstr(begin, "\r\n"); + if (!end) + ERROR("No CRLF found"); + memset(ip, 0, 128); + strncpy(ip, begin, end - begin); + memset(&ipv6, 0, sizeof(ipv6)); + if (!inet_pton(AF_INET6, ip, &ipv6)) { + ERROR("No media IPv6 found"); + } + return ipv6; + } + + /* * Look for "m=audio " pattern in the message and extract the following value * which should be port number *************** *** 217,220 **** --- 245,265 ---- return atoi(number); } + + /* + * IPv{4,6} compliant + */ + int call::get_remote_media_addr(char *msg) { + if (media_ip_is_ipv6) { + (_RCAST(struct sockaddr_in6 *, &daddr))->sin6_family = AF_INET6; + (_RCAST(struct sockaddr_in6 *, &daddr))->sin6_port = get_remote_port_media(msg); + (_RCAST(struct sockaddr_in6 *, &daddr))->sin6_addr = get_remote_ipv6_media(msg); + } + else { + (_RCAST(struct sockaddr_in *, &daddr))->sin_family = AF_INET; + (_RCAST(struct sockaddr_in *, &daddr))->sin_port = get_remote_port_media(msg); + (_RCAST(struct sockaddr_in *, &daddr))->sin_addr.s_addr = get_remote_ip_media(msg); + } + hasMediaInformation = 1; + } #endif *************** *** 303,308 **** #ifdef PCAPPLAY ! remote_ip_media = 0; ! remote_port_media = 0; media_thread = 0; #endif --- 348,353 ---- #ifdef PCAPPLAY ! memset(&daddr, 0, sizeof(struct sockaddr_storage)); ! hasMediaInformation = 0; media_thread = 0; #endif *************** *** 1885,1891 **** } else if ((reply_code == 200) && (hasMedia == 1) ! && (remote_port_media == 0)) { ! remote_ip_media = get_remote_ip_media(msg); ! remote_port_media = get_remote_port_media(msg); #endif } --- 1930,1935 ---- } else if ((reply_code == 200) && (hasMedia == 1) ! && (hasMediaInformation == 0)) { ! get_remote_media_addr(msg); #endif } *************** *** 1905,1910 **** && (strncmp(request, "INVITE", 6) == 0) && (hasMedia == 1)) { ! remote_ip_media = get_remote_ip_media(msg); ! remote_port_media = get_remote_port_media(msg); } #endif --- 1949,1953 ---- && (strncmp(request, "INVITE", 6) == 0) && (hasMedia == 1)) { ! get_remote_media_addr(msg); } #endif *************** *** 2354,2363 **** CAction::E_AT_PLAY_PCAP) { play_args_t *play_args = currentAction->getPcapArgs(); ! play_args->from.sin_family = AF_INET; ! play_args->from.sin_addr.s_addr = inet_addr(media_ip); ! play_args->from.sin_port = media_port; ! play_args->to.sin_family = AF_INET; ! play_args->to.sin_addr.s_addr = remote_ip_media; ! play_args->to.sin_port = remote_port_media; /* Create a thread to send RTP packets */ pthread_attr_t attr; --- 2397,2414 ---- CAction::E_AT_PLAY_PCAP) { play_args_t *play_args = currentAction->getPcapArgs(); ! if (media_ip_is_ipv6) { ! struct sockaddr_in6 *from = (struct sockaddr_in6 *) &(play_args->from); ! from->sin6_family = AF_INET6; ! inet_pton(AF_INET6, media_ip, &(from->sin6_addr)); ! from->sin6_port = media_port; ! memcpy(&(play_args->to), &daddr, sizeof(struct sockaddr_in6)); ! } ! else { ! struct sockaddr_in *from = (struct sockaddr_in *) &(play_args->from); ! from->sin_family = AF_INET; ! from->sin_addr.s_addr = inet_addr(media_ip); ! from->sin_port = media_port; ! memcpy(&(play_args->to), &daddr, sizeof(struct sockaddr_in)); ! } /* Create a thread to send RTP packets */ pthread_attr_t attr; *************** *** 2366,2374 **** #define PTHREAD_STACK_MIN 16384 #endif ! pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); pthread_attr_setdetachstate(&attr, ! PTHREAD_CREATE_DETACHED); int ret = pthread_create(&media_thread, &attr, send_wrapper, ! (void *) play_args); assert(!ret); pthread_attr_destroy(&attr); --- 2417,2425 ---- #define PTHREAD_STACK_MIN 16384 #endif ! //pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); pthread_attr_setdetachstate(&attr, ! PTHREAD_CREATE_DETACHED); int ret = pthread_create(&media_thread, &attr, send_wrapper, ! (void *) play_args); assert(!ret); pthread_attr_destroy(&attr); Index: send_packets.h =================================================================== RCS file: /cvsroot/sipp/sipp/Attic/send_packets.h,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** send_packets.h 20 Dec 2005 16:56:52 -0000 1.1.2.1 --- send_packets.h 10 Jan 2006 16:18:50 -0000 1.1.2.2 *************** *** 111,116 **** char *file; uint16_t base; ! struct sockaddr_in from; ! struct sockaddr_in to; } play_args_t; --- 111,116 ---- char *file; uint16_t base; ! struct sockaddr_storage from; ! struct sockaddr_storage to; } play_args_t; Index: send_packets.c =================================================================== RCS file: /cvsroot/sipp/sipp/Attic/send_packets.c,v retrieving revision 1.1.2.2 retrieving revision 1.1.2.3 diff -C2 -d -r1.1.2.2 -r1.1.2.3 *** send_packets.c 21 Dec 2005 12:10:14 -0000 1.1.2.2 --- send_packets.c 10 Jan 2006 16:18:50 -0000 1.1.2.3 *************** *** 45,48 **** --- 45,49 ---- extern volatile unsigned long rtp_pckts; extern volatile unsigned long rtp_bytes; + extern int media_ip_is_ipv6; inline void *************** *** 109,119 **** int ret; u_long pktlen; ! u_char errbuf[PCAP_ERRBUF_SIZE]; ! libnet_ptag_t ip = 0, l4 = 0; ! struct libnet_ipv4_hdr *ip_hdr = NULL; struct libnet_udp_hdr *udp_hdr = NULL; ! char *payload; int payload_s; int ip_len; int port_diff; struct timeval didsleep = { 0, 0 }; --- 110,123 ---- int ret; u_long pktlen; ! char errbuf[PCAP_ERRBUF_SIZE]; ! libnet_ptag_t ip = LIBNET_PTAG_INITIALIZER, l4 = LIBNET_PTAG_INITIALIZER; ! struct libnet_ipv4_hdr *ip4_hdr = NULL; ! struct libnet_ipv6_hdr *ip6_hdr = NULL; struct libnet_udp_hdr *udp_hdr = NULL; ! u_char *payload; int payload_s; int ip_len; + uint16_t from_port, to_port; + struct libnet_in6_addr from_ipv6, to_ipv6; int port_diff; struct timeval didsleep = { 0, 0 }; *************** *** 123,127 **** assert (pcap); ! l = libnet_init (LIBNET_RAW4, play_args->interface, errbuf); assert (l); --- 127,138 ---- assert (pcap); ! if (media_ip_is_ipv6) { ! l = libnet_init (LIBNET_RAW6, play_args->interface, errbuf); ! memcpy(&from_ipv6, & (((struct sockaddr_in6 *) (&(play_args->from)) )->sin6_addr), sizeof(struct libnet_in6_addr)); ! memcpy(&to_ipv6, & (((struct sockaddr_in6 *) (&(play_args->to)) )->sin6_addr), sizeof(struct libnet_in6_addr)); ! } ! else { ! l = libnet_init (LIBNET_RAW4, play_args->interface, errbuf); ! } assert (l); *************** *** 138,166 **** pktlen = (u_long) pkthdr->len; ! ip_hdr = (struct libnet_ipv4_hdr *) (pktdata + LIBNET_ETH_H); ! ip_len = 4 * ip_hdr->ip_hl; ! if (ip_hdr->ip_p == IPPROTO_UDP) ! { ! udp_hdr = (struct libnet_udp_hdr *) (pktdata + LIBNET_ETH_H + ip_len); ! payload = ((char *) udp_hdr + sizeof (*udp_hdr)); ! payload_s = pktlen - ip_len - sizeof (*udp_hdr) - LIBNET_ETH_H; ! port_diff = ntohs (udp_hdr->uh_dport) - play_args->base; - l4 = libnet_build_udp (play_args->from.sin_port + port_diff, - play_args->to.sin_port + port_diff, - LIBNET_UDP_H + payload_s, - 0, payload, payload_s, l, l4); - assert (l4 != -1); - ip = libnet_build_ipv4 (LIBNET_IPV4_H + LIBNET_UDP_H + - payload_s, 0, 666, 0, 64, IPPROTO_UDP, - 0, play_args->from.sin_addr.s_addr, - play_args->to.sin_addr.s_addr, NULL, 0, - l, ip); - assert (ip != -1); - } - else if (ip_hdr->ip_p == IPPROTO_TCP) - { - } do_sleep ((struct timeval *) &pkthdr->ts, &last, pktlen, &didsleep, &start); --- 149,194 ---- pktlen = (u_long) pkthdr->len; ! /*Read from IPv4 capture*/ ! /*For the moment ;)*/ ! ip4_hdr = (struct libnet_ipv4_hdr *) (pktdata + LIBNET_ETH_H); ! ip_len = 4 * ip4_hdr->ip_hl; ! udp_hdr = (struct libnet_udp_hdr *) (pktdata + LIBNET_ETH_H + ip_len); ! payload = ((u_char *) udp_hdr + sizeof (*udp_hdr)); ! payload_s = pktlen - ip_len - sizeof (*udp_hdr) - LIBNET_ETH_H; ! port_diff = ntohs (udp_hdr->uh_dport) - play_args->base; ! ! if (media_ip_is_ipv6) { ! from_port = ((struct sockaddr_in6 *) (&(play_args->from)) )->sin6_port; ! to_port = ((struct sockaddr_in6 *) (&(play_args->to)) )->sin6_port; ! } ! else { ! from_port = ((struct sockaddr_in *) (&(play_args->from)) )->sin_port; ! to_port = ((struct sockaddr_in *) (&(play_args->to)) )->sin_port; ! } ! ! l4 = libnet_build_udp (from_port + port_diff, ! to_port + port_diff, ! LIBNET_UDP_H + payload_s, ! 0, payload, payload_s, l, l4); ! assert (l4 != -1); ! if (ip == LIBNET_PTAG_INITIALIZER) { ! if (media_ip_is_ipv6) { ! ip = libnet_build_ipv6 (0, 0, ! LIBNET_UDP_H + payload_s, IPPROTO_UDP, ! 255, from_ipv6, ! to_ipv6, NULL, 0, ! l, 0); ! } ! else { ! ip = libnet_build_ipv4 (LIBNET_IPV4_H + LIBNET_UDP_H + ! payload_s, 0, 666, 0, 64, IPPROTO_UDP, ! 0, ((struct sockaddr_in *) (&(play_args->from)) )->sin_addr.s_addr, ! ((struct sockaddr_in *) (&(play_args->to)) )->sin_addr.s_addr, NULL, 0, ! l, 0); ! } ! assert (ip != -1); ! } do_sleep ((struct timeval *) &pkthdr->ts, &last, pktlen, &didsleep, &start); *************** *** 180,186 **** fprintf (stderr, "Unable to send packet: %s\n", strerror (errno)); ! fprintf (stderr, "Send packets called with %s[%d]\n", ! inet_ntoa (play_args->to.sin_addr), ! ntohs (play_args->to.sin_port)); abort (); } --- 208,221 ---- fprintf (stderr, "Unable to send packet: %s\n", strerror (errno)); ! if (media_ip_is_ipv6) { ! fprintf (stderr, "Send packets called with %s[%d]\n", ! NULL, ! ((struct sockaddr_in6 *) (&(play_args->to)) )->sin6_port); ! } ! else { ! fprintf (stderr, "Send packets called with %s[%d]\n", ! inet_ntoa (((struct sockaddr_in *) (&(play_args->to)) )->sin_addr), ! ((struct sockaddr_in *) (&(play_args->to)) )->sin_port); ! } abort (); } Index: Makefile =================================================================== RCS file: /cvsroot/sipp/sipp/Makefile,v retrieving revision 1.7.2.10 retrieving revision 1.7.2.11 diff -C2 -d -r1.7.2.10 -r1.7.2.11 *** Makefile 20 Dec 2005 16:56:52 -0000 1.7.2.10 --- Makefile 10 Jan 2006 16:18:49 -0000 1.7.2.11 *************** *** 125,129 **** #Link Libraries ! LIBS_linux= -ldl -lpthread -lncurses -lstdc++ -L /usr/local/lib -L /usr/lib LIBS_hpux= -lcurses -lpthread -L /opt/openssl/lib -L /usr/local/lib LIBS_tru64= -lcurses -lpthread --- 125,129 ---- #Link Libraries ! LIBS_linux= -ldl -lpthread -lncurses -lstdc++ -L /usr/local/lib -L /usr/lib -L /usr/lib64 LIBS_hpux= -lcurses -lpthread -L /opt/openssl/lib -L /usr/local/lib LIBS_tru64= -lcurses -lpthread Index: call.hpp =================================================================== RCS file: /cvsroot/sipp/sipp/call.hpp,v retrieving revision 1.5.2.13 retrieving revision 1.5.2.14 diff -C2 -d -r1.5.2.13 -r1.5.2.14 *** call.hpp 20 Dec 2005 16:56:52 -0000 1.5.2.13 --- call.hpp 10 Jan 2006 16:18:50 -0000 1.5.2.14 *************** *** 80,85 **** #ifdef PCAPPLAY /* remote media information */ ! uint32_t remote_ip_media; ! uint16_t remote_port_media; pthread_t media_thread; #endif --- 80,85 ---- #ifdef PCAPPLAY /* remote media information */ ! struct sockaddr_storage daddr; ! int hasMediaInformation; pthread_t media_thread; #endif *************** *** 211,214 **** --- 211,216 ---- bool use_ipv6; + int get_remote_media_addr(char * message); + static void getFieldFromInputFile(const char* fieldName, int lineNum, char*& dest); |
From: Olivier J. <oja...@us...> - 2006-01-05 08:11:14
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11747 Modified Files: Tag: cumulus sipp.cpp Log Message: Fixed wrong open file limit warning - provided by Clement Chen. Index: sipp.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/sipp.cpp,v retrieving revision 1.15.2.39 retrieving revision 1.15.2.40 diff -C2 -d -r1.15.2.39 -r1.15.2.40 *** sipp.cpp 20 Dec 2005 16:56:52 -0000 1.15.2.39 --- sipp.cpp 5 Jan 2006 08:11:07 -0000 1.15.2.40 *************** *** 25,28 **** --- 25,29 ---- * Shriram Natarajan * Guillaume Teissier from FTR&D + * Clement Chen */ *************** *** 3598,3602 **** if (rlimit.rlim_max > #ifndef __CYGWIN ! (L_maxSocketPresent) ? max_multi_socket : FD_SETSIZE #else FD_SETSIZE --- 3599,3603 ---- if (rlimit.rlim_max > #ifndef __CYGWIN ! ((L_maxSocketPresent) ? max_multi_socket : FD_SETSIZE) #else FD_SETSIZE |
From: Olivier J. <oja...@us...> - 2005-12-21 13:05:08
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21716 Modified Files: Tag: cumulus LICENSE.txt Log Message: Change in LICENSE.txt to include send_packets.c and send_packets.h specific copyright notice Index: LICENSE.txt =================================================================== RCS file: /cvsroot/sipp/sipp/LICENSE.txt,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -C2 -d -r1.1.1.1 -r1.1.1.1.2.1 *** LICENSE.txt 4 Apr 2004 07:07:28 -0000 1.1.1.1 --- LICENSE.txt 21 Dec 2005 13:04:58 -0000 1.1.1.1.2.1 *************** *** 1,2 **** --- 1,36 ---- + SIPp is licensed under GNU general public license (copy below) except + send_packets.c and send_packets.h for which the following copyright + notice applies: + + ------ Copyright notice for send_packets.c and send_packets.h -------- + * Copyright (c) 2001-2004 Aaron Turner. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the names of the copyright owners nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ---------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 |
From: Olivier J. <oja...@us...> - 2005-12-21 12:10:33
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9313 Modified Files: Tag: cumulus send_packets.c Log Message: pcapplay: use of libnet structures for better portability. Index: send_packets.c =================================================================== RCS file: /cvsroot/sipp/sipp/Attic/send_packets.c,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** send_packets.c 20 Dec 2005 16:56:52 -0000 1.1.2.1 --- send_packets.c 21 Dec 2005 12:10:14 -0000 1.1.2.2 *************** *** 111,116 **** u_char errbuf[PCAP_ERRBUF_SIZE]; libnet_ptag_t ip = 0, l4 = 0; ! struct iphdr *ip_hdr = NULL; ! struct udphdr *udp_hdr = NULL; char *payload; int payload_s; --- 111,116 ---- u_char errbuf[PCAP_ERRBUF_SIZE]; libnet_ptag_t ip = 0, l4 = 0; ! struct libnet_ipv4_hdr *ip_hdr = NULL; ! struct libnet_udp_hdr *udp_hdr = NULL; char *payload; int payload_s; *************** *** 138,150 **** pktlen = (u_long) pkthdr->len; ! ip_hdr = (struct iphdr *) (pktdata + LIBNET_ETH_H); ! ip_len = 4 * ip_hdr->ihl; ! if (ip_hdr->protocol == IPPROTO_UDP) { ! udp_hdr = (struct udphdr *) (pktdata + LIBNET_ETH_H + ip_len); payload = ((char *) udp_hdr + sizeof (*udp_hdr)); payload_s = pktlen - ip_len - sizeof (*udp_hdr) - LIBNET_ETH_H; ! port_diff = ntohs (udp_hdr->dest) - play_args->base; l4 = libnet_build_udp (play_args->from.sin_port + port_diff, --- 138,150 ---- pktlen = (u_long) pkthdr->len; ! ip_hdr = (struct libnet_ipv4_hdr *) (pktdata + LIBNET_ETH_H); ! ip_len = 4 * ip_hdr->ip_hl; ! if (ip_hdr->ip_p == IPPROTO_UDP) { ! udp_hdr = (struct libnet_udp_hdr *) (pktdata + LIBNET_ETH_H + ip_len); payload = ((char *) udp_hdr + sizeof (*udp_hdr)); payload_s = pktlen - ip_len - sizeof (*udp_hdr) - LIBNET_ETH_H; ! port_diff = ntohs (udp_hdr->uh_dport) - play_args->base; l4 = libnet_build_udp (play_args->from.sin_port + port_diff, *************** *** 160,164 **** assert (ip != -1); } ! else if (ip_hdr->protocol == IPPROTO_TCP) { } --- 160,164 ---- assert (ip != -1); } ! else if (ip_hdr->ip_p == IPPROTO_TCP) { } |
From: Olivier J. <oja...@us...> - 2005-12-20 16:59:48
|
Update of /cvsroot/sipp/sipp/pcap In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4124/pcap Added Files: Tag: cumulus dtmf_2833_1.pcap dtmf_2833_2.pcap dtmf_2833_3.pcap dtmf_2833_4.pcap dtmf_2833_5.pcap dtmf_2833_6.pcap dtmf_2833_7.pcap dtmf_2833_8.pcap dtmf_2833_9.pcap dtmf_2833_pound.pcap dtmf_2833_star.pcap g711a.pcap Log Message: Initial check-in of pcap play feature - provided by Guillaume Teissier from FT R&D. --- NEW FILE: dtmf_2833_8.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_6.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_7.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_5.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_4.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_2.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_star.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_1.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_3.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_9.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: dtmf_2833_pound.pcap --- (This appears to be a binary file; contents omitted.) --- NEW FILE: g711a.pcap --- (This appears to be a binary file; contents omitted.) |
From: Olivier J. <oja...@us...> - 2005-12-20 16:57:17
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3604 Modified Files: Tag: cumulus Makefile README.txt actions.cpp actions.hpp call.cpp call.hpp scenario.cpp scenario.hpp sipp.cpp sipp.dtd sipp.hpp Added Files: Tag: cumulus MEDIA.txt send_packets.c send_packets.h Log Message: Initial check-in of pcap play feature - provided by Guillaume Teissier from FT R&D. Index: sipp.dtd =================================================================== RCS file: /cvsroot/sipp/sipp/sipp.dtd,v retrieving revision 1.3.2.2 retrieving revision 1.3.2.3 diff -C2 -d -r1.3.2.2 -r1.3.2.3 *** sipp.dtd 9 Nov 2004 08:15:36 -0000 1.3.2.2 --- sipp.dtd 20 Dec 2005 16:56:52 -0000 1.3.2.3 *************** *** 21,24 **** --- 21,25 ---- <!ATTLIST exec command CDATA > <!ATTLIST exec int_cmd (stop_now|stop_gracefully|stop_call) "stop_call" > + <!ATTLIST exec play_pcap CDATA > <!ELEMENT pause EMPTY > Index: call.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/call.cpp,v retrieving revision 1.9.2.39 retrieving revision 1.9.2.40 diff -C2 -d -r1.9.2.39 -r1.9.2.40 *** call.cpp 22 Nov 2005 12:59:07 -0000 1.9.2.39 --- call.cpp 20 Dec 2005 16:56:52 -0000 1.9.2.40 *************** *** 24,27 **** --- 24,28 ---- * Nasir Khan * Lee Ballard + * Guillaume Teissier from FTR&D */ *************** *** 30,34 **** --- 31,39 ---- #include <fstream> #include <iostream> + #ifdef PCAPPLAY + #include <assert.h> + #endif #include "sipp.hpp" + #include "send_packets.h" #define KEYWORD_SIZE 64 *************** *** 42,45 **** --- 47,55 ---- call_map calls; + #ifdef PCAPPLAY + /* send_packets pthread wrapper */ + void *send_wrapper(void *); + #endif + /************** Call map and management routines **************/ *************** *** 162,165 **** --- 172,222 ---- } + #ifdef PCAPPLAY + /******* Media information management *************************/ + /* + * Look for "c=IN IP4 " pattern in the message and extract the following value + * which should be IP address + */ + uint32_t get_remote_ip_media(char *msg) + { + char pattern[] = "c=IN IP4 "; + char *begin, *end; + char ip[32]; + begin = strstr(msg, pattern); + if (!begin) { + fprintf(stderr, "%s", msg); + ERROR("No media IP found"); + } + begin += sizeof("c=IN IP4 ") - 1; + end = strstr(begin, "\r\n"); + if (!end) + ERROR("No CRLF found"); + memset(ip, 0, 32); + strncpy(ip, begin, end - begin); + return inet_addr(ip); + } + + /* + * Look for "m=audio " pattern in the message and extract the following value + * which should be port number + */ + uint16_t get_remote_port_media(char *msg) + { + char pattern[] = "m=audio "; + char *begin, *end; + char number[5]; + begin = strstr(msg, pattern); + if (!begin) + ERROR("No media port found"); + begin += sizeof("m=audio ") - 1; + end = strstr(begin, "\r\n"); + if (!end) + ERROR("No CRLF found"); + memset(number, 0, 5); + strncpy(number, begin, end - begin); + return atoi(number); + } + #endif + /******* Very simple hash for retransmission detection *******/ *************** *** 245,248 **** --- 302,311 ---- } + #ifdef PCAPPLAY + remote_ip_media = 0; + remote_port_media = 0; + media_thread = 0; + #endif + peer_tag[0] = '\0'; } *************** *** 864,867 **** --- 927,933 ---- double L_stop_time ; bool bInviteTransaction = false; + #ifdef PCAPPLAY + int actionResult = 0; + #endif if(msg_index >= scenario_len) { *************** *** 957,960 **** --- 1023,1032 ---- } #endif + #ifdef PCAPPLAY + else if(scenario[msg_index] -> M_type == MSG_TYPE_NOP) { + actionResult = executeAction(NULL, msg_index); + return(next()); + } + #endif else if(scenario[msg_index] -> send_scheme) { *************** *** 1047,1050 **** --- 1119,1126 ---- } + #ifdef PCAPPLAY + actionResult = executeAction(msg_snd, msg_index); + #endif + /* Update scenario statistics */ scenario[msg_index] -> nb_sent++; *************** *** 1806,1809 **** --- 1882,1892 ---- return false; // Call aborted by unexpected message handling } + #ifdef PCAPPLAY + } else if ((reply_code == 200) + && (hasMedia == 1) + && (remote_port_media == 0)) { + remote_ip_media = get_remote_ip_media(msg); + remote_port_media = get_remote_port_media(msg); + #endif } request[0]=0; *************** *** 1818,1821 **** --- 1901,1912 ---- call_established=true; } + #ifdef PCAPPLAY + if ((toolMode == MODE_SERVER) + && (strncmp(request, "INVITE", 6) == 0) + && (hasMedia == 1)) { + remote_ip_media = get_remote_ip_media(msg); + remote_port_media = get_remote_port_media(msg); + } + #endif reply_code = 0; *************** *** 2259,2262 **** --- 2350,2377 ---- break; } + #ifdef PCAPPLAY + } else if (currentAction->getActionType() == + CAction::E_AT_PLAY_PCAP) { + play_args_t *play_args = currentAction->getPcapArgs(); + play_args->from.sin_family = AF_INET; + play_args->from.sin_addr.s_addr = inet_addr(media_ip); + play_args->from.sin_port = media_port; + play_args->to.sin_family = AF_INET; + play_args->to.sin_addr.s_addr = remote_ip_media; + play_args->to.sin_port = remote_port_media; + /* Create a thread to send RTP packets */ + pthread_attr_t attr; + pthread_attr_init(&attr); + #ifndef PTHREAD_STACK_MIN + #define PTHREAD_STACK_MIN 16384 + #endif + pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); + pthread_attr_setdetachstate(&attr, + PTHREAD_CREATE_DETACHED); + int ret = pthread_create(&media_thread, &attr, send_wrapper, + (void *) play_args); + assert(!ret); + pthread_attr_destroy(&attr); + #endif } else {// end action == E_AT_EXECUTE_CMD ERROR("call::executeAction unknown action"); *************** *** 2534,2536 **** } ! --- 2649,2665 ---- } ! #ifdef PCAPPLAY ! void *send_wrapper(void *arg) ! { ! play_args_t *s = (play_args_t *) arg; ! struct sched_param param; ! int ret; ! param.sched_priority = 10; ! ret = pthread_setschedparam(pthread_self(), SCHED_RR, ¶m); ! assert(!ret); ! pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); ! pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); ! send_packets(s); ! return NULL; ! } ! #endif Index: README.txt =================================================================== RCS file: /cvsroot/sipp/sipp/README.txt,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -C2 -d -r1.1.1.1 -r1.1.1.1.2.1 *** README.txt 4 Apr 2004 07:07:28 -0000 1.1.1.1 --- README.txt 20 Dec 2005 16:56:52 -0000 1.1.1.1.2.1 *************** *** 13,20 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ! # Copyright (C) 2003 - The Authors ! # ! # Author : Richard GAYRAUD - 04 Nov 2003 ! # From Hewlett Packard Company. # --- 13,17 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ! # Copyright (C) 2003,2004,2005 - The Authors # *************** *** 65,68 **** --- 62,66 ---- Thanks, + oja...@us... ric...@us... Index: scenario.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/scenario.cpp,v retrieving revision 1.11.2.22 retrieving revision 1.11.2.23 diff -C2 -d -r1.11.2.22 -r1.11.2.23 *** scenario.cpp 12 Oct 2005 20:32:31 -0000 1.11.2.22 --- scenario.cpp 20 Dec 2005 16:56:52 -0000 1.11.2.23 *************** *** 21,24 **** --- 21,25 ---- * Venkatesh * Lee Ballard + * Guillaume TEISSIER from FTR&D */ *************** *** 293,296 **** --- 294,301 ---- } + #ifdef PCAPPLAY + getActionForThisMessage(); + #endif + } else if(!strcmp(elem, (char *)"recv")) { recv_count++; *************** *** 386,391 **** --- 391,404 ---- scenario_duration += duration; } + getActionForThisMessage(); } + #ifdef PCAPPLAY + else if(!strcmp(elem, "nop")) { + /* Does nothing at SIP level, only meant to handle actions */ + scenario[scenario_len]->M_type = MSG_TYPE_NOP; + getActionForThisMessage(); + } + #endif #ifdef __3PCC__ else if(!strcmp(elem, "recvCmd")) { *************** *** 727,730 **** --- 740,751 ---- tmpActions.setAction(tmpAction); tmpActionNumber++; + #ifdef PCAPPLAY + } else if (ptr = xp_get_value((char *) "play_pcap")) { + tmpAction.setPcapArgs(ptr); + tmpAction.setActionType(CAction::E_AT_PLAY_PCAP); + tmpActions.setAction(tmpAction); + tmpActionNumber++; + hasMedia = 1; + #endif } else { ERROR("illegal exec line\n"); *************** *** 2014,2017 **** --- 2035,2177 ---- "\n" "</scenario>\n" + #ifdef PCAPPLAY + "\n", + + /************* Default_scenario[9] ***************/ + (char*) + "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n" + "<!DOCTYPE scenario SYSTEM \"sipp.dtd\">\n" + "\n" + "<!-- This program is free software; you can redistribute it and/or -->\n" + "<!-- modify it under the terms of the GNU General Public License as -->\n" + "<!-- published by the Free Software Foundation; either version 2 of the -->\n" + "<!-- License, or (at your option) any later version. -->\n" + "<!-- -->\n" + "<!-- This program is distributed in the hope that it will be useful, -->\n" + "<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of -->\n" + "<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -->\n" + "<!-- GNU General Public License for more details. -->\n" + "<!-- -->\n" + "<!-- You should have received a copy of the GNU General Public License -->\n" + "<!-- along with this program; if not, write to the -->\n" + "<!-- Free Software Foundation, Inc., -->\n" + "<!-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -->\n" + "<!-- -->\n" + "<!-- Sipp 'uac' scenario with pcap (rtp) play -->\n" + "<!-- -->\n" + "\n" + "<scenario name=\"UAC with media\">\n" + " <!-- In client mode (sipp placing calls), the Call-ID MUST be -->\n" + " <!-- generated by sipp. To do so, use [call_id] keyword. -->\n" + " <send retrans=\"500\">\n" + " <![CDATA[\n" + "\n" + " INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0\n" + " Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]\n" + " From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]\n" + " To: sut <sip:[service]@[remote_ip]:[remote_port]>\n" + " Call-ID: [call_id]\n" + " CSeq: 1 INVITE\n" + " Contact: sip:sipp@[local_ip]:[local_port]\n" + " Max-Forwards: 70\n" + " Subject: Performance Test\n" + " Content-Type: application/sdp\n" + " Content-Length: [len]\n" + "\n" + " v=0\n" + " o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]\n" + " s=-\n" + " c=IN IP[local_ip_type] [local_ip]\n" + " t=0 0\n" + " m=audio [media_port] RTP/AVP 8\n" + " a=rtpmap:8 PCMA/8000\n" + " a=rtpmap:101 telephone-event/8000\n" + " a=fmtp:101 0-11,16\n" + "\n" + " ]]>\n" + " </send>\n" + "\n" + " <recv response=\"100\" optional=\"true\">\n" + " </recv>\n" + "\n" + " <recv response=\"180\" optional=\"true\">\n" + " </recv>\n" + "\n" + " <!-- By adding rrs=\"true\" (Record Route Sets), the route sets -->\n" + " <!-- are saved and used for following messages sent. Useful to test -->\n" + " <!-- against stateful SIP proxies/B2BUAs. -->\n" + " <recv response=\"200\" rtd=\"true\" crlf=\"true\">\n" + " </recv>\n" + "\n" + " <!-- Packet lost can be simulated in any send/recv message by -->\n" + " <!-- by adding the 'lost = \"10\"'. Value can be [1-100] percent. -->\n" + " <send>\n" + " <![CDATA[\n" + "\n" + " ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0\n" + " Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]\n" + " From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]\n" + " To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]\n" + " Call-ID: [call_id]\n" + " CSeq: 1 ACK\n" + " Contact: sip:sipp@[local_ip]:[local_port]\n" + " Max-Forwards: 70\n" + " Subject: Performance Test\n" + " Content-Length: 0\n" + "\n" + " ]]>\n" + " </send>\n" + "\n" + " <!-- Play a pre-recorded PCAP file (RTP stream) using lo interface -->\n" + " <!-- and that was originally meant for destination port 2006 -->\n" + " <nop>\n" + " <action>\n" + " <exec play_pcap=\"pcap/g711a.pcap:lo:2006\"/>\n" + " </action>\n" + " </nop>\n" + "\n" + " <!-- Pause 8 seconds, which is approximately the duration of the -->\n" + " <!-- PCAP file -->\n" + " <pause milliseconds=\"8000\"/>\n" + "\n" + " <!-- Play an out of band DTMF '1' using lo interface and that was -->\n" + " <!-- originally meant for destination port 10000 -->\n" + " <nop>\n" + " <action>\n" + " <exec play_pcap=\"pcap/dtmf_2833_1.pcap:lo:10000\"/>\n" + " </action>\n" + " </nop>\n" + "\n" + " <pause milliseconds=\"1000\"/>\n" + "\n" + " <!-- The 'crlf' option inserts a blank line in the statistics report. -->\n" + " <send retrans=\"500\">\n" + " <![CDATA[\n" + "\n" + " BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0\n" + " Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]\n" + " From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]\n" + " To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]\n" + " Call-ID: [call_id]\n" + " CSeq: 2 BYE\n" + " Contact: sip:sipp@[local_ip]:[local_port]\n" + " Max-Forwards: 70\n" + " Subject: Performance Test\n" + " Content-Length: 0\n" + "\n" + " ]]>\n" + " </send>\n" + "\n" + " <recv response=\"200\" crlf=\"true\">\n" + " </recv>\n" + "\n" + " <!-- definition of the response time repartition table (unit is ms) -->\n" + " <ResponseTimeRepartition value=\"10, 20, 30, 40, 50, 100, 150, 200\"/>\n" + "\n" + " <!-- definition of the call length repartition table (unit is ms) -->\n" + " <CallLengthRepartition value=\"10, 50, 100, 500, 1000, 5000, 10000\"/>\n" + "\n" + "</scenario>\n" "\n" + #endif }; --- NEW FILE: send_packets.h --- /* * send_packets.h: from tcpreplay tools by Aaron Turner * http://tcpreplay.sourceforge.net/ * send_packets.h is under BSD license (see below) * SIPp is under GPL license */ /* * Copyright (c) 2001-2004 Aaron Turner. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the names of the copyright owners nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _SIPP_SEND_PACKETS_H_ #define _SIPP_SEND_PACKETS_H_ #include <time.h> #include <sys/time.h> #include <math.h> inline void timerdiv (struct timeval *tvp, float div); inline void float2timer (float time, struct timeval *tvp); #ifndef TIMEVAL_TO_TIMESPEC #define TIMEVAL_TO_TIMESPEC(tv, ts) { \ (ts)->tv_sec = (tv)->tv_sec; \ (ts)->tv_nsec = (tv)->tv_usec * 1000; } #endif /* zero out a timer */ #ifndef timerclear #define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 #endif /* is timer non-zero? */ #ifndef timerisset #define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) #endif /* add tvp and uvp and store in vvp */ #ifndef timeradd #define timeradd(tvp, uvp, vvp) \ do { \ (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ if ((vvp)->tv_usec >= 1000000) { \ (vvp)->tv_sec++; \ (vvp)->tv_usec -= 1000000; \ } \ } while (0) #endif /* subtract uvp from tvp and store in vvp */ #ifndef timersub #define timersub(tvp, uvp, vvp) \ do { \ (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ if ((vvp)->tv_usec < 0) { \ (vvp)->tv_sec--; \ (vvp)->tv_usec += 1000000; \ } \ } while (0) #endif /* compare tvp and uvp using cmp */ #ifndef timercmp #define timercmp(tvp, uvp, cmp) \ (((tvp)->tv_sec == (uvp)->tv_sec) ? \ ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ ((tvp)->tv_sec cmp (uvp)->tv_sec)) #endif /* multiply tvp by x and store in uvp */ #define timermul(tvp, uvp, x) \ do { \ (uvp)->tv_sec = (tvp)->tv_sec * x; \ (uvp)->tv_usec = (tvp)->tv_usec * x; \ while((uvp)->tv_usec > 1000000) { \ (uvp)->tv_sec++; \ (uvp)->tv_usec -= 1000000; \ } \ } while(0) /* device tvp by x. store in tvp */ #define timerdiv2(tvp, x) \ do { \ (tvp)->tv_sec = (tvp)->tv_sec / x; \ (tvp)->tv_usec = (tvp)->tv_usec / x; \ } while(0) /* send_packets args */ typedef struct { char *interface; char *file; uint16_t base; struct sockaddr_in from; struct sockaddr_in to; } play_args_t; #ifdef __cplusplus extern "C" { #endif int parse_play_args (char *, play_args_t *); int send_packets (play_args_t *); #ifdef __cplusplus } #endif #endif/*_SIPP_SEND_PACKETS_H_*/ --- NEW FILE: send_packets.c --- /* * send_packets.c: from tcpreplay tools by Aaron Turner * http://tcpreplay.sourceforge.net/ * send_packets.c is under BSD license (see below) * SIPp is under GPL license */ /* * Copyright (c) 2001-2004 Aaron Turner. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the names of the copyright owners nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <pcap.h> #include <libnet.h> #include <unistd.h> #include <assert.h> #include <stdlib.h> #include "send_packets.h" extern volatile unsigned long rtp_pckts; extern volatile unsigned long rtp_bytes; inline void timerdiv (struct timeval *tvp, float div) { double interval; if (div == 0 || div == 1) return; interval = ((double) tvp->tv_sec * 1000000 + tvp->tv_usec) / (double) div; tvp->tv_sec = interval / (int) 1000000; tvp->tv_usec = interval - (tvp->tv_sec * 1000000); } /* * converts a float to a timeval structure */ inline void float2timer (float time, struct timeval *tvp) { float n; n = time; tvp->tv_sec = n; n -= tvp->tv_sec; tvp->tv_usec = n * 100000; } /* buffer should be "file:interface:port_base" */ int parse_play_args (char *buffer, play_args_t * args) { char *colon, *interf; colon = strchr (buffer, ':'); if (!colon) return -1; *colon = '\0'; args->file = strdup (buffer); interf = colon + 1; colon = strchr (colon + 1, ':'); if (!colon) return -1; *colon = '\0'; args->interface = strdup (interf); args->base = atoi (colon + 1); // fprintf (stderr, "Parsed %s on %s[>%d]\n", args->file, args->interface, args->base); } /*Safe threaded version*/ void do_sleep (struct timeval *, struct timeval *, int, struct timeval *, struct timeval *); int send_packets (play_args_t * play_args) { libnet_t *l; pcap_t *pcap; struct timeval last = { 0, 0 }; struct pcap_pkthdr *pkthdr = NULL; u_char *pktdata = NULL; int ret; u_long pktlen; u_char errbuf[PCAP_ERRBUF_SIZE]; libnet_ptag_t ip = 0, l4 = 0; struct iphdr *ip_hdr = NULL; struct udphdr *udp_hdr = NULL; char *payload; int payload_s; int ip_len; int port_diff; struct timeval didsleep = { 0, 0 }; struct timeval start = { 0, 0 }; pcap = pcap_open_offline (play_args->file, errbuf); assert (pcap); l = libnet_init (LIBNET_RAW4, play_args->interface, errbuf); assert (l); #if HAVE_PCAP_NEXT_EX while (pcap_next_ex (pcap, &pkthdr, (const u_char **) &pktdata) == 1) { #else pkthdr = malloc (sizeof (*pkthdr)); assert (pkthdr); while ((pktdata = pcap_next (pcap, pkthdr)) != NULL) { #endif pktlen = (u_long) pkthdr->len; ip_hdr = (struct iphdr *) (pktdata + LIBNET_ETH_H); ip_len = 4 * ip_hdr->ihl; if (ip_hdr->protocol == IPPROTO_UDP) { udp_hdr = (struct udphdr *) (pktdata + LIBNET_ETH_H + ip_len); payload = ((char *) udp_hdr + sizeof (*udp_hdr)); payload_s = pktlen - ip_len - sizeof (*udp_hdr) - LIBNET_ETH_H; port_diff = ntohs (udp_hdr->dest) - play_args->base; l4 = libnet_build_udp (play_args->from.sin_port + port_diff, play_args->to.sin_port + port_diff, LIBNET_UDP_H + payload_s, 0, payload, payload_s, l, l4); assert (l4 != -1); ip = libnet_build_ipv4 (LIBNET_IPV4_H + LIBNET_UDP_H + payload_s, 0, 666, 0, 64, IPPROTO_UDP, 0, play_args->from.sin_addr.s_addr, play_args->to.sin_addr.s_addr, NULL, 0, l, ip); assert (ip != -1); } else if (ip_hdr->protocol == IPPROTO_TCP) { } do_sleep ((struct timeval *) &pkthdr->ts, &last, pktlen, &didsleep, &start); do { ret = libnet_write (l); if (ret == -1) { if (errno == ENOBUFS) { fprintf (stderr, "NOBUFS\n"); abort (); } else { fprintf (stderr, "Unable to send packet: %s\n", strerror (errno)); fprintf (stderr, "Send packets called with %s[%d]\n", inet_ntoa (play_args->to.sin_addr), ntohs (play_args->to.sin_port)); abort (); } } rtp_pckts++; rtp_bytes += pktlen; } while (ret == -1); memcpy (&last, &pkthdr->ts, sizeof (struct timeval)); } pcap_close (pcap); libnet_destroy (l); } /* * Given the timestamp on the current packet and the last packet sent, * calculate the appropriate amount of time to sleep and do so. */ void do_sleep (struct timeval *time, struct timeval *last, int len, struct timeval *didsleep, struct timeval *start) { struct timeval nap, now, delta; struct timespec ignore, sleep; float n; static u_int32_t send = 0; /* remember # of packets to send btw calls */ if (gettimeofday (&now, NULL) < 0) { errx (1, "Error gettimeofday: %s", strerror (errno)); } /* First time through for this file */ if (!timerisset (last)) { *start = now; timerclear (&delta); timerclear (didsleep); } else { timersub (&now, start, &delta); } if (timerisset (last) && timercmp (time, last, >)) { timersub (time, last, &nap); } else { /* * Don't sleep if this is our first packet, or if the * this packet appears to have been sent before the * last packet. */ timerclear (&nap); } timeradd (didsleep, &nap, didsleep); if (timercmp (didsleep, &delta, >)) { timersub (didsleep, &delta, &nap); sleep.tv_sec = nap.tv_sec; sleep.tv_nsec = nap.tv_usec * 1000; /* convert ms to ns */ while ((nanosleep (&sleep, &sleep) == -1) && (errno == -EINTR)); } } Index: actions.hpp =================================================================== RCS file: /cvsroot/sipp/sipp/actions.hpp,v retrieving revision 1.1.1.1.2.2 retrieving revision 1.1.1.1.2.3 diff -C2 -d -r1.1.1.1.2.2 -r1.1.1.1.2.3 *** actions.hpp 25 Feb 2005 17:32:51 -0000 1.1.1.1.2.2 --- actions.hpp 20 Dec 2005 16:56:52 -0000 1.1.1.1.2.3 *************** *** 19,23 **** * Richard GAYRAUD * From Hewlett Packard Company. - * */ --- 19,22 ---- *************** *** 25,28 **** --- 24,31 ---- #define _CACTIONS + #ifdef PCAPPLAY + #include "send_packets.h" + #endif + class CAction { *************** *** 37,40 **** --- 40,46 ---- E_AT_EXECUTE_CMD, E_AT_EXEC_INTCMD, + #ifdef PCAPPLAY + E_AT_PLAY_PCAP, + #endif E_AT_NB_ACTION }; *************** *** 78,81 **** --- 84,90 ---- char* getCmdLine(); /* exec specific function */ T_IntCmdType getIntCmd(); /* exec specific function */ + #ifdef PCAPPLAY + play_args_t *getPcapArgs(); /* send_packets specific function */ + #endif void setActionType (T_ActionType P_value); *************** *** 89,92 **** --- 98,105 ---- void setCmdLine (char* P_value); /* exec specific function */ void setIntCmd (T_IntCmdType P_type ); /* exec specific function */ + #ifdef PCAPPLAY + void setPcapArgs (char * P_value); /* send_packets specific function */ + void setPcapArgs (play_args_t * P_value); /* send_packets specific function */ + #endif void setSubVarId (int P_value); *************** *** 117,120 **** --- 130,137 ---- char* M_cmdLine; T_IntCmdType M_IntCmd; + #ifdef PCAPPLAY + /* pcap specific member */ + play_args_t* M_pcapArgs; + #endif }; Index: scenario.hpp =================================================================== RCS file: /cvsroot/sipp/sipp/scenario.hpp,v retrieving revision 1.4.2.10 retrieving revision 1.4.2.11 diff -C2 -d -r1.4.2.10 -r1.4.2.11 *** scenario.hpp 12 Oct 2005 20:22:23 -0000 1.4.2.10 --- scenario.hpp 20 Dec 2005 16:56:52 -0000 1.4.2.11 *************** *** 19,22 **** --- 19,23 ---- * Peter Higginson * JPeG + * Guillaume TEISSIER from FTR&D */ *************** *** 38,41 **** --- 39,43 ---- #define MSG_TYPE_RECV 3 #define MSG_TYPE_PAUSE 4 + #define MSG_TYPE_NOP 5 #define MODE_CLIENT 0 *************** *** 145,149 **** ! extern char * default_scenario[9]; extern unsigned int labelArray[20]; --- 147,151 ---- ! extern char * default_scenario[10]; extern unsigned int labelArray[20]; Index: Makefile =================================================================== RCS file: /cvsroot/sipp/sipp/Makefile,v retrieving revision 1.7.2.9 retrieving revision 1.7.2.10 diff -C2 -d -r1.7.2.9 -r1.7.2.10 *** Makefile 11 Aug 2005 07:39:03 -0000 1.7.2.9 --- Makefile 20 Dec 2005 16:56:52 -0000 1.7.2.10 *************** *** 95,99 **** CFLAGS_SunOS=-g CFLAGS_Cygwin=-D__CYGWIN -Dsocklen_t=int ! CFLAGS=$(CFLAGS_$(SYSTEM)) -D__3PCC__ $(TLS) #C++ Compiler Flags --- 95,99 ---- CFLAGS_SunOS=-g CFLAGS_Cygwin=-D__CYGWIN -Dsocklen_t=int ! CFLAGS=$(CFLAGS_$(SYSTEM)) -D__3PCC__ $(TLS) $(PCAPPLAY) #C++ Compiler Flags *************** *** 104,108 **** CPPFLAGS_SunOS=-g CPPFLAGS_Cygwin=-D__CYGWIN -Dsocklen_t=int ! CPPFLAGS=$(CPPFLAGS_$(SYSTEM)) -D__3PCC__ $(TLS) #Linker mapping --- 104,108 ---- CPPFLAGS_SunOS=-g CPPFLAGS_Cygwin=-D__CYGWIN -Dsocklen_t=int ! CPPFLAGS=$(CPPFLAGS_$(SYSTEM)) -D__3PCC__ $(TLS) $(PCAPPLAY) #Linker mapping *************** *** 125,130 **** #Link Libraries ! LIBS_linux= -ldl -lpthread -lncurses -lstdc++ ! LIBS_hpux= -lcurses -L /opt/openssl/lib LIBS_tru64= -lcurses -lpthread LIBS_freebsd= -lcurses -pthread --- 125,130 ---- #Link Libraries ! LIBS_linux= -ldl -lpthread -lncurses -lstdc++ -L /usr/local/lib -L /usr/lib ! LIBS_hpux= -lcurses -lpthread -L /opt/openssl/lib -L /usr/local/lib LIBS_tru64= -lcurses -lpthread LIBS_freebsd= -lcurses -pthread *************** *** 136,140 **** INCDIR_linux=-I. -I/opt/openssl/include INCDIR_freebsd=-I. -I/opt/openssl/include ! INCDIR_hpux=-I. -I/opt/openssl/include INCDIR_tru64=-I. -I/opt/openssl/include INCDIR_SunOS=-I. -I/usr/local/ssl/include/ --- 136,140 ---- INCDIR_linux=-I. -I/opt/openssl/include INCDIR_freebsd=-I. -I/opt/openssl/include ! INCDIR_hpux=-I. -I/usr/local/include -I/opt/openssl/include INCDIR_tru64=-I. -I/opt/openssl/include INCDIR_SunOS=-I. -I/usr/local/ssl/include/ *************** *** 150,156 **** make OSNAME=`uname|sed -e "s/CYGWIN.*/CYGWIN/"` MODELNAME=`uname -m` OBJ_TLS="auth.o sslinit.o sslthreadsafe.o" TLS_LIBS="-lssl -lcrypto" TLS="-D_USE_OPENSSL -DOPENSSL_NO_KRB5" $(OUTPUT) ! $(OUTPUT): $(OBJ_TLS) $(OBJ) $(CCLINK) $(LFLAGS) $(MFLAGS) $(LIBDIR_$(SYSTEM)) \ ! $(DEBUG_FLAGS) -o $@ $(OBJ_TLS) $(OBJ) $(LIBS) $(TLS_LIBS) debug: --- 150,163 ---- make OSNAME=`uname|sed -e "s/CYGWIN.*/CYGWIN/"` MODELNAME=`uname -m` OBJ_TLS="auth.o sslinit.o sslthreadsafe.o" TLS_LIBS="-lssl -lcrypto" TLS="-D_USE_OPENSSL -DOPENSSL_NO_KRB5" $(OUTPUT) ! #Building with PCAP play ! pcapplay: ! make OSNAME=`uname|sed -e "s/CYGWIN.*/CYGWIN/"` MODELNAME=`uname -m` OBJ_PCAPPLAY="send_packets.o" PCAPPLAY_LIBS="-lnet -lpcap" PCAPPLAY="-DPCAPPLAY" $(OUTPUT) ! ! pcapplay_ossl: ! make OSNAME=`uname|sed -e "s/CYGWIN.*/CYGWIN/"` MODELNAME=`uname -m` OBJ_TLS="auth.o sslinit.o sslthreadsafe.o" TLS_LIBS="-lssl -lcrypto" TLS="-D_USE_OPENSSL -DOPENSSL_NO_KRB5" OBJ_PCAPPLAY="send_packets.o" PCAPPLAY_LIBS="-lnet -lpcap" PCAPPLAY="-DPCAPPLAY" $(OUTPUT) ! ! $(OUTPUT): $(OBJ_TLS) $(OBJ_PCAPPLAY) $(OBJ) $(CCLINK) $(LFLAGS) $(MFLAGS) $(LIBDIR_$(SYSTEM)) \ ! $(DEBUG_FLAGS) -o $@ $(OBJ_TLS) $(OBJ_PCAPPLAY) $(OBJ) $(LIBS) $(TLS_LIBS) $(PCAPPLAY_LIBS) debug: Index: sipp.hpp =================================================================== RCS file: /cvsroot/sipp/sipp/sipp.hpp,v retrieving revision 1.5.2.17 retrieving revision 1.5.2.18 diff -C2 -d -r1.5.2.17 -r1.5.2.18 *** sipp.hpp 19 Sep 2005 12:12:44 -0000 1.5.2.17 --- sipp.hpp 20 Dec 2005 16:56:52 -0000 1.5.2.18 *************** *** 163,166 **** --- 163,169 ---- extern bool local_ip_is_ipv6; extern int local_port _DEFVAL(0); + #ifdef PCAPPLAY + extern int hasMedia _DEFVAL(0); + #endif extern char media_ip[40]; extern char media_ip_escaped[42]; Index: sipp.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/sipp.cpp,v retrieving revision 1.15.2.38 retrieving revision 1.15.2.39 diff -C2 -d -r1.15.2.38 -r1.15.2.39 *** sipp.cpp 30 Nov 2005 14:01:14 -0000 1.15.2.38 --- sipp.cpp 20 Dec 2005 16:56:52 -0000 1.15.2.39 *************** *** 24,27 **** --- 24,28 ---- * Vincent Luba * Shriram Natarajan + * Guillaume Teissier from FTR&D */ *************** *** 604,610 **** --- 605,618 ---- } + #ifndef PCAPPLAY /* 5th line, RTP echo statistics */ if (media_socket > 0) { sprintf(temp_str, "%d Total echo RTP pckts 1st stream", + #else + /* if has media abilities */ + fprintf(stderr, "Media: %s\n", hasMedia ? "yes" : "no"); + if (hasMedia != 0) { + sprintf(temp_str, "%d Total RTP pckts ", + #endif rtp_pckts); *************** *** 616,620 **** (rtp_bytes)%(clock_tick-last_report_time)); } ! /* second stream statitics: */ sprintf(temp_str, "%d Total echo RTP pckts 2nd stream", --- 624,628 ---- (rtp_bytes)%(clock_tick-last_report_time)); } ! #ifndef PCAPPLAY /* second stream statitics: */ sprintf(temp_str, "%d Total echo RTP pckts 2nd stream", *************** *** 628,631 **** --- 636,640 ---- (rtp2_bytes)%(clock_tick-last_report_time)); } + #endif rtp_bytes = 0; rtp2_bytes = 0; *************** *** 753,756 **** --- 762,770 ---- scenario[index] -> nb_unexp); } + #ifdef PCAPPLAY + else if(scenario[index] -> M_type == MSG_TYPE_NOP) { + fprintf(f," [ NOP ] "); + } + #endif #ifdef __3PCC__ else if(scenario[index] -> M_type == MSG_TYPE_RECVCMD) { *************** *** 2452,2455 **** --- 2466,2473 ---- "\n" " 'uac' : Standard SipStone UAC (default).\n" + #ifdef PCAPPLAY + " 'uac_pcap' : Standard SipStone UAC with pcap\n" + " play (RTP)\n" + #endif " 'uas' : Simple UAS responder.\n" " 'regexp' : Standard SipStone UAC - with\n" *************** *** 3420,3423 **** --- 3438,3444 ---- CStat::instance()->setFileName((char*)"branchs", (char*)".csv"); load_scenario(0, 8); + } else if(!strcmp(argv[argi], "uac_pcap")) { + CStat::instance()->setFileName((char*)"uac_pcap", (char*)".csv"); + load_scenario(0, 9); } else { ERROR_P1("Invalid default scenario name '%s'.\n", argv[argi]); *************** *** 3461,3464 **** --- 3482,3488 ---- fprintf(stdout, "%s", default_scenario[8]); exit(EXIT_OTHER); + } else if(!strcmp(argv[argi], "uac_pcap")) { + fprintf(stdout, "%s", default_scenario[9]); + exit(EXIT_OTHER); } else { ERROR_P1("Invalid default scenario name '%s'.\n", argv[argi]); Index: call.hpp =================================================================== RCS file: /cvsroot/sipp/sipp/call.hpp,v retrieving revision 1.5.2.12 retrieving revision 1.5.2.13 diff -C2 -d -r1.5.2.12 -r1.5.2.13 *** call.hpp 24 Aug 2005 14:43:34 -0000 1.5.2.12 --- call.hpp 20 Dec 2005 16:56:52 -0000 1.5.2.13 *************** *** 78,81 **** --- 78,88 ---- unsigned int cseq; + #ifdef PCAPPLAY + /* remote media information */ + uint32_t remote_ip_media; + uint16_t remote_port_media; + pthread_t media_thread; + #endif + #ifdef _USE_OPENSSL --- NEW FILE: MEDIA.txt --- This document describes changes added to sipp source code. By Guillaume Teissier from FTR&D Starts with unstable version 2005-30-11 DESCRIPTION Adds media replay functionnality to sipp following tcpreplay strategy. It needs a modification of XML script: see uac.xml for an example. When launched, a play_pcap exec action will create a pthread for sending packets. send_packets takes as arguments: - a file name (pcap capture file, only unidirectional RTP streams) - an interface name (eth0 for most Linux) - two peers description (inet_addr) Pcap file is processed and UDP packets are replayed on a different port. Dest port is taken as a basis for port shifting. An example: g711a.pcap has the following output 10.1.3.43:5000 -> 10.1.6.18:2006, stands for RTP G711A pt the line play_pcap="g711a.pcap:lo:2006" will shift every UDP packet by dest_port (original udp dest port) - base (0 in our test case). The advantage is that RTCP and another RTP stream should be supported transparently. PERFORMANCE So far, on my DELL D410 laptop (800MHz / 1Go), it supports 500 simultaneous media comms (only audio). When trying with -r 90, fails when more than ~500 comms are up, a memory alloc has failed. Check the end of document for possible ways of enhancement PREREQUISITES libnet - tested with 1.1, there should be no worries about version > 1 libpcap - tested with 0.9.4 NOTE: sometimes pcap_next_ex is not compiled in libpcap, this may be useful to check this at make time. NOTE2: I have no idea whether it is possible or not to inject raw packets, so it should not work on Windows. ADDED FILES send_packets.{h,c}: contains the thread function to send packets and export it. The function send_packets is based on tcpreplay source code. INDENTED with -bl -i2 options MODIFIED FILES Makefile: added send_packets.o, dependency for libnet and libpcap call.hpp: added members to call class remote_ip_media (u32), remote_port_media (u16) and media_thread (pthread_t) call.cpp: modified call constructor to initialize added members correctly. Added media information extracting function: get_remote_ip_media and get_remote_port_media in method process_incomming. Launch a **light** pthread when encounter a play_pcap action. Modified call::run method to make action on send msg. sipp.hpp: added global configuration variable hasMedia, default to 0 sipp.cpp: disabled RTP mirror threads. Set RTP pkts and bytes/s to correct values (updated in send_packets.c) scenario.cpp: set hasMedia to 1 when a tag play_pcap is encountered and set options. Added ability to execute a command on a send tag ( to play media when sending back ACK to uas). actions.hpp: added a new action called play_pcap, see syntax in uac.xml actions.cpp: modified constructor and various accessors. sipp.dtd: added a play_pcap tag for dtd validation ENHANCEMENTS - Opening both pcap_t descriptor and libnet_t descriptor for each call is too much, see if mutualisation if possible: follow libnet_cq* check http://www.security-labs.org/index.php3?page=libnet and libnet_ng check http://www.security-labs.org/index.php3?page=libnetng - Processing pcap file once for all should better - Clean up and document Index: actions.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/actions.cpp,v retrieving revision 1.2.2.2 retrieving revision 1.2.2.3 diff -C2 -d -r1.2.2.2 -r1.2.2.3 *** actions.cpp 25 Feb 2005 17:32:49 -0000 1.2.2.2 --- actions.cpp 20 Dec 2005 16:56:52 -0000 1.2.2.3 *************** *** 19,23 **** * Richard GAYRAUD * From Hewlett Packard Company. ! * */ --- 19,23 ---- * Richard GAYRAUD * From Hewlett Packard Company. ! * Guillaume Teissier from FTR&D */ *************** *** 67,70 **** --- 67,74 ---- } else if (M_action == E_AT_LOG_TO_FILE) { printf("Type[%d] - message[%-32.32s]", M_action, M_message); + #ifdef PCAPPLAY + } else if (M_action == E_AT_PLAY_PCAP) { + printf("Type[%d] - file[%s]", M_action, M_pcapArgs->file); + #endif } } *************** *** 81,84 **** --- 85,91 ---- char* CAction::getMessage() { return(M_message); } char* CAction::getCmdLine() { return(M_cmdLine); } + #ifdef PCAPPLAY + play_args_t* CAction::getPcapArgs() { return(M_pcapArgs); } + #endif void CAction::setActionType (CAction::T_ActionType P_value) *************** *** 170,173 **** --- 177,218 ---- } + #ifdef PCAPPLAY + void CAction::setPcapArgs (play_args_t* P_value) + { + if(M_pcapArgs != NULL) + { + free(M_pcapArgs); + M_pcapArgs = NULL; + } + + if(P_value != NULL) + { + M_pcapArgs = (play_args_t *)malloc(sizeof(*M_pcapArgs)); + memcpy(M_pcapArgs, P_value, sizeof(*M_pcapArgs)); + } + } + + void CAction::setPcapArgs (char* P_value) + { + if(M_pcapArgs != NULL) + { + free(M_pcapArgs); + M_pcapArgs = NULL; + } + + if(P_value != NULL) + { + M_pcapArgs = (play_args_t *) malloc(sizeof(*M_pcapArgs)); + if (parse_play_args(P_value, M_pcapArgs) == -1) + { + ERROR("Play pcap error"); + } + if (access(M_pcapArgs->file, F_OK)) { + ERROR_P1("Cannot read file %s\n", M_pcapArgs->file); + } + } + } + #endif + void CAction::setAction(CAction P_action) { *************** *** 188,191 **** --- 233,239 ---- setCmdLine ( P_action.M_cmdLine ); setIntCmd ( P_action.M_IntCmd ); + #ifdef PCAPPLAY + setPcapArgs ( P_action.M_pcapArgs ); + #endif } *************** *** 206,209 **** --- 254,260 ---- M_cmdLine = NULL; M_IntCmd = E_INTCMD_INVALID; + #ifdef PCAPPLAY + M_pcapArgs = NULL; + #endif } *************** *** 217,220 **** --- 268,274 ---- M_subVarId = NULL; M_IntCmd = E_INTCMD_INVALID; + #ifdef PCAPPLAY + M_pcapArgs = NULL; + #endif // M_maxNbSubVarId = P_action.M_maxNbSubVarId ; *************** *** 233,236 **** --- 287,293 ---- setCmdLine ( P_action.M_cmdLine ); setIntCmd ( P_action.M_IntCmd ); + #ifdef PCAPPLAY + setPcapArgs ( P_action.M_pcapArgs ); + #endif } *************** *** 257,260 **** --- 314,323 ---- M_subVarId = NULL; } + #ifdef PCAPPLAY + if (M_pcapArgs != NULL) { + free(M_pcapArgs); + M_pcapArgs = NULL; + } + #endif } |
From: Olivier J. <oja...@us...> - 2005-12-20 16:45:40
|
Update of /cvsroot/sipp/sipp/pcap In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1535/pcap Log Message: Directory /cvsroot/sipp/sipp/pcap added to the repository --> Using per-directory sticky tag `cumulus' |
From: Peter H. <pet...@ne...> - 2005-12-13 14:47:34
|
I don't think this change protects what you intend, a better version to test for this case would be: unsigned long get_reply_code(char *msg) { if (!msg) return 0; while((*msg) && (*msg != ' ') && (*msg != '\t')) ++msg; while((*msg == ' ') || (*msg == '\t')) ++msg; if (strlen(msg)>0) { return atol(msg); } else { return 0; } } It is very unlikely that the routine would be called with msg=0 but in that unlikely event you could return 0 or trap. It is most unlikely that msg would wrap round to 0 so it is not worth testing again. (I would not put the first test in - you probably segfault before you get here anyway.) The line that looks for space or tab needs a test on *msg to stop wandering off the end of the string. This the change made does not have. The next line looks for either space or tab and so will stop anyway if it hits end of string. I think atol would return 0 anyway on a null string so I think the strlen test is not needed. In summary, my preferred code is: unsigned long get_reply_code(char *msg) { while((*msg) && (*msg != ' ') && (*msg != '\t')) ++msg; while((*msg == ' ') || (*msg == '\t')) ++msg; return atol(msg); } Peter Higginson Newport Networks Ltd, Direct line 01494 470694 http://www.newport-networks.com/ -----Original Message----- From: sip...@li... [mailto:sip...@li...] On Behalf Of Bruno Guerin Sent: 30 November 2005 14:01 To: sip...@li... Subject: [Sipp-commits] sipp sipp.cpp,1.15.2.37,1.15.2.38 Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29365 Modified Files: Tag: cumulus sipp.cpp Log Message: Fix core dump that could occur on get_reply_code. Index: sipp.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/sipp.cpp,v retrieving revision 1.15.2.37 retrieving revision 1.15.2.38 diff -C2 -d -r1.15.2.37 -r1.15.2.38 *** sipp.cpp 18 Oct 2005 14:11:15 -0000 1.15.2.37 --- sipp.cpp 30 Nov 2005 14:01:14 -0000 1.15.2.38 *************** *** 1208,1215 **** unsigned long get_reply_code(char *msg) { ! while((*msg != ' ') && (*msg != '\t')) msg ++; ! while((*msg == ' ') || (*msg == '\t')) msg ++; ! return atol(msg); } --- 1208,1219 ---- unsigned long get_reply_code(char *msg) { ! while((msg) && (*msg != ' ') && (*msg != '\t')) msg ++; ! while((msg) && ((*msg == ' ') || (*msg == '\t'))) msg ++; ! if ((msg) && (strlen(msg)>0)) { ! return atol(msg); ! } else { ! return 0; ! } } ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ Sipp-commits mailing list Sip...@li... https://lists.sourceforge.net/lists/listinfo/sipp-commits |
From: Bruno G. <bru...@us...> - 2005-11-30 14:01:34
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29365 Modified Files: Tag: cumulus sipp.cpp Log Message: Fix core dump that could occur on get_reply_code. Index: sipp.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/sipp.cpp,v retrieving revision 1.15.2.37 retrieving revision 1.15.2.38 diff -C2 -d -r1.15.2.37 -r1.15.2.38 *** sipp.cpp 18 Oct 2005 14:11:15 -0000 1.15.2.37 --- sipp.cpp 30 Nov 2005 14:01:14 -0000 1.15.2.38 *************** *** 1208,1215 **** unsigned long get_reply_code(char *msg) { ! while((*msg != ' ') && (*msg != '\t')) msg ++; ! while((*msg == ' ') || (*msg == '\t')) msg ++; ! return atol(msg); } --- 1208,1219 ---- unsigned long get_reply_code(char *msg) { ! while((msg) && (*msg != ' ') && (*msg != '\t')) msg ++; ! while((msg) && ((*msg == ' ') || (*msg == '\t'))) msg ++; ! if ((msg) && (strlen(msg)>0)) { ! return atol(msg); ! } else { ! return 0; ! } } |
From: Olivier J. <oja...@us...> - 2005-11-22 12:59:14
|
Update of /cvsroot/sipp/sipp In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30354 Modified Files: Tag: cumulus call.cpp Log Message: Fixed multi-socket mode in UDP that was broken since 2005-02-25 - provided by Bruno Guerin. Index: call.cpp =================================================================== RCS file: /cvsroot/sipp/sipp/call.cpp,v retrieving revision 1.9.2.38 retrieving revision 1.9.2.39 diff -C2 -d -r1.9.2.38 -r1.9.2.39 *** call.cpp 13 Nov 2005 14:06:30 -0000 1.9.2.38 --- call.cpp 22 Nov 2005 12:59:07 -0000 1.9.2.39 *************** *** 502,511 **** if (!call_remote_socket) { struct sockaddr_storage *L_dest = &remote_sending_sockaddr; if((call_remote_socket= socket(use_ipv6 ? AF_INET6 : AF_INET, ! SOCK_STREAM, 0))== -1) { ERROR_NO("Unable to get a socket for rsa option"); } sipp_customize_socket(call_remote_socket); --- 502,524 ---- if (!call_remote_socket) { struct sockaddr_storage *L_dest = &remote_sending_sockaddr; + + if(transport == T_UDP) { if((call_remote_socket= socket(use_ipv6 ? AF_INET6 : AF_INET, ! SOCK_DGRAM, 0))== -1) { ERROR_NO("Unable to get a socket for rsa option"); } + if(bind(call_remote_socket, + (sockaddr *)(void *)L_dest, + use_ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in))) { + ERROR_NO("Unable to bind UDP socket for rsa option"); + } + } else { + if((call_remote_socket= socket(use_ipv6 ? AF_INET6 : AF_INET, + SOCK_STREAM, + 0))== -1) { + ERROR_NO("Unable to get a socket for rsa option"); + } sipp_customize_socket(call_remote_socket); *************** *** 518,521 **** --- 531,535 ---- } else { ERROR_NO("Unable to connect a socket for rsa option"); + } } } |
From: <try...@ho...> - 2005-10-04 07:55:25
|
confirm 261958 Dear. I have used SIPp for testing SER(SIP Express Protocol). But I want to run sipp client (sipp -sn uac xxx.xxx.xxx.xxx) with another executable file(msctp/client). The client of mSCTP is runed by root]#./msctp/client So I think that have to insert source-code of sipp. for example, exec_msg('./root/msctp/client'); But I don't know where file I have to insert the code;;;;;;;;; I appreciate for if you give me some advise in detail....... Thank you in advance........ By.Song.. _________________________________________________________________ 확인하자. 오늘의 운세 무료 사주, 궁합, 작명, 전생 가이드 http://www.msn.co.kr/fortune/default.asp |
From: <try...@ho...> - 2005-10-04 07:42:50
|
confirm 261958 Dear. I have used SIPp for testing SER(SIP Express Protocol). But I want to run sipp client (sipp -sn uac xxx.xxx.xxx.xxx) with another client(mSCTP). The client of mSCTP is runed by root]#./msctp/client So I think that have to insert source-code of sipp. for example, exec_msg('./root/msctp/client'); But I don't know where file I have to insert the code;;;;;;;;; I appreciate for if you give me some advise in detail....... Thank you in advance........ By.Song.. _________________________________________________________________ 고.. 감.. 도.. 사.. 랑.. 만.. 들.. 기.. MSN 러브 http://www.msn.co.kr/love/ |