Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(639)

Side by Side Diff: src/common/packet.cc

Issue 109068: Ns-3 MPI Distributed Simulation (Closed)
Patch Set: Updates after Faker's comments Created 14 years, 4 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /* 2 /*
3 * Copyright (c) 2005,2006 INRIA 3 * Copyright (c) 2005,2006 INRIA
4 * 4 *
5 * This program is free software; you can redistribute it and/or modify 5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as 6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation; 7 * published by the Free Software Foundation;
8 * 8 *
9 * This program is distributed in the hope that it will be useful, 9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 Packet::Packet (uint32_t size) 177 Packet::Packet (uint32_t size)
178 : m_buffer (size), 178 : m_buffer (size),
179 m_byteTagList (), 179 m_byteTagList (),
180 m_packetTagList (), 180 m_packetTagList (),
181 m_metadata (m_globalUid, size), 181 m_metadata (m_globalUid, size),
182 m_nixVector (0), 182 m_nixVector (0),
183 m_refCount (1) 183 m_refCount (1)
184 { 184 {
185 m_globalUid++; 185 m_globalUid++;
186 } 186 }
187 Packet::Packet (uint32_t mpiRank, uint32_t uid, uint32_t size)
craigdo 2009/11/13 20:20:02 Okay, this means we have nix-specific code in our
188 : m_buffer (size),
189 m_byteTagList (),
190 m_packetTagList (),
191 m_metadata (mpiRank, uid, size),
192 m_nixVector (0),
193 m_refCount (1)
194 {}
195
187 Packet::Packet (uint8_t const*buffer, uint32_t size) 196 Packet::Packet (uint8_t const*buffer, uint32_t size)
188 : m_buffer (), 197 : m_buffer (),
189 m_byteTagList (), 198 m_byteTagList (),
190 m_packetTagList (), 199 m_packetTagList (),
191 m_metadata (m_globalUid, size), 200 m_metadata (m_globalUid, size),
192 m_nixVector (0), 201 m_nixVector (0),
193 m_refCount (1) 202 m_refCount (1)
194 { 203 {
195 m_globalUid++; 204 m_globalUid++;
196 m_buffer.AddAtStart (size); 205 m_buffer.AddAtStart (size);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 { 394 {
386 return m_buffer.CopyData (os, size); 395 return m_buffer.CopyData (os, size);
387 } 396 }
388 397
389 uint32_t· 398 uint32_t·
390 Packet::GetUid (void) const 399 Packet::GetUid (void) const
391 { 400 {
392 return m_metadata.GetUid (); 401 return m_metadata.GetUid ();
393 } 402 }
394 403
404 uint32_t·
405 Packet::GetMpiRank (void) const
406 {
407 return m_metadata.GetMpiRank ();
408 }
409
395 void· 410 void·
396 Packet::PrintByteTags (std::ostream &os) const 411 Packet::PrintByteTags (std::ostream &os) const
397 { 412 {
398 ByteTagIterator i = GetByteTagIterator (); 413 ByteTagIterator i = GetByteTagIterator ();
399 while (i.HasNext ()) 414 while (i.HasNext ())
400 { 415 {
401 ByteTagIterator::Item item = i.Next (); 416 ByteTagIterator::Item item = i.Next ();
402 os << item.GetTypeId ().GetName () << " [" << item.GetStart () << "-" << i tem.GetEnd () << "]"; 417 os << item.GetTypeId ().GetName () << " [" << item.GetStart () << "-" << i tem.GetEnd () << "]";
403 Callback<ObjectBase *> constructor = item.GetTypeId ().GetConstructor (); 418 Callback<ObjectBase *> constructor = item.GetTypeId ().GetConstructor ();
404 if (constructor.IsNull ()) 419 if (constructor.IsNull ())
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 PacketMetadata::Enable (); 567 PacketMetadata::Enable ();
553 } 568 }
554 569
555 void 570 void
556 Packet::EnableChecking (void) 571 Packet::EnableChecking (void)
557 { 572 {
558 NS_LOG_FUNCTION_NOARGS (); 573 NS_LOG_FUNCTION_NOARGS ();
559 PacketMetadata::EnableChecking (); 574 PacketMetadata::EnableChecking ();
560 } 575 }
561 576
577 Buffer
578 Packet::SerializeForMpi (void) const
craigdo 2009/11/13 20:20:02 There's got to be a better way. This is the begin
579 {
580 /*
581 This function stores the following·
582 information in the buffer to be·
583 transmitted via MPI:
584
585 ------------------------------------
586 | UID (4B) |
587 ------------------------------------
588 | rank (4B) |
589 ------------------------------------
590 | Nix-vector Length (4B) |
591 ------------------------------------
592 | Nix-vector (x4B) |
593 ------------------------------------
594 | Tags |
595 ------------------------------------
596 | Meta-data |
597 ------------------------------------
598 | Zero-byte data Length (4B) |
599 ------------------------------------
600 | Packet (start) buffer Length (4B) |
601 ------------------------------------
602 | Packet (start) buffer |
603 ------------------------------------
604 | Packet (end) buffer Length (4B) |
605 ------------------------------------
606 | Packet (end) buffer |
607 ------------------------------------
608
609 */
610
611 NS_LOG_FUNCTION (this);
612 Buffer writeBuffer;
613
614 // write Packet byte buffer
615 writeBuffer = m_buffer.CreateLimitedCopy ();
616
617 // write Meta-data
618 uint32_t metaReserve = m_metadata.GetSerializedSize ();
619 writeBuffer.AddAtStart (metaReserve);
620 m_metadata.Serialize (writeBuffer.Begin (), metaReserve);
621
622 // write Tags
623 //XXX
624 //reserve = m_tags.GetSerializedSize ();
625 //buffer.AddAtStart (reserve);
626 //m_tags.Serialize (buffer.Begin (), reserve);
627
628 // write Nix-vector
629 if (m_nixVector)
630 {
631 uint32_t nixReserve = m_nixVector->GetSerializedSize ();
632 writeBuffer.AddAtStart (nixReserve);
633 m_nixVector->Serialize (writeBuffer.Begin(), nixReserve);
634 }
635 else
636 {
637 writeBuffer.AddAtStart (4);
638 writeBuffer.Begin ().WriteU32 (0);
639 }
640
641 // write Rank
642 writeBuffer.AddAtStart (4);
643 if (MPIInterface::IsEnabled ())
644 writeBuffer.Begin ().WriteU32 (MPIInterface::Rank ());
645 else
646 writeBuffer.Begin ().WriteU32 (0);
647
648 // write UID
649 writeBuffer.AddAtStart (4);
650 writeBuffer.Begin ().WriteU32 (GetUid ());
651
652 return writeBuffer;
653 }
654
655 void·
656 Packet::DeserializeForMpi (Buffer buffer)
657 {
658 NS_LOG_FUNCTION (this);
659
660 // uid and rank have already been stripped·
661 // off immediately before calling this·
662 // function. So we start with the nix-vector.
663
664 // read nix-vector
665 NS_ASSERT (!m_nixVector);
666 if (buffer.Begin ().ReadU32 ())
667 {
668 Ptr<NixVector> nix = CreateObject<NixVector> ();
669 uint32_t nixDeserialized = nix->Deserialize (buffer.Begin ());
670 m_nixVector = nix;
671 buffer.RemoveAtStart (nixDeserialized);
672 }
673 else
674 buffer.RemoveAtStart (4);
675
676 // read tags
677 //XXX
678 //uint32_t tagsDeserialized = m_tags.Deserialize (buffer.Begin ());
679 //buffer.RemoveAtStart (tagsDeserialized);
680
681 // read metadata
682 uint32_t metadataDeserialized =·
683 m_metadata.Deserialize (buffer.Begin ());
684 buffer.RemoveAtStart (metadataDeserialized);
685
686 // read zero-byte length
687 uint32_t zeroByteLength = buffer.Begin ().ReadU32 ();
688 Buffer zeroByteBuffer (zeroByteLength);
689 buffer.RemoveAtStart (4);
690
691 // read (start) packet buffer
692 uint32_t startLength = buffer.Begin ().ReadU32 ();
693 buffer.RemoveAtStart (4);
694 Buffer startBuffer = buffer;
695 buffer.RemoveAtStart (startLength);
696
697 // read (end) packet buffer
698 uint32_t endLength = buffer.Begin ().ReadU32 ();
699 buffer.RemoveAtStart (4);
700
701 // remove end buffer from start buffer
702 startBuffer.RemoveAtEnd (endLength+4);
703
704 // fill in m_buffer with everything in·
705 // the right order
706 // something strange happened when I tried to use·
707 // AddAtEnd to add the end data (after the zero-byte),
708 // so i used Write instead
709 zeroByteBuffer.AddAtStart (startLength);
710 zeroByteBuffer.Begin ().Write (startBuffer.PeekData (), startLength);
711 zeroByteBuffer.AddAtEnd (endLength);
712 zeroByteBuffer.End ().Write (buffer.PeekData (), endLength);
713 buffer.RemoveAtStart (endLength);
714 m_buffer = zeroByteBuffer;
715 }
716
562 Buffer· 717 Buffer·
563 Packet::Serialize (void) const 718 Packet::Serialize (void) const
564 { 719 {
565 NS_LOG_FUNCTION (this); 720 NS_LOG_FUNCTION (this);
566 Buffer buffer; 721 Buffer buffer;
567 uint32_t reserve; 722 uint32_t reserve;
568 723
569 // write metadata 724 // write metadata
570 reserve = m_metadata.GetSerializedSize (); 725 reserve = m_metadata.GetSerializedSize ();
571 buffer.AddAtStart (reserve); 726 buffer.AddAtStart (reserve);
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 PacketTestSuite::PacketTestSuite () 1277 PacketTestSuite::PacketTestSuite ()
1123 : TestSuite ("packet", UNIT) 1278 : TestSuite ("packet", UNIT)
1124 { 1279 {
1125 AddTestCase (new PacketTest); 1280 AddTestCase (new PacketTest);
1126 } 1281 }
1127 1282
1128 PacketTestSuite g_packetTestSuite; 1283 PacketTestSuite g_packetTestSuite;
1129 1284
1130 1285
1131 } // namespace ns3 1286 } // namespace ns3
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b