| 292 | } |
| 293 | |
| 294 | void |
| 295 | MulticastDataLink::sample_received(ReceivedDataSample& sample) |
| 296 | { |
| 297 | switch (sample.header_.message_id_) { |
| 298 | case TRANSPORT_CONTROL: { |
| 299 | // Transport control samples are delivered to all sessions |
| 300 | // regardless of association status: |
| 301 | { |
| 302 | Message_Block_Ptr payload(sample.data()); |
| 303 | char* const ptr = payload ? payload->rd_ptr() : 0; |
| 304 | |
| 305 | ACE_GUARD(ACE_SYNCH_RECURSIVE_MUTEX, |
| 306 | guard, |
| 307 | this->session_lock_); |
| 308 | |
| 309 | const TransportHeader& theader = receive_strategy()->received_header(); |
| 310 | |
| 311 | if (!is_active() && sample.header_.submessage_id_ == MULTICAST_SYN && |
| 312 | sessions_.find(theader.source_) == sessions_.end()) { |
| 313 | // We have received a SYN but there is no session (yet) for this source. |
| 314 | // Depending on the data, we may need to send SYNACK. |
| 315 | |
| 316 | guard.release(); |
| 317 | syn_received_no_session(theader.source_, payload, |
| 318 | theader.swap_bytes()); |
| 319 | |
| 320 | guard.acquire(); |
| 321 | MulticastSessionMap::iterator s_itr = sessions_.find(theader.source_); |
| 322 | if (s_itr != sessions_.end()) { |
| 323 | s_itr->second->record_header_received(theader); |
| 324 | } |
| 325 | |
| 326 | if (ptr) { |
| 327 | payload->rd_ptr(ptr); |
| 328 | } |
| 329 | return; |
| 330 | } |
| 331 | |
| 332 | MulticastSessionMap temp_sessions(sessions_); |
| 333 | guard.release(); |
| 334 | |
| 335 | for (MulticastSessionMap::iterator it(temp_sessions.begin()); |
| 336 | it != temp_sessions.end(); ++it) { |
| 337 | it->second->control_received(sample.header_.submessage_id_, |
| 338 | payload); |
| 339 | it->second->record_header_received(theader); |
| 340 | |
| 341 | // reset read pointer |
| 342 | if (ptr) { |
| 343 | payload->rd_ptr(ptr); |
| 344 | } |
| 345 | } |
| 346 | } |
| 347 | } break; |
| 348 | |
| 349 | default: |
| 350 | |
| 351 | if (ready_to_deliver(sample)) { |
no test coverage detected