NS3中的IpL4Protocol是一个基类,其主要用来使其他的基于IP协议的传输层协议继承于这个类,从而实现其基于IP的功能。

这个类继承于Object类,其中首先定义了一个枚举类型RxStatus

  /**
   * \brief Rx status codes.
   */
  enum RxStatus {
    RX_OK,
    RX_CSUM_FAILED, // checksum failed
    RX_ENDPOINT_CLOSED, // endpoint closed
    RX_ENDPOINT_UNREACH // endpoint unreach
  };

这个类中没有什么成员变量,也没有保护和私有的成员函数,下面介绍下它的公有函数。

公有函数

GetProtocolNumber

virtual int GetProtocolNumber (void) const = 0;

得到协议号,具体可参考另一篇文章Protocol Numbers « 云中君

Receive及其变种

// 接收普通包
virtual enum RxStatus Receive (Ptr<Packet> p,
                                 Ipv4Header const &header,
                                 Ptr<Ipv4Interface> incomingInterface) = 0;

// 接收ICMP包
virtual void ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
                            uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                            Ipv4Address payloadSource, Ipv4Address payloadDestination,
                            const uint8_t payload[8]);

这里的接受包指的是网络层收到了包,需要将其发送到上层,也就是传输层。

SetDownTarget

Receive函数主要用来当接收到网络层的包后的行为,而SetDownTarget函数主要是主动发送包时的行为。其允许使用者手动设置一个向下端发送的回调函数,从而能够顺利地将包向下进行交付。

virtual void SetDownTarget (DownTargetCallback cb) = 0;
virtual DownTargetCallback GetDownTarget (void) const = 0;

同样,GetDownTarget函数用来得到当前设置的回调。

注意,这个函数是纯虚函数,因为我们无法在这个类中进行实现。

参考文献