File Coverage

blib/lib/NetPacket/IP.pm
Criterion Covered Total %
statement 292 296 98.6
branch 5 10 50.0
condition n/a
subroutine 83 85 97.6
pod 3 5 60.0
total 383 396 96.7


line stmt bran cond sub pod time code
1             package NetPacket::IP;
2             our $AUTHORITY = 'cpan:YANICK';
3             # ABSTRACT: Assemble and disassemble IP (Internet Protocol) packets.
4             $NetPacket::IP::VERSION = '1.7.2';
5 10     10   78802 use strict;
  10         33  
  10         302  
6 10     10   48 use warnings;
  10         20  
  10         267  
7              
8 10     10   962 use parent 'NetPacket';
  10         678  
  10         52  
9              
10             our @EXPORT_OK = qw(ip_strip
11             IP_PROTO_IP IP_PROTO_ICMP IP_PROTO_IGMP
12             IP_PROTO_IPIP IP_PROTO_TCP IP_PROTO_EGP
13             IP_PROTO_EGP IP_PROTO_PUP IP_PROTO_UDP
14             IP_PROTO_IDP IP_PROTO_TP IP_PROTO_DCCP
15             IP_PROTO_IPV6 IP_PROTO_IPv6 IP_PROTO_ROUTING IP_PROTO_FRAGMENT
16             IP_PROTO_RSVP IP_PROTO_GRE IP_PROTO_ESP
17             IP_PROTO_AH IP_PROTO_ICMPV6 IP_PROTO_ICMPv6 IP_PROTO_NONE
18             IP_PROTO_DSTOPTS IP_PROTO_MTP IP_PROTO_ENCAP
19             IP_PROTO_PIM IP_PROTO_COMP IP_PROTO_SCTP
20             IP_PROTO_UDPLITE
21             IP_VERSION_IPv4
22             IP_FLAG_MOREFRAGS IP_FLAG_DONTFRAG IP_FLAG_CONGESTION
23             IPTOS_ECN_MASK IPTOS_ECN_NOT_ECT IPTOS_ECN_ECT1
24             IPTOS_ECN_ECT0 IPTOS_ECN_CE
25             IPTOS_DSCP_MASK IPTOS_DSCP_EF
26             IPTOS_DSCP_AF11 IPTOS_DSCP_AF12 IPTOS_DSCP_AF13
27             IPTOS_DSCP_AF21 IPTOS_DSCP_AF22 IPTOS_DSCP_AF23
28             IPTOS_DSCP_AF31 IPTOS_DSCP_AF32 IPTOS_DSCP_AF33
29             IPTOS_DSCP_AF41 IPTOS_DSCP_AF42 IPTOS_DSCP_AF43
30             IPTOS_CLASS_MASK IPTOS_CLASS_DEFAULT
31             IPTOS_CLASS_CS0 IPTOS_CLASS_CS1 IPTOS_CLASS_CS2
32             IPTOS_CLASS_CS3 IPTOS_CLASS_CS4 IPTOS_CLASS_CS5
33             IPTOS_CLASS_CS6 IPTOS_CLASS_CS7
34             IPTOS_PREC_MASK IPTOS_PREC_NETCONTROL
35             IPTOS_PREC_INTERNETCONTROL IPTOS_PREC_CRITIC_ECP
36             IPTOS_PREC_FLASHOVERRIDE IPTOS_PREC_FLASH
37             IPTOS_PREC_IMMEDIATE IPTOS_PREC_PRIORITY
38             IPTOS_PREC_ROUTINE
39             MAXTTL IPDEFTTL IPFRAGTTL IPTTLDEC IP_MSS IP_MAXPACKET
40             );
41              
42             our %EXPORT_TAGS = (
43             ALL => [@EXPORT_OK],
44             protos => [qw(IP_PROTO_IP IP_PROTO_ICMP IP_PROTO_IGMP IP_PROTO_IPIP
45             IP_PROTO_TCP IP_PROTO_EGP IP_PROTO_PUP
46             IP_PROTO_UDP IP_PROTO_IDP IP_PROTO_TP IP_PROTO_DCCP
47             IP_PROTO_IPV6 IP_PROTO_IPv6 IP_PROTO_ROUTING IP_PROTO_FRAGMENT
48             IP_PROTO_RSVP IP_PROTO_GRE IP_PROTO_ESP IP_PROTO_AH
49             IP_PROTO_ICMPV6 IP_PROTO_ICMPv6 IP_PROTO_NONE IP_PROTO_DSTOPTS
50             IP_PROTO_MTP IP_PROTO_ENCAP IP_PROTO_PIM IP_PROTO_COMP
51             IP_PROTO_SCTP IP_PROTO_UDPLITE)],
52             versions => [qw(IP_VERSION_IPv4)],
53             strip => [qw(ip_strip)],
54             flags => [qw(IP_FLAG_MOREFRAGS IP_FLAG_DONTFRAG IP_FLAG_CONGESTION)],
55             tos => [qw(IPTOS_ECN_MASK IPTOS_ECN_NOT_ECT IPTOS_ECN_ECT1
56             IPTOS_ECN_ECT0 IPTOS_ECN_CE
57             IPTOS_DSCP_MASK IPTOS_DSCP_EF
58             IPTOS_DSCP_AF11 IPTOS_DSCP_AF12 IPTOS_DSCP_AF13
59             IPTOS_DSCP_AF21 IPTOS_DSCP_AF22 IPTOS_DSCP_AF23
60             IPTOS_DSCP_AF31 IPTOS_DSCP_AF32 IPTOS_DSCP_AF33
61             IPTOS_DSCP_AF41 IPTOS_DSCP_AF42 IPTOS_DSCP_AF43
62             IPTOS_CLASS_MASK IPTOS_CLASS_DEFAULT
63             IPTOS_CLASS_CS0 IPTOS_CLASS_CS1 IPTOS_CLASS_CS2
64             IPTOS_CLASS_CS3 IPTOS_CLASS_CS4 IPTOS_CLASS_CS5
65             IPTOS_CLASS_CS6 IPTOS_CLASS_CS7
66             IPTOS_PREC_MASK IPTOS_PREC_NETCONTROL
67             IPTOS_PREC_INTERNETCONTROL IPTOS_PREC_CRITIC_ECP
68             IPTOS_PREC_FLASHOVERRIDE IPTOS_PREC_FLASH
69             IPTOS_PREC_IMMEDIATE IPTOS_PREC_PRIORITY
70             IPTOS_PREC_ROUTINE)],
71             misc => [qw(MAXTTL IPDEFTTL IPFRAGTTL IPTTLDEC IP_MSS
72             IP_MAXPACKET)],
73             );
74              
75             #
76             # Partial list of IP protocol values from RFC 1700
77             #
78              
79 10     10   2374 use constant IP_PROTO_IP => 0; # Dummy protocol for TCP
  10         21  
  10         968  
80 10     10   66 use constant IP_PROTO_ICMP => 1; # Internet Control Message Protocol
  10         17  
  10         608  
81 10     10   65 use constant IP_PROTO_IGMP => 2; # Internet Group Management Protocol
  10         19  
  10         546  
82 10     10   66 use constant IP_PROTO_IPIP => 4; # IP in IP encapsulation
  10         18  
  10         527  
83 10     10   79 use constant IP_PROTO_TCP => 6; # Transmission Control Protocol
  10         16  
  10         524  
84 10     10   77 use constant IP_PROTO_EGP => 8; # Exterior Gateway Protocol
  10         29  
  10         571  
85 10     10   64 use constant IP_PROTO_PUP => 12; # PUP protocol
  10         15  
  10         543  
86 10     10   62 use constant IP_PROTO_UDP => 17; # User Datagram Protocol
  10         36  
  10         559  
87 10     10   64 use constant IP_PROTO_IDP => 22; # XNS IDP Protocol
  10         26  
  10         497  
88 10     10   62 use constant IP_PROTO_TP => 29; # SO Transport Protocol Class 4
  10         19  
  10         593  
89 10     10   62 use constant IP_PROTO_DCCP => 33; # Datagram Congestion Control Protocol
  10         20  
  10         542  
90 10     10   67 use constant IP_PROTO_IPV6 => 41; # IPv6 header
  10         17  
  10         495  
91 10     10   79 use constant IP_PROTO_IPv6 => 41; # IPv6 header (alias)
  10         45  
  10         524  
92 10     10   64 use constant IP_PROTO_ROUTING => 43; # IPv6 routing header
  10         19  
  10         494  
93 10     10   87 use constant IP_PROTO_FRAGMENT => 44; # IPv6 fragmentation header
  10         21  
  10         500  
94 10     10   67 use constant IP_PROTO_RSVP => 46; # Reservation Protocol
  10         28  
  10         492  
95 10     10   58 use constant IP_PROTO_GRE => 47; # General Routing Encapsulation
  10         20  
  10         488  
96 10     10   59 use constant IP_PROTO_ESP => 50; # encapsulating security payload
  10         17  
  10         548  
97 10     10   74 use constant IP_PROTO_AH => 51; # authentication header
  10         19  
  10         468  
98 10     10   61 use constant IP_PROTO_ICMPV6 => 58; # ICMPv6
  10         18  
  10         468  
99 10     10   58 use constant IP_PROTO_ICMPv6 => 58; # ICMPv6 (alias)
  10         41  
  10         481  
100 10     10   59 use constant IP_PROTO_NONE => 59; # IPv6 no next header
  10         28  
  10         471  
101 10     10   60 use constant IP_PROTO_DSTOPTS => 60; # IPv6 destination options
  10         19  
  10         518  
102 10     10   67 use constant IP_PROTO_MTP => 92; # Multicast Transport Protocol
  10         22  
  10         487  
103 10     10   57 use constant IP_PROTO_ENCAP => 98; # Encapsulation Header
  10         20  
  10         502  
104 10     10   61 use constant IP_PROTO_PIM => 103; # Protocol Independent Multicast
  10         19  
  10         551  
105 10     10   72 use constant IP_PROTO_COMP => 108; # Compression Header Protocol
  10         19  
  10         511  
106 10     10   59 use constant IP_PROTO_SCTP => 132; # Stream Control Transmission Protocol
  10         26  
  10         484  
107 10     10   60 use constant IP_PROTO_UDPLITE => 136; # UDP-Lite protocol
  10         25  
  10         797  
108              
109              
110             #
111             # Partial list of IP version numbers from RFC 1700
112             #
113              
114 10     10   68 use constant IP_VERSION_IPv4 => 4; # IP version 4
  10         25  
  10         568  
115              
116             #
117             # Flag values
118             #
119              
120 10     10   62 use constant IP_FLAG_MOREFRAGS => 1; # More fragments coming
  10         19  
  10         541  
121 10     10   86 use constant IP_FLAG_DONTFRAG => 2; # Don't fragment me
  10         40  
  10         517  
122 10     10   59 use constant IP_FLAG_CONGESTION => 4; # Congestion present
  10         57  
  10         542  
123              
124             #
125             # ToS/DSCP values
126             #
127              
128 10     10   57 use constant IPTOS_ECN_MASK => 0x03;
  10         58  
  10         529  
129 10     10   76 use constant IPTOS_ECN_NOT_ECT => 0x00;
  10         22  
  10         533  
130 10     10   62 use constant IPTOS_ECN_ECT1 => 0x01;
  10         18  
  10         481  
131 10     10   68 use constant IPTOS_ECN_ECT0 => 0x02;
  10         16  
  10         645  
132 10     10   68 use constant IPTOS_ECN_CE => 0x03;
  10         18  
  10         553  
133              
134 10     10   58 use constant IPTOS_DSCP_MASK => 0xfc;
  10         19  
  10         506  
135 10     10   62 use constant IPTOS_DSCP_AF11 => 0x28;
  10         61  
  10         824  
136 10     10   58 use constant IPTOS_DSCP_AF12 => 0x30;
  10         20  
  10         493  
137 10     10   58 use constant IPTOS_DSCP_AF13 => 0x38;
  10         17  
  10         562  
138 10     10   62 use constant IPTOS_DSCP_AF21 => 0x48;
  10         37  
  10         507  
139 10     10   60 use constant IPTOS_DSCP_AF22 => 0x50;
  10         18  
  10         500  
140 10     10   60 use constant IPTOS_DSCP_AF23 => 0x58;
  10         17  
  10         482  
141 10     10   58 use constant IPTOS_DSCP_AF31 => 0x68;
  10         19  
  10         480  
142 10     10   57 use constant IPTOS_DSCP_AF32 => 0x70;
  10         18  
  10         477  
143 10     10   58 use constant IPTOS_DSCP_AF33 => 0x78;
  10         60  
  10         470  
144 10     10   55 use constant IPTOS_DSCP_AF41 => 0x88;
  10         18  
  10         529  
145 10     10   62 use constant IPTOS_DSCP_AF42 => 0x90;
  10         18  
  10         496  
146 10     10   102 use constant IPTOS_DSCP_AF43 => 0x98;
  10         43  
  10         527  
147 10     10   61 use constant IPTOS_DSCP_EF => 0xb8;
  10         24  
  10         519  
148              
149 10     10   59 use constant IPTOS_CLASS_MASK => 0xe0;
  10         23  
  10         470  
150 10     10   69 use constant IPTOS_CLASS_CS0 => 0x00;
  10         87  
  10         515  
151 10     10   60 use constant IPTOS_CLASS_CS1 => 0x20;
  10         17  
  10         446  
152 10     10   61 use constant IPTOS_CLASS_CS2 => 0x40;
  10         16  
  10         481  
153 10     10   55 use constant IPTOS_CLASS_CS3 => 0x60;
  10         20  
  10         517  
154 10     10   58 use constant IPTOS_CLASS_CS4 => 0x80;
  10         27  
  10         558  
155 10     10   62 use constant IPTOS_CLASS_CS5 => 0xa0;
  10         18  
  10         560  
156 10     10   66 use constant IPTOS_CLASS_CS6 => 0xc0;
  10         17  
  10         473  
157 10     10   57 use constant IPTOS_CLASS_CS7 => 0xe0;
  10         16  
  10         492  
158 10     10   59 use constant IPTOS_CLASS_DEFAULT => 0x00;
  10         18  
  10         474  
159              
160 10     10   59 use constant IPTOS_PREC_MASK => 0xe0;
  10         16  
  10         435  
161 10     10   56 use constant IPTOS_PREC_NETCONTROL => 0xe0;
  10         18  
  10         542  
162 10     10   64 use constant IPTOS_PREC_INTERNETCONTROL => 0xc0;
  10         17  
  10         552  
163 10     10   60 use constant IPTOS_PREC_CRITIC_ECP => 0x0a;
  10         19  
  10         546  
164 10     10   57 use constant IPTOS_PREC_FLASHOVERRIDE => 0x80;
  10         20  
  10         524  
165 10     10   61 use constant IPTOS_PREC_FLASH => 0x60;
  10         20  
  10         614  
166 10     10   62 use constant IPTOS_PREC_IMMEDIATE => 0x40;
  10         16  
  10         538  
167 10     10   75 use constant IPTOS_PREC_PRIORITY => 0x20;
  10         20  
  10         533  
168 10     10   57 use constant IPTOS_PREC_ROUTINE => 0x00;
  10         27  
  10         541  
169              
170             # TTL values
171 10     10   62 use constant MAXTTL => 255;
  10         35  
  10         542  
172 10     10   62 use constant IPDEFTTL => 64;
  10         22  
  10         483  
173 10     10   86 use constant IPFRAGTTL => 60;
  10         20  
  10         591  
174 10     10   69 use constant IPTTLDEC => 1;
  10         31  
  10         519  
175              
176 10     10   63 use constant IP_MSS => 576;
  10         19  
  10         537  
177              
178             # Maximum IP Packet size
179 10     10   62 use constant IP_MAXPACKET => 65535;
  10         18  
  10         8608  
180              
181             # Convert 32-bit IP address to dotted quad notation
182              
183             sub to_dotquad {
184 16     16 0 36 my($net) = @_ ;
185 16         27 my($na, $nb, $nc, $nd);
186              
187 16         29 $na = $net >> 24 & 255;
188 16         25 $nb = $net >> 16 & 255;
189 16         24 $nc = $net >> 8 & 255;
190 16         26 $nd = $net & 255;
191              
192 16         66 return ("$na.$nb.$nc.$nd");
193             }
194              
195             #
196             # Decode the packet
197             #
198              
199             sub decode {
200 8     8 1 1144 my $class = shift;
201 8         24 my($pkt, $parent) = @_;
202 8         16 my $self = {};
203              
204             # Class fields
205              
206 8         24 $self->{_parent} = $parent;
207 8         19 $self->{_frame} = $pkt;
208              
209             # Decode IP packet
210              
211 8 50       29 if (defined($pkt)) {
212 8         13 my $tmp;
213              
214             ($tmp, $self->{tos},$self->{len}, $self->{id}, $self->{foffset},
215             $self->{ttl}, $self->{proto}, $self->{cksum}, $self->{src_ip},
216 8         72 $self->{dest_ip}, $self->{options}) = unpack('CCnnnCCnNNa*' , $pkt);
217              
218             # Extract bit fields
219            
220 8         31 $self->{ver} = ($tmp & 0xf0) >> 4;
221 8         18 $self->{hlen} = $tmp & 0x0f;
222            
223 8         461 $self->{flags} = $self->{foffset} >> 13;
224 8         25 $self->{foffset} = ($self->{foffset} & 0x1fff) << 3;
225              
226             # Decode variable length header options and remaining data in field
227              
228 8         20 my $olen = $self->{hlen} - 5;
229 8 50       25 $olen = 0 if $olen < 0; # Check for bad hlen
230              
231             # Option length is number of 32 bit words
232              
233 8         20 $olen = $olen * 4;
234              
235             ($self->{options}, $self->{data}) = unpack("a" . $olen .
236 8         53 "a*", $self->{options});
237              
238 8         21 my $length = $self->{hlen};
239 8 50       26 $length = 5 if $length < 5; # precaution against bad header
240              
241             # truncate data to the length given by the header
242 8         34 $self->{data} = substr $self->{data}, 0, $self->{len} - 4 * $length;
243              
244             # Convert 32 bit ip addresses to dotted quad notation
245              
246 8         38 $self->{src_ip} = to_dotquad($self->{src_ip});
247 8         22 $self->{dest_ip} = to_dotquad($self->{dest_ip});
248             }
249              
250 8         30 return bless $self, $class;
251             }
252              
253             #
254             # Strip header from packet and return the data contained in it
255             #
256              
257             sub ip_strip { # Create ip_strip alias
258 0     0 0 0 goto \&strip;
259             }
260              
261             sub strip {
262 0     0 1 0 my ($pkt) = @_;
263              
264 0         0 my $ip_obj = NetPacket::IP->decode($pkt);
265 0         0 return $ip_obj->{data};
266             }
267              
268             #
269             # Encode a packet
270             #
271              
272             sub encode {
273              
274 1     1 1 854 my $self = shift;
275 1         5 my ($hdr,$packet,$zero,$tmp,$offset);
276 1         0 my ($src_ip, $dest_ip);
277              
278             # create a zero variable
279 1         2 $zero = 0;
280              
281             # adjust the length of the packet
282 1         4 $self->{len} = ($self->{hlen} * 4) + length($self->{data});
283              
284 1         3 $tmp = $self->{hlen} & 0x0f;
285 1         5 $tmp = $tmp | (($self->{ver} << 4) & 0xf0);
286              
287 1         2 $offset = $self->{flags} << 13;
288 1         4 $offset = $offset | (($self->{foffset} >> 3) & 0x1fff);
289              
290             # convert the src and dst ip
291 1         92 $src_ip = gethostbyname($self->{src_ip});
292 1         44 $dest_ip = gethostbyname($self->{dest_ip});
293              
294 1         4 my $fmt = 'CCnnnCCna4a4a*';
295             my @pkt = ($tmp, $self->{tos},$self->{len},
296             $self->{id}, $offset, $self->{ttl}, $self->{proto},
297 1         7 $zero, $src_ip, $dest_ip);
298             # change format and package in case of IP options
299 1 50       5 if(defined $self->{options}){
300 1         3 $fmt = 'CCnnnCCna4a4a*a*';
301 1         5 push(@pkt, $self->{options});
302             }
303              
304             # construct header to calculate the checksum
305 1         10 $hdr = pack($fmt, @pkt);
306 1         15 $self->{cksum} = NetPacket::htons(NetPacket::in_cksum($hdr));
307 1         3 $pkt[7] = $self->{cksum};
308              
309             # make the entire packet
310 1 50       6 if(defined $self->{data}){
311 1         3 push(@pkt, $self->{data});
312             }
313 1         5 $packet = pack($fmt, @pkt);
314              
315 1         5 return($packet);
316             }
317              
318             #
319             # Module initialisation
320             #
321              
322             1;
323              
324             # autoloaded methods go after the END token (&& pod) below
325              
326             =pod
327              
328             =head1 NAME
329              
330             NetPacket::IP - Assemble and disassemble IP (Internet Protocol) packets.
331              
332             =head1 VERSION
333              
334             version 1.7.2
335              
336             =head1 SYNOPSIS
337              
338             use NetPacket::IP;
339              
340             $ip_obj = NetPacket::IP->decode($raw_pkt);
341             $ip_pkt = NetPacket::IP->encode($ip_obj);
342             $ip_data = NetPacket::IP::strip($raw_pkt);
343              
344             =head1 DESCRIPTION
345              
346             C provides a set of routines for assembling and
347             disassembling packets using IP (Internet Protocol).
348              
349             =head2 Methods
350              
351             =over
352              
353             =item Cdecode([RAW PACKET])>
354              
355             Decode the raw packet data given and return an object containing
356             instance data. This method will quite happily decode garbage input.
357             It is the responsibility of the programmer to ensure valid packet data
358             is passed to this method.
359              
360             =item Cencode()>
361              
362             Return an IP packet encoded with the instance data specified. This
363             will infer the total length of the packet automatically from the
364             payload length and also adjust the checksum.
365              
366             =back
367              
368             =head2 Functions
369              
370             =over
371              
372             =item C
373              
374             Return the encapsulated data (or payload) contained in the IP
375             packet. This data is suitable to be used as input for other
376             C modules.
377              
378             This function is equivalent to creating an object using the
379             C constructor and returning the C field of that
380             object.
381              
382             =back
383              
384             =head2 Instance data
385              
386             The instance data for the C object consists of
387             the following fields.
388              
389             =over
390              
391             =item ver
392              
393             The IP version number of this packet.
394              
395             =item hlen
396              
397             The IP header length of this packet.
398              
399             =item flags
400              
401             The IP header flags for this packet.
402              
403             =item foffset
404              
405             The IP fragment offset for this packet.
406              
407             =item tos
408              
409             The type-of-service for this IP packet.
410              
411             =item len
412              
413             The length (including length of header) in bytes for this packet.
414              
415             =item id
416              
417             The identification (sequence) number for this IP packet.
418              
419             =item ttl
420              
421             The time-to-live value for this packet.
422              
423             =item proto
424              
425             The IP protocol number for this packet.
426              
427             =item cksum
428              
429             The IP checksum value for this packet.
430              
431             =item src_ip
432              
433             The source IP address for this packet in dotted-quad notation.
434              
435             =item dest_ip
436              
437             The destination IP address for this packet in dotted-quad notation.
438              
439             =item options
440              
441             Any IP options for this packet.
442              
443             =item data
444              
445             The encapsulated data (payload) for this IP packet.
446              
447             =back
448              
449             =head2 Exports
450              
451             =over
452              
453             =item default
454              
455             none
456              
457             =item exportable
458              
459             IP_PROTO_IP IP_PROTO_ICMP IP_PROTO_IGMP IP_PROTO_IPIP IP_PROTO_TCP
460             IP_PROTO_UDP IP_VERSION_IPv4
461              
462             =item tags
463              
464             The following tags group together related exportable items.
465              
466             =over
467              
468             =item C<:protos>
469              
470             IP_PROTO_IP IP_PROTO_ICMP IP_PROTO_IGMP IP_PROTO_IPIP
471             IP_PROTO_TCP IP_PROTO_UDP
472              
473             =item C<:versions>
474              
475             IP_VERSION_IPv4
476              
477             =item C<:strip>
478              
479             Import the strip function C.
480              
481             =item C<:ALL>
482              
483             All the above exportable items.
484              
485             =back
486              
487             =back
488              
489             =head1 EXAMPLE
490              
491             The following script dumps IP frames by IP address and protocol
492             to standard output.
493              
494             #!/usr/bin/perl -w
495              
496             use strict;
497             use Net::PcapUtils;
498             use NetPacket::Ethernet qw(:strip);
499             use NetPacket::IP;
500              
501             sub process_pkt {
502             my ($user, $hdr, $pkt) = @_;
503              
504             my $ip_obj = NetPacket::IP->decode(eth_strip($pkt));
505             print("$ip_obj->{src_ip}:$ip_obj->{dest_ip} $ip_obj->{proto}\n");
506             }
507              
508             Net::PcapUtils::loop(\&process_pkt, FILTER => 'ip');
509              
510             =head1 TODO
511              
512             =over
513              
514             =item IP option decoding - currently stored in binary form.
515              
516             =item Assembly of received fragments
517              
518             =back
519              
520             =head1 COPYRIGHT
521              
522             Copyright (c) 2001 Tim Potter and Stephanie Wehner.
523              
524             Copyright (c) 1995,1996,1997,1998,1999 ANU and CSIRO on behalf of
525             the participants in the CRC for Advanced Computational Systems
526             ('ACSys').
527              
528             This module is free software. You can redistribute it and/or
529             modify it under the terms of the Artistic License 2.0.
530              
531             This program is distributed in the hope that it will be useful,
532             but without any warranty; without even the implied warranty of
533             merchantability or fitness for a particular purpose.
534              
535             =head1 AUTHOR
536              
537             Tim Potter Etpot@samba.orgE
538              
539             Stephanie Wehner Eatrak@itsx.comE
540              
541             =cut
542              
543             __END__