| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# You may distribute under the terms of either the GNU General Public License |
|
2
|
|
|
|
|
|
|
# or the Artistic License (the same terms as Perl itself) |
|
3
|
|
|
|
|
|
|
# |
|
4
|
|
|
|
|
|
|
# (C) Paul Evans, 2009-2020 -- leonerd@leonerd.org.uk |
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
package Socket::Packet; |
|
7
|
|
|
|
|
|
|
|
|
8
|
8
|
|
|
8
|
|
430554
|
use strict; |
|
|
8
|
|
|
|
|
71
|
|
|
|
8
|
|
|
|
|
238
|
|
|
9
|
8
|
|
|
8
|
|
47
|
use warnings; |
|
|
8
|
|
|
|
|
14
|
|
|
|
8
|
|
|
|
|
196
|
|
|
10
|
|
|
|
|
|
|
|
|
11
|
8
|
|
|
8
|
|
42
|
use Carp; |
|
|
8
|
|
|
|
|
16
|
|
|
|
8
|
|
|
|
|
601
|
|
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our $VERSION = '0.11'; |
|
14
|
|
|
|
|
|
|
|
|
15
|
8
|
|
|
8
|
|
50
|
use Exporter 'import'; |
|
|
8
|
|
|
|
|
23
|
|
|
|
8
|
|
|
|
|
1196
|
|
|
16
|
|
|
|
|
|
|
our @EXPORT_OK = qw( |
|
17
|
|
|
|
|
|
|
pack_sockaddr_ll unpack_sockaddr_ll |
|
18
|
|
|
|
|
|
|
pack_packet_mreq unpack_packet_mreq |
|
19
|
|
|
|
|
|
|
unpack_tpacket_stats |
|
20
|
|
|
|
|
|
|
siocgstamp |
|
21
|
|
|
|
|
|
|
siocgstampns |
|
22
|
|
|
|
|
|
|
siocgifindex |
|
23
|
|
|
|
|
|
|
siocgifname |
|
24
|
|
|
|
|
|
|
recv_len |
|
25
|
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
setup_rx_ring |
|
27
|
|
|
|
|
|
|
get_ring_frame_status |
|
28
|
|
|
|
|
|
|
get_ring_frame |
|
29
|
|
|
|
|
|
|
done_ring_frame |
|
30
|
|
|
|
|
|
|
); |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
require XSLoader; |
|
33
|
|
|
|
|
|
|
XSLoader::load( __PACKAGE__, $VERSION ); |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
=head1 NAME |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
C - interface to Linux's C socket family |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
use Socket qw( SOCK_RAW ); |
|
42
|
|
|
|
|
|
|
use Socket::Packet qw( |
|
43
|
|
|
|
|
|
|
PF_PACKET |
|
44
|
|
|
|
|
|
|
ETH_P_ALL |
|
45
|
|
|
|
|
|
|
pack_sockaddr_ll unpack_sockaddr_ll |
|
46
|
|
|
|
|
|
|
); |
|
47
|
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
socket( my $sock, PF_PACKET, SOCK_RAW, 0 ) |
|
49
|
|
|
|
|
|
|
or die "Cannot socket() - $!\n"; |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
bind( $sock, pack_sockaddr_ll( ETH_P_ALL, 0, 0, 0, "" ) ) |
|
52
|
|
|
|
|
|
|
or die "Cannot bind() - $!\n"; |
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
while( my $addr = recv( $sock, my $packet, 8192, 0 ) ) { |
|
55
|
|
|
|
|
|
|
my ( $proto, $ifindex, $hatype, $pkttype, $addr ) |
|
56
|
|
|
|
|
|
|
= unpack_sockaddr_ll( $addr ); |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
... |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
To quote C: |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
Packet sockets are used to receive or send raw packets at the device driver |
|
66
|
|
|
|
|
|
|
(OSI Layer 2) level. They allow the user to implement protocol modules in |
|
67
|
|
|
|
|
|
|
user space on top of the physical layer. |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
Sockets in the C family get direct link-level access to the |
|
70
|
|
|
|
|
|
|
underlying hardware (i.e. Ethernet or similar). They are usually used to |
|
71
|
|
|
|
|
|
|
implement packet capturing, or sending of specially-constructed packets |
|
72
|
|
|
|
|
|
|
or to implement protocols the underlying kernel does not recognise. |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
The use of C sockets is usually restricted to privileged users |
|
75
|
|
|
|
|
|
|
only. |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
This module also provides various other support functions which wrap |
|
78
|
|
|
|
|
|
|
Cs or socket options. This includes support for C, |
|
79
|
|
|
|
|
|
|
the high-performance zero-copy packet receive buffering, if the underlying |
|
80
|
|
|
|
|
|
|
platform supports it. |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
=cut |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=head1 CONSTANTS |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
The following constants are exported |
|
87
|
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=over 8 |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=item PF_PACKET |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
The packet family (for C calls) |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
=item AF_PACKET |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
The address family |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=item PACKET_HOST |
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
This packet is inbound unicast for this host. |
|
101
|
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=item PACKET_BROADCAST |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
This packet is inbound broadcast. |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=item PACKET_MULTICAST |
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
This packet is inbound multicast. |
|
109
|
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
=item PACKET_OTHERHOST |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
This packet is inbound unicast for another host. |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
=item PACKET_OUTGOING |
|
115
|
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
This packet is outbound. |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
=item ETH_P_ALL |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
Pseudo-protocol number to capture all protocols. |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
=item SOL_PACKET |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
Socket option level for C and C. |
|
125
|
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
=back |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
=cut |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
=head1 SOCKET OPTIONS |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
The following constants define socket options |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=over 8 |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
=item PACKET_STATISTICS (get; struct tpacket_stats) |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
Packet received and drop counters. |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
=item PACKET_ORIGDEV (get or set; int) |
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
Received packets will indicate the originally-received device, rather than the |
|
143
|
|
|
|
|
|
|
apparent one. This mainly relates to Ethernet bonding or VLANs. |
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
This socket option is optional, and may not be provided on all platforms. |
|
146
|
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
=item PACKET_ADD_MEMBERSHIP (set; struct packet_mreq) |
|
148
|
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
=item PACKET_DROP_MEMBERSHIP (set; struct packet_mreq) |
|
150
|
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
Membership of multicast or broadcast groups, or set promiscuous mode. |
|
152
|
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
The C C field should be one of the following: |
|
154
|
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
=over 4 |
|
156
|
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
=item PACKET_MR_MULTICAST |
|
158
|
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
A multicast group |
|
160
|
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=item PACKET_MR_PROMISC |
|
162
|
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
Set or clear the promiscuous flag; the address is ignored |
|
164
|
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=item PACKET_MR_ALLMULTI |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
Set or clear the allmulti flag; the address is ignored |
|
168
|
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
=back |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
=back |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
=cut |
|
174
|
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
=head1 FUNCTIONS |
|
176
|
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
The following pair of functions operate on C address structures. |
|
178
|
|
|
|
|
|
|
The meanings of the parameters are: |
|
179
|
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
=over 8 |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=item protocol |
|
183
|
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
An ethertype protocol number. When using an address with C, the |
|
185
|
|
|
|
|
|
|
constant C can be used instead, to capture any protocol. The |
|
186
|
|
|
|
|
|
|
C and C functions byte-swap this |
|
187
|
|
|
|
|
|
|
value to or from network endian order. |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
=item ifindex |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
The index number of the interface on which the packet was sent or received. |
|
192
|
|
|
|
|
|
|
When using an address with C, the value C<0> can be used instead, to |
|
193
|
|
|
|
|
|
|
watch all interfaces. |
|
194
|
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
=item hatype |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
The hardware ARP type of hardware address. |
|
198
|
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
=item pkttype |
|
200
|
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
The type of the packet; indicates if it was sent or received. Will be one of |
|
202
|
|
|
|
|
|
|
the C values. |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
=item addr |
|
205
|
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
The underlying hardware address, in the type given by C. |
|
207
|
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
=back |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
=head2 pack_sockaddr_ll |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
$a = pack_sockaddr_ll( $protocol, $ifindex, $hatype, $pkttype, $addr ) |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
Returns a C structure with the fields packed into it. |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
=head2 unpack_sockaddr_ll |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
( $protocol, $ifindex, $hatype, $pkttype, $addr ) = unpack_sockaddr_ll( $a ) |
|
219
|
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
Takes a C structure and returns the unpacked fields from it. |
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
=head2 pack_packet_mreq |
|
223
|
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
$mreq = pack_packet_mreq( $ifindex, $type, $addr ) |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
Returns a C structure with the fields packed into it. |
|
227
|
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
=head2 unpack_packet_mreq |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
( $ifindex, $type, $addr ) = unpack_packet_mreq( $mreq ) |
|
231
|
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
Takes a C structure and returns the unpacked fields from it. |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=head2 unpack_tpacket_stats |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
( $packets, $drops ) = unpack_tpacket_stats( $stats ) |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
Takes a C structure from the C sockopt and |
|
239
|
|
|
|
|
|
|
returns the unpacked fields from it. |
|
240
|
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
=head2 siocgstamp |
|
242
|
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
$time = siocgstamp( $sock ) |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
( $sec, $usec ) = siocgstamp( $sock ) |
|
246
|
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
Returns the timestamp of the last received packet on the socket (as obtained |
|
248
|
|
|
|
|
|
|
by the C C). In scalar context, returns a single |
|
249
|
|
|
|
|
|
|
floating-point value in UNIX epoch seconds. In list context, returns the |
|
250
|
|
|
|
|
|
|
number of seconds, and the number of microseconds. |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
=head2 siocgstampns |
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
$time = siocgstampns( $sock ) |
|
255
|
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
( $sec, $nsec ) = siocgstampns( $sock ) |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
Returns the nanosecond-precise timestamp of the last received packet on the |
|
259
|
|
|
|
|
|
|
socket (as obtained by the C C). In scalar context, |
|
260
|
|
|
|
|
|
|
returns a single floating-point value in UNIX epoch seconds. In list context, |
|
261
|
|
|
|
|
|
|
returns the number of seconds, and the number of nanoseconds. |
|
262
|
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
=head2 siocgifindex |
|
264
|
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
$ifindex = siocgifindex( $sock, $ifname ) |
|
266
|
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
Returns the C of the interface with the given name if one exists, or |
|
268
|
|
|
|
|
|
|
C if not. C<$sock> does not need to be a C socket, any |
|
269
|
|
|
|
|
|
|
socket handle will do. |
|
270
|
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
=head2 siocgifname |
|
272
|
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
$ifname = siocgifname( $sock, $ifindex ) |
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
Returns the C of the interface at the given index if one exists, or |
|
276
|
|
|
|
|
|
|
C if not. C<$sock> does not need to be a C socket, any |
|
277
|
|
|
|
|
|
|
socket handle will do. |
|
278
|
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
=head2 recv_len |
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
( $addr, $len ) = recv_len( $sock, $buffer, $maxlen, $flags ) |
|
282
|
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
Similar to Perl's C builtin, except it returns the packet length as an |
|
284
|
|
|
|
|
|
|
explict return value. This may be useful if C<$flags> contains the |
|
285
|
|
|
|
|
|
|
C flag, obtaining the true length of the packet on the wire, even |
|
286
|
|
|
|
|
|
|
if this is longer than the data written in the buffer. |
|
287
|
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
=cut |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
=head1 RING-BUFFER FUNCTIONS |
|
291
|
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
The following functions operate on the high-performance memory-mapped buffer |
|
293
|
|
|
|
|
|
|
feature of C, allowing efficient packet-capture applications to |
|
294
|
|
|
|
|
|
|
share a buffer with the kernel directly, avoiding the need for per-packet |
|
295
|
|
|
|
|
|
|
system calls to C (and possibly C to obtain the timestamp). |
|
296
|
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
The ring-buffer is optional, and may not be implemented on all platforms. If |
|
298
|
|
|
|
|
|
|
it is not implemented, then all the following functions will die with an error |
|
299
|
|
|
|
|
|
|
message. |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
=cut |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
=head2 setup_rx_ring |
|
304
|
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
$size = setup_rx_ring( $sock, $frame_size, $frame_nr, $block_size ) |
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
Sets up the ring-buffer on the socket. The buffer will store C<$frame_nr> |
|
308
|
|
|
|
|
|
|
frames of up to C<$frame_size> bytes each (including metadata headers), and |
|
309
|
|
|
|
|
|
|
will be split in the kernel in blocks of C<$block_size> bytes. C<$block_size> |
|
310
|
|
|
|
|
|
|
should be a power of 2, at minimum, 4KiB. |
|
311
|
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
If successful, the overall size of the buffer in bytes is returned. If not, |
|
313
|
|
|
|
|
|
|
C is returned, and C<$!> will hold the error value. |
|
314
|
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
=head2 get_ring_frame_status |
|
316
|
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
$status = get_ring_frame_status( $sock ) |
|
318
|
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
Returns the frame status of the next frame in the ring. |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
The following constants are defined for the status: |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
=over 8 |
|
324
|
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
=item TP_STATUS_KERNEL |
|
326
|
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
This frame belongs to the kernel and userland should not touch it. |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
=item TP_STATUS_USER |
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
This frame belongs to userland and the kernel will not modify it. |
|
332
|
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
=item TP_STATUS_LOSING |
|
334
|
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
Bitwise-or'ed with the status if packet loss has occurred since the previous |
|
336
|
|
|
|
|
|
|
frame. |
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
=back |
|
339
|
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
=head2 get_ring_frame |
|
341
|
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
$len = get_ring_frame( $sock, $buffer, \%info ) |
|
343
|
|
|
|
|
|
|
|
|
344
|
|
|
|
|
|
|
If the next frame is ready for userland, fills in keys of the C<%info> hash |
|
345
|
|
|
|
|
|
|
with its metadata, sets C<$buffer> to its contents, and return the length of |
|
346
|
|
|
|
|
|
|
the data. The C<$buffer> variable has its string backing buffer aliased, |
|
347
|
|
|
|
|
|
|
rather than the buffer copied into, for performance. The caller should not |
|
348
|
|
|
|
|
|
|
modify the variable, nor attempt to access it after the socket has been |
|
349
|
|
|
|
|
|
|
closed. |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
If the frame is not yet ready, this function returns undef. |
|
352
|
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
The following fields are returned: |
|
354
|
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
=over 8 |
|
356
|
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
=item tp_status |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
The status of the frame; see C |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
=item tp_len |
|
362
|
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
The length of the packet on the wire, in bytes |
|
364
|
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
=item tp_snaplen |
|
366
|
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
The length of the packet captured and stored in the buffer, in bytes. This may |
|
368
|
|
|
|
|
|
|
be shorter than C if, for example, a filter is set on the socket that |
|
369
|
|
|
|
|
|
|
truncated the packet. |
|
370
|
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
=item tp_sec |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
=item tp_nsec |
|
374
|
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
The seconds and nanoseconds fields of the timestamp. If the underlying |
|
376
|
|
|
|
|
|
|
platform does not support C, then this field will only have a |
|
377
|
|
|
|
|
|
|
resolution of microseconds; i.e. it will be a whole multiple of 1000. |
|
378
|
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
=item tp_vlan_tci |
|
380
|
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
VLAN information about the packet, if the underlying platform supports |
|
382
|
|
|
|
|
|
|
C. If this is not supported, the key will not be present in the |
|
383
|
|
|
|
|
|
|
hash |
|
384
|
|
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
=item sll_protocol |
|
386
|
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
=item sll_ifindex |
|
388
|
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
=item sll_hatype |
|
390
|
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
=item sll_pkttype |
|
392
|
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
=item sll_addr |
|
394
|
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
Fields from the C; see above for more detail |
|
396
|
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
=back |
|
398
|
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
=head2 clear_ring_frame |
|
400
|
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
clear_ring_frame( $sock ) |
|
402
|
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
Clears the status of current frame to hand it back to the kernel and moves on |
|
404
|
|
|
|
|
|
|
to the next. |
|
405
|
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=cut |
|
407
|
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
409
|
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
=over 4 |
|
411
|
|
|
|
|
|
|
|
|
412
|
|
|
|
|
|
|
=item * |
|
413
|
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
L - Object interface to C domain sockets |
|
415
|
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
=item * |
|
417
|
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
L - interface to Linux's socket packet filtering |
|
419
|
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
=item * |
|
421
|
|
|
|
|
|
|
|
|
422
|
|
|
|
|
|
|
C - packet, AF_PACKET - packet interface on device level |
|
423
|
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
=back |
|
425
|
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
=head1 AUTHOR |
|
427
|
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
Paul Evans |
|
429
|
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
=cut |
|
431
|
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
0x55AA; |