use strict; use warnings; package Net::PcapWriter::UDP; use fields qw(flow l2prefix pktmpl writer); use Net::PcapWriter::IP; use Socket qw(AF_INET IPPROTO_UDP); sub new { my ($class,$writer,$src,$sport,$dst,$dport) = @_; my $self = fields::new($class); $self->{flow} = [ # src, dst, sport, dport [ $src,$dst,$sport,$dport ], [ $dst,$src,$dport,$sport ], ]; $self->{writer} = $writer; $self->{l2prefix} = $self->{writer}->layer2prefix($src); $self->{pktmpl} = [ ip_packet( undef, $src, $dst, IPPROTO_UDP, 6), ip_packet( undef, $dst, $src, IPPROTO_UDP, 6), ]; return $self; } sub write { my ($self,$dir,$data,$timestamp) = @_; my $flow = $self->{flow}[$dir]; my $udp = pack("nnnna*", $flow->[2],$flow->[3], # sport,dport length($data)+8, 0, # checksum $data # payload ); $self->{writer}->packet( $self->{l2prefix} . $self->{pktmpl}[$dir]($udp), $timestamp ); } 1;