icmp.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*    
  2.  * Copyright (c) 1998 Regents of the University of California.
  3.  * All rights reserved.
  4.  *    
  5.  * Redistribution and use in source and binary forms, with or without 
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *      This product includes software developed by the Network Research
  16.  *      Group at Lawrence Berkeley National Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *   
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  31.  * SUCH DAMAGE.
  32.  */  
  33. #ifndef lint
  34. static const char rcsid[] =
  35.     "@(#) $Header: /cvsroot/nsnam/ns-2/emulate/icmp.cc,v 1.5 2000/09/01 03:04:10 haoboy Exp $";
  36. #endif
  37. #include <stdio.h>
  38. #include <sys/types.h>
  39. #include <netinet/in.h>
  40. #include <netinet/in_systm.h>
  41. #include <netinet/ip.h>
  42. #include <netinet/ip_icmp.h>
  43. #include <netinet/ip_icmp.h>
  44. #include <arpa/inet.h>
  45. #include "agent.h"
  46. #include "scheduler.h"
  47. #include "packet.h"
  48. #include "emulate/net.h"
  49. #include "emulate/internet.h"
  50. #ifndef IPPROTO_GGP
  51. #define IPPROTO_GGP 3
  52. #endif // IPPROTO_GGP
  53. //
  54. // icmp.cc -- a very limited-functionality set of icmp routines
  55. // 
  56. class IcmpAgent : public Agent {
  57. public:
  58. IcmpAgent();
  59. void recv(Packet*, Handler*) { abort(); }
  60. protected:
  61. void sendredirect(in_addr& me, in_addr& target, in_addr& dest, in_addr& gw);
  62. int command(int argc, const char*const* argv);
  63. int ttl_;
  64. };
  65. static class IcmpAgentClass : public TclClass { 
  66. public:
  67.         IcmpAgentClass() : TclClass("Agent/IcmpAgent") {}
  68.         TclObject* create(int , const char*const*) {
  69.                 return (new IcmpAgent());
  70.         } 
  71. } class_icmpsagent;
  72. IcmpAgent::IcmpAgent() : Agent(PT_LIVE)
  73. {
  74. bind("ttl_", &ttl_);
  75. }
  76. /*
  77.  * sendredirect -- send a packet to "target" containing a redirect
  78.  * for the network specified by "dst", so that the gateway "gw" is used
  79.  * also, forge the source address so as to appear to come from "me"
  80.  */
  81. void
  82. IcmpAgent::sendredirect(in_addr& me, in_addr& target, in_addr& dst, in_addr& gw)
  83. {
  84. // make a simulator packet to hold the IP packet, which in turn
  85. // holds: ip header, icmp header, embedded ip header, plus 64 bits
  86. // data
  87. int iplen = sizeof(ip) + 8 + sizeof(ip) + 8;
  88.         Packet* p = allocpkt(iplen);
  89. hdr_cmn* hc = HDR_CMN(p);
  90. ip* iph = (ip*) p->accessdata();
  91. hc->size() = iplen;
  92. // make an IP packet ready to send to target
  93. // size will be min icmp + a dummy'd-up IP header
  94. Internet::makeip(iph, iplen, ttl_, IPPROTO_ICMP, me, target);
  95. // make an ICMP host redirect, set the gwaddr field
  96. icmp* icp = (icmp*) (iph + 1);
  97. icp->icmp_gwaddr = gw;
  98. // make a dummy IP packet to go in the ICMP data, which will
  99. // be used to indicate to the end host which routing table
  100. // entry to update
  101. ip* dummyhdr = (ip*)((u_char*)icp + 8); // past icmp hdr
  102. // deprecated protocol inside
  103. Internet::makeip(dummyhdr, 20, 254, IPPROTO_GGP, target, dst);
  104. u_short *port = (u_short*) (dummyhdr + 1); // past ip hdr
  105. *port++ = htons(9); // discard port
  106. *port = htons(9); // discard port
  107. icp->icmp_cksum = 0;
  108. icp->icmp_type = ICMP_REDIRECT;
  109. icp->icmp_code = ICMP_REDIRECT_HOST;
  110. icp->icmp_cksum = Internet::in_cksum((u_short*)icp,
  111. 8 + sizeof(ip) + 8);
  112. send(p, 0);
  113. return;
  114. }
  115. int
  116. IcmpAgent::command(int argc, const char*const* argv)
  117. {
  118. if (argc > 5) {
  119. // $obj send name src dst [...stuff...]
  120. if (strcmp(argv[1], "send") == 0) {
  121. if (strcmp(argv[2], "redirect") == 0 &&
  122.     argc == 7) {
  123. // $obj send redirect src target dst gwaddr
  124. // as src, send to targ, so that it changes
  125. // its route to dst to use gwaddr
  126. u_long s, t, d, g;
  127. s = inet_addr(argv[3]);
  128. t = inet_addr(argv[4]);
  129. d = inet_addr(argv[5]);
  130. g = inet_addr(argv[6]);
  131. in_addr src, targ, dst, gw;
  132. src.s_addr = s;
  133. targ.s_addr = t;
  134. dst.s_addr = d;
  135. gw.s_addr = g;
  136. sendredirect(src, targ, dst, gw);
  137. return (TCL_OK);
  138. }
  139. }
  140. }
  141. return (Agent::command(argc, argv));
  142. }