FreeCalypso > hg > themwi-system-sw
annotate utils/sip-rx-test.c @ 57:d61d0136f6a5
sip-in INVITE processing: return "GSM service is offline" indication
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 08 Sep 2022 13:39:42 -0800 |
parents | 5995660dcbac |
children |
rev | line source |
---|---|
42
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This test program is the next level above sip-udp-dump: it binds |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * to UDP port 5060, waits for a packet to come in, and when a SIP |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * packet does arrive (call one of the numbers from BulkVS while this |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * test program is running, to make BulkVS send SIP INVITE), it does |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * two things with the captured packet: |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * 1) The captured packet is written raw into one file named on the |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * command line; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * 2) The packet is parsed with parse_incoming_sip_msg(), and the |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * parsed structure is written out into the other file named on |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 * the command line. |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 * |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 * This program is intended to serve as a unit test for the parsing |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 * function. |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 */ |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 #include <sys/types.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 #include <sys/file.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #include <sys/socket.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #include <netinet/in.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #include <arpa/inet.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 #include <stdio.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 #include <stdlib.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 #include <string.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 #include <strings.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 #include <unistd.h> |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 #include "../libsip/parse.h" |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 static int sock; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 static struct sockaddr_in sin; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 static struct sip_pkt_rx pkt; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 static void |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 save_raw_packet(filename) |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 char *filename; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 int fd; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0666); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 if (fd < 0) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 perror(filename); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 exit(1); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 write(fd, pkt.pkt_buffer, pkt.pkt_length); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 close(fd); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 static void |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 write_parse_output(filename) |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 char *filename; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 FILE *of; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 unsigned n; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 of = fopen(filename, "w"); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 if (!of) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 perror(filename); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 exit(1); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 switch (pkt.parse_msgtype) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 case SIP_MSG_TYPE_REQ: |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 fprintf(of, "Message is a request\n"); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 fprintf(of, "Method: %s\n", pkt.req_method); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 fprintf(of, "Request-URI: %s\n", pkt.req_uri); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 break; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 case SIP_MSG_TYPE_RESP: |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 fprintf(of, "Message is a response\n"); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 fprintf(of, "Status code: %u\n", pkt.status_code); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 fprintf(of, "Status string: %s\n", pkt.status_str); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 break; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 default: |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 fprintf(of, "Parsed returned unknown message type %d\n", |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 pkt.parse_msgtype); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 fprintf(of, "Number of header fields: %u\n", pkt.num_hdr_fields); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 for (n = 0; n < pkt.num_hdr_fields; n++) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 fprintf(of, "Header field %u:\n", n); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 fprintf(of, " Field name: %s\n", |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 pkt.hdr_fields[n].field_name); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 fprintf(of, " Field value: %s\n", |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 pkt.hdr_fields[n].field_value); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 fprintf(of, "Message body length: %u\n", pkt.msg_body_len); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 fclose(of); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 main(argc, argv) |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 char **argv; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 int rc; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 socklen_t addrlen; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 if (argc != 3) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 fprintf(stderr, "usage: %s raw-file parsed-file\n", argv[0]); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 exit(1); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 sock = socket(AF_INET, SOCK_DGRAM, 0); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 if (sock < 0) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 perror("socket"); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 exit(1); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 sin.sin_family = AF_INET; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 sin.sin_addr.s_addr = INADDR_ANY; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 sin.sin_port = htons(5060); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 rc = bind(sock, (struct sockaddr *) &sin, sizeof sin); |
43
5995660dcbac
sip-rx-test, sip-udp-dump: fix bind error handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
42
diff
changeset
|
108 if (rc < 0) { |
42
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 perror("bind"); |
43
5995660dcbac
sip-rx-test, sip-udp-dump: fix bind error handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
42
diff
changeset
|
110 exit(1); |
5995660dcbac
sip-rx-test, sip-udp-dump: fix bind error handling
Mychaela Falconia <falcon@freecalypso.org>
parents:
42
diff
changeset
|
111 } |
42
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 addrlen = sizeof sin; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 rc = recvfrom(sock, pkt.pkt_buffer, MAX_SIP_RX_PACKET, 0, |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 (struct sockaddr *) &sin, &addrlen); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 if (rc < 0) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 perror("recvfrom"); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 exit(1); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 pkt.pkt_length = rc; |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 printf("Rx from %s:%u, %u bytes\n", inet_ntoa(sin.sin_addr), |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 ntohs(sin.sin_port), pkt.pkt_length); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 save_raw_packet(argv[1]); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 rc = parse_incoming_sip_msg(&pkt); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 if (rc < 0) { |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 printf("Parse error: %d\n", rc); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 exit(0); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 } |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 write_parse_output(argv[2]); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 exit(0); |
891ebfb55e6b
sip-rx-test program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 } |