1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Net::Frame 1.09;
7use Net::Frame::Simple 1.05;
8use Net::Frame::Layer qw(:subs);
9use Net::Frame::Layer::ETH qw(:consts);
10use Net::Frame::Layer::IPv6 qw(:consts);
11use Net::Frame::Layer::IPv6::Routing;
12use Net::Frame::Layer::ICMPv6 qw(:consts);
13use Net::Frame::Layer::ICMPv6::Echo;
14
15# Get input
16print "What destination [ENTER for default]? ";
17my $dest = <STDIN>;
18chomp $dest;
19print "What hop1 [ENTER for default]?        ";
20my $hop1 = <STDIN>;
21chomp $hop1;
22print "What hop2 [ENTER for default]?        ";
23my $hop2 = <STDIN>;
24chomp $hop2;
25print "\n";
26
27# Validate
28$dest = $dest || 'ipv6.google.com';
29if (!($dest = getHostIpv6Addr($dest))) { return }
30$hop1 = $hop1 || '2001::1';
31if (!($hop1 = getHostIpv6Addr($hop1))) { return }
32$hop2 = $hop2 || '2001::2';
33if (!($hop2 = getHostIpv6Addr($hop2))) { return }
34
35# Create layers
36my $ether = Net::Frame::Layer::ETH->new(
37    type=>NF_ETH_TYPE_IPv6
38);
39my $ipv6  = Net::Frame::Layer::IPv6->new(
40    dst        => $hop1,
41    nextHeader => NF_IPv6_PROTOCOL_IPv6ROUTING
42);
43my $route = Net::Frame::Layer::IPv6::Routing->new(
44    nextHeader => NF_IPv6_PROTOCOL_ICMPv6,
45    addresses  => [
46        $hop2, $dest
47    ],
48);
49my $icmp  = Net::Frame::Layer::ICMPv6->new;
50my $echo  = Net::Frame::Layer::ICMPv6::Echo->new(
51    payload=>'echo'
52);
53
54# Create packet
55my $packet = Net::Frame::Simple->new(layers=>
56    [ $ether, $ipv6, $route, $icmp, $echo ]
57);
58
59print $packet->print . "\n";
60