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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 The 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 Network Research
  17.  *  Group at Lawrence Berkeley National Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    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.  * $Header: /cvsroot/nsnam/ns-2/classifier/classifier-hash.h,v 1.9 2005/09/18 23:33:31 tomh Exp $
  35.  */
  36. #include "classifier.h"
  37. #include "ip.h"
  38. class Flow;
  39. /* class defs for HashClassifier (base), SrcDest, SrcDestFid HashClassifiers */
  40. class HashClassifier : public Classifier {
  41. public:
  42. HashClassifier(int keylen) : default_(-1), keylen_(keylen) {
  43. // shift + mask picked up from underlying Classifier object
  44. bind("default_", &default_);
  45. Tcl_InitHashTable(&ht_, keylen);
  46. }
  47. ~HashClassifier() {
  48. Tcl_DeleteHashTable(&ht_);
  49. };
  50. virtual int classify(Packet *p);
  51. virtual long lookup(Packet* p) {
  52. hdr_ip* h = hdr_ip::access(p);
  53. return get_hash(mshift(h->saddr()), mshift(h->daddr()), 
  54. h->flowid());
  55. }
  56. virtual long unknown(Packet* p) {
  57. hdr_ip* h = hdr_ip::access(p);
  58. Tcl::instance().evalf("%s unknown-flow %u %u %u",
  59.       name(), h->saddr(), h->daddr(),
  60.       h->flowid()); 
  61. return lookup(p);
  62. };
  63. void set_default(int slot) { default_ = slot; } 
  64. int do_set_hash(nsaddr_t src, nsaddr_t dst, int fid, int slot) {
  65. return (set_hash(src,dst,fid,slot));
  66. }
  67. void set_table_size(int nn) {}
  68. protected:
  69. union hkey {
  70. struct {
  71. int fid;
  72. } Fid;
  73. struct {
  74. nsaddr_t dst;
  75. } Dst;
  76. struct {
  77. nsaddr_t src, dst;
  78. } SrcDst;
  79. struct {
  80. nsaddr_t src, dst;
  81. int fid;
  82. } SrcDstFid;
  83. };
  84. long lookup(nsaddr_t src, nsaddr_t dst, int fid) {
  85. return get_hash(src, dst, fid);
  86. }
  87. int newflow(Packet* pkt) {
  88. hdr_ip* h = hdr_ip::access(pkt);
  89. Tcl::instance().evalf("%s unknown-flow %u %u %u",
  90.       name(), h->saddr(), h->daddr(),
  91.       h->flowid()); 
  92. return lookup(pkt);
  93. };
  94. void reset() {
  95. Tcl_DeleteHashTable(&ht_);
  96. Tcl_InitHashTable(&ht_, keylen_);
  97. }
  98. virtual const char* hashkey(nsaddr_t, nsaddr_t, int)=0; 
  99. int set_hash(nsaddr_t src, nsaddr_t dst, int fid, long slot) {
  100. int newEntry;
  101. Tcl_HashEntry *ep= Tcl_CreateHashEntry(&ht_,
  102.        hashkey(src, dst, fid),
  103.        &newEntry); 
  104. if (ep) {
  105. Tcl_SetHashValue(ep, slot);
  106. return slot;
  107. }
  108. return -1;
  109. }
  110. long get_hash(nsaddr_t src, nsaddr_t dst, int fid) {
  111. Tcl_HashEntry *ep= Tcl_FindHashEntry(&ht_, 
  112.      hashkey(src, dst, fid)); 
  113. if (ep)
  114. return (long)Tcl_GetHashValue(ep);
  115. return -1;
  116. }
  117. virtual int command(int argc, const char*const* argv);
  118. int default_;
  119. Tcl_HashTable ht_;
  120. hkey buf_;
  121. int keylen_;
  122. };
  123. class SrcDestFidHashClassifier : public HashClassifier {
  124. public:
  125. SrcDestFidHashClassifier() : HashClassifier(3) {
  126. }
  127. protected:
  128. const char* hashkey(nsaddr_t src, nsaddr_t dst, int fid) {
  129. buf_.SrcDstFid.src= mshift(src);
  130. buf_.SrcDstFid.dst= mshift(dst);
  131. buf_.SrcDstFid.fid= fid;
  132. return (const char*) &buf_;
  133. }
  134. };
  135. class SrcDestHashClassifier : public HashClassifier {
  136. public:
  137. SrcDestHashClassifier() : HashClassifier(2) {
  138. int command(int argc, const char*const* argv);
  139. int classify(Packet *p);
  140. }
  141. protected:
  142. const char*  hashkey(nsaddr_t src, nsaddr_t dst, int) {
  143. buf_.SrcDst.src= mshift(src);
  144. buf_.SrcDst.dst= mshift(dst);
  145. return (const char*) &buf_;
  146. }
  147. };
  148. class FidHashClassifier : public HashClassifier {
  149. public:
  150. FidHashClassifier() : HashClassifier(TCL_ONE_WORD_KEYS) {
  151. }
  152. protected:
  153. const char* hashkey(nsaddr_t, nsaddr_t, int fid) {
  154. long key = fid;
  155. return (const char*) key;
  156. }
  157. };
  158. class DestHashClassifier : public HashClassifier {
  159. public:
  160. DestHashClassifier() : HashClassifier(TCL_ONE_WORD_KEYS) {}
  161. virtual int command(int argc, const char*const* argv);
  162. int classify(Packet *p);
  163. virtual void do_install(char *dst, NsObject *target);
  164. protected:
  165. const char* hashkey(nsaddr_t, nsaddr_t dst, int) {
  166. long key = mshift(dst);
  167. return (const char*) key;
  168. }
  169. };