mirror of https://github.com/sipwise/rtpengine.git
Squashed commit of the following: commit 1af3efd464d9c86eb428aa29ca084ead67ba4cdc Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Nov 7 11:10:22 2016 -0500 save and restore call recording status to/from redis closes #254 Change-Id: If3cd34fcfd64fa8164521a86eb1d1aa0eb327f3b commit 460053a2316ac77ebf2609af4e5bf73beac57643 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Nov 4 14:09:08 2016 -0400 restore libcurl build dependency Change-Id: Ia853f928caf9e443bb69c4015cbba805e6d24153 commit 5f5fd88fde67ffcd5a83f1a18e9134702f995686 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Nov 4 11:22:27 2016 -0400 ensure we are always decrypting SRTP when recording Change-Id: I2b75afefcadc55ebf1bf6a19a983134c87c41602 commit 69b4e9fa886c673bed6168c2092864fdff2619aa Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Nov 4 09:56:47 2016 -0400 remove redundant ng result=ok logic Change-Id: I84d7245f52dc12a4002b4dd2b736afea9ae733fa commit 411213dd3d17c1e54eeb6813cb0473a706a10cee Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Nov 3 16:04:54 2016 -0400 support the `start recording` command message Change-Id: I316e90fd3fe34f01b20826936ef620bcff785397 commit ae1910c68d90d0c1f913bd09f9ecdee5579f53f4 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Nov 3 15:01:57 2016 -0400 move logic for `record call` flag to where it belongs Change-Id: I65a3b5d62f4360df4251faea1339b5a6355c0e6d commit 217008d572d103ab4146cdcfb9c292610c869643 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Nov 3 12:49:48 2016 -0400 support combining streams into one pcap in reference scripts Change-Id: Id82936ae7ef1b406acf3b4d3429ecc1cb6e2356e commit 3fcafd92750d20e07b9c522cd15df0f1745bd412 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Nov 3 11:40:00 2016 -0400 output additional details to metafiles Change-Id: I0539a0617aff51c9c499bbd9586d61c7e7ca7e7c commit e81f413f3ba228f548931a234a1c18c13c62b135 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Nov 2 16:18:28 2016 -0400 globalize kernel access variables Change-Id: Ie07e0ebb8705189c8b1e49f596080ff8bcaef64f commit 5e74609c7c3e5237fbd9995b90b29b2c456d2c04 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Nov 2 12:20:55 2016 -0400 duplicate error messages to stderr when in foreground Change-Id: Iaf9d8d1392946046846cb6f2c0fb928a96893911 commit 032077bed4a4b3610e88deab905f6a41616393e6 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Nov 2 11:38:22 2016 -0400 eliminate dummy virtual function Change-Id: I7cc2596f31350bf0d39253b3bd7e9fe1cec2b92d commit 9177effc4e56b0fc26f44da525fe88d8aa3a6f05 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Nov 2 11:30:58 2016 -0400 clean up recording code related to ng interface Change-Id: I69c6d953f8467e5154f000979c94f2dc3a79918a commit ac0ec6a5e7b4927af5294a6e86a129a8ffc90e7a Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Nov 2 10:57:15 2016 -0400 output before/after sdp to metafiles Change-Id: I1d3177e40591d6b4c4789eb6e18132743a9eda45 commit 68b27fa964455eef4c4acaf9540d19013b3df3e7 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Nov 1 15:40:20 2016 -0400 fix header length problems Change-Id: I896453f72df3ba146251f5d82ca1d02dd0ad08e9 commit ebbd942ad00b3a4eb74fbfcd915e82a263243d02 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Nov 1 14:14:08 2016 -0400 support writing pcap files in reference intercept script Change-Id: I53502ba416426e9012a68c35cdf4b457d7c3eb69 commit fe82efa40a5b0fee4bed2601bab7c1afa09b0ce1 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Nov 1 13:35:47 2016 -0400 ensure we never make any calls that might sleep when holding locks Change-Id: I1ce6aeced1f61715374b80f6fb1fbeafc987ae7f commit be5316e804368fad28c2a0012ac2d60cb476b740 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Nov 1 13:08:19 2016 -0400 fix math in auto_array_find_free_index Change-Id: I39c786b03dbafe59b88a1945ac27964c3852c9eb commit 183d4939ca8e1fc0f39271713435b016c055bfff Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Nov 1 11:41:47 2016 -0400 adding rudimentary lock debugging Change-Id: Iff541c58e5ea4c3fc2ec16e93396148f935bc4f3 commit 51a75c5022f96a23b8fff6738b5fa4ad7095a746 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Oct 31 14:35:17 2016 -0400 handle read errors in reference intercept script Change-Id: I047d763dbd498026a0d8db24c5532155c75fd6e6 commit 69a460de08c6dfe163f9d90dee478c72ea56a2fc Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Oct 31 14:34:54 2016 -0400 changed locking semantics to avoid proc_clear deadlock Change-Id: I70dbc07aa8af7b9860beca86b4b82d8180d8a0ae commit 62eae1459a8dc116a0f965d014dd2962d9f2ece2 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Oct 31 12:50:26 2016 -0400 additional debugging Change-Id: I81c93c2dd9007ed6a0d6e0b147de0deb44b7b023 commit fd367947404c25f7122479dc805ca895346e3568 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Oct 28 12:07:25 2016 -0400 adding reference implementation using inotify Change-Id: Ibec73bdc4c7a576e4beaf5e749567dd2508be4df commit f8fde6cc7308faf9aea5016d1b325fe54ace4f73 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Oct 27 15:55:10 2016 -0400 add stream info to metadata files Change-Id: I200df14a3e35c2c0077866444b96692de4303761 commit 5a8b4dd156d014756681c644549f481af941b294 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Oct 27 14:47:49 2016 -0400 pass intercepted packets to kernel and tie in kernel idx Change-Id: I33ff297c4a66276b05d0e5d537b0281f27116243 commit 0c0b97ea3940a34843375c58255d40cf4280bd5c Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Oct 27 12:29:02 2016 -0400 abstractize fake packet header and support ipv6 Change-Id: I6c1ad1cccad306f3d306fb3387efcb033a3574b2 commit e1b648b9baea609cbe9836c81a5a2cd41ef464cb Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Oct 27 09:32:40 2016 -0400 support creating kernel intercept streams Change-Id: I1f9bdda61af52814f07f765a8b558a7491cfc0b9 commit b6737ec9635d2d7a8d0245bab7c51a077cd814d2 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Oct 26 14:46:13 2016 -0400 get rid of call->record_call flag Change-Id: I04dcba49b07fc669b0bb4bcea8ccc2b52cb76e02 commit 6ed362c120995d1e3fdff71f7e440e73737e7fcb Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Oct 26 12:53:04 2016 -0400 add recorded call to /proc Change-Id: I1fe64b9fb8fe3604bb7d432899c43e3e37ea6a4f commit 62d2508ecf69fbdf9ba1faf3e2433fa6f717740a Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Oct 26 10:10:05 2016 -0400 simplify some code Change-Id: I2a27400e91f58aa8ea20d3e610a7509d2e9a0dfc commit 0c811a8e91ded41487bf045e6df55fb31cce7671 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Oct 25 16:12:59 2016 -0400 create separate ../tmp recording dir and clean up duplicate code Change-Id: I94e0c19a1e8fed5a30212b79930987333f5e6786 commit 16592a92300b856084ebd5769ecae35788f0ad63 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Oct 25 11:26:54 2016 -0400 remove explicit libcurl dependency finally properly fixes #251 Change-Id: I3feafe2d0086f6dd789175e6ec0079c54edd487a commit c78ac5bbb7e65609175753933f7e75d54ea21c30 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Oct 25 10:48:50 2016 -0400 abstractize recording cleanup routine Change-Id: Ib9fc46542f273bab53f611a1456f02d67edfc966 commit d8358c9a2c6cbd66e17d4bb08dba96a3b2e2d41a Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Oct 25 10:07:44 2016 -0400 use shorthand for function pointers Change-Id: Idf43949e20281a10317e22a5b68a6d133e398bd4 commit 9417437c1092770e36bde22b508f9d71078d4a1b Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Oct 24 15:31:56 2016 -0400 abstractize individual recording functions Change-Id: I0974696b6bb361fce39b24d6be91b5c052ee2b14 commit eb631cd876a0f941ed4fb6d47412a6892e019f1b Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Oct 24 11:54:42 2016 -0400 abstractize call recording mechanism Change-Id: If8672051227944544d9cf916d359c5db67235e3e commit 70797ceb8f36c45593688652df98f19a5c1dd9f4 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Jul 14 11:25:05 2016 -0400 combine two mallocs into one for user-generated packets Change-Id: I585d129f10d379a5cb853382773f91a7cec9a98d commit f62f71cee404893b3f5076489d6a3eb1ad6f69c0 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 13 14:22:18 2016 -0400 check for and avoid /proc file name collisions Change-Id: Ie9eb9ceef8f32de8aba816f0121e768c57fa7402 commit ec6b3d22fcce8e7e2edd35704a559fe392406561 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 13 11:02:04 2016 -0400 implement free list Change-Id: I3e7dc2325c937923d19ce6000f2cf1c011e51037 commit bd75a1cf254c484878d07ecceca7220cdbf1ddb3 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 13 09:30:36 2016 -0400 make number of packets retained per stream configurable Change-Id: If1c87f80dd7367cbc274d13c15f94836ef9c8cb1 commit de259c3d646526bd200f619371668798ddae86b2 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Jul 12 15:15:01 2016 -0400 facilitate passing packets from kernel module out to userspace Change-Id: I2317a007084a1718e185ba04632c53a9ebe5f29d commit 3aa88716fb86c62f96b6dfc7d0d9c9755fa1f389 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Mon Jul 11 10:45:10 2016 -0400 restructure calls and streams to global arrays Change-Id: Icfca615b21f2e51b1abda4422c4eeb8f4ac70a9b commit 6cf9980f3e61f1f1d44b5ce883298ca2726af1b2 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Jul 8 11:53:32 2016 -0400 implement poll/select mechanism Change-Id: Ic10c017250f0991f691a887b078e80f694bba853 commit d95829e07b2bf4d3352806c70b3393ae3a8609fb Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Jul 8 10:44:38 2016 -0400 discard new/old packets as required Change-Id: If73ce77dcbc24addb6ce0931b90de0f5efae9f51 commit be1d769e4454f1d98f0b75cc8301c128a40e980c Author: Richard Fuchs <rfuchs@sipwise.com> Date: Fri Jul 8 10:25:38 2016 -0400 implement EOF for stream readers Change-Id: I858dc1fdd7df3b65283e1d96457d87e7452840f5 commit ed2d98d55a87ce428cdc66d9336035f3dc0cb5ae Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Jul 7 15:02:58 2016 -0400 blocking and nonblocking reads - incomplete Change-Id: I7cbfb09507ad8726773d6a28ddb98d5981decd04 commit 246709c7f4741e669c4a78b48c382497bf57c6be Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Jul 7 13:55:41 2016 -0400 rudimentary packet reading/dequeuing Change-Id: I1a924e5cb2ef4e4f16aeff1f1dd90d0746f91da5 commit 427749394995d2e6fb8ad7ddc23c876b1c8e11f1 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Jul 7 12:40:31 2016 -0400 use kzalloc where appropriate Change-Id: Icd6a109a69ab4f6dc9f7d35fd9e8fc9127f8e7e0 commit 5b07819217dfb47201a373e941aab185789484a9 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Jul 7 09:07:54 2016 -0400 more module referencing Change-Id: I2e34fe74f2edef9170a4558f6a24394240966d79 commit 1d8268f636c26ec21c3cfa2308bad91262e0768a Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 6 14:56:42 2016 -0400 store delivered packets in queue Change-Id: Id349b75e06f9dd77c884196b7726027ac5cab7ae commit 23c6a53f94c46ead7093b5402486799fc631e432 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 6 14:21:27 2016 -0400 implement call for packet delivery Change-Id: Ibeb815bf2fedfdd644d324c65b58a24871d47d4a commit c8fd855f325128b78f4e276bfb26b479ef189b11 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 6 10:28:18 2016 -0400 automatic cleanup of objects upon free/delete Change-Id: If244905e2d074f491229316f3305c9b0b1451792 commit 282ef603a83637c9a8e33ed31d09268fa45a6301 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jul 6 09:47:29 2016 -0400 unify read/write functions Change-Id: I78b0dd05cd730e16655034994c74cbe23be23fce commit e74c62cc6f0dce85fea6534d8d72e2f51e0947d6 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Jul 5 15:36:00 2016 -0400 rename _push to _put and _hold to _get Change-Id: I9b0ff5038b541bd3cfb961657c15a26f26ccdfb2 commit d71ce17529d1938ce2439b122fb6017e29dd079b Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Jul 5 15:33:07 2016 -0400 support creation and deletion of streams Change-Id: I7df05d232b5971c54ca50adce8144b5f1646fba0 commit 8be4e2c7c49dd7b893335f14ca98776a1f3fb12f Author: Richard Fuchs <rfuchs@sipwise.com> Date: Tue Jul 5 11:54:39 2016 -0400 create functions for redundant code Change-Id: Id3772f12294ee9891d22d833274e5935814cae0b commit 47ce4ca8f5d694e50c98f73147ed2eb81f14ea8a Author: Richard Fuchs <rfuchs@sipwise.com> Date: Thu Jun 30 12:12:19 2016 -0400 support creation and deletion of calls objects Change-Id: Ie5f9aa978bac21fc30909f14d6a438494848dfd5 commit 8dab54209d3e52d41f78d8f54956a4ed3dc15da3 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jun 29 14:20:23 2016 -0400 create /proc/.../calls directory Change-Id: I682a4bf23edbb72772d64963e3ba2cab2a521ff4 commit 1401ae8db5f9e2a973c670f3bf72e9019c451276 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jun 29 14:02:11 2016 -0400 rename kernel message enum Change-Id: I45d7aeae43df1fe6ecd6b6965dbd6ba7e7b715d8 commit ce44ff0dbe67a6687d5fb1bea9d31e21c9464907 Author: Richard Fuchs <rfuchs@sipwise.com> Date: Wed Jun 29 14:00:32 2016 -0400 convert kernel message data to union Change-Id: I7cfd9fe81623efae0a828ba457aa0a4b1380ff03 Change-Id: I4bb0b7f6d29c1c7a2144e4735ed59f3dc0e37094changes/33/9333/5
parent
ce461490c3
commit
984585a32c
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,260 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Linux::Inotify2;
|
||||
use AnyEvent::Loop;
|
||||
use AnyEvent;
|
||||
use Fcntl;
|
||||
use Errno qw(EINTR EIO EAGAIN EWOULDBLOCK :POSIX);
|
||||
use Net::Pcap;
|
||||
use Time::HiRes;
|
||||
|
||||
my $COMBINE = 1;
|
||||
# possible values:
|
||||
# 0: don't combine any streams. each stream gets written to its own pcap file
|
||||
# 1: combine all streams of one call into one pcap file
|
||||
|
||||
my $i = new Linux::Inotify2 or die;
|
||||
$i->blocking(0);
|
||||
|
||||
$i->watch('/var/spool/rtpengine', IN_CLOSE_WRITE | IN_DELETE, \&handle_inotify) or die;
|
||||
my $i_w = AnyEvent->io(fh => $i->fileno, poll => 'r', cb => sub { $i->poll });
|
||||
|
||||
setup();
|
||||
|
||||
AnyEvent::Loop::run();
|
||||
|
||||
exit;
|
||||
|
||||
my %metafiles;
|
||||
my %callbacks;
|
||||
|
||||
sub handle_inotify {
|
||||
my ($e) = @_;
|
||||
my $fn = $e->{w}->{name} . '/' . $e->{name};
|
||||
my $mf = ($metafiles{$fn} //= { name => $fn });
|
||||
if ($e->IN_DELETE) {
|
||||
handle_delete($e, $fn, $mf);
|
||||
}
|
||||
elsif ($e->IN_CLOSE_WRITE) {
|
||||
handle_change($e, $fn, $mf);
|
||||
}
|
||||
else {
|
||||
print("unhandled inotify event on $fn\n");
|
||||
}
|
||||
}
|
||||
|
||||
sub handle_change {
|
||||
my ($e, $fn, $mf) = @_;
|
||||
|
||||
print("handling change on $fn\n");
|
||||
|
||||
my $fd;
|
||||
open($fd, '<', $fn) or return;
|
||||
|
||||
# resume from where we left of
|
||||
my $pos = $mf->{pos} // 0;
|
||||
seek($fd, $pos, 0);
|
||||
|
||||
# read as much as we can
|
||||
my $buf;
|
||||
read($fd, $buf, 100000) or return;
|
||||
$mf->{pos} = tell($fd);
|
||||
close($fd);
|
||||
|
||||
# read contents section by section
|
||||
while ($buf =~ s/^(.*?)\n//s) {
|
||||
my $key = $1;
|
||||
$buf =~ s/^(\d+):\n//s or die $buf;
|
||||
my $len = $1;
|
||||
my $val = substr($buf, 0, $len, '');
|
||||
$buf =~ s/^\n\n//s or die;
|
||||
|
||||
if ($key =~ /^(CALL-ID|PARENT)$/) {
|
||||
$mf->{$key} = $val;
|
||||
}
|
||||
elsif ($key =~ /^STREAM (\d+) interface$/) {
|
||||
open_stream($mf, $val, $1);
|
||||
}
|
||||
elsif ($key =~ /^STREAM (\d+) details$/) {
|
||||
stream_details($mf, $val, $1);
|
||||
}
|
||||
}
|
||||
|
||||
cb('call_setup', $mf);
|
||||
}
|
||||
|
||||
sub handle_delete {
|
||||
my ($e, $fn, $mf) = @_;
|
||||
|
||||
print("handling delete on $fn\n");
|
||||
|
||||
cb('call_close', $mf);
|
||||
|
||||
for my $sn (keys(%{$mf->{streams}})) {
|
||||
my $ref = $mf->{streams}->{$sn};
|
||||
close_stream($ref);
|
||||
}
|
||||
|
||||
delete($mf->{streams});
|
||||
delete($mf->{streams_id});
|
||||
delete($metafiles{$fn});
|
||||
}
|
||||
|
||||
|
||||
sub get_stream_by_id {
|
||||
my ($mf, $id) = @_;
|
||||
my $ref = ($mf->{streams_id}->[$id] //= { metafile => $mf, id => $id });
|
||||
return $ref;
|
||||
}
|
||||
|
||||
sub open_stream {
|
||||
my ($mf, $stream, $id) = @_;
|
||||
print("opening $stream for $mf->{'CALL-ID'}\n");
|
||||
my $fd;
|
||||
sysopen($fd, '/proc/rtpengine/0/calls/' . $mf->{PARENT} . '/' . $stream, O_RDONLY | O_NONBLOCK) or return;
|
||||
my $ref = get_stream_by_id($mf, $id);
|
||||
$ref->{name} = $stream;
|
||||
$ref->{fh} = $fd;
|
||||
$ref->{watcher} = AnyEvent->io(fh => $fd, poll => 'r', cb => sub { stream_read($mf, $ref) });
|
||||
cb('stream_setup', $ref, $mf);
|
||||
$mf->{streams}->{$stream} = $ref;
|
||||
$mf->{streams_id}->[$id] = $ref;
|
||||
print("opened for reading $stream for $mf->{'CALL-ID'}\n");
|
||||
}
|
||||
|
||||
sub stream_details {
|
||||
my ($mf, $val, $id) = @_;
|
||||
my $ref = get_stream_by_id($mf, $id);
|
||||
my @details = $val =~ /(\w+) (\d+)/g;
|
||||
while (@details) {
|
||||
my $k = shift(@details);
|
||||
my $v = shift(@details);
|
||||
$ref->{$k} = $v;
|
||||
}
|
||||
}
|
||||
|
||||
sub close_stream {
|
||||
my ($ref) = @_;
|
||||
# this needs to be done explicitly, otherwise the closure would keep
|
||||
# the object from being freed
|
||||
delete($ref->{watcher});
|
||||
my $mf = $ref->{metafile};
|
||||
delete($mf->{streams}->{$ref->{name}});
|
||||
cb('stream_close', $ref);
|
||||
print("closed $ref->{name}\n");
|
||||
}
|
||||
|
||||
sub stream_read {
|
||||
my ($mf, $ref) = @_;
|
||||
#print("handling read event for $mf->{name} / $ref->{name}\n");
|
||||
while (1) {
|
||||
my $buf;
|
||||
my $ret = sysread($ref->{fh}, $buf, 65535);
|
||||
if (!defined($ret)) {
|
||||
if ($!{EAGAIN} || $!{EWOULDBLOCK}) {
|
||||
return;
|
||||
}
|
||||
print("read error on $ref->{name} for $mf->{'CALL-ID'}: $!\n");
|
||||
# fall through
|
||||
}
|
||||
elsif ($ret == 0) {
|
||||
print("eof on $ref->{name} for $mf->{'CALL-ID'}\n");
|
||||
# fall through
|
||||
}
|
||||
else {
|
||||
# $ret > 0
|
||||
#print("$ret bytes read from $ref->{name} for $mf->{'CALL-ID'}\n");
|
||||
cb('packet', $ref, $mf, $buf, $ret);
|
||||
next;
|
||||
}
|
||||
|
||||
# some kind of error
|
||||
close_stream($ref);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sub tvsec_now {
|
||||
my ($h) = @_;
|
||||
my @now = Time::HiRes::gettimeofday();
|
||||
$h->{tv_sec} = $now[0];
|
||||
$h->{tv_usec} = $now[1];
|
||||
}
|
||||
|
||||
sub setup {
|
||||
if ($COMBINE == 0) {
|
||||
$callbacks{stream_setup} = \&stream_pcap;
|
||||
$callbacks{stream_close} = \&stream_pcap_close;
|
||||
$callbacks{packet} = \&stream_packet,
|
||||
}
|
||||
elsif ($COMBINE == 1) {
|
||||
$callbacks{call_setup} = \&call_pcap;
|
||||
$callbacks{call_close} = \&call_pcap_close;
|
||||
$callbacks{packet} = \&call_packet,
|
||||
}
|
||||
}
|
||||
sub cb {
|
||||
my ($name, @args) = @_;
|
||||
my $fn = $callbacks{$name};
|
||||
$fn or return;
|
||||
return $fn->(@args);
|
||||
}
|
||||
|
||||
|
||||
sub dump_open {
|
||||
my ($hash, $name) = @_;
|
||||
$hash->{pcap} = pcap_open_dead(DLT_RAW, 65535);
|
||||
$hash->{dumper} = pcap_dump_open($hash->{pcap}, $name);
|
||||
}
|
||||
sub dump_close {
|
||||
my ($hash) = @_;
|
||||
pcap_dump_close($hash->{dumper});
|
||||
pcap_close($hash->{pcap});
|
||||
delete($hash->{dumper});
|
||||
delete($hash->{pcap});
|
||||
}
|
||||
sub dump_packet {
|
||||
my ($hash, $buf, $len) = @_;
|
||||
if (!$hash->{dumper}) {
|
||||
print("discarding packet (dumper not open) - $hash->{name}\n");
|
||||
return;
|
||||
}
|
||||
my $hdr = { len => $len, caplen => $len };
|
||||
tvsec_now($hdr);
|
||||
pcap_dump($hash->{dumper}, $hdr, $buf);
|
||||
}
|
||||
|
||||
# COMBINE 0 functions
|
||||
sub stream_pcap {
|
||||
my ($ref, $mf) = @_;
|
||||
dump_open($ref, $mf->{PARENT} . '-' . $ref->{name} . '.pcap');
|
||||
}
|
||||
sub stream_pcap_close {
|
||||
my ($ref) = @_;
|
||||
dump_close($ref);
|
||||
}
|
||||
sub stream_packet {
|
||||
my ($ref, $mf, $buf, $ret) = @_;
|
||||
dump_packet($ref, $buf, $ret);
|
||||
}
|
||||
|
||||
# COMBINE 1 functions
|
||||
sub call_pcap {
|
||||
my ($mf) = @_;
|
||||
|
||||
$mf->{pcap} and return;
|
||||
$mf->{PARENT} or return;
|
||||
|
||||
print("opening pcap for $mf->{PARENT}\n");
|
||||
dump_open($mf, $mf->{PARENT} . '.pcap');
|
||||
}
|
||||
sub call_pcap_close {
|
||||
my ($mf) = @_;
|
||||
dump_close($mf);
|
||||
}
|
||||
sub call_packet {
|
||||
my ($ref, $mf, $buf, $ret) = @_;
|
||||
dump_packet($mf, $buf, $ret);
|
||||
}
|
Loading…
Reference in new issue