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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2000 Nortel Networks
  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 Nortel Networks.
  16.  * 4. The name of the Nortel Networks may not be used
  17.  *    to endorse or promote products derived from this software without
  18.  *    specific prior written permission.
  19.  * 
  20.  * THIS SOFTWARE IS PROVIDED BY NORTEL AND CONTRIBUTORS ``AS IS'' AND
  21.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED.  IN NO EVENT SHALL NORTEL OR CONTRIBUTORS BE LIABLE
  24.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30.  * SUCH DAMAGE.
  31.  *
  32.  * Developed by: Farhan Shallwani, Jeremy Ethridge
  33.  *               Peter Pieda, and Mandeep Baines
  34.  * Maintainer: Peter Pieda <ppieda@nortelnetworks.com>
  35.  */
  36. /*
  37.  * Integrated into ns by Xuan Chen (xuanc@isi.edu) 
  38.  * Add instance of policyClassifier.
  39.  */
  40. #include "dsEdge.h"
  41. #include "ew.h"
  42. #include "dewp.h"
  43. #include "packet.h"
  44. #include "tcp.h"
  45. #include "random.h"
  46. /*------------------------------------------------------------------------------
  47. class edgeClass 
  48. ------------------------------------------------------------------------------*/
  49. static class edgeClass : public TclClass {
  50. public:
  51. edgeClass() : TclClass("Queue/dsRED/edge") {}
  52. TclObject* create(int, const char*const*) {
  53. return (new edgeQueue);
  54. }
  55. } class_edge;
  56. /*------------------------------------------------------------------------------
  57. edgeQueue() Constructor.
  58. ------------------------------------------------------------------------------*/
  59. edgeQueue::edgeQueue() {
  60.   //  policy = NULL;
  61. }
  62. /*------------------------------------------------------------------------------
  63. void enque(Packet* pkt) 
  64. Post: The incoming packet pointed to by pkt is marked with an appropriate code
  65.   point (as handled by the marking method) and enqueued in the physical and 
  66.   virtual queue corresponding to that code point (as specified in the PHB 
  67.   Table).
  68. Uses: Methods Policy::mark(), lookupPHBTable(), and redQueue::enque(). 
  69. ------------------------------------------------------------------------------*/
  70. void edgeQueue::enque(Packet* pkt) {
  71. int codePt;
  72. // Mark the packet with the specified priority:
  73. //printf("before ,markn");
  74. codePt = policy.mark(pkt);
  75. // printf("after ,markn");
  76. dsREDQueue::enque(pkt);
  77. }
  78. /*------------------------------------------------------------------------------
  79. int command(int argc, const char*const* argv) 
  80.     Commands from the ns file are interpreted through this interface.
  81. ------------------------------------------------------------------------------*/
  82. int edgeQueue::command(int argc, const char*const* argv) {
  83.   if (strcmp(argv[1], "addPolicyEntry") == 0) {
  84.     // Note: the definition of policy has changed.
  85.     policy.addPolicyEntry(argc, argv);
  86.     return(TCL_OK);
  87.   };
  88.   if (strcmp(argv[1], "addPolicerEntry") == 0) {
  89.     // Note: the definition of policy has changed.
  90.     policy.addPolicerEntry(argc, argv);
  91.     return(TCL_OK);
  92.   };
  93.   if (strcmp(argv[1], "couple") == 0) {
  94.   /*
  95.     printf("%d ", argc);
  96.     for (int i = 1; i < argc; i++) 
  97.       printf("%d(%s) ", i, argv[i]);
  98.     printf("n");   
  99.   */
  100.     DEWPPolicy *ewp = (DEWPPolicy *)(policy.policy_pool[DEWP]);
  101.     // Get the pointer to the queue to be coupled (in c++)
  102.     //Tcl& tcl = Tcl::instance();
  103.     edgeQueue *cq = (edgeQueue*) TclObject::lookup(argv[2]);
  104.     DEWPPolicy *ewpc = (DEWPPolicy *)((cq->policy).policy_pool[DEWP]);
  105.     ewp->couple(ewpc); 
  106.     return(TCL_OK);
  107.   };
  108.   // couple the EW on request and response links
  109.   if (strcmp(argv[1], "coupleEW") == 0) {
  110.     //printf("%d ", argc);
  111.     //for (int i = 1; i < argc; i++) 
  112.     //printf("%d(%s) ", i, argv[i]);
  113.     //printf("n");   
  114.     EWPolicy *ewp = (EWPolicy *)(policy.policy_pool[EW]);
  115.     // Get the pointer to the queue to be coupled (in c++)
  116.     //Tcl& tcl = Tcl::instance();
  117.     edgeQueue *cq = (edgeQueue*) TclObject::lookup(argv[2]);
  118.     EWPolicy *ewpc = (EWPolicy *)((cq->policy).policy_pool[EW]);
  119.     // couple the EW detector 
  120.     if (argc > 3)
  121.       ewp->coupleEW(ewpc, atof(argv[3])); 
  122.     else
  123.       ewp->coupleEW(ewpc); 
  124.     return(TCL_OK);
  125.   };
  126.   // Set a rate limitor
  127.   if (strcmp(argv[1], "limit") == 0) {
  128.     //printf("%d ", argc);
  129.     //for (int i = 1; i < argc; i++) 
  130.     //  printf("%d(%s) ", i, argv[i]);
  131.     //printf("n");
  132.     EWPolicy *ewp = (EWPolicy *)(policy.policy_pool[EW]);
  133.     
  134.     // Packet rate limitor
  135.     if (strcmp(argv[2], "P") == 0) {
  136.       ewp->limitPr(atoi(argv[3]));
  137.       return(TCL_OK);
  138.     } 
  139.     // bits rate limitor
  140.     if (strcmp(argv[2], "B") == 0) {
  141.       ewp->limitBr(atoi(argv[3]));
  142.       return(TCL_OK);
  143.     }
  144.   };
  145.   // Setup an EW detector on a link
  146.   if (strcmp(argv[1], "detect") == 0) {
  147.     //printf("%d ", argc);
  148.     //for (int i = 1; i < argc; i++) 
  149.     //  printf("%d(%s) ", i, argv[i]);
  150.     //printf("n");
  151.     EWPolicy *ewp = (EWPolicy *)(policy.policy_pool[EW]);
  152.     
  153.     if (strcmp(argv[2], "P") == 0) {
  154.       if (argc > 4)
  155. ewp->detectPr(atoi(argv[3]), atoi(argv[4]));
  156.       else if (argc > 3)
  157. ewp->detectPr(atoi(argv[3]));
  158.       else
  159. ewp->detectPr();
  160.       return(TCL_OK);
  161.     } 
  162.     if (strcmp(argv[2], "B") == 0) {
  163.       if (argc > 4)
  164. ewp->detectBr(atoi(argv[3]), atoi(argv[4]));
  165.       else if (argc > 3)
  166. ewp->detectBr(atoi(argv[3]));
  167.       else
  168. ewp->detectBr();
  169.       return(TCL_OK);
  170.     }
  171.   };
  172.   if (strcmp(argv[1], "getCBucket") == 0) {
  173.     Tcl& tcl = Tcl::instance();
  174.     tcl.resultf("%f", policy.getCBucket(argv));
  175.     return(TCL_OK);
  176.   }
  177.   if (strcmp(argv[1], "printPolicyTable") == 0) {
  178.     policy.printPolicyTable();
  179.     return(TCL_OK);
  180.   }
  181.   if (strcmp(argv[1], "printPolicerTable") == 0) {
  182.     policy.printPolicerTable();
  183.     return(TCL_OK);
  184.   }
  185.   
  186.   return(dsREDQueue::command(argc, argv));
  187. }