| Net-Write documentation | Contained in the Net-Write distribution. |
Net::Write::Layer3 - object for a network layer (layer 3) descriptor
use Net::Write::Layer qw(:constants);
use Net::Write::Layer3;
my $desc = Net::Write::Layer3->new(
dst => '192.168.0.1',
protocol => NW_IPPROTO_RAW,
family => NW_AF_INET,
);
$desc->open;
$desc->send('G'x666);
$desc->close;
This is the class for creating a layer 3 descriptor.
The target IPv4 or IPv6 address we will send frames to.
Address family, see Net::Write::Layer CONSTANTS section.
Transport layer protocol to use, see Net::Write::Layer CONSTANTS section.
Object constructor. You MUST pass a valid dst attribute. Default values:
protocol: NW_IPPROTO_RAW
family: NW_AF_INET
Open the interface.
Send raw data to the network.
Close the descriptor.
Sending IPv6 frames does not work under BSD systems. They can't do IP_HDRINCL for IPv6. For now, only Linux supports this (at least, with a 2.6.x kernel).
Does not work at all under Win32 systems. They can't send frames at layer 3 (or I don't know how to do that).
Patrice <GomoR> Auffret
Copyright (c) 2006-2009, Patrice <GomoR> Auffret
You may distribute this module under the terms of the Artistic license. See LICENSE.Artistic file in the source distribution archive.
| Net-Write documentation | Contained in the Net-Write distribution. |
# # $Id: Layer3.pm 1636 2009-06-10 18:38:24Z gomor $ # package Net::Write::Layer3; use strict; use warnings; use Carp; use Net::Write::Layer qw(:constants); our @ISA = qw(Net::Write::Layer); __PACKAGE__->cgBuildIndices; BEGIN { my $osname = { cygwin => \&_newWin32, MSWin32 => \&_newWin32, }; *new = $osname->{$^O} || \&_newOther; } no strict 'vars'; sub _newWin32 { croak("Not possible to use layer 3 under Windows. Use layer 2 instead.\n"); } sub _newOther { my $self = shift->SUPER::new( protocol => NW_IPPROTO_RAW, family => NW_AF_INET, @_, ); croak("@{[(caller(0))[3]]}: you must pass `dst' parameter\n") unless $self->[$__dst]; $self; } sub open { shift->SUPER::open(1) } sub _setIpHdrincl { my $self = shift; my ($sock, $family) = @_; if ($family == NW_AF_INET) { return setsockopt($sock, NW_IPPROTO_IP, NW_IP_HDRINCL, 1); } if ($family == NW_AF_INET6) { return setsockopt($sock, NW_IPPROTO_IPv6, NW_IP_HDRINCL, 1); } return; } 1; __END__