A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
icmpv6-l4-protocol.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007-2009 Strasbourg University
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
19  * David Gross <gdavid.devel@gmail.com>
20  * Mehdi Benamor <benamor.mehdi@ensi.rnu.tn>
21  */
22 
23 #ifndef ICMPV6_L4_PROTOCOL_H
24 #define ICMPV6_L4_PROTOCOL_H
25 
26 #include <list>
27 
28 #include "ns3/ipv6-address.h"
29 #include "icmpv6-header.h"
30 #include "ip-l4-protocol.h"
31 
32 namespace ns3 {
33 
34 class NetDevice;
35 class Node;
36 class Packet;
37 class TraceContext;
38 class NdiscCache;
39 
45 {
46 public:
50  static TypeId GetTypeId ();
51 
55  static const uint8_t PROT_NUMBER;
56 
60  static const uint8_t MAX_INITIAL_RTR_ADVERT_INTERVAL;
61 
65  static const uint8_t MAX_INITIAL_RTR_ADVERTISEMENTS;
66 
70  static const uint8_t MAX_FINAL_RTR_ADVERTISEMENTS;
71 
75  static const uint8_t MIN_DELAY_BETWEEN_RAS;
76 
80  static const uint32_t MAX_RA_DELAY_TIME;
81 
85  static const uint8_t MAX_RTR_SOLICITATION_DELAY;
86 
90  static const uint8_t RTR_SOLICITATION_INTERVAL;
91 
95  static const uint8_t MAX_RTR_SOLICITATIONS;
96 
100  static const uint8_t MAX_MULTICAST_SOLICIT;
101 
105  static const uint8_t MAX_UNICAST_SOLICIT;
106 
110  static const uint8_t MAX_ANYCAST_DELAY_TIME;
111 
115  static const uint8_t MAX_NEIGHBOR_ADVERTISEMENT;
116 
120  static const uint32_t REACHABLE_TIME;
121 
125  static const uint32_t RETRANS_TIMER;
126 
130  static const uint8_t DELAY_FIRST_PROBE_TIME;
131 
135  static const double MIN_RANDOM_FACTOR;
136 
140  static const double MAX_RANDOM_FACTOR;
141 
146  static uint16_t GetStaticProtocolNumber ();
147 
151  Icmpv6L4Protocol ();
152 
156  virtual ~Icmpv6L4Protocol ();
157 
162  void SetNode (Ptr<Node> node);
163 
169  void NotifyNewAggregate ();
170 
175  virtual int GetProtocolNumber () const;
176 
181  virtual int GetVersion () const;
182 
190  void SendMessage (Ptr<Packet> packet, Ipv6Address src, Ipv6Address dst, uint8_t ttl);
191 
200  void SendMessage (Ptr<Packet> packet, Ipv6Address dst, Icmpv6Header& icmpv6Hdr, uint8_t ttl);
201 
211  void DoDAD (Ipv6Address target, Ptr<Ipv6Interface> interface);
212 
220  void SendNA (Ipv6Address src, Ipv6Address dst, Address* hardwareAddress, uint8_t flags);
221 
230  void SendEchoReply (Ipv6Address src, Ipv6Address dst, uint16_t id, uint16_t seq, Ptr<Packet> data);
231 
239  void SendNS (Ipv6Address src, Ipv6Address dst, Ipv6Address target, Address hardwareAddress);
240 
247  void SendErrorDestinationUnreachable (Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code);
248 
255  void SendErrorTooBig (Ptr<Packet> malformedPacket, Ipv6Address dst, uint32_t mtu);
256 
263  void SendErrorTimeExceeded (Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code);
264 
272  void SendErrorParameterError (Ptr<Packet> malformedPacket, Ipv6Address dst, uint8_t code, uint32_t ptr);
273 
282  void SendRedirection (Ptr<Packet> redirectedPacket, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget);
283 
292  Ptr<Packet> ForgeNS (Ipv6Address src, Ipv6Address dst, Ipv6Address target, Address hardwareAddress);
293 
302  Ptr<Packet> ForgeNA (Ipv6Address src, Ipv6Address dst, Address* hardwareAddress, uint8_t flags);
303 
311  Ptr<Packet> ForgeRS (Ipv6Address src, Ipv6Address dst, Address hardwareAddress);
312 
322  Ptr<Packet> ForgeEchoRequest (Ipv6Address src, Ipv6Address dst, uint16_t id, uint16_t seq, Ptr<Packet> data);
323 
331  Ipv4Header const &header,
332  Ptr<Ipv4Interface> interface);
333 
342  Ipv6Address &src, Ipv6Address &dst,
343  Ptr<Ipv6Interface> interface);
344 
351  static void FunctionDadTimeout (Ptr<Icmpv6L4Protocol> icmpv6, Ipv6Interface* interface, Ipv6Address addr);
352 
361  bool Lookup (Ipv6Address dst, Ptr<NetDevice> device, Ptr<NdiscCache> cache, Address* hardwareDestination);
362 
374  bool Lookup (Ptr<Packet> p, Ipv6Address dst, Ptr<NetDevice> device, Ptr<NdiscCache> cache, Address* hardwareDestination);
375 
382  void SendRS (Ipv6Address src, Ipv6Address dst, Address hardwareAddress);
383 
391 
396  bool IsAlwaysDad () const;
397 
398 protected:
402  virtual void DoDispose ();
403 
404 private:
405  typedef std::list<Ptr<NdiscCache> > CacheList;
406 
411 
416 
421 
430  void Forward (Ipv6Address source, Icmpv6Header icmp,
431  uint32_t info, Ipv6Header ipHeader,
432  const uint8_t payload[8]);
433 
441  void HandleNS (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
442 
450  void HandleRS (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
451 
459  void HandleRA (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
460 
468  void HandleEchoRequest (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
469 
477  void HandleNA (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
478 
486  void HandleRedirection (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
487 
495  void HandleDestinationUnreachable (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
496 
504  void HandleTimeExceeded (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
505 
513  void HandlePacketTooBig (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
514 
522  void HandleParameterError (Ptr<Packet> p, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
523 
531  void ReceiveLLA (Icmpv6OptionLinkLayerAddress lla, Ipv6Address const &src, Ipv6Address const &dst, Ptr<Ipv6Interface> interface);
532 
538 
539  // From IpL4Protocol
542  // From IpL4Protocol
543  virtual IpL4Protocol::DownTargetCallback GetDownTarget (void) const;
545 
547 
548 };
549 
550 } /* namespace ns3 */
551 
552 #endif /* ICMPV6_L4_PROTOCOL_H */
553