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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. //
  3. /*
  4.  * tpm.cc
  5.  * Copyright (C) 2001 by the University of Southern California
  6.  * $Id: tpm.cc,v 1.3 2006/02/21 15:20:18 mahrenho Exp $
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License,
  10.  * version 2, as published by the Free Software Foundation.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License along
  18.  * with this program; if not, write to the Free Software Foundation, Inc.,
  19.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  20.  *
  21.  *
  22.  * The copyright of this module includes the following
  23.  * linking-with-specific-other-licenses addition:
  24.  *
  25.  * In addition, as a special exception, the copyright holders of
  26.  * this module give you permission to combine (via static or
  27.  * dynamic linking) this module with free software programs or
  28.  * libraries that are released under the GNU LGPL and with code
  29.  * included in the standard release of ns-2 under the Apache 2.0
  30.  * license or under otherwise-compatible licenses with advertising
  31.  * requirements (or modified versions of such code, with unchanged
  32.  * license).  You may copy and distribute such a system following the
  33.  * terms of the GNU GPL for this module and the licenses of the
  34.  * other code concerned, provided that you include the source code of
  35.  * that other code when and as the GNU GPL requires distribution of
  36.  * source code.
  37.  *
  38.  * Note that people who make modified versions of this module
  39.  * are not obligated to grant this special exception for their
  40.  * modified versions; it is their choice whether to do so.  The GNU
  41.  * General Public License gives permission to release a modified
  42.  * version without this exception; this exception also makes it
  43.  * possible to release a modified version which carries forward this
  44.  * exception.
  45.  *
  46.  */
  47. //
  48. // Other copyrights might apply to parts of this software and are so
  49. // noted when applicable.
  50. //
  51. // Management function to playback TCPDump trace file (after post precssing)
  52. // Xuan Chen (xuanc@isi.edu)
  53. //
  54. #include "tpm.h"
  55. // Timer to send requests
  56. TPMTimer::TPMTimer(TPM* t) {
  57. tpm = t;
  58. }
  59. void TPMTimer::expire(Event *e) {
  60. //if (e) 
  61. // Packet::free((Packet *)e);
  62. tpm->run();
  63. }
  64. static class TPMClass : public TclClass {
  65. public:
  66.         TPMClass() : TclClass("TPM") {}
  67.         TclObject* create(int, const char*const*) {
  68. return (new TPM());
  69. }
  70. } class_tpm;
  71. TPM::TPM() {
  72. tp_default_ = tp_num_ = 0;
  73. tp = NULL;
  74. // initialize next request
  75. next_p.time = 0;
  76. next_p.saddr = 0;
  77. next_p.sport = 0;
  78. next_p.daddr = 0;
  79. next_p.dport = 0;
  80. next_p.len = 0;
  81. // initialize request timer
  82. timer = new TPMTimer(this);
  83. start_t = 0;
  84. }
  85. TPM::~TPM() {
  86. if (fp)
  87. fclose(fp);
  88. if (timer)
  89. delete timer;
  90. }
  91. int TPM::loadLog(const char* filename) {
  92. fp = fopen(filename, "r");
  93. if (fp == 0)
  94. return(0);
  95. return(1);
  96. }
  97. int TPM::start() {
  98. start_t = Scheduler::instance().clock();
  99. processLog();
  100. return(1);
  101. }
  102. int TPM::processLog() {
  103. int time, sport, dport, len;
  104. unsigned int saddr, daddr;
  105. while (!feof(fp)) {
  106. fscanf(fp, "%d %u %d %u %d %dn",
  107.        &time, &saddr, &sport, &daddr, &dport, &len);
  108. if (time > 0) {
  109. // save information for next request
  110. next_p.time = time;
  111. next_p.saddr = saddr;
  112. next_p.sport = sport;
  113. next_p.daddr = daddr;
  114. next_p.dport = dport;
  115. next_p.len = len;
  116. //double now = Scheduler::instance().clock();
  117. //double delay = time + start_t - now;
  118. double delay = time * 1.0 / 1000000.0;
  119. timer->resched(delay);
  120. return(1);
  121. } else {
  122. genPkt(saddr, sport, daddr, dport, len);
  123. }
  124. }
  125. return(1);
  126. }
  127. int TPM::run() {
  128. genPkt(next_p.saddr, next_p.sport, next_p.daddr, next_p.dport, next_p.len);
  129. processLog();
  130. return(1);
  131. }
  132. int TPM::genPkt(unsigned int saddr, int sport, unsigned int daddr, int dport, int len) {
  133. // we can send packets to anybody with twinks...
  134. if (saddr == daddr) {
  135.        return(0);
  136. }
  137. // use the default TP agent unless specified.
  138.    unsigned int tp_id = tp_default_;
  139. if (saddr < (unsigned int)tp_num_) {
  140. tp_id = saddr;
  141. }
  142. printf("tpid %dn", tp_id);
  143. tp[tp_id]->sendto(len, saddr, sport, daddr, dport);
  144. return(1);
  145. }
  146. int TPM::command(int argc, const char*const* argv) {
  147. if (argc == 2) {
  148. if (strcmp(argv[1], "start") == 0) {
  149. if (start())
  150. return(TCL_OK);
  151. else
  152. return(TCL_ERROR);
  153. }
  154. } else if (argc == 3) {
  155. if (strcmp(argv[1], "loadLog") == 0) {
  156. if (loadLog(argv[2]))
  157. return(TCL_OK);
  158. else
  159. return(TCL_ERROR);
  160. } else if (strcmp(argv[1], "tp-num") == 0) {
  161. tp_num_ = atoi(argv[2]);
  162. tp_default_ = tp_num_ - 1;
  163. if (tp_default_ < 0)
  164.   tp_default_ = 0;
  165. tp = new TPAgent*[tp_num_];
  166. return(TCL_OK);
  167. } else if (strcmp(argv[1], "tp-default") == 0) {
  168.         tp_default_ = atoi(argv[2]);
  169. return(TCL_OK);
  170. }
  171. } else if (argc == 4) {
  172. if (strcmp(argv[1], "tp-reg") == 0) {
  173. int index = atoi(argv[2]);
  174. if (index >= tp_num_)
  175. return(TCL_ERROR);
  176. tp[index] = (TPAgent *) TclObject::lookup(argv[3]);
  177. return(TCL_OK);
  178. }
  179. }
  180. printf("Command specified does not existn");
  181. return(TCL_ERROR);
  182. }