Ipv6NdMessage.msg

Msg File src/inet/networklayer/icmpv6/Ipv6NdMessage.msg

Name Type Description
Ipv6NdOptionTypes enum

TLB options (type, length, bytes), length must be divisible by eight, max value is 8*255 Type codes: // RFC 2461

Ipv6NdOption class (no description)
Ipv6NdSourceTargetLinkLayerAddress class (no description)
Ipv6NdSourceLinkLayerAddress class (no description)
Ipv6NdTargetLinkLayerAddress class (no description)
Ipv6NdPrefixInformation class

IPv6ND Prefix Information RFC 2461 / RFC 4861 Section 4.6.2 RFC 3775 Section 7.2 (routerAddressFlag)

Ipv6NdMtu class (no description)
Mipv6NdAdvertisementInterval class

MIPv6 New Advertisement Interval Option RFC 3775 Section 7.3

Mipv6HaInformation class

MIPv6 Home Agent Information Option RFC 3775 Section 7.4

Ipv6NdOptions class (no description)
Ipv6NdMessage class

Neighbour Discovery for Ipv6. RFC 2461

Ipv6RouterSolicitation class

Router Solicitation Message Format RFC 4861 Section 4.1

Ipv6RouterAdvertisement class

Router Advertisement Message Format RFC 2461 Section 4.2 RFC 3775 Section 7.1, RFC 5175 Section 3. (homeAgentFlag)

Ipv6NeighbourSolicitation class

Neighbour Solicitation Message Format RFC 4861 Section 4.3

Ipv6NeighbourAdvertisement class

Neighbour Advertisement Message Format RFC 2461 Section 4.4

Ipv6Redirect class

Redirect Message Format RFC 2461 Section 4.5

Ipv6NdControlInfo class (no description)

Source code

//
// Copyright (C) 2005 Wei Yang, Ng
// Copyright (C) 2005 OpenSim Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//

import inet.common.INETDefs;
import inet.linklayer.common.MacAddress;
import inet.networklayer.icmpv6.Icmpv6Header;
import inet.networklayer.contract.ipv6.Ipv6Address;

namespace inet;

// TLB options (type, length, bytes), length must be divisible by eight, max value is 8*255
// Length in bytes:
cplusplus {{
const B IPv6ND_LINK_LAYER_ADDRESS_OPTION_LENGTH = B(8);    // RFC 2461, Section 4.6.1. Source/Target Link-layer Address
const B IPv6ND_PREFIX_INFORMATION_OPTION_LENGTH = B(32);   // RFC 2461, Section 4.6.2. Prefix Information
const B IPv6ND_REDIRECTED_HEADER_OPTION_LENGTH = B(8);     // 8 + redirected packet, RFC 2461, Section 4.6.3. Redirected Header.
                                                           // The original packet truncated to ensure that the size of the redirect message does not exceed 1280 octets.
const B IPv6ND_MTU_OPTION_LENGTH = B(8);                   // RFC 2461, Section 4.6.4. MTU
}}

// TLB options (type, length, bytes), length must be divisible by eight, max value is 8*255
// Type codes:          // RFC 2461
enum Ipv6NdOptionTypes {
    IPv6ND_SOURCE_LINK_LAYER_ADDR_OPTION = 1;
    IPv6ND_TARGET_LINK_LAYER_ADDR_OPTION = 2;
    IPv6ND_PREFIX_INFORMATION = 3;
    IPv6ND_REDIRECTED_HEADER = 4;
    IPv6ND_MTU = 5;
    IPv6ND_ADVERTISEMENT_INTERVAL = 7;    // RFC 3775 Section 7.3
    IPv6ND_HOME_AGENT_INFORMATION_OPTION = 8;    // RFC 3775 Section 7.4
}

class Ipv6NdOption extends cObject
{
    @packetData;
    Ipv6NdOptionTypes type = static_cast<Ipv6NdOptionTypes>(0);    // 1 byte, 0 is invalid
    short optionLength = 0;    // The length of the option in units of 8 octets, 0 is invalid.    // 1 byte
    char paddingBytes[];    // padding bytes on end of option
}

class Ipv6NdSourceTargetLinkLayerAddress extends Ipv6NdOption
{
    optionLength = 1;    // 8 byte ( when using MacAddress)
    MacAddress linkLayerAddress;
}

class Ipv6NdSourceLinkLayerAddress extends Ipv6NdSourceTargetLinkLayerAddress
{
    type = IPv6ND_SOURCE_LINK_LAYER_ADDR_OPTION;
}

class Ipv6NdTargetLinkLayerAddress extends Ipv6NdSourceTargetLinkLayerAddress
{
    type = IPv6ND_TARGET_LINK_LAYER_ADDR_OPTION;
}

//
// IPv6ND Prefix Information
// RFC 2461 / RFC 4861 Section 4.6.2
// RFC 3775 Section 7.2 (routerAddressFlag)
//
class Ipv6NdPrefixInformation extends Ipv6NdOption
{
    type = IPv6ND_PREFIX_INFORMATION;
    optionLength = 4;
    unsigned short prefixLength;    // 0..128
    bool onlinkFlag;        //L-bit
    bool autoAddressConfFlag;    //A-bit
    bool routerAddressFlag;        //R-bit: used in case of MIPv6 when the H-bit is set
    unsigned int reserved1 = 0;
    uint32_t validLifetime;    // seconds
    uint32_t preferredLifetime;    // seconds
    uint32_t reserved2 = 0;
    Ipv6Address prefix;
}

class Ipv6NdMtu extends Ipv6NdOption
{
    type = IPv6ND_MTU;
    optionLength = 1;
    uint16_t reserved;
    uint32_t mtu;
}

// MIPv6 New Advertisement Interval Option
// RFC 3775 Section 7.3
//
class Mipv6NdAdvertisementInterval extends Ipv6NdOption
{
    type = IPv6ND_ADVERTISEMENT_INTERVAL;
    optionLength = 1;
    uint16_t reserved;
    uint32_t advertisementInterval;    // milliseconds
}

//MIPv6 Home Agent Information Option
//RFC 3775 Section 7.4
class Mipv6HaInformation extends Ipv6NdOption
{
    type = IPv6ND_HOME_AGENT_INFORMATION_OPTION;
    optionLength = 1;
    uint16_t reserved;
    uint16_t homeAgentPreference;
    uint16_t homeAgentLifetime;    // seconds
}

class Ipv6NdOptions extends cObject {
    @packetData;
    // TLV Options:
    Ipv6NdOption *option[] @owned;  // on end of message
}

cplusplus(Ipv6NdOptions) {{
    virtual const Ipv6NdOption *findOption(Ipv6NdOptionTypes t) const;
    virtual Ipv6NdOption *findOptionForUpdate(Ipv6NdOptionTypes t);
    virtual void insertUniqueOption(size_t k, Ipv6NdOption * option);
    virtual void insertUniqueOption(Ipv6NdOption * option) { insertUniqueOption(option_arraysize, option); }
}}

//
// Neighbour Discovery for Ipv6.
// RFC 2461
//
// ICMP fields inherited from ~Icmpv6Header:
//    - Type
//
// ICMP fields not implemented:
//    - Checksum
//    - Reserved
//
class Ipv6NdMessage extends Icmpv6Header
{
    int code = 0;
}

//
// Router Solicitation Message Format
// RFC 4861 Section 4.1
//
class Ipv6RouterSolicitation extends Ipv6NdMessage
{
    chunkLength = B(8);    // without options
    type = ICMPv6_ROUTER_SOL;
    //Additional ICMP fields
    uint32_t reserved = 0;
    Ipv6NdOptions options;
}

//
// Router Advertisement Message Format
// RFC 2461 Section 4.2
// RFC 3775 Section 7.1, RFC 5175 Section 3. (homeAgentFlag)
//
class Ipv6RouterAdvertisement extends Ipv6NdMessage
{
    chunkLength = B(16);    // without options
    type = ICMPv6_ROUTER_AD;
    //Additional ICMP fields
    unsigned short curHopLimit;

    bool managedAddrConfFlag;    //M-bit
    bool otherStatefulConfFlag;    //O-bit
    bool homeAgentFlag = false;        //H-bit
    uint8_t reserved = 0;

    unsigned short routerLifetime;  // [s] 0 indicates router is not a default router
    unsigned int reachableTime;     // [ms]
    unsigned int retransTimer;      // [ms]
    Ipv6NdOptions options;
}

//
// Neighbour Solicitation Message Format
// RFC 4861 Section 4.3
//
class Ipv6NeighbourSolicitation extends Ipv6NdMessage
{
    chunkLength = B(24);    // without options
    type = ICMPv6_NEIGHBOUR_SOL;
    //Additional ICMP fields
    uint32_t reserved = 0;
    Ipv6Address targetAddress;// MUST NOT be a multicast address.
    Ipv6NdOptions options;
}

//
// Neighbour Advertisement Message Format
// RFC 2461 Section 4.4
//
class Ipv6NeighbourAdvertisement extends Ipv6NdMessage
{
    chunkLength = B(24);    // without options
    type = ICMPv6_NEIGHBOUR_AD;
    //Additional ICMP fields
    bool routerFlag;    //R-flag
    bool solicitedFlag;    //S-flag
    bool overrideFlag;    //O-flag
    uint32_t reserved = 0;
    Ipv6Address targetAddress;// MUST NOT be a multicast address.
    Ipv6NdOptions options;
}

//
// Redirect Message Format
// RFC 2461 Section 4.5
//
class Ipv6Redirect extends Ipv6NdMessage
{
    chunkLength = B(40);    // without options
    type = ICMPv6_REDIRECT;
    //Additional ICMP fields
    Ipv6Address targetAddress;
    Ipv6Address destinationAddress;
    Ipv6NdOptions options;
}

class Ipv6NdControlInfo extends cObject
{
    Ipv6Address nextHop;   // next hop address
    int interfaceId = -1; // interface on which the datagram should be sent
    bool fromHL = false;    // packet came from higher layer
}