1#!perl -T
2use strict;
3use File::Spec;
4use Test::More;
5use Net::Pcap;
6use lib 't';
7use Utils;
8
9my(%name2val,%val2name,%val2descr);
10plan skip_all => "extended datalink related functions are not available"
11    unless is_available('pcap_datalink_name_to_val');
12
13%name2val = (
14    undef            => -1,
15    LTalk            => DLT_LTALK,
16    raw              => DLT_RAW,
17    PPP_serial       => DLT_PPP_SERIAL,
18    SLIP             => DLT_SLIP,
19    ieee802_11       => DLT_IEEE802_11,
20);
21%val2name = (
22    0                => 'NULL',
23    DLT_LTALK()      => 'LTALK',
24    DLT_RAW()        => 'RAW',
25    DLT_PPP_SERIAL() => 'PPP_SERIAL',
26    DLT_SLIP()       => 'SLIP',
27    DLT_IEEE802_11() => 'IEEE802_11',
28);
29%val2descr = (
30    0                => 'BSD loopback',
31    DLT_NULL()       => 'BSD loopback',
32    DLT_LTALK()      => 'Localtalk',
33    DLT_RAW()        => 'Raw IP',
34    DLT_PPP_SERIAL() => 'PPP over serial',
35    DLT_SLIP()       => 'SLIP',
36    DLT_IEEE802_11() => '802.11',
37);
38
39plan tests => keys(%name2val) * 2 + keys(%val2name) * 2 + keys(%val2descr) * 2 + 23;
40
41my $has_test_exception = eval "use Test::Exception; 1";
42
43my($dev,$pcap,$datalink,$r,$err) = ('','','','','');
44
45# Testing error messages
46SKIP: {
47    skip "Test::Exception not available", 7 unless $has_test_exception;
48
49    # datalink() errors
50    throws_ok(sub {
51        Net::Pcap::datalink()
52    }, '/^Usage: Net::Pcap::datalink\(p\)/',
53       "calling datalink() with no argument");
54
55    throws_ok(sub {
56        Net::Pcap::datalink(0)
57    }, '/^p is not of type pcap_tPtr/',
58       "calling datalink() with incorrect argument type");
59
60    # set_datalink() errors
61    throws_ok(sub {
62        Net::Pcap::set_datalink()
63    }, '/^Usage: Net::Pcap::set_datalink\(p, linktype\)/',
64       "calling set_datalink() with no argument");
65
66    throws_ok(sub {
67        Net::Pcap::set_datalink(0, 0)
68    }, '/^p is not of type pcap_tPtr/',
69       "calling set_datalink() with incorrect argument type");
70
71    # datalink_name_to_val() errors
72    throws_ok(sub {
73        Net::Pcap::datalink_name_to_val()
74    }, '/^Usage: Net::Pcap::datalink_name_to_val\(name\)/',
75       "calling datalink_name_to_val() with no argument");
76
77    # datalink_val_to_name() errors
78    throws_ok(sub {
79        Net::Pcap::datalink_val_to_name()
80    }, '/^Usage: Net::Pcap::datalink_val_to_name\(linktype\)/',
81       "calling datalink_val_to_name() with no argument");
82
83    # datalink_val_to_descr() errors
84    throws_ok(sub {
85        Net::Pcap::datalink_val_to_description()
86    }, '/^Usage: Net::Pcap::datalink_val_to_description\(linktype\)/',
87       "calling datalink_val_to_description() with no argument");
88
89}
90
91SKIP: {
92    skip "must be run as root", 5 unless is_allowed_to_use_pcap();
93    skip "no network device available", 5 unless find_network_device();
94
95    # Find a device and open it
96    $dev = find_network_device();
97    $pcap = Net::Pcap::open_live($dev, 1024, 1, 100, \$err);
98    isa_ok( $pcap, 'pcap_tPtr', "\$pcap" );
99
100    # Testing datalink()
101    $datalink = '';
102    eval { $datalink = Net::Pcap::datalink($pcap) };
103    is( $@, '', "datalink() on a live connection" );
104    like( $datalink , '/^\d+$/', " - datalink is an integer" );
105
106    # Testing set_datalink()
107    eval { $r = Net::Pcap::set_datalink($pcap, DLT_LTALK) };  # Apple LocalTalk
108    is( $@, '', "set_datalink() on a live connection" );
109    is( $r , -1, " - returned -1 (expected failure)" );
110
111    Net::Pcap::close($pcap);
112}
113
114# Open a sample save file
115$pcap = Net::Pcap::open_offline(File::Spec->catfile(qw(t samples ping-ietf-20pk-be.dmp)), \$err);
116isa_ok( $pcap, 'pcap_tPtr', "\$pcap" );
117
118# Testing datalink()
119$datalink = '';
120eval { $datalink = Net::Pcap::datalink($pcap) };
121is( $@, '', "datalink() on a save file" );
122like( $datalink , '/^\d+$/', " - datalink is an integer" );
123is( $datalink , DLT_EN10MB, " - datalink is DLT_EN10MB (Ethernet)" );
124
125# Testing set_datalink()
126eval { $r = Net::Pcap::set_datalink($pcap, DLT_LTALK) };  # Apple LocalTalk
127is( $@, '', "set_datalink() on a save file" );
128is( $r , -1, " - returned -1 (expected failure)" );
129
130Net::Pcap::close($pcap);
131
132
133# Open a dead pcap descriptor
134$pcap = Net::Pcap::open_dead(DLT_IP_OVER_FC, 1024);
135isa_ok( $pcap, 'pcap_tPtr', "\$pcap" );
136
137# Testing datalink()
138$datalink = '';
139eval { $datalink = Net::Pcap::datalink($pcap) };
140is( $@, '', "datalink() on a dead descriptor" );
141is( $datalink , DLT_IP_OVER_FC, " - datalink is an integer" );
142
143# Testing set_datalink()
144# the migration of the century: from IP-over-Fibre Channel to Apple LocalTalk!
145eval { $r = Net::Pcap::set_datalink($pcap, DLT_LTALK) };
146is( $@, '', "set_datalink() on a dead descriptor" );
147is( $r , -1, " - returned -1 (expected failure)" );
148# The following tests don't work, but maybe they're just incorrect.
149#isnt( $r , -1, " - should not returned -1" );
150#$datalink = Net::Pcap::datalink($pcap);
151#is( $datalink, DLT_LTALK, " - new link type was correctly stored" );
152
153
154# Testing datalink_name_to_val()
155for my $name (keys %name2val) {
156    $datalink = '';
157    eval { $datalink = Net::Pcap::datalink_name_to_val($name) };
158    is( $@, '', "datalink_name_to_val($name)" );
159    is( $datalink, $name2val{$name}, " - checking expected value" );
160}
161
162# Testing datalink_val_to_name()
163for my $val (keys %val2name) {
164    my $name = '';
165    eval { $name = Net::Pcap::datalink_val_to_name($val) };
166    is( $@, '', "datalink_val_to_name($val)" );
167    is( $name, $val2name{$val}, " - checking expected value" );
168}
169
170# Testing datalink_val_to_description()
171for my $val (keys %val2descr) {
172    my $descr = '';
173    eval { $descr = Net::Pcap::datalink_val_to_description($val) };
174    is( $@, '', "datalink_val_to_description($val)" );
175    is( $descr, $val2descr{$val}, " - checking expected value" );
176}
177
178