Ipv6

Package: inet.networklayer.ipv6

Ipv6

simple module

Implements the Ipv6 protocol.

An overview of the Ipv6 implementation in the INET Framework is provided here.

The Ipv6 protocol header is represented by the IPv6Datagram message class.

Interfacing with higher layer protocols

To send a packet over Ipv6 from a higher layer protocol, the module should fill in an L3AddressReq object, attach it to the packet with Packet's addTag() method, then send the packet to the Ipv6 module.

When Ipv6 sends up a packet to a higher layer protocol, it will also attach an L3AddressInd to the packet, with the source and destination Ipv6 addresses of the Ipv6 datagram in which the packet arrived.

Ipv6 can serve several higher-layer protocols. The higher layer protocols should call registerProtocol with their gate towards the Ipv6 module, for fill up the protocol-to-gateindex map. When delivering packets to them, the output gate is determined from the Protocol field in the Ipv6 header.

Routing and interfacing with lower layers

The routing table is stored in the module Ipv6RoutingTable. When a datagram needs to be routed, Ipv6 queries Ipv6RoutingTable for the output interface (or "port") and next hop address of the packet. This is done by directly calling C++ methods of Ipv6RoutingTable. No message exchange with Ipv6RoutingTable takes place.

Routing protocol implementations can also query and manipulate the route table by calling Ipv6RoutingTable's methods in C++.

Performance model, QoS

In the current form, Ipv6 contains a FIFO which queues up Ipv6 datagrams; datagrams are processed in order. The processing time is determined by the procDelay module parameter.

See also: Ipv6RoutingTable, Ipv6NeighbourDiscovery, Icmpv6

Author: Andras Varga

Ipv6

Used in compound modules

Name Type Description
Ipv6NetworkLayer compound module

Represents an Ipv6 network layer (L3).

Parameters

Name Type Default value Description
interfaceTableModule string

The path to the InterfaceTable module

routingTableModule string
ipv6NeighbourDiscoveryModule string
icmpv6Module string
ipv6TunnelingModule string
procDelay double 0s

Properties

Name Value Description
display i=block/network2

Gates

Name Direction Size Description
transportIn input
transportOut output
queueIn input
queueOut output
ndIn input
ndOut output
upperTunnelingIn input

tunneling gates - CB

upperTunnelingOut output
lowerTunnelingIn input
lowerTunnelingOut output
xMIPv6In input

the following gates are added by Zarrar Yousaf on 19.06.07

xMIPv6Out output

Signals

Name Type Unit
packetDropped cPacket
packetSentToUpper inet::Packet

Source code

//
// Implements the Ipv6 protocol.
//
// An overview of the Ipv6 implementation in the INET Framework is
// provided <a href="ipv6overview.html">here</a>.
//
// The Ipv6 protocol header is represented by the ~IPv6Datagram message class.
//
// <b>Interfacing with higher layer protocols</b>
//
// To send a packet over Ipv6 from a higher layer protocol, the module should
// fill in an ~L3AddressReq object, attach it to the packet with Packet's
// addTag() method, then send the packet to the ~Ipv6 module.
//
// When ~Ipv6 sends up a packet to a higher layer protocol, it will also attach
// an ~L3AddressInd to the packet, with the source and destination Ipv6 addresses
// of the Ipv6 datagram in which the packet arrived.
//
// ~Ipv6 can serve several higher-layer protocols. The higher layer protocols
// should call registerProtocol with their gate towards the Ipv6 module,
// for fill up the protocol-to-gateindex map. When delivering packets to them,
// the output gate is determined from the Protocol field in the Ipv6 header.
//
// <b>Routing and interfacing with lower layers</b>
//
// The routing table is stored in the module ~Ipv6RoutingTable. When a datagram
// needs to be routed, Ipv6 queries ~Ipv6RoutingTable for the output interface
// (or "port") and next hop address of the packet. This is done by directly
// calling C++ methods of ~Ipv6RoutingTable. No message exchange with ~Ipv6RoutingTable
// takes place.
//
//#FIXME TBD describe operation
//
// Routing protocol implementations can also query and manipulate the route table
// by calling ~Ipv6RoutingTable's methods in C++.
//
// <b>Performance model, QoS</b>
//
// In the current form, ~Ipv6 contains a FIFO which queues up Ipv6 datagrams;
// datagrams are processed in order. The processing time is determined by the
// procDelay module parameter.
//
// @see ~Ipv6RoutingTable, ~Ipv6NeighbourDiscovery, ~Icmpv6
//
// @author Andras Varga
//
simple Ipv6
{
    parameters:
        string interfaceTableModule;   // The path to the InterfaceTable module
        string routingTableModule;
        string ipv6NeighbourDiscoveryModule;
        string icmpv6Module;
        string ipv6TunnelingModule;
        double procDelay @unit(s) = default(0s);
        @display("i=block/network2");
        @signal[packetDropped](type=cPacket);
        @signal[packetSentToUpper](type=inet::Packet);
    gates:
        input transportIn @labels(Ipv6ControlInfo/down,TcpHeader,UdpHeader);
        output transportOut @labels(Ipv6ControlInfo/up,TcpHeader,UdpHeader);
        input queueIn @labels(IPv6Datagram);
        output queueOut @labels(IPv6Datagram);
        input ndIn;
        output ndOut;
        // tunneling gates - CB
        input upperTunnelingIn;
        output upperTunnelingOut;
        input lowerTunnelingIn;
        output lowerTunnelingOut;
        //the following gates are added by Zarrar Yousaf on 19.06.07
        input xMIPv6In;
        output xMIPv6Out;
}

File: src/inet/networklayer/ipv6/Ipv6.ned