767547b7f541039dc725d396aeb442fdd772aef1
[senf.git] / senf / Packets / MPEGDVBBundle / MPESection.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Thorsten Horstmann <tho@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief MPESection unit tests */
25
26 //#include "MPESection.test.hh"
27 //#include "MPESection.test.ih"
28
29 // Custom includes
30 #include "MPESection.hh"
31 #include <senf/Packets/DefaultBundle/LlcSnapPacket.hh>
32 #include <senf/Packets/DefaultBundle/EthernetPacket.hh>
33 #include <senf/Packets/DefaultBundle/IPv4Packet.hh>
34
35 #include <senf/Utils/auto_unit_test.hh>
36 #include <boost/test/test_tools.hpp>
37
38 #define prefix_
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40
41 using namespace senf;
42
43 SENF_AUTO_UNIT_TEST(MPESection_parse_chain)
44 {
45     // MPE section captured with dvbsnoop
46     unsigned char data[] = {
47             // MPE Header
48             0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
49             0x04, 0xd8, 0x12, 0x0c,
50             // LLC/SNAP Header
51             0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x62,
52             // Ethernet Header
53             0x01, 0x00, 0x5e, 0x01, 0x02, 0x03, 0x12, 0xb0,
54             0x43, 0x61, 0x5d, 0x99, 0x08, 0x00,
55             // IPv4 Header
56             0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00,
57             0x01, 0x01, 0xc6, 0xfb, 0xc0, 0xa8, 0x01, 0x01,
58             0xef, 0x01, 0x02, 0x03,
59             // Payload (ICMP)
60             0x08, 0x00, 0x0e, 0xa3, 0xf2, 0x72, 0x55, 0xea,
61             0xa2, 0xae, 0x56, 0x47, 0xbb, 0x06, 0x02, 0x00,
62             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
63             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
64             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
65             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
66             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
67             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
68             // MPE Trailer (crc)
69             0xb5, 0x77, 0x4c, 0x3c
70     };
71
72     senf::MPESection sec (senf::MPESection::create(data));
73
74     BOOST_CHECK_EQUAL(   sec->table_id(),                0x3eu       );
75     BOOST_CHECK(         sec->section_syntax_indicator()             );
76     BOOST_CHECK(       ! sec->private_indicator()                    );
77     BOOST_CHECK_EQUAL(   sec->section_length(),          0x77u       );
78     BOOST_CHECK_EQUAL(   sec->mac_addr_6(),              0x0u        );
79     BOOST_CHECK_EQUAL(   sec->mac_addr_5(),              0x0u        );
80     BOOST_CHECK_EQUAL(   sec->payload_scrmbl_ctrl(),     0x0u        );
81     BOOST_CHECK_EQUAL(   sec->addr_scrmbl_ctrl(),        0x0u        );
82     BOOST_CHECK      (   sec->llc_snap_flag()                        );
83     BOOST_CHECK      (   sec->curr_next_indicator()                  );
84     BOOST_CHECK_EQUAL(   sec->section_num(),             0x0u        );
85     BOOST_CHECK_EQUAL(   sec->last_section_num(),        0x0u        );
86     BOOST_CHECK_EQUAL(   sec->real_time_parameters().delta_t(),        0x04du  );
87     BOOST_CHECK_EQUAL(   sec->real_time_parameters().table_boundary(), 1       );
88     BOOST_CHECK_EQUAL(   sec->real_time_parameters().frame_boundary(), 0       );
89     BOOST_CHECK_EQUAL(   sec->real_time_parameters().address(),        0x120cu );
90     BOOST_CHECK_EQUAL(   sec->crc(), 3044494396u                     );
91     BOOST_CHECK_EQUAL(   sec->crc(), sec->calcCrc()                  );
92
93     std::ostringstream oss (std::ostringstream::out);
94     SENF_CHECK_NO_THROW( sec.dump( oss));
95
96     BOOST_REQUIRE( sec.next().is<senf::LlcSnapPacket>() );
97     senf::LlcSnapPacket llcsnap (sec.next().as<senf::LlcSnapPacket>());
98
99     BOOST_CHECK_EQUAL( llcsnap->dsap(),        0xaau );
100     BOOST_CHECK_EQUAL( llcsnap->ssap(),        0xaau );
101     BOOST_CHECK_EQUAL( llcsnap->ctrl(),        0x3u  );
102     BOOST_CHECK_EQUAL( llcsnap->protocolId(),  0x0u  );
103     // in the captured section the llcsnap type/length field was set to the
104     // length of the following ethernet packet; the ethertype 0x6558 (Trans
105     // Ether Bridging [RFC1701]) would be possible as well (see next test)
106     BOOST_CHECK_EQUAL( llcsnap->type_length(), 0x62u );
107
108     BOOST_REQUIRE( llcsnap.next().is<senf::EthernetPacket>() );
109     senf::EthernetPacket eth (llcsnap.next().as<senf::EthernetPacket>());
110
111     BOOST_CHECK_EQUAL( eth->destination().value(), senf::MACAddress::from_string("01:00:5e:01:02:03") );
112     BOOST_CHECK_EQUAL( eth->source().value(),      senf::MACAddress::from_string("12:b0:43:61:5d:99") );
113     BOOST_CHECK_EQUAL( eth->type_length(),         0x800u                                             );
114
115     BOOST_REQUIRE( eth.next().is<senf::IPv4Packet>() );
116     senf::IPv4Packet ip (eth.next().as<senf::IPv4Packet>());
117
118     BOOST_CHECK_EQUAL( ip->version(),    0x4u   );
119     BOOST_CHECK_EQUAL( ip->ihl(),        0x5u   );
120     BOOST_CHECK_EQUAL( ip->tos(),        0x0u   );
121     BOOST_CHECK_EQUAL( ip->length(),     0x54u  );
122     BOOST_CHECK_EQUAL( ip->identifier(), 0x0u   );
123     BOOST_CHECK_EQUAL( ip->df(),         1      );
124     BOOST_CHECK_EQUAL( ip->mf(),         0      );
125     BOOST_CHECK_EQUAL( ip->frag(),       0x0u   );
126     BOOST_CHECK_EQUAL( ip->ttl(),        1      );
127     BOOST_CHECK_EQUAL( ip->protocol(),   1      );
128     BOOST_CHECK_EQUAL( ip->checksum(),   0xc6fb );
129     BOOST_CHECK_EQUAL( ip->source().value(),      senf::INet4Address::from_string("192.168.1.1") );
130     BOOST_CHECK_EQUAL( ip->destination().value(), senf::INet4Address::from_string("239.1.2.3")   );
131 }
132
133
134 SENF_AUTO_UNIT_TEST(MPESection_create)
135 {
136     senf::MPESection sec (senf::MPESection::create());
137     sec->real_time_parameters().delta_t()        = 0x027u;
138     sec->real_time_parameters().table_boundary() = 1;
139     sec->real_time_parameters().frame_boundary() = 0;
140     sec->real_time_parameters().address()        = 0xfffffu;
141
142     // the type/length field will be set to the ethertype 0x6558 (Trans
143     // Ether Bridging [RFC1701]) on finalize()
144     senf::LlcSnapPacket llcsnap (senf::LlcSnapPacket::createAfter(sec));
145
146     senf::EthernetPacket eth (senf::EthernetPacket::createAfter(llcsnap));
147     eth->destination() = senf::MACAddress::from_string("01:00:5e:01:02:03");
148     eth->source()      = senf::MACAddress::from_string("92:4c:a2:1c:da:81");
149
150     senf::IPv4Packet ip (senf::IPv4Packet::createAfter(eth));
151     ip->df()          = 1;
152     ip->ttl()         = 1;
153     ip->protocol()    = 1;
154     ip->source()      = senf::INet4Address::from_string("10.1.2.2");
155     ip->destination() = senf::INet4Address::from_string("239.1.2.3");
156
157     unsigned char payload_data[] = {
158             // Payload (ICMP)
159             0x08, 0x00, 0x52, 0x73, 0x0e, 0x02, 0x00, 0x20,
160             0xa4, 0x3a, 0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00,
161             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
162             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
163             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
164             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
165             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
166             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
167     };
168     senf::DataPacket payload (senf::DataPacket::createAfter(ip, payload_data));
169
170     sec.finalizeAll();
171
172     unsigned char sec_data[] = {
173             0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
174             0x02, 0x7b, 0xff, 0xff, 0xaa, 0xaa, 0x03, 0x00,
175             0x00, 0x00, 0x65, 0x58, 0x01, 0x00, 0x5e, 0x01,
176             0x02, 0x03, 0x92, 0x4c, 0xa2, 0x1c, 0xda, 0x81,
177             0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x00, 0x00,
178             0x40, 0x00, 0x01, 0x01, 0x7c, 0xa2, 0x0a, 0x01,
179             0x02, 0x02, 0xef, 0x01, 0x02, 0x03, 0x08, 0x00,
180             0x52, 0x73, 0x0e, 0x02, 0x00, 0x20, 0xa4, 0x3a,
181             0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00, 0x08, 0x09,
182             0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
183             0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
184             0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
185             0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
186             0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
187             0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0xdf,
188             0x6a, 0x1d
189     };
190     SENF_CHECK_EQUAL_COLLECTIONS(
191             sec_data, sec_data+sizeof(sec_data), sec.data().begin(), sec.data().end() );
192 }
193
194 //-/////////////////////////////////////////////////////////////////////////////////////////////////
195 #undef prefix_
196
197 \f
198 // Local Variables:
199 // mode: c++
200 // fill-column: 100
201 // c-file-style: "senf"
202 // indent-tabs-mode: nil
203 // ispell-local-dictionary: "american"
204 // compile-command: "scons -u test"
205 // comment-column: 40
206 // End: