NSIS-ka
A free C++ implementation of NSIS protocols

Changeset 4557


Ignore:
Timestamp:
Oct 14, 2009, 3:12:19 PM (8 years ago)
Author:
roehricht
Message:
  • Revert changes to process_query_msg() of last two commits as long as correctness of changes cannot be validated
File:
1 edited

Legend:

Unmodified
Added
Removed
  • qos-nslp/trunk/src/QoS_StateModule.cpp

    r4555 r4557  
    327327                  const ntlp::sessionid* rcvd_sid, const ntlp::mri_pathcoupled* rcvd_mri)
    328328{
    329         querymsg* query;
    330 
    331         bound_sessionid* send_bs = NULL;
    332         bool found = false;
    333 
    334         query = dynamic_cast<querymsg*>(known_pdu);
    335 
    336         NSLP_Context* context = rcvd_sid ? contextmap.find(*rcvd_sid) : 0;
    337 
    338         if (context)
    339                 ILog(state_manager::modname, "process_query_msg(), Found context");
     329  querymsg* query;
     330
     331  bound_sessionid* send_bs = NULL;
     332  bound_sessionid* bs = NULL;
     333  bool found = false;
     334  ILog(state_manager::modname, "process_query_msg()");
     335
     336  query = dynamic_cast<querymsg*>(known_pdu);
     337
     338  NSLP_Context* context = rcvd_sid ? contextmap.find(*rcvd_sid) : 0;
     339
     340  if (context)
     341    ILog(state_manager::modname, "process_query_msg(), Found context!");
     342
     343  cout << (*query);
     344  qspec_object* q = dynamic_cast<qspec_object*>(query->get_qspec());
     345
     346  // ???????????????????????????????????????????
     347  /*
     348    if (q) {
     349    if (!rmf_admin) {
     350    rmf_admin = new rmf();
     351    }
     352    rmf_admin->process_qspec_in_query(q);
     353    }
     354  */
     355
     356  NSLP_Context::qn_type_t type = NSLP_Context::QNE;
     357
     358  const bound_sessionid* rcvd_b_sid = query->get_bound_sid();
     359  if (context) {
     360    context->lock();
     361    type= context->get_qn_type();
     362    context->set_downstream(down);
     363    context->set_mri(rcvd_mri);
     364    context->unlock();
     365    //================================= process RII ======================================
     366    rii* r = query->get_rii();
     367    if (r) {   
     368      uint32 rii_number;
     369      r->get(rii_number);
     370      ILog(state_manager::modname, "RII in QUERY existing " << rii_number);
     371
     372      if (type != NSLP_Context::QNR) {
     373        // check if the RII number already existing
     374        NSLP_Context::rii_hashmap_it_t rii_hit;
     375        context->lock();
     376        if ((rii_hit=context->rii_hashmap.find(rii_number))!=context->rii_hashmap.end())
     377          {
     378            ILog(state_manager::modname, "FOUND RII " << rii_number << " in HASHMAP! Is it my entry?");
     379            rii* found_context_rii = rii_hit->second;
     380            context->unlock();
     381            if (found_context_rii->get_own()) {
     382              ERRLog(state_manager::modname, "Another node has sent a message with the duplicated RII!!!");
     383              send_response_with_rii(r, type == NSLP_Context::QNR, !down, rcvd_sid, rcvd_mri,
     384                                     info_spec::transient, info_spec::RIIconflict);
     385              return;
     386            }
     387          }
     388        else {
     389          context->unlock();
     390        }
     391      }  // end if not QNR
     392
     393      if (type == NSLP_Context::QNR)
     394        send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
     395      else {
     396        if (query->is_scoping_flag())
     397          send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
    340398        else
    341                 ILog(state_manager::modname, "process_query_msg(), No context");
    342 
    343         qspec_object* q = dynamic_cast<qspec_object*>(query->get_qspec());
    344 
    345         // TODO
    346         /*
    347         if (q) {
    348                 if (!rmf_admin)
    349                         rmf_admin = new rmf();
    350                 rmf_admin->process_qspec_in_query(q);
    351         }
    352         */
    353 
    354         const bound_sessionid* rcvd_b_sid = query->get_bound_sid();
    355 
    356         if (context) {
    357                 NSLP_Context::qn_type_t type = NSLP_Context::QNE;
    358                 context->lock();
    359                 type = context->get_qn_type();
    360                 context->set_downstream(down);
    361                 context->set_mri(rcvd_mri);
    362                 context->unlock();
    363 
    364                 //=========================== process RII ================================
    365                 rii* r = query->get_rii();
    366                 if (r) {
    367                         uint32 rii_number;
    368                         r->get(rii_number);
    369                         ILog(state_manager::modname, "RII in QUERY existing " << rii_number);
    370 
    371                         if (type != NSLP_Context::QNR) {
    372                                 // check if the RII number already existing
    373                                 NSLP_Context::rii_hashmap_it_t rii_hit;
    374                                 context->lock();
    375                                 if ((rii_hit=context->rii_hashmap.find(rii_number))!=context->rii_hashmap.end()) {
    376                                         ILog(state_manager::modname, "FOUND RII " << rii_number << " in hashmap. Is it my entry?");
    377                                         rii* found_context_rii = rii_hit->second;
    378                                         context->unlock();
    379                                         if (found_context_rii->get_own()) {
    380                                                 ERRLog(state_manager::modname, "Another node has sent a message with the duplicated RII!!!");
    381                                                 send_response_with_rii(r, type == NSLP_Context::QNR, !down, rcvd_sid, rcvd_mri,
    382                                                                 info_spec::transient, info_spec::RIIconflict);
    383                                                 return;
    384                                         }
    385                                 }
    386                                 else {
    387                                         context->unlock();
    388                                 }
    389                         }  // end if not QNR
    390 
    391                         if (type == NSLP_Context::QNR)
    392                                 send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
    393                         else {
    394                                 if (query->is_scoping_flag())
    395                                         send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
    396                                 else
    397                                         forward_query_msg(query, down, rcvd_sid, rcvd_mri);
    398                         }
    399                 }  // end if RII existing
    400                 else {
    401                         // if I'm the QNR I should respond to the Query
    402                         if (query->is_reserve_init_flag() && is_last_signaling_hop(rcvd_mri))
    403                                 // create RESERVE msg, send to QUERY initiator
    404                                 create_and_send_reserve_msg_as_response_to_query(true, q, rcvd_b_sid, !down, rcvd_sid, rcvd_mri, context);
    405                         else if (query->is_reserve_init_flag())
    406                                 forward_query_msg(query, down, rcvd_sid, rcvd_mri);
    407                         else // I'm a QNE, so simply forward this QUERY
    408                                 ERRLog(state_manager::modname, "Reservation existing! Wrong message requesting new reservation!");
    409                 }
    410 
    411                 //========================== process BOUND_SESSIONID ================================
    412                 if (rcvd_b_sid) {
    413                         DLog(state_manager::modname, "process_query_msg() - saving BOUND_SID ["
    414                                         << rcvd_b_sid->to_string() << "]");
    415                         context->lock();
    416                         context->set_bound_s_id(*rcvd_b_sid);
    417                         context->unlock();
    418                 }
    419                 else {
    420                         if (type != NSLP_Context::QNR) {
    421                                 // check, if there is a BOUND_SESSIONID saved for this SID
    422                                 uint128 saved_b_sid;
    423                                 context->lock();
    424                                 found = context->get_bound_s_id(saved_b_sid);
    425                                 context->unlock();
    426                                 if (found) {
    427                                         ILog(state_manager::modname, "Found saved BOUND_SID. "
    428                                                         << "Setting BOUND_SESSIONID in QUERY message to ["
    429                                                         << saved_b_sid << "]");
    430                                         send_bs = new bound_sessionid();
    431                                         send_bs->set(saved_b_sid);
    432                                 } 
    433                         }
    434                 }
    435         } // end if context found
    436 
    437         // no context found
     399          forward_query_msg(query, down, rcvd_sid, rcvd_mri);
     400      }
     401    }  // end if RII existing
     402    else {
     403      // if I'm the QNR I should respond to the Query
     404      if ( query->is_reserve_init_flag() && is_last_signaling_hop(rcvd_mri) ) {
     405        // create RESERVE msg, send to QUERY initiator
     406        create_and_send_reserve_msg_as_response_to_query(true, q, rcvd_b_sid, !down, rcvd_sid, rcvd_mri, context);
     407      }
     408      else if (query->is_reserve_init_flag()) {
     409        forward_query_msg(query, down, rcvd_sid, rcvd_mri);
     410      }
     411      else { // I'm a QNE, so simply forward this QUERY
     412        ERRLog(state_manager::modname, "Reservation existing! Wrong message requesting new reservation!!!");
     413      }
     414    }
     415
     416    //========================== process BOUND_SESSIONID ================================
     417    if (rcvd_b_sid) {
     418      DLog(state_manager::modname, "process_query_msg() - saving BOUND_SID [" << rcvd_b_sid->to_string() << "]");
     419      context->lock();
     420      context->set_bound_s_id(*rcvd_b_sid);
     421      context->unlock();
     422    }
     423    else {
     424      if (type != NSLP_Context::QNR) {
     425        // check, if there is a BOUND_SESSIONID saved for this SID
     426        uint128 saved_b_sid;
     427        context->lock();
     428        found = context->get_bound_s_id(saved_b_sid);
     429        context->unlock();
     430        if (found) {
     431          ILog(state_manager::modname, "Found saved BOUND_SID. Setting BOUND_SESSIONID in QUERY message to [" << saved_b_sid << "]");
     432          send_bs = new bound_sessionid();
     433          send_bs->set(saved_b_sid);
     434        } 
     435      }
     436    }
     437  } // end if context found
     438  else {
     439    // no context so far
     440    if (rcvd_b_sid) {
     441      bs = new bound_sessionid(*rcvd_b_sid);
     442    }
     443    else {
     444      if (send_bs) {
     445        bs = new bound_sessionid(*send_bs);
     446      }
     447    }
     448
     449    //================================ process RII ======================================
     450    rii* r = query->get_rii();
     451    if (r) {
     452      // if it RII is present, it cannot have the R flag set
     453      ILog(state_manager::modname, "RII existing!");
     454      // XXX: this test should be "is_last_signaling_hop(rcvd_mri)" ?!?
     455      if (type == NSLP_Context::QNR) {
     456        send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
     457      }
     458      else {
     459        if (query->is_scoping_flag()) {
     460          send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
     461        }
    438462        else {
    439                 bound_sessionid* bound_session_id = NULL;
    440                 // no context so far
    441                 if (rcvd_b_sid)
    442                         bound_session_id = new bound_sessionid(*rcvd_b_sid);
    443 
    444                 //============================ process RII =================================
    445                 rii* r = query->get_rii();
    446                 if (r) {
    447                         // if it RII is present, it cannot have the R flag set
    448                         ILog(state_manager::modname, "RII existing!");
    449                         if (is_last_signaling_hop(rcvd_mri))
    450                                 send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
    451                         else {
    452                                 if (query->is_scoping_flag())
    453                                         send_response_to_query(r, q, !down, rcvd_sid, rcvd_mri);
    454                                 else {
    455                                         // set BOUND_SESSION_ID for QUERY if present
    456                                         if (bound_session_id)
    457                                                 query->set_bound_sid(bound_session_id);
    458                                         forward_query_msg(query, down, rcvd_sid, rcvd_mri);
    459                                 }
    460                         }
    461                 }  // end if RII existing
    462                
    463                 // no RII present
    464                 else {
    465 
    466                         // if I'm the QNR I should respond to the Query
    467                         if ( query->is_reserve_init_flag() && is_last_signaling_hop(rcvd_mri) ) {
    468                                 // create RESERVE msg, send to QUERY initiator
    469                                 create_and_send_reserve_msg_as_response_to_query(true, q, rcvd_b_sid, !down, rcvd_sid, rcvd_mri, 0);
    470                         }
    471                         else { // I'm a QNE, so simply forward this QUERY
    472                                 // HA TEnter
    473                                 if (down && addresses->addr_is_in(rcvd_mri->get_destaddress(), AddressList::HomeNet_P)) {
    474                                         ntlp::mri_pathcoupled *logical_tmri = rcvd_mri->copy();
    475                                         hostaddress *my_src = dynamic_cast<hostaddress *>(addresses->get_first(AddressList::HAAddr_P, rcvd_mri->get_destaddress().is_ipv4()));
    476                                         logical_tmri->set_sourceaddress(*my_src);
    477 
    478                                         querymsg* tunnel_query = new querymsg();
    479                                         copy_query_message(query, tunnel_query);
    480 
    481                                         tunnel_query->set_originator(true);
    482                                         known_nslp_pdu *pdu = dynamic_cast<known_nslp_pdu*>(tunnel_query);
    483                                         SignalingMsg* sigmsg = new SignalingMsg();
    484                                         sigmsg->set_msg(pdu);
    485 
    486                                         sigmsg->set_sig_mri(logical_tmri);
    487 
    488                                         sigmsg->set_downstream(down);
    489 
    490                                         uint128 tsid;
    491 
    492                                         ntlp::sessionid* sid = new sessionid();
    493                                         sid->generate_random();
    494                                         sid->generate_random();
    495                                         tsid = *sid;
    496 
    497                                         bound_sessionid* send_bs = new bound_sessionid();
    498                                         send_bs->set(tsid);
    499 
    500                                         query->set_bound_sid(send_bs);
    501 
    502                                         sigmsg->set_sid(tsid);
    503                                         sigmsg->send_or_delete();
    504                                 }
    505 
    506                                 // set BOUND_SESSION_ID for QUERY if present
    507                                 if (bound_session_id)
    508                                         query->set_bound_sid(bound_session_id);
    509                                 forward_query_msg(query, down, rcvd_sid, rcvd_mri);
    510                         }
    511                 } // end else
    512         }  // end no context
    513         ILog(state_manager::modname,"END process_query_msg()");
     463          forward_query_msg(query, down, rcvd_sid, rcvd_mri);
     464        }
     465      }
     466    }  // end if RII existing
     467    else { // no RII present
     468     
     469      // if I'm the QNR I should respond to the Query
     470      if ( query->is_reserve_init_flag() && is_last_signaling_hop(rcvd_mri) ) {
     471        // create RESERVE msg, send to QUERY initiator
     472        create_and_send_reserve_msg_as_response_to_query(true, q, rcvd_b_sid, !down, rcvd_sid, rcvd_mri, 0);
     473      }
     474      else { // I'm a QNE, so simply forward this QUERY
     475        // HA TEnter
     476        if (down && addresses->addr_is_in(rcvd_mri->get_destaddress(), AddressList::HomeNet_P)) {
     477          ntlp::mri_pathcoupled *logical_tmri = rcvd_mri->copy();
     478          hostaddress *my_src = dynamic_cast<hostaddress *>(addresses->get_first(AddressList::HAAddr_P, rcvd_mri->get_destaddress().is_ipv4()));
     479          logical_tmri->set_sourceaddress(*my_src);
     480
     481          uint128 tsid;
     482
     483          querymsg* tunnel_query = new querymsg();
     484          copy_query_message(query, tunnel_query);
     485
     486          tunnel_query->set_originator(true);
     487          known_nslp_pdu *pdu = dynamic_cast<known_nslp_pdu*>(tunnel_query);
     488          SignalingMsg* sigmsg = new SignalingMsg();
     489          sigmsg->set_msg(pdu);
     490
     491          sigmsg->set_sig_mri(logical_tmri);
     492
     493          sigmsg->set_downstream(down);
     494
     495          ntlp::sessionid* sid = new sessionid();
     496          sid->generate_random();
     497          sid->generate_random();
     498          tsid = *sid;
     499
     500          bound_sessionid* send_bs = new bound_sessionid();
     501          send_bs->set(tsid);
     502
     503          query->set_bound_sid(send_bs);
     504
     505          sigmsg->set_sid(tsid);
     506          sigmsg->send_or_delete();
     507        }
     508
     509        forward_query_msg(query, down, rcvd_sid, rcvd_mri);
     510      }
     511
     512    } // end else
     513  }  // end no context
     514  ILog(state_manager::modname,"END process_query_msg()");
    514515}
    515516
Note: See TracChangeset for help on using the changeset viewer.