comparison pcap-study/rtp-stream-dump.c @ 14:e7f43262efa1

rtp-stream-dump: add hex dump option
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 28 Jul 2024 01:53:41 +0000
parents d59dbdfe1778
children
comparison
equal deleted inserted replaced
13:d59dbdfe1778 14:e7f43262efa1
23 static unsigned iphdr_addr_offset, udphdr_port_offset; 23 static unsigned iphdr_addr_offset, udphdr_port_offset;
24 static unsigned link_hdr_len, ethertype_offset; 24 static unsigned link_hdr_len, ethertype_offset;
25 static int stream_init_flag, toad_init_flag; 25 static int stream_init_flag, toad_init_flag;
26 static unsigned last_seq, last_tstamp, stream_ssrc; 26 static unsigned last_seq, last_tstamp, stream_ssrc;
27 static struct timeval last_pkt_time; 27 static struct timeval last_pkt_time;
28 static int do_hexdump;
28 29
29 static void 30 static void
30 check_dl_type() 31 check_dl_type()
31 { 32 {
32 int dltype; 33 int dltype;
84 last_tstamp = cur_tstamp; 85 last_tstamp = cur_tstamp;
85 stream_ssrc = cur_ssrc; 86 stream_ssrc = cur_ssrc;
86 } 87 }
87 88
88 static void 89 static void
90 hexdump_payload(payload, payload_len)
91 u_char *payload;
92 unsigned payload_len;
93 {
94 unsigned off;
95
96 for (off = 0; off < payload_len; off++) {
97 if ((off & 3) == 0)
98 putchar(' ');
99 printf(" %02X", payload[off]);
100 if ((off & 15) == 15 || off == payload_len - 1)
101 putchar('\n');
102 }
103 }
104
105 static void
89 process_packet(pkt, caplen, pkt_idx, pkt_time) 106 process_packet(pkt, caplen, pkt_idx, pkt_time)
90 u_char *pkt; 107 u_char *pkt;
91 unsigned caplen, pkt_idx; 108 unsigned caplen, pkt_idx;
92 struct timeval *pkt_time; 109 struct timeval *pkt_time;
93 { 110 {
134 "error in packet #%u: unsupported RTP header structure\n", 151 "error in packet #%u: unsupported RTP header structure\n",
135 pkt_idx); 152 pkt_idx);
136 exit(1); 153 exit(1);
137 } 154 }
138 rtp_stream_logic(pkt + 28, pkt_idx); 155 rtp_stream_logic(pkt + 28, pkt_idx);
156 payload_len = udplen - 20;
139 printf("pkt #%u seq 0x%04X ts 0x%08X: pt=%u M=%u len=%u", pkt_idx, 157 printf("pkt #%u seq 0x%04X ts 0x%08X: pt=%u M=%u len=%u", pkt_idx,
140 last_seq, last_tstamp, pkt[29] & 0x7F, pkt[29] >> 7, 158 last_seq, last_tstamp, pkt[29] & 0x7F, pkt[29] >> 7,
141 udplen - 20); 159 payload_len);
142 if (toad_init_flag && timercmp(pkt_time, &last_pkt_time, >=)) { 160 if (toad_init_flag && timercmp(pkt_time, &last_pkt_time, >=)) {
143 timersub(pkt_time, &last_pkt_time, &toad); 161 timersub(pkt_time, &last_pkt_time, &toad);
144 if (toad.tv_sec) 162 if (toad.tv_sec)
145 printf(", toad %u.%06u s", (unsigned) toad.tv_sec, 163 printf(", toad %u.%06u s", (unsigned) toad.tv_sec,
146 (unsigned) toad.tv_usec); 164 (unsigned) toad.tv_usec);
149 toad_us = toad.tv_usec % 1000; 167 toad_us = toad.tv_usec % 1000;
150 printf(", toad %u.%03u ms", toad_ms, toad_us); 168 printf(", toad %u.%03u ms", toad_ms, toad_us);
151 } 169 }
152 } 170 }
153 putchar('\n'); 171 putchar('\n');
172 if (do_hexdump)
173 hexdump_payload(pkt + 40, payload_len);
154 bcopy(pkt_time, &last_pkt_time, sizeof(struct timeval)); 174 bcopy(pkt_time, &last_pkt_time, sizeof(struct timeval));
155 toad_init_flag = 1; 175 toad_init_flag = 1;
156 } 176 }
157 177
158 main(argc, argv) 178 main(argc, argv)
161 char errbuf[PCAP_ERRBUF_SIZE]; 181 char errbuf[PCAP_ERRBUF_SIZE];
162 u_char *pkt; 182 u_char *pkt;
163 struct pcap_pkthdr pkthdr; 183 struct pcap_pkthdr pkthdr;
164 unsigned pkt_idx; 184 unsigned pkt_idx;
165 185
166 if (argc != 5) { 186 switch (argc) {
167 fprintf(stderr, 187 case 5:
168 "usage: %s pcap-file src|dest ip-addr udp-port\n", 188 do_hexdump = 0;
189 break;
190 case 6:
191 if (strcmp(argv[5], "hex"))
192 goto usage;
193 do_hexdump = 1;
194 break;
195 default:
196 usage:
197 fprintf(stderr,
198 "usage: %s pcap-file src|dest ip-addr udp-port [hex]\n",
169 argv[0]); 199 argv[0]);
170 exit(1); 200 exit(1);
171 } 201 }
172 pcap = pcap_open_offline(argv[1], errbuf); 202 pcap = pcap_open_offline(argv[1], errbuf);
173 if (!pcap) { 203 if (!pcap) {