FreeCalypso > hg > themwi-system-sw
annotate utils/sip-out-test.c @ 124:7e04d28fae8b
sip-in: default use-100rel to no
BulkVS servers act badly when we send a reliable 180 Ringing response
to an incoming call, even though they advertise 100rel support in
the Supported header in the INVITE packet, and we probably won't be
implementing 100rel for outbound because doing per-the-spec PRACK
as a UAC is just too burdensome. Therefore, we need to consider
100rel extension as not-really-supported in themwi-system-sw.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 01 Oct 2022 15:54:50 -0800 |
parents | ffb563a17f23 |
children |
rev | line source |
---|---|
52
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This program is a contraption for testing manually constructed |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * outgoing SIP calls to BulkVS. |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/types.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/socket.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <sys/time.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <sys/errno.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <netinet/in.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <arpa/inet.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <stdio.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include <stdlib.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include <string.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <strings.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include <unistd.h> |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 #define MAX_SIP_TX_PACKET 1472 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 static struct in_addr local_ip, remote_ip; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 static unsigned local_sip_port, local_rtp_port, remote_port; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 static char *invite_filename, *log_filename; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 static char invite_packet[MAX_SIP_TX_PACKET]; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 static unsigned invite_packet_len; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 static FILE *logF; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 static struct timeval curtime; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 static void |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 read_invite_file() |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 FILE *inf; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 char linebuf[128], *cp, *dp; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 int lineno; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 unsigned size_accum, linelen; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 inf = fopen(invite_filename, "r"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 if (!inf) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 perror(invite_filename); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 size_accum = 0; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 dp = invite_packet; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 for (lineno = 1; fgets(linebuf, sizeof(linebuf), inf); lineno++) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 cp = index(linebuf, '\n'); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 if (!cp) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 fprintf(stderr, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 "%s line %d: too long or missing newline\n", |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 invite_filename, lineno); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 *cp = '\0'; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 linelen = cp - linebuf; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 if (size_accum + linelen + 2 > MAX_SIP_TX_PACKET) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 fprintf(stderr, "%s line %d: packet overflow\n", |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 invite_filename, lineno); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 bcopy(linebuf, dp, linelen); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 dp += linelen; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 *dp++ = '\r'; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 *dp++ = '\n'; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 size_accum += linelen + 2; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 fclose(inf); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 if (!size_accum) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 fprintf(stderr, "error: %s is empty\n", invite_filename); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 invite_packet_len = size_accum; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 static void |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 log_common(msg, msglen, sin, dir, outf) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 char *msg, *dir; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 unsigned msglen; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 struct sockaddr_in *sin; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 FILE *outf; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 unsigned sec, ms; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 sec = curtime.tv_sec % 86400; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 ms = curtime.tv_usec / 1000; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 fprintf(outf, "Msg %s %s:%u %u bytes %02u:%02u:%02u.%03u\n", dir, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), msglen, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 sec / 3600, (sec / 60) % 60, sec % 60, ms); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 fwrite(msg, 1, msglen, outf); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 putc('\n', outf); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 fflush(outf); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 static void |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 log_sip_msg_rx(msg, msglen, sin) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 char *msg; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 unsigned msglen; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 struct sockaddr_in *sin; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 log_common(msg, msglen, sin, "from", stdout); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 if (logF) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 log_common(msg, msglen, sin, "from", logF); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 static void |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 log_sip_msg_tx(msg, msglen, sin) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 char *msg; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 unsigned msglen; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 struct sockaddr_in *sin; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 log_common(msg, msglen, sin, "to", stdout); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 if (logF) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 log_common(msg, msglen, sin, "to", logF); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 main(argc, argv) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 char **argv; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 struct sockaddr_in sin_local, sin_rtp, sin_rtcp, sin_remote, sin_rx; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 int sock_sip, sock_rtp, sock_rtcp, max_fd; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 socklen_t addrlen; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 fd_set fds; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 char recv_buf[4096]; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 int rc; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 /* grok command line arguments */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 if (argc < 7 || argc > 8) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 fprintf(stderr, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 "usage: %s local-ip local-sip local-rtp remote-ip remote-sip inv-file [logfile]\n", |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 argv[0]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 local_ip.s_addr = inet_addr(argv[1]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 if (local_ip.s_addr == INADDR_NONE) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 fprintf(stderr, "error: invalid IP address \"%s\"\n", argv[1]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 local_sip_port = atoi(argv[2]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 local_rtp_port = atoi(argv[3]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 remote_ip.s_addr = inet_addr(argv[4]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 if (remote_ip.s_addr == INADDR_NONE) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 fprintf(stderr, "error: invalid IP address \"%s\"\n", argv[4]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 remote_port = atoi(argv[5]); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 invite_filename = argv[6]; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 log_filename = argv[7]; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 /* fill sin structures */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 sin_local.sin_family = AF_INET; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 sin_local.sin_addr = local_ip; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 sin_local.sin_port = htons(local_sip_port); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 sin_rtp.sin_family = AF_INET; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 sin_rtp.sin_addr = local_ip; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 sin_rtp.sin_port = htons(local_rtp_port); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 sin_rtcp.sin_family = AF_INET; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 sin_rtcp.sin_addr = local_ip; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 sin_rtcp.sin_port = htons(local_rtp_port+1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 sin_remote.sin_family = AF_INET; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 sin_remote.sin_addr = remote_ip; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 sin_remote.sin_port = htons(remote_port); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 /* create and bind sockets */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 sock_sip = socket(AF_INET, SOCK_DGRAM, 0); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 if (sock_sip < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 perror("socket"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 rc = bind(sock_sip, (struct sockaddr *) &sin_local, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 sizeof(struct sockaddr_in)); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 perror("bind"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 sock_rtp = socket(AF_INET, SOCK_DGRAM, 0); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 if (sock_rtp < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 perror("socket"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 rc = bind(sock_rtp, (struct sockaddr *) &sin_rtp, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 sizeof(struct sockaddr_in)); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 perror("bind"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 sock_rtcp = socket(AF_INET, SOCK_DGRAM, 0); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 if (sock_rtcp < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 perror("socket"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 rc = bind(sock_rtcp, (struct sockaddr *) &sin_rtcp, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 sizeof(struct sockaddr_in)); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 perror("bind"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 /* read the INVITE packet */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 read_invite_file(); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 /* open the log file, if we have one */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 if (log_filename) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 logF = fopen(log_filename, "a"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 if (!logF) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 perror(log_filename); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 /* now get down to business */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 max_fd = sock_sip; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 if (sock_rtp > max_fd) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 max_fd = sock_rtp; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 if (sock_rtcp > max_fd) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 max_fd = sock_rtcp; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 addrlen = sizeof(struct sockaddr_in); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 rc = sendto(sock_sip, invite_packet, invite_packet_len, 0, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 (struct sockaddr *) &sin_remote, addrlen); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 perror("sendto"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 gettimeofday(&curtime, 0); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 log_sip_msg_tx(invite_packet, invite_packet_len, &sin_remote); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 /* main select loop */ |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 for (;;) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 FD_ZERO(&fds); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 FD_SET(sock_sip, &fds); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 FD_SET(sock_rtp, &fds); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 FD_SET(sock_rtcp, &fds); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 rc = select(max_fd+1, &fds, 0, 0, 0); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 if (errno == EINTR) |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 continue; |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 perror("select"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 gettimeofday(&curtime, 0); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 if (FD_ISSET(sock_sip, &fds)) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 addrlen = sizeof(struct sockaddr_in); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 rc = recvfrom(sock_sip, recv_buf, sizeof recv_buf, 0, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 (struct sockaddr *) &sin_rx, &addrlen); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 perror("recvfrom"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 log_sip_msg_rx(recv_buf, rc, &sin_rx); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 if (FD_ISSET(sock_rtp, &fds)) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 addrlen = sizeof(struct sockaddr_in); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 rc = recvfrom(sock_rtp, recv_buf, sizeof recv_buf, 0, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 (struct sockaddr *) &sin_rx, &addrlen); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 perror("recvfrom"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 if (FD_ISSET(sock_rtcp, &fds)) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 addrlen = sizeof(struct sockaddr_in); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 rc = recvfrom(sock_rtp, recv_buf, sizeof recv_buf, 0, |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 (struct sockaddr *) &sin_rx, &addrlen); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 if (rc < 0) { |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 perror("recvfrom"); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 exit(1); |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 } |
ffb563a17f23
wrote sip-out-test program
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 } |