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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1996 Regents of the University of California.
  4.  * All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *  This product includes software developed by the MASH Research
  17.  *  Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  * 
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. #ifndef lint
  35. static const char rcsid[] =
  36.     "@(#) $Header: /cvsroot/nsnam/ns-2/mcast/replicator.cc,v 1.21 2000/12/20 10:12:48 alefiyah Exp $";
  37. #endif
  38. #include "classifier.h"
  39. #include "packet.h"
  40. #include "ip.h"
  41. /*
  42.  * A replicator is not really a packet classifier but
  43.  * we simply find convenience in leveraging its slot table.
  44.  * (this object used to implement fan-out on a multicast
  45.  * router as well as broadcast LANs)
  46.  */
  47. class Replicator : public Classifier {
  48. public:
  49. Replicator();
  50. void recv(Packet*, Handler* h = 0);
  51. virtual int classify(Packet*) {/*NOTREACHED*/ return -1;};
  52. protected:
  53. virtual int command(int argc, const char*const* argv);
  54. int ignore_;
  55. int direction_;
  56. };
  57. static class ReplicatorClass : public TclClass {
  58. public:
  59. ReplicatorClass() : TclClass("Classifier/Replicator") {}
  60. TclObject* create(int, const char*const*) {
  61. return (new Replicator());
  62. }
  63. } class_replicator;
  64. Replicator::Replicator() : ignore_(0),direction_(0)
  65. {
  66. bind("ignore_", &ignore_);
  67. bind_bool("direction_",&direction_);
  68. }
  69. void Replicator::recv(Packet* p, Handler*)
  70. {
  71. hdr_ip* iph = hdr_ip::access(p);
  72. hdr_cmn* ch = hdr_cmn::access(p);
  73. if (maxslot_ < 0) {
  74. if (!ignore_) 
  75. Tcl::instance().evalf("%s drop %ld %ld %d", name(), 
  76. iph->saddr(), iph->daddr(), ch->iface());
  77. Packet::free(p);
  78. return;
  79. }
  80. //If the direction of the packet is DOWN, 
  81. // now that is has reached the end of the stack 
  82. // change the direction to UP
  83. if(direction_){
  84. if( HDR_CMN(p)->direction() == hdr_cmn::DOWN){
  85. ch->direction() = hdr_cmn::UP; // Up the stack 
  86. }
  87. }
  88. for (int i = 0; i < maxslot_; ++i) {
  89. NsObject* o = slot_[i];
  90. if (o != 0)
  91. o->recv(p->copy());
  92. }
  93. /* we know that maxslot is non-null */
  94. slot_[maxslot_]->recv(p);
  95. }
  96. int Replicator::command(int argc, const char*const* argv)
  97. {
  98. Tcl& tcl = Tcl::instance();
  99. if (argc == 2) {
  100. /*
  101.  * $replicator slot
  102.  */
  103. if (strcmp(argv[1], "slots") == 0) {
  104. if (maxslot_ < 0) {
  105. tcl.result("");
  106. return (TCL_OK);
  107. }
  108. for (int i = 0; i <= maxslot_; i++) {
  109. if (slot_[i] == 0) 
  110. continue;
  111. tcl.resultf("%s %s", tcl.result(),
  112.     slot_[i]->name());
  113. }
  114. return (TCL_OK);
  115. }
  116. }
  117. return Classifier::command(argc, argv);
  118. }