destclassifier.cc
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:3k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #include "destclassifier.h"
  19. #include "mac802_16.h"
  20. #include "scheduling/wimaxscheduler.h"
  21.   
  22. /**
  23.  * TCL Hooks for the simulator for classifier
  24.  */
  25. static class DestClassifierClass : public TclClass {
  26. public:
  27.   DestClassifierClass() : TclClass("SDUClassifier/Dest") {}
  28.   TclObject* create(int, const char*const*) {
  29.     return (new DestClassifier());
  30.     
  31.   }
  32. } class_destclassifier;
  33. /**
  34.  * Create a classifier in the given mac
  35.  * Constructor to be used by TCL
  36.  */
  37. DestClassifier::DestClassifier (): SDUClassifier () {
  38.   
  39. }
  40. /**
  41.  * Classify a packet and return the CID to use (or -1 if unknown)
  42.  * @param p The packet to classify
  43.  * @return The CID or -1
  44.  */
  45. int DestClassifier::classify (Packet * p) 
  46. {
  47.   struct hdr_mac *dh = HDR_MAC(p);
  48.   int dst = dh->macDA();
  49.   mac_->debug ("At %f in Mac %d DestClassifier classifying packet for %d(size=%d, type=%s)n",
  50.        NOW, mac_->addr(), dst, HDR_CMN(p)->size(), packet_info.name(HDR_CMN(p)->ptype()));
  51.   //here we look at the list of peer nodes until we find the one with 
  52.   //the same destination address. Then we return its data communication
  53.   //if broadcast, then send to broadcast CID
  54.   if (dst == -1) {
  55.     if (mac_->getScheduler()->getNodeType ()==STA_BS)
  56.       return BROADCAST_CID;
  57.     else {
  58.       //I am a MN, check if I am connected
  59.       PeerNode *n = mac_->getPeerNode_head ();
  60.       //i should classify depending on the packet type.TBD
  61.       if (n && n->getSecondary())
  62. return n->getSecondary()->get_cid();
  63.     }
  64.   }
  65.   
  66.   for (PeerNode *n = mac_->getPeerNode_head (); n ; n=n->next_entry()) {
  67.     //printf ("Checking peer %d for %dn", n->getPeerNode(), dst);
  68.     if (dst == n->getPeerNode ()) {
  69.       switch (HDR_CMN(p)->ptype()) {
  70.       case PT_ARP:
  71. #ifdef USE_802_21
  72.       case PT_RRED:
  73.       case PT_RADS:
  74.       case PT_RSOL:
  75. #endif
  76. if (n->getSecondary())
  77.   return n->getSecondary()->get_cid();
  78. break;
  79.       default:
  80. if (n->getOutData())
  81.   return n->getOutData()->get_cid();
  82. else //this node is not ready to send data
  83.   break;
  84.       }
  85.     }
  86.   }
  87.   return -1;
  88. }