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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) Xerox Corporation 1997. All rights reserved.
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License as published by the
  7.  * Free Software Foundation; either version 2 of the License, or (at your
  8.  * option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.  *
  19.  * Linking this file statically or dynamically with other modules is making
  20.  * a combined work based on this file.  Thus, the terms and conditions of
  21.  * the GNU General Public License cover the whole combination.
  22.  *
  23.  * In addition, as a special exception, the copyright holders of this file
  24.  * give you permission to combine this file with free software programs or
  25.  * libraries that are released under the GNU LGPL and with code included in
  26.  * the standard release of ns-2 under the Apache 2.0 license or under
  27.  * otherwise-compatible licenses with advertising requirements (or modified
  28.  * versions of such code, with unchanged license).  You may copy and
  29.  * distribute such a system following the terms of the GNU GPL for this
  30.  * file and the licenses of the other code concerned, provided that you
  31.  * include the source code of that other code when and as the GNU GPL
  32.  * requires distribution of source code.
  33.  *
  34.  * Note that people who make modified versions of this file are not
  35.  * obligated to grant this special exception for their modified versions;
  36.  * it is their choice whether to do so.  The GNU General Public License
  37.  * gives permission to release a modified version without this exception;
  38.  * this exception also makes it possible to release a modified version
  39.  * which carries forward this exception.
  40.  *
  41.  * $Header: /cvsroot/nsnam/ns-2/adc/salink.cc,v 1.6 2005/08/26 05:05:28 tomh Exp $
  42.  */
  43. #include "packet.h"
  44. #include "ip.h"
  45. #include "resv.h"
  46. #include "connector.h"
  47. #include "adc.h"
  48. #include "salink.h"
  49. static class SALinkClass : public TclClass {
  50. public:
  51. SALinkClass() : TclClass("SALink") {}
  52. TclObject* create(int, const char*const*) {
  53. return (new SALink());
  54. }
  55. }class_salink;
  56. SALink::SALink() : adc_(0), numfl_(-1), tchan_(0), onumfl_(0), last_(-1)
  57. {
  58. int i;
  59. for (i=0;i<NFLOWS;i++) {
  60. pending_[i].flowid=-1;
  61. pending_[i].status=0;
  62. }
  63. bind("src_", &src_);
  64. bind("dst_", &dst_);
  65. numfl_.tracer(this);
  66. numfl_.name(""Admitted Flows"");
  67. }
  68. void SALink::recv(Packet *p, Handler *h)
  69. {
  70. int decide;
  71. int j;
  72. hdr_cmn *ch=hdr_cmn::access(p);
  73. hdr_ip *iph=hdr_ip::access(p);
  74. hdr_resv *rv=hdr_resv::access(p);
  75. //CLEAN THIS UP
  76. int cl=(iph->flowid())?1:0;
  77. switch(ch->ptype()) {
  78. case PT_REQUEST:
  79. decide=adc_->admit_flow(cl,rv->rate(),rv->bucket());
  80. if (tchan_)
  81. if (last_ != decide) {
  82. int n;
  83. char wrk[50];
  84. double t = Scheduler::instance().clock();
  85. sprintf(wrk, "l -t %g -s %d -d %d -S COLOR -c %s", 
  86. t, src_, dst_, decide ? "MediumBlue" : "red" );
  87. n = strlen(wrk);
  88. wrk[n] = 'n';
  89. wrk[n+1] = 0;
  90. (void)Tcl_Write(tchan_, wrk, n+1);
  91. last_ = decide;
  92. }
  93. //put decide in the packet
  94. rv->decision() &= decide;
  95. if (decide) {
  96. j=get_nxt();
  97. pending_[j].flowid=iph->flowid();
  98. //pending_[j].status=decide;
  99. numfl_++;
  100. }
  101. break;
  102. case PT_ACCEPT:
  103. case PT_REJECT:
  104. break;
  105. case PT_CONFIRM:
  106. {
  107. j=lookup(iph->flowid());
  108. if (j!=-1) {
  109. if (!rv->decision()) {
  110. //decrease the avload for this class 
  111. adc_->rej_action(cl,rv->rate(),rv->bucket());
  112. numfl_--;
  113. }
  114. pending_[j].flowid=-1;
  115. }
  116. break;
  117. }
  118. case PT_TEARDOWN:
  119. {
  120. adc_->teardown_action(cl,rv->rate(),rv->bucket());
  121. numfl_--;
  122. break;
  123. }
  124. default:
  125. #ifdef notdef
  126. error("unknown signalling message type : %d",ch->ptype());
  127. abort();
  128. #endif
  129. break;
  130. }
  131. send(p,h);
  132. }
  133. int SALink::command(int argc, const char*const* argv)
  134. {
  135. Tcl& tcl = Tcl::instance();
  136. char wrk[500];
  137. if (argc ==3) {
  138. if (strcmp(argv[1],"attach-adc") == 0 ) {
  139. adc_=(ADC *)TclObject::lookup(argv[2]);
  140. if (adc_ ==0 ) {
  141. tcl.resultf("no such node %s", argv[2]);
  142. return(TCL_ERROR);
  143. }
  144. return(TCL_OK);
  145. }
  146. if (strcmp(argv[1], "attach") == 0) {
  147. int mode;
  148. const char* id = argv[2];
  149. tchan_ = Tcl_GetChannel(tcl.interp(), (char*)id, &mode);
  150. if (tchan_ == 0) {
  151. tcl.resultf("SALink: trace: can't attach %s for writing", id);
  152. return (TCL_ERROR);
  153. }
  154. return (TCL_OK);
  155. }
  156. }
  157. if (argc == 2) {
  158. if (strcmp(argv[1], "add-trace") == 0) {
  159. if (tchan_) {
  160. sprintf(wrk, "a -t * -n %s:%d-%d -s %d",
  161. adc_->type(), src_, dst_, src_);
  162. int n = strlen(wrk);
  163. wrk[n] = 'n';
  164. wrk[n+1] = 0;
  165. (void)Tcl_Write(tchan_, wrk, n+1);
  166. numfl_ = 0;
  167. }
  168. return (TCL_OK);
  169. }
  170. }
  171. return Connector::command(argc,argv);
  172. }
  173. int SALink::lookup(int flowid)
  174. {
  175. int i;
  176. for (i=0;i<NFLOWS;i++)
  177. if (pending_[i].flowid==flowid)
  178. return i;
  179. return(-1);
  180. }
  181. int SALink::get_nxt()
  182. {
  183. int i;
  184. for (i=0;i<NFLOWS;i++)
  185. {
  186. if (pending_[i].flowid==-1)
  187. return i;
  188. }
  189. printf("Ran out of pending space n");
  190. exit(1);
  191. return i;
  192. }
  193. void SALink::trace(TracedVar* v)
  194. {
  195. char wrk[500];
  196. int *p, newval;
  197. if (strcmp(v->name(), ""Admitted Flows"") == 0) {
  198. p = &onumfl_;
  199. }
  200. else {
  201. fprintf(stderr, "SALink: unknown trace var %sn", v->name());
  202. return;
  203. }
  204. newval = int(*((TracedInt*)v));
  205. if (tchan_) {
  206. int n;
  207. double t = Scheduler::instance().clock();
  208. /* f -t 0.0 -s 1 -a SA -T v -n Num -v 0 -o 0 */
  209. sprintf(wrk, "f -t %g -s %d -a %s:%d-%d -T v -n %s -v %d -o %d",
  210. t, src_, adc_->type(), src_, dst_, v->name(), newval, *p);
  211. n = strlen(wrk);
  212. wrk[n] = 'n';
  213. wrk[n+1] = 0;
  214. (void)Tcl_Write(tchan_, wrk, n+1);
  215. }
  216. *p = newval;
  217. return;
  218. }