Msg File src/inet/routing/pim/PIMPacket.msg

Name Type Description
PIMPacketType enum (no description)
PIMHelloOptionType enum (no description)
HelloOption class (no description)
HoldtimeOption class (no description)
LANPruneDelayOption class (no description)
DRPriorityOption class (no description)
GenerationIDOption class (no description)
EncodedAddress struct (no description)
JoinPruneGroup class

Record for Join/Prune message in structure it is not possible to use dynamic arrays, iit is needed to use class

PIMPacket packet

Header

PIMHello packet

Hello message DM, SM

PIMJoinPrune packet

Join/Prune message DM, SM

PIMAssert packet

Assert message DM, SM

PIMGraft packet

Graft message, only message send by unicast DM

PIMGraftAck packet

GraftAck message DM

PIMStateRefresh packet

State Refresh message DM

PIMRegister packet

Register message SM

PIMRegisterStop packet

Register-Stop message SM

Source code:

//
// Copyright (C) 2013 Brno University of Technology (http://nes.fit.vutbr.cz/ansa)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program; if not, see <http://www.gnu.org/licenses/>.
//
// Authors: Veronika Rybova, Vladimir Vesely ([email protected]),
//          Tamas Borbely ([email protected])


cplusplus {{
#include "inet/networklayer/contract/ipv4/IPv4Address.h"

#define PIM_HEADER_LENGTH 4
#define ENCODED_UNICODE_ADDRESS_LENGTH 6 // IPv4 only
#define ENCODED_GROUP_ADDRESS_LENGTH   8 // IPv4 only
#define ENCODED_SOURCE_ADDRESS_LENGTH  8 // IPv4 only
}}

namespace inet;

//struct IPAddress;
class noncobject IPv4Address;

enum PIMPacketType
{
   Hello = 0;
   Register = 1;
   RegisterStop = 2;
   JoinPrune = 3;
   Bootstrap = 4;
   Assert = 5;
   Graft = 6;
   GraftAck = 7;
   CandidateRPAdvertisement = 8;
   StateRefresh = 9;
}

enum PIMHelloOptionType
{
   Holdtime = 1;
   LANPruneDelay = 2;
   DRPriority = 19;
   GenerationID = 20;
   StateRefreshCapable = 21;
   AddressList = 24;
}

class HelloOption
{
    short type @enum(PIMHelloOptionType);
}

class HoldtimeOption extends HelloOption
{
    type = Holdtime;
    uint16_t holdTime;
}

class LANPruneDelayOption extends HelloOption
{
    type = LANPruneDelay;
    uint16_t propagationDelay;
    uint16_t overrideInterval;
}

class DRPriorityOption extends HelloOption
{
    type = DRPriority;
    uint32_t priority;
}

class GenerationIDOption extends HelloOption
{
    type = GenerationID;
    uint32_t generationID;
}

//class AddressListOption extends HelloOption
//{
//    IPv4Address secondaryAddresses[];
//}

cplusplus {{ class HelloOption; typedef HelloOption *HelloOptionPtr; }}
class noncobject HelloOptionPtr;

struct EncodedAddress
{
    IPv4Address IPaddress;
    bool         S;
    bool        W;                //WC bit
    bool        R;                //RPT bit
}

// Record for Join/Prune message
// in structure it is not possible to use dynamic arrays, iit is needed to use class
class JoinPruneGroup
{
    IPv4Address     groupAddress;
    EncodedAddress     joinedSourceAddress[];
    EncodedAddress     prunedSourceAddress[];
}

///////////////////////////////////////////////////////////////////////////////////////////////
// Header
packet PIMPacket
{
   short         version = 2;
   short         type @enum(PIMPacketType);
}

// Hello message
// DM, SM
packet PIMHello extends PIMPacket
{
    @customize(true);
    type = Hello;
    abstract HelloOptionPtr  options[];
}

// Join/Prune message
// DM, SM
packet PIMJoinPrune extends PIMPacket
{
    type= JoinPrune;
    IPv4Address        upstreamNeighborAddress;
    int                holdTime;
    //int                numGroups;
    JoinPruneGroup    joinPruneGroups[];
}

// Assert message
// DM, SM
packet PIMAssert extends PIMPacket
{
    type = Assert;
    IPv4Address        groupAddress;
    IPv4Address        sourceAddress;
    bool            R;
    int                metric;
    int                metricPreference;
}

// Graft message, only message send by unicast
// DM
packet PIMGraft extends PIMJoinPrune
{
    type = Graft;
    holdTime = 0;
}

// GraftAck message
// DM
packet PIMGraftAck extends PIMGraft
{
    type = GraftAck;
}

// State Refresh message
// DM
packet PIMStateRefresh extends PIMPacket
{
    type = StateRefresh;
    IPv4Address        groupAddress;
    IPv4Address        sourceAddress;
    IPv4Address        originatorAddress;
    int                metric;
    int                metricPreference;
    short            maskLen;
    short            ttl;
    bool            P;
    int                interval;
}
// Register message
// SM
packet PIMRegister extends PIMPacket
{
    type = Register;
    bool            B;
    bool            N;
}

// Register-Stop message
// SM
packet PIMRegisterStop extends PIMPacket
{
    type = RegisterStop;
    IPv4Address        groupAddress;
    IPv4Address        sourceAddress;
}