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

网络

开发平台:

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 "serviceflowhandler.h"
  19. #include "mac802_16.h"
  20. #include "scheduling/wimaxscheduler.h" 
  21. static int TransactionID = 0; 
  22. /* 
  23.  * Create a service flow
  24.  * @param mac The Mac where it is located
  25.  */
  26. ServiceFlowHandler::ServiceFlowHandler ()
  27. {
  28.   LIST_INIT (&flow_head_);
  29.   LIST_INIT (&pendingflow_head_);
  30. }
  31. /*
  32.  * Set the mac it is located in
  33.  * @param mac The mac it is located in
  34.  */
  35. void ServiceFlowHandler::setMac (Mac802_16 *mac)
  36. {
  37.   assert (mac);
  38.   mac_ = mac;
  39. }
  40. /**
  41.  * Process the given packet. Only service related packets must be sent here.
  42.  * @param p The packet received
  43.  */
  44. void ServiceFlowHandler::process (Packet * p) 
  45.   hdr_mac802_16 *wimaxHdr = HDR_MAC802_16(p);
  46.   gen_mac_header_t header = wimaxHdr->header;
  47.   //we cast to this frame because all management frame start with
  48.   //a type 
  49.   mac802_16_dl_map_frame *frame = (mac802_16_dl_map_frame*) p->accessdata();
  50.   switch (frame->type) {
  51.   case MAC_DSA_REQ: 
  52.     processDSA_req (p);
  53.     break;
  54.   case MAC_DSA_RSP: 
  55.     processDSA_rsp (p);
  56.     break;
  57.   case MAC_DSA_ACK: 
  58.     processDSA_ack (p);
  59.     break;
  60.   default: 
  61.     printf ("Unknow frame type (%d) in flow handlern", frame->type);
  62.   }
  63.   Packet::free (p);
  64. }
  65. /**
  66.  * Add a flow with the given qos
  67.  * @param qos The QoS for the flow
  68.  * @return the created ServiceFlow
  69.  */
  70. ServiceFlow* ServiceFlowHandler::addFlow (ServiceFlowQoS * qos) {
  71.   return NULL;
  72. }
  73. /**
  74.  * Remove the flow given its id
  75.  * @param id The flow id
  76.  */
  77. void ServiceFlowHandler::removeFlow (int id) {
  78.   
  79. }
  80. /**
  81.  * Send a flow request to the given node
  82.  * @param index The node address
  83.  * @param uplink The flow direction
  84.  */
  85. void ServiceFlowHandler::sendFlowRequest (int index, bool uplink)
  86. {
  87.   Packet *p;
  88.   struct hdr_cmn *ch;
  89.   hdr_mac802_16 *wimaxHdr;
  90.   mac802_16_dsa_req_frame *dsa_frame;
  91.   PeerNode *peer;
  92.   //create packet for request
  93.   peer = mac_->getPeerNode(index);  
  94.   p = mac_->getPacket ();
  95.   ch = HDR_CMN(p);
  96.   wimaxHdr = HDR_MAC802_16(p);
  97.   p->allocdata (sizeof (struct mac802_16_dsa_req_frame));
  98.   dsa_frame = (mac802_16_dsa_req_frame*) p->accessdata();
  99.   dsa_frame->type = MAC_DSA_REQ;
  100.   dsa_frame->uplink = uplink;
  101.   dsa_frame->transaction_id = TransactionID++;
  102.   if (mac_->getScheduler()->getNodeType()==STA_MN)
  103.     ch->size() += GET_DSA_REQ_SIZE (0);
  104.   else {
  105.     //assign a CID and include it in the message
  106.     Connection *data = new Connection (CONN_DATA);
  107.     mac_->getCManager()->add_connection (data, uplink);
  108.     if (uplink)
  109.       peer->setInData (data);
  110.     else
  111.       peer->setOutData (data);
  112.     dsa_frame->cid = data->get_cid();
  113.     ch->size() += GET_DSA_REQ_SIZE (1);
  114.   }
  115.   wimaxHdr->header.cid = peer->getPrimary()->get_cid();
  116.   peer->getPrimary()->enqueue (p);
  117. }
  118. /**
  119.  * process a flow request
  120.  * @param p The received request
  121.  */
  122. void ServiceFlowHandler::processDSA_req (Packet *p)
  123. {
  124.   mac_->debug ("At %f in Mac %d received DSA requestn", NOW, mac_->addr());
  125.   
  126.   Packet *rsp;
  127.   struct hdr_cmn *ch;
  128.   hdr_mac802_16 *wimaxHdr_req;
  129.   hdr_mac802_16 *wimaxHdr_rsp;
  130.   mac802_16_dsa_req_frame *dsa_req_frame;
  131.   mac802_16_dsa_rsp_frame *dsa_rsp_frame;
  132.   PeerNode *peer;
  133.   Connection *data;
  134.   //read the request
  135.   wimaxHdr_req = HDR_MAC802_16(p);
  136.   dsa_req_frame = (mac802_16_dsa_req_frame*) p->accessdata();
  137.   peer = mac_->getCManager ()->get_connection (wimaxHdr_req->header.cid, true)->getPeerNode();
  138.   
  139.   //allocate response
  140.   //create packet for request
  141.   rsp = mac_->getPacket ();
  142.   ch = HDR_CMN(rsp);
  143.   wimaxHdr_rsp = HDR_MAC802_16(rsp);
  144.   rsp->allocdata (sizeof (struct mac802_16_dsa_rsp_frame));
  145.   dsa_rsp_frame = (mac802_16_dsa_rsp_frame*) rsp->accessdata();
  146.   dsa_rsp_frame->type = MAC_DSA_RSP;
  147.   dsa_rsp_frame->transaction_id = dsa_req_frame->transaction_id;
  148.   dsa_rsp_frame->uplink = dsa_req_frame->uplink;
  149.   dsa_rsp_frame->confirmation_code = 0; //OK
  150.   if (mac_->getScheduler()->getNodeType()==STA_MN) {
  151.     //the message contains the CID for the connection
  152.     data = new Connection (CONN_DATA, dsa_req_frame->cid);
  153.     mac_->getCManager()->add_connection (data, dsa_req_frame->uplink);
  154.     if (dsa_req_frame->uplink)
  155.       peer->setOutData (data);
  156.     else
  157.       peer->setInData (data);
  158.     ch->size() += GET_DSA_RSP_SIZE (0);
  159.   } else {
  160.     //allocate new connection
  161.     data = new Connection (CONN_DATA);
  162.     mac_->getCManager()->add_connection (data, dsa_req_frame->uplink);
  163.     if (dsa_req_frame->uplink)
  164.       peer->setInData (data);
  165.     else
  166.       peer->setOutData (data);
  167.     dsa_rsp_frame->cid = data->get_cid();
  168.     ch->size() += GET_DSA_RSP_SIZE (1);
  169.   }
  170.   wimaxHdr_rsp->header.cid = peer->getPrimary()->get_cid();
  171.   peer->getPrimary()->enqueue (rsp);
  172. }
  173. /**
  174.  * process a flow response
  175.  * @param p The received response
  176.  */
  177. void ServiceFlowHandler::processDSA_rsp (Packet *p)
  178. {
  179.   mac_->debug ("At %f in Mac %d received DSA responsen", NOW, mac_->addr());
  180.   Packet *ack;
  181.   struct hdr_cmn *ch;
  182.   hdr_mac802_16 *wimaxHdr_ack;
  183.   hdr_mac802_16 *wimaxHdr_rsp;
  184.   mac802_16_dsa_ack_frame *dsa_ack_frame;
  185.   mac802_16_dsa_rsp_frame *dsa_rsp_frame;
  186.   Connection *data;
  187.   PeerNode *peer;
  188.   //read the request
  189.   wimaxHdr_rsp = HDR_MAC802_16(p);
  190.   dsa_rsp_frame = (mac802_16_dsa_rsp_frame*) p->accessdata();
  191.   peer = mac_->getCManager ()->get_connection (wimaxHdr_rsp->header.cid, true)->getPeerNode();
  192.   
  193.   //TBD: check if status not OK
  194.   if (mac_->getScheduler()->getNodeType()==STA_MN) {
  195.     //the message contains the CID for the connection
  196.     data = new Connection (CONN_DATA, dsa_rsp_frame->cid);
  197.     mac_->getCManager()->add_connection (data, dsa_rsp_frame->uplink);
  198.     if (dsa_rsp_frame->uplink)
  199.       peer->setOutData (data);
  200.     else
  201.       peer->setInData (data);
  202.   }
  203.   //allocate ack
  204.   //create packet for request
  205.   ack = mac_->getPacket ();
  206.   ch = HDR_CMN(ack);
  207.   wimaxHdr_ack = HDR_MAC802_16(ack);
  208.   ack->allocdata (sizeof (struct mac802_16_dsa_ack_frame));
  209.   dsa_ack_frame = (mac802_16_dsa_ack_frame*) ack->accessdata();
  210.   dsa_ack_frame->type = MAC_DSA_ACK;
  211.   dsa_ack_frame->transaction_id = dsa_rsp_frame->transaction_id;
  212.   dsa_ack_frame->uplink = dsa_rsp_frame->uplink;
  213.   dsa_ack_frame->confirmation_code = 0; //OK
  214.   ch->size() += DSA_ACK_SIZE;
  215.   wimaxHdr_ack->header.cid = peer->getPrimary()->get_cid();
  216.   peer->getPrimary()->enqueue (ack);
  217. }
  218. /**
  219.  * process a flow request
  220.  * @param p The received response
  221.  */
  222. void ServiceFlowHandler::processDSA_ack (Packet *p)
  223. {
  224.   mac_->debug ("At %f in Mac %d received DSA ackn", NOW, mac_->addr());
  225. }