modules/up/src/Core/network/Ping.cc

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. pingTimerHandler
  2. Ping
  3. Ping
  4. send
  5. handleTimer
  6. receive

   1 //
   2 // $Id: Ping.cc,v 1.1.1.1 2000/03/10 16:32:19 engin Exp $
   3 //
   4 // Author(s): Ramesh Govindan
   5 
   6 #ifdef HAVE_CONFIG_H
   7 #include <config.h>
   8 #endif
   9 
  10 #include "util/Types.hh"
  11 #include "util/Trail.hh"
  12 #include "util/Handler.hh"
  13 #include "util/Buffer.hh"
  14 #include "sys/File.hh"
  15 #include "sys/Pipe.hh"
  16 #include "sys/Time.hh"
  17 #include "sched/Timer.hh"
  18 #include "sched/Dispatcher.hh"
  19 
  20 #include "network/Ping.hh"
  21 #include "network/Headers.hh"
  22 #include "network/Network.hh"
  23 
  24 // Locals
  25 static TraceCode        tracePing("network");
  26 static TimeShort        maxWait(10, 0);
  27 static unsigned int     probeNumber = 1;
  28 
  29 
  30 static void
  31 pingTimerHandler(void* ptr,
     /* [<][>][^][v][top][bottom][index][help] */
  32                  void*)
  33 {
  34     ((Ping*) ptr)->handleTimer();
  35 }
  36 
  37 Ping::Ping(Address* a,
     /* [<][>][^][v][top][bottom][index][help] */
  38            Handler& cb)
  39         : ListNode()
  40 {
  41     done = cb;
  42     addr = *a;
  43     timer = NULL;
  44     network->pendingPings.append(this);
  45 }
  46 
  47 Ping::~Ping()
     /* [<][>][^][v][top][bottom][index][help] */
  48 {
  49     if (timer) {
  50         delete timer;
  51     }
  52     network->pendingPings.remove(this);
  53 }
  54 
  55 void
  56 Ping::send()
     /* [<][>][^][v][top][bottom][index][help] */
  57 {
  58     Handler     th(pingTimerHandler, this);
  59     Handler     nh(NULL, NULL);
  60     Buffer*     buf;
  61     IP*         ip;
  62     ICMP*       icmp;
  63     RawSocket*  raw;
  64     unsigned long*      t;
  65     TimeLong    at;
  66 
  67     raw = new RawSocket(nh, nh, RawSocketICMP);
  68     buf = new Buffer(sizeof(IP) + sizeof(ICMP) + sizeof(unsigned long long));
  69     buf->zeroFill();
  70 
  71     ip = (IP*) buf->contents;
  72     ip->headerLength = sizeof(IP) >> 2;
  73     ip->version = 4;
  74     ip->typeOfService = 0;
  75     ip->totalLength = sizeof(IP) + sizeof(ICMP) + sizeof(unsigned long long);
  76     ip->identifier = 0;
  77     ip->fragmentOffset = 0;
  78     ip->timeToLive = 0xff;
  79     ip->protocol = IPPROTO_ICMP;
  80     ip->source = (network->interfaces.head())->address.get();
  81     ip->destination = addr.get();
  82     ip->hton();
  83     ip->checksum = 0;
  84     ip->checksum = htons(network->cksum((U16*) ip, sizeof(IP)));
  85 
  86     // We encode the sequence number and ident in the probe
  87     sequence = probeNumber++;
  88     icmp = (ICMP*) (ip + 1);
  89     icmp->type = ICMPTypeEcho;
  90     icmp->code = 0;
  91     icmp->gateway = sequence;
  92     icmp->hton();
  93 
  94     dispatcher.systemClock.sync();
  95     sent = dispatcher.systemClock;
  96 
  97     icmp->checksum = 0;
  98     icmp->checksum = network->cksum((U16*) icmp,
  99                                     sizeof(ICMP) + sizeof(unsigned long long));
 100 
 101     raw->sendTo(buf->contents, buf->size, addr, 0);
 102 
 103     TRACE(tracePing, "ping sent to %s\n", addr.name());
 104 
 105     delete raw;
 106     delete buf;
 107     
 108     if (timer) {
 109         delete timer;
 110     }
 111     at = dispatcher.systemClock;
 112     at = at + maxWait;
 113     timer = new Timer(th, at);
 114 
 115     return;
 116 }
 117 
 118 void
 119 Ping::handleTimer()
     /* [<][>][^][v][top][bottom][index][help] */
 120 {
 121     TRACE(tracePing, "ping failed to %s\n", addr.name());
 122 
 123     timer = NULL;
 124     lastRtt = InfiniteInterval;
 125     done.callBack((void*) this);
 126     return;
 127 }
 128 
 129 Boolean
 130 Ping::receive(IP* ip)
     /* [<][>][^][v][top][bottom][index][help] */
 131 {
 132     ICMP*               icmp;
 133     unsigned long*      t;
 134 
 135     icmp = (struct ICMP*) ((char*) ip + (ip->headerLength << 2));
 136     // Verify signature to see if it is for us
 137     if (icmp->type == ICMPTypeEchoReply) {
 138         if (ip->source != addr.get()) {
 139             return false;
 140         }
 141         if (icmp->gateway != sequence) {
 142             return false;
 143         }
 144         
 145         TRACE(tracePing, "ping received from %s\n", addr.name());
 146 
 147         t = (unsigned long *) (icmp+1);
 148 
 149         dispatcher.systemClock.sync();
 150         lastRtt = dispatcher.systemClock - sent;
 151         done.callBack((void*) this);
 152         return true;
 153     }
 154     return false;
 155 }
 156 
 157 //  Copyright (c) 1994 by the University of Southern California.
 158 //  All rights reserved.
 159 //
 160 //  Permission to use, copy, modify, and distribute this software and
 161 //  its documentation in source and binary forms for lawful
 162 //  non-commercial purposes and without fee is hereby granted, provided
 163 //  that the above copyright notice appear in all copies and that both
 164 //  the copyright notice and this permission notice appear in supporting
 165 //  documentation, and that any documentation, advertising materials,
 166 //  and other materials related to such distribution and use acknowledge
 167 //  that the software was developed by the University of Southern
 168 //  California and/or Information Sciences Institute.
 169 //  The name of the University of Southern California may not
 170 //  be used to endorse or promote products derived from this software
 171 //  without specific prior written permission.
 172 //
 173 //  THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY REPRESENTATIONS
 174 //  ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE.  THIS SOFTWARE IS
 175 //  PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
 176 //  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 177 //  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND 
 178 //  NON-INFRINGEMENT.
 179 //
 180 //  IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
 181 //  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
 182 //  TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
 183 //  THE USE OR PERFORMANCE OF THIS SOFTWARE.
 184 //
 185 //  Questions concerning this software should be directed to 
 186 //  scan@isi.edu.
 187 //
 188 
 189 

/* [<][>][^][v][top][bottom][index][help] */