Package: inet.networklayer.ipv6
Ipv6
simple moduleImplements the IPv6 protocol.
The IPv6 protocol header is represented by the Ipv6Header 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 Ipv6Header 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 frames; these are processed in order. The processing time is determined by the procDelay module parameter.
See also: Ipv6RoutingTable, Ipv6NeighbourDiscovery, Icmpv6
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 |
---|---|---|
packetReceivedFromUpper | inet::Packet | |
packetReceivedFromLower | inet::Packet | |
packetDropped | inet::Packet | |
packetSentToLower | inet::Packet | |
packetSentToUpper | inet::Packet |
Direct method calls (observed)
call to | function | info |
---|---|---|
MessageDispatcher | inet::MessageDispatcher::arrived | arrived |
MessageDispatcher | inet::MessageDispatcher::handleRegisterProtocol | handleRegisterProtocol |
MessageDispatcher | inet::MessageDispatcher::handleRegisterService | handleRegisterService |
Ipv6NeighbourDiscovery | inet::Ipv6NeighbourDiscovery::resolveNeighbour | resolveNeighbor(%s,if=%d) |
Ipv6RoutingTable | inet::Ipv6RoutingTable::doLongestPrefixMatch | doLongestPrefixMatch(%s) |
Ipv6RoutingTable | inet::Ipv6RoutingTable::getInterfaceByAddress | getInterfaceByAddress(%s)=? |
Ipv6RoutingTable | inet::Ipv6RoutingTable::isLocalAddress | isLocalAddress(%s) |
Ipv6RoutingTable | inet::Ipv6RoutingTable::lookupDestCache | lookupDestCache(%s) |
Dymo | inet::dymo::Dymo::datagramLocalOutHook | datagramLocalOutHook |
Dymo | inet::dymo::Dymo::datagramPreRoutingHook | datagramPreRoutingHook |
Gpsr | inet::Gpsr::datagramLocalOutHook | datagramLocalOutHook |
Gpsr | inet::Gpsr::datagramPreRoutingHook | datagramPreRoutingHook |
TcpCrcInsertionHook | inet::tcp::TcpCrcInsertionHook::datagramPostRoutingHook | datagramPostRoutingHook |
UdpCrcInsertionHook | inet::UdpCrcInsertionHook::datagramPostRoutingHook | datagramPostRoutingHook |
Called methods (observed)
function | info | call from |
---|---|---|
inet::Ipv6::handleRegisterProtocol | handleRegisterProtocol | MessageDispatcher |
inet::Ipv6::handleRegisterService | handleRegisterService | MessageDispatcher |
inet::Ipv6::registerHook | registerHook() | Dymo, Gpsr, Tcp, Udp |
Incoming messages (observed)
Outgoing messages (observed)
Packet operations (observed)
chunkType | packetAction |
---|---|
trim, trimFront | |
Icmpv6Header | peekAtFront |
Ipv6Header | insertAtFront, peekAtFront, popAtFront, removeAtFront |
Shared Tagging operations (observed)
tagType | tagAction |
---|---|
DispatchProtocolInd | addTagIfAbsent |
DispatchProtocolReq | addTagIfAbsent, removeTagIfPresent |
DscpInd | addTagIfAbsent |
DscpReq | removeTagIfPresent |
EcnInd | addTagIfAbsent |
EcnReq | removeTagIfPresent |
HopLimitInd | addTagIfAbsent |
HopLimitReq | removeTagIfPresent |
InterfaceInd | findTag, getTag |
InterfaceReq | addTagIfAbsent, findTag |
Ipv6ExtHeaderReq | removeTagIfPresent |
L3AddressInd | addTagIfAbsent |
L3AddressReq | getTag, removeTag |
MacAddressReq | addTagIfAbsent |
NetworkProtocolInd | addTagIfAbsent, removeTagIfPresent |
PacketProtocolTag | addTagIfAbsent, getTag, removeTagIfPresent |
SocketInd | addTagIfAbsent |
SocketReq | getTag |
TosInd | addTagIfAbsent |
TosReq | removeTagIfPresent |
Tagging operations (observed)
tagType | tagAction |
---|---|
inet::Ipv6InterfaceData | getTag |
Source code
// // Implements the IPv6 protocol. // // The IPv6 protocol header is represented by the ~Ipv6Header 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 ~Ipv6Header 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 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 frames; // these are processed in order. The processing time is determined by the // procDelay module parameter. // // @see ~Ipv6RoutingTable, ~Ipv6NeighbourDiscovery, ~Icmpv6 // 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=inet::Packet); @signal[packetSentToUpper](type=inet::Packet); @signal[packetReceivedFromUpper](type=inet::Packet); @signal[packetSentToLower](type=inet::Packet); @signal[packetReceivedFromLower](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