IPv4ControlInfo

Namespace inet

IPv4ControlInfo

class

Control information for sending/receiving packets over IPv4.

To send a packet over IPv4, fill in an IPv4ControlInfo object, attach it to the packet with the C++ method setControlInfo(), the send it to the IPv4 module.

When sending, the following fields are required:

Optional fields:

  • srcAddr: it will be set to the address of the outgoing interface
  • typeOfService: (default: 0)
  • timeToLive: default defined as module parameter
  • dontFragment: default: false

Not supported:

  • options: IPv4 Options currently not used
  • Identifier is currently always chosen by the IPv4 layer

When IPv4 delivers a packet to higher layers, it also attaches an IPv4ControlInfo to it. It fills in the following fields:

  • srcAddr, destAddr, protocol, TypeOfService: values from the original datagram
  • interfaceId: the interface on which the datagram arrived, or -1 if it was created locally

IPv4 also puts the original datagram object into the control info, because it may be needed by higher layers (for example, by ICMP for error reporting).

Extends

Name Type Description
cObject (unknown -- not in documented files)

Fields

Name Type Description
destAddr IPv4Address

destination IPv4 address

srcAddr IPv4Address

source IPv4 address

interfaceId int

interface on which the datagram was received, or should be sent (see InterfaceTable)

multicastLoop bool

if true, sent multicast datagrams will be looped back

protocol short

encapsulated protocol

typeOfService unsigned char

Type of Service byte (low 6 bits: DSCP)

diffServCodePoint int

maps to bits 0-5 of trafficClass

explicitCongestionNotification int

maps to bits 6-7 of trafficClass

timeToLive short

maximum hop count

dontFragment bool

"don't fragment" bit

Source code

//
// Control information for sending/receiving packets over IPv4.
//
// To send a packet over IPv4, fill in an ~IPv4ControlInfo object,
// attach it to the packet with the C++ method setControlInfo(),
// the send it to the ~IPv4 module.
//
// When sending, the following fields are required:
// - protocol: a value from ~IPProtocolId
// - destAddr
//
// Optional fields:
// - srcAddr: it will be set to the address of the outgoing interface
// - typeOfService: (default: 0)
// - timeToLive: default defined as module parameter
// - dontFragment: default: false
//
// Not supported:
// - options: IPv4 Options currently not used
// - Identifier is currently always chosen by the IPv4 layer
//
// When ~IPv4 delivers a packet to higher layers, it also attaches an ~IPv4ControlInfo
// to it. It fills in the following fields:
//  - srcAddr, destAddr, protocol, TypeOfService: values from the original datagram
//  - interfaceId: the interface on which the datagram arrived, or -1 if it was
//    created locally
//
// ~IPv4 also puts the original datagram object into the control info, because
// it may be needed by higher layers (for example, by ~ICMP for error reporting).
//
class IPv4ControlInfo extends cObject
{
    @customize(true);
    IPv4Address destAddr;   // destination IPv4 address
    IPv4Address srcAddr;    // source IPv4 address
    int interfaceId = -1; // interface on which the datagram was received, or
                          // should be sent (see ~InterfaceTable)
    bool multicastLoop;   // if true, sent multicast datagrams will be looped back
    short protocol @enum(IPProtocolId);  // encapsulated protocol
    unsigned char typeOfService;  // Type of Service byte (low 6 bits: DSCP)
    abstract int diffServCodePoint;  // maps to bits 0-5 of trafficClass
    abstract int explicitCongestionNotification;  // maps to bits 6-7 of trafficClass
    short timeToLive;     // maximum hop count
    bool dontFragment;    // "don't fragment" bit
}

File: src/inet/networklayer/contract/ipv4/IPv4ControlInfo.msg