00001 #ifndef ICMPV4_L4_PROTOCOL_H
00002 #define ICMPV4_L4_PROTOCOL_H
00003
00004 #include "ipv4-l4-protocol.h"
00005 #include "icmpv4.h"
00006 #include "ns3/ipv4-address.h"
00007
00008 namespace ns3 {
00009
00010 class Node;
00011 class Ipv4Interface;
00012
00013 class Icmpv4L4Protocol : public Ipv4L4Protocol
00014 {
00015 public:
00016 static TypeId GetTypeId (void);
00017 Icmpv4L4Protocol ();
00018 virtual ~Icmpv4L4Protocol ();
00019
00020 void SetNode (Ptr<Node> node);
00021
00022 static uint16_t GetStaticProtocolNumber (void);
00023 virtual int GetProtocolNumber (void) const;
00024 virtual enum Ipv4L4Protocol::RxStatus Receive(Ptr<Packet> p,
00025 const Ipv4Address &source,
00026 const Ipv4Address &destination,
00027 Ptr<Ipv4Interface> incomingInterface);
00028
00029 void SendDestUnreachFragNeeded (Ipv4Header header, Ptr<const Packet> orgData, uint16_t nextHopMtu);
00030 void SendTimeExceededTtl (Ipv4Header header, Ptr<const Packet> orgData);
00031 void SendDestUnreachPort (Ipv4Header header, Ptr<const Packet> orgData);
00032
00033 private:
00034 void HandleEcho (Ptr<Packet> p,
00035 Icmpv4Header header,
00036 Ipv4Address source,
00037 Ipv4Address destination);
00038 void HandleDestUnreach (Ptr<Packet> p,
00039 Icmpv4Header header,
00040 Ipv4Address source,
00041 Ipv4Address destination);
00042 void HandleTimeExceeded (Ptr<Packet> p,
00043 Icmpv4Header icmp,
00044 Ipv4Address source,
00045 Ipv4Address destination);
00046 void SendDestUnreach (Ipv4Header header, Ptr<const Packet> orgData,
00047 uint8_t code, uint16_t nextHopMtu);
00048 void SendMessage (Ptr<Packet> packet, Ipv4Address dest, uint8_t type, uint8_t code);
00049 void SendMessage (Ptr<Packet> packet, Ipv4Address source, Ipv4Address dest, uint8_t type, uint8_t code);
00050 void Forward (Ipv4Address source, Icmpv4Header icmp,
00051 uint32_t info, Ipv4Header ipHeader,
00052 const uint8_t payload[8]);
00053
00054 virtual void DoDispose (void);
00055
00056 Ptr<Node> m_node;
00057 bool m_calcChecksum;
00058 };
00059
00060 }
00061
00062 #endif