47 |
47 |
48 void DefaultPrint (void) |
48 void DefaultPrint (void) |
49 { |
49 { |
50 // We create a packet with 1000 bytes of zero payload |
50 // We create a packet with 1000 bytes of zero payload |
51 // and add 3 headers to this packet. |
51 // and add 3 headers to this packet. |
52 Packet p (1000); |
52 Ptr<Packet> p = Create<Packet> (1000); |
53 Ipv4Header ipv4; |
53 Ipv4Header ipv4; |
54 UdpHeader udp; |
54 UdpHeader udp; |
55 ipv4.SetSource (Ipv4Address ("192.168.0.1")); |
55 ipv4.SetSource (Ipv4Address ("192.168.0.1")); |
56 ipv4.SetDestination (Ipv4Address ("192.168.0.2")); |
56 ipv4.SetDestination (Ipv4Address ("192.168.0.2")); |
57 udp.SetSource (1025); |
57 udp.SetSource (1025); |
58 udp.SetDestination (80); |
58 udp.SetDestination (80); |
59 udp.SetPayloadSize (1000); |
59 udp.SetPayloadSize (1000); |
60 p.AddHeader (udp); |
60 p->AddHeader (udp); |
61 p.AddHeader (ipv4); |
61 p->AddHeader (ipv4); |
62 |
62 |
63 std::cout << "full packet size=" << p.GetSize () << std::endl; |
63 std::cout << "full packet size=" << p->GetSize () << std::endl; |
64 // Here, invoke the default Print routine, directed to std out |
64 // Here, invoke the default Print routine, directed to std out |
65 p.Print (std::cout); |
65 p->Print (std::cout); |
66 std::cout << std::endl; |
66 std::cout << std::endl; |
67 |
67 |
68 |
68 |
69 // Now, we fragment our packet in 3 consecutive pieces. |
69 // Now, we fragment our packet in 3 consecutive pieces. |
70 Packet p1 = p.CreateFragment (0, 2); |
70 Ptr<Packet> p1 = p->CreateFragment (0, 2); |
71 Packet p2 = p.CreateFragment (2, 1000); |
71 Ptr<Packet> p2 = p->CreateFragment (2, 1000); |
72 Packet p3 = p.CreateFragment (1002, 26); |
72 Ptr<Packet> p3 = p->CreateFragment (1002, 26); |
73 |
73 |
74 std::cout << "fragment1" << std::endl; |
74 std::cout << "fragment1" << std::endl; |
75 p1.Print (std::cout); |
75 p1->Print (std::cout); |
76 std::cout << std::endl; |
76 std::cout << std::endl; |
77 std::cout << "fragment2" << std::endl; |
77 std::cout << "fragment2" << std::endl; |
78 p2.Print (std::cout); |
78 p2->Print (std::cout); |
79 std::cout << std::endl; |
79 std::cout << std::endl; |
80 std::cout << "fragment3" << std::endl; |
80 std::cout << "fragment3" << std::endl; |
81 p3.Print (std::cout); |
81 p3->Print (std::cout); |
82 std::cout << std::endl; |
82 std::cout << std::endl; |
83 |
83 |
84 // And, finally, we re-aggregate the 3 consecutive pieces. |
84 // And, finally, we re-aggregate the 3 consecutive pieces. |
85 Packet aggregate = p1; |
85 Ptr<Packet> aggregate = p1->Copy (); |
86 aggregate.AddAtEnd (p2); |
86 aggregate->AddAtEnd (p2); |
87 aggregate.AddAtEnd (p3); |
87 aggregate->AddAtEnd (p3); |
88 std::cout << "aggregated" << std::endl; |
88 std::cout << "aggregated" << std::endl; |
89 aggregate.Print (std::cout); |
89 aggregate->Print (std::cout); |
90 std::cout << std::endl; |
90 std::cout << std::endl; |
91 } |
91 } |
92 |
92 |
93 void |
93 void |
94 DoPrintPayload (std::ostream & os,uint32_t packetUid,uint32_t size, |
94 DoPrintPayload (std::ostream & os,uint32_t packetUid,uint32_t size, |
126 printer.SetHeaderPrinter (MakeCallback (&DoPrintIpv4Header), |
126 printer.SetHeaderPrinter (MakeCallback (&DoPrintIpv4Header), |
127 MakeCallback (&DoPrintIpv4HeaderFragment)); |
127 MakeCallback (&DoPrintIpv4HeaderFragment)); |
128 |
128 |
129 |
129 |
130 // We create a packet with 1000 bytes of zero payload |
130 // We create a packet with 1000 bytes of zero payload |
131 Packet p (1000); |
131 Ptr<Packet> p = Create<Packet> (1000); |
132 Ipv4Header ipv4; |
132 Ipv4Header ipv4; |
133 UdpHeader udp; |
133 UdpHeader udp; |
134 ipv4.SetSource (Ipv4Address ("192.168.0.1")); |
134 ipv4.SetSource (Ipv4Address ("192.168.0.1")); |
135 ipv4.SetDestination (Ipv4Address ("192.168.0.2")); |
135 ipv4.SetDestination (Ipv4Address ("192.168.0.2")); |
136 udp.SetSource (1025); |
136 udp.SetSource (1025); |
137 udp.SetDestination (80); |
137 udp.SetDestination (80); |
138 udp.SetPayloadSize (1000); |
138 udp.SetPayloadSize (1000); |
139 p.AddHeader (udp); |
139 p->AddHeader (udp); |
140 p.AddHeader (ipv4); |
140 p->AddHeader (ipv4); |
141 |
141 |
142 std::cout << "full packet size=" << p.GetSize () << std::endl; |
142 std::cout << "full packet size=" << p->GetSize () << std::endl; |
143 p.Print (std::cout, printer); |
143 p->Print (std::cout, printer); |
144 std::cout << std::endl; |
144 std::cout << std::endl; |
145 |
145 |
146 |
146 |
147 // fragment our packet in 3 pieces |
147 // fragment our packet in 3 pieces |
148 Packet p1 = p.CreateFragment (0, 2); |
148 Ptr<Packet> p1 = p->CreateFragment (0, 2); |
149 Packet p2 = p.CreateFragment (2, 1000); |
149 Ptr<Packet> p2 = p->CreateFragment (2, 1000); |
150 Packet p3 = p.CreateFragment (1002, 26); |
150 Ptr<Packet> p3 = p->CreateFragment (1002, 26); |
151 std::cout << "fragment1" << std::endl; |
151 std::cout << "fragment1" << std::endl; |
152 p1.Print (std::cout, printer); |
152 p1->Print (std::cout, printer); |
153 std::cout << std::endl; |
153 std::cout << std::endl; |
154 std::cout << "fragment2" << std::endl; |
154 std::cout << "fragment2" << std::endl; |
155 p2.Print (std::cout, printer); |
155 p2->Print (std::cout, printer); |
156 std::cout << std::endl; |
156 std::cout << std::endl; |
157 std::cout << "fragment3" << std::endl; |
157 std::cout << "fragment3" << std::endl; |
158 p3.Print (std::cout, printer); |
158 p3->Print (std::cout, printer); |
159 std::cout << std::endl; |
159 std::cout << std::endl; |
160 |
160 |
161 // aggregate all 3 fragments of the original packet |
161 // aggregate all 3 fragments of the original packet |
162 // to reconstruct a copy of the original packet. |
162 // to reconstruct a copy of the original packet. |
163 Packet aggregate = p1; |
163 Ptr<Packet> aggregate = p1->Copy (); |
164 aggregate.AddAtEnd (p2); |
164 aggregate->AddAtEnd (p2); |
165 aggregate.AddAtEnd (p3); |
165 aggregate->AddAtEnd (p3); |
166 std::cout << "aggregated" << std::endl; |
166 std::cout << "aggregated" << std::endl; |
167 aggregate.Print (std::cout, printer); |
167 aggregate->Print (std::cout, printer); |
168 std::cout << std::endl; |
168 std::cout << std::endl; |
169 } |
169 } |
170 |
170 |
171 |
171 |
172 |
172 |