Ospfv2Packet.msg

Msg File src/inet/routing/ospfv2/Ospfv2Packet.msg

Name Type Description
Ospfv2TimerType enum (no description)
Ospfv2Options struct

should be a byte long bitfield

Ospfv2Packet class

Represents an OSPF packet header

Ospfv2HelloPacket class

Represents an OSPF Hello packet

Ospfv2LsaType enum (no description)
Ospfv2LsaHeader class

Represents an OSPF LSA header

Ospfv2Lsa class

common ancestor type for all LSAs

LinkType enum (no description)
Ospfv2TosData struct

(RFC 1583 Section A.4.2.)

Ospfv2Link class

Router LSA Link section (RFC 1583 Section A.4.2.)

Ospfv2RouterLsa class

Represents an OSPF Router LSA (RFC 1583 Section A.4.2.)

Ospfv2NetworkLsa class

Represents an OSPF Network LSA

Ospfv2SummaryLsa class

Represents an OSPF Summary LSA

Ospfv2ExternalTosInfo struct (no description)
Ospfv2AsExternalLsaContents class

Represents the contents of an OSPF AS External LSA

Ospfv2AsExternalLsa class

Represents an OSPF AS External LSA

Ospfv2DdOptions struct

should be a byte long bitfield

Ospfv2DatabaseDescriptionPacket class

Represents an OSPF Database Description packet

Ospfv2LsaRequest struct (no description)
Ospfv2LinkStateRequestPacket class

Represents an OSPF Link State Request packet

Ospfv2LinkStateUpdatePacket class

Represents an OSPF Link State Update packet

Ospfv2LinkStateAcknowledgementPacket class

Represents an OSPF Link State Acknowledgement packet

Source code

//
// Copyright (C) 2006 Andras Babos and Andras Varga
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//

import inet.common.INETDefs;
import inet.common.packet.chunk.Chunk;
import inet.networklayer.contract.ipv4.Ipv4Address;
import inet.routing.ospf_common.OspfPacketBase;
import inet.transportlayer.common.CrcMode;

namespace inet::ospfv2;

cplusplus {{
using namespace ospf;
}}

enum Ospfv2TimerType {
    INTERFACE_HELLO_TIMER = 0;
    INTERFACE_WAIT_TIMER = 1;
    INTERFACE_ACKNOWLEDGEMENT_TIMER = 3;
    NEIGHBOR_INACTIVITY_TIMER = 4;
    NEIGHBOR_POLL_TIMER = 5;
    NEIGHBOR_DD_RETRANSMISSION_TIMER = 6;
    NEIGHBOR_UPDATE_RETRANSMISSION_TIMER = 7;
    NEIGHBOR_REQUEST_RETRANSMISSION_TIMER = 8;
    DATABASE_AGE_TIMER = 9;
};

// should be a byte long bitfield
struct Ospfv2Options
{
    @packetData;
    bool unused_1;
    bool E_ExternalRoutingCapability;
    bool MC_MulticastForwarding;
    bool NP_Type7LSA;
    bool EA_ForwardExternalLSAs;
    bool DC_DemandCircuits;
    bool unused_2;
    bool unused_3;
}

//
// Represents an OSPF packet header
//
class Ospfv2Packet extends ospf::OspfPacketBase
{
    chunkLength = B(24);
    version = 2;

    short authenticationType = 0;   // 2 bytes
    char authentication[8];         // 8 bytes
}

//
// Represents an OSPF Hello packet
//
class Ospfv2HelloPacket extends Ospfv2Packet
{
    type = HELLO_PACKET;
    Ipv4Address networkMask;

    short helloInterval = 5;

    Ospfv2Options options;

    char routerPriority = 0;
    long routerDeadInterval = 0;

    Ipv4Address designatedRouter;
    Ipv4Address backupDesignatedRouter;
    Ipv4Address neighbor[];
}

enum Ospfv2LsaType
{
    ROUTERLSA_TYPE = 1;
    NETWORKLSA_TYPE = 2;
    SUMMARYLSA_NETWORKS_TYPE = 3;
    SUMMARYLSA_ASBOUNDARYROUTERS_TYPE = 4;
    AS_EXTERNAL_LSA_TYPE = 5;
}

//
// Represents an OSPF LSA header
//
class Ospfv2LsaHeader extends cObject
{
    @packetData;
    unsigned short lsAge = 0;
    Ospfv2Options lsOptions;
    Ospfv2LsaType lsType = static_cast<Ospfv2LsaType>(-1);
    Ipv4Address linkStateID;
    Ipv4Address advertisingRouter;
    int32_t lsSequenceNumber = 0;
    uint16_t lsCrc = 0;
    CrcMode lsCrcMode = CRC_MODE_UNDEFINED;
    uint16_t lsaLength = 0;
}

//
// common ancestor type for all LSAs
//
class Ospfv2Lsa extends cObject
{
    @packetData;
    Ospfv2LsaHeader header;
}

enum LinkType
{
    POINTTOPOINT_LINK = 1;
    TRANSIT_LINK = 2;
    STUB_LINK = 3;
    VIRTUAL_LINK = 4;
}

// (RFC 1583 Section A.4.2.)
struct Ospfv2TosData
{
    @packetData;
    unsigned char tos;
    unsigned long tosMetric;
}

// Router LSA Link section (RFC 1583 Section A.4.2.)
class Ospfv2Link extends cObject
{
    @packetData;
    Ipv4Address linkID;
    unsigned long linkData = 0;
    LinkType type = POINTTOPOINT_LINK;
    unsigned char numberOfTOS = 0;
    unsigned long linkCost = 1;     // TOS 0 metric
    Ospfv2TosData tosData[];
}

//
// Represents an OSPF Router LSA (RFC 1583 Section A.4.2.)
//
class Ospfv2RouterLsa extends Ospfv2Lsa
{
    // header.lsType = ROUTERLSA_TYPE;
    unsigned short reserved1 = 0;   // 5 bit
    bool V_VirtualLinkEndpoint = false;
    bool E_ASBoundaryRouter = false;
    bool B_AreaBorderRouter = false;
    unsigned short reserved2 = 0;   // 8 bit
    unsigned short numberOfLinks = 0;
    Ospfv2Link links[];
}

//
// Represents an OSPF Network LSA
//
class Ospfv2NetworkLsa extends Ospfv2Lsa
{
    // header.lsType = NETWORKLSA_TYPE;
    Ipv4Address networkMask;
    Ipv4Address attachedRouters[];
}

//
// Represents an OSPF Summary LSA
//
class Ospfv2SummaryLsa extends Ospfv2Lsa
{
    // header.lsType = SUMMARYLSA_NETWORKS_TYPE;
    Ipv4Address networkMask;
    unsigned long routeCost = 1;
    Ospfv2TosData tosData[];  // 1 element required, count of tosData not stored, calculate it from length of LSA
}

struct Ospfv2ExternalTosInfo
{
    @packetData;
    // TODO tosData (?)
    unsigned short tos;
    bool E_ExternalMetricType = false;
    unsigned long routeCost = 1;
    Ipv4Address forwardingAddress;
    long externalRouteTag;
}

//
// Represents the contents of an OSPF AS External LSA
//
class Ospfv2AsExternalLsaContents extends cObject
{
    @packetData;
    Ipv4Address networkMask;
    Ospfv2ExternalTosInfo externalTOSInfo[];
}

//
// Represents an OSPF AS External LSA
//
class Ospfv2AsExternalLsa extends Ospfv2Lsa
{
    // header.lsType = AS_EXTERNAL_LSA_TYPE;
    Ospfv2AsExternalLsaContents contents;
}

// should be a byte long bitfield
struct Ospfv2DdOptions
{
    @packetData;
    unsigned short unused = 0;  // 5 bit
    bool I_Init;
    bool M_More;
    bool MS_MasterSlave;
}

//
// Represents an OSPF Database Description packet
//
class Ospfv2DatabaseDescriptionPacket extends Ospfv2Packet
{
    unsigned short interfaceMTU;
    Ospfv2Options options;
    Ospfv2DdOptions ddOptions;
    unsigned long ddSequenceNumber;
    Ospfv2LsaHeader lsaHeaders[];     //TODO
}

struct Ospfv2LsaRequest
{
    @packetData;
    unsigned long lsType;
    Ipv4Address linkStateID;
    Ipv4Address advertisingRouter;
}

//
// Represents an OSPF Link State Request packet
//
class Ospfv2LinkStateRequestPacket extends Ospfv2Packet
{
    Ospfv2LsaRequest requests[];
}

//
// Represents an OSPF Link State Update packet
//
class Ospfv2LinkStateUpdatePacket extends Ospfv2Packet
{
    Ospfv2Lsa *ospfLSAs[] @owned @allowReplace;
}

//
// Represents an OSPF Link State Acknowledgement packet
//
class Ospfv2LinkStateAcknowledgementPacket extends Ospfv2Packet
{
    Ospfv2LsaHeader lsaHeaders[];     //TODO
}