4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Thorsten Horstmann <tho@berlios.de>
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.
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.
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.
24 \brief MPESection unit tests */
26 //#include "MPESection.test.hh"
27 //#include "MPESection.test.ih"
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>
35 #include <senf/Utils/auto_unit_test.hh>
36 #include <boost/test/test_tools.hpp>
39 ///////////////////////////////cc.p////////////////////////////////////////
43 BOOST_AUTO_UNIT_TEST(MPESection_parse_chain)
45 // MPE section captured with dvbsnoop
46 unsigned char data[] = {
48 0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
49 0x04, 0xd8, 0x12, 0x0c,
51 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x62,
53 0x01, 0x00, 0x5e, 0x01, 0x02, 0x03, 0x12, 0xb0,
54 0x43, 0x61, 0x5d, 0x99, 0x08, 0x00,
56 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00,
57 0x01, 0x01, 0xc6, 0xfb, 0xc0, 0xa8, 0x01, 0x01,
58 0xef, 0x01, 0x02, 0x03,
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,
69 0xb5, 0x77, 0x4c, 0x3c
72 senf::MPESection sec (senf::MPESection::create(data));
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() );
93 std::ostringstream oss (std::ostringstream::out);
94 SENF_CHECK_NO_THROW( sec.dump( oss));
96 BOOST_REQUIRE( sec.next().is<senf::LlcSnapPacket>() );
97 senf::LlcSnapPacket llcsnap (sec.next().as<senf::LlcSnapPacket>());
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 );
108 BOOST_REQUIRE( llcsnap.next().is<senf::EthernetPacket>() );
109 senf::EthernetPacket eth (llcsnap.next().as<senf::EthernetPacket>());
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 );
115 BOOST_REQUIRE( eth.next().is<senf::IPv4Packet>() );
116 senf::IPv4Packet ip (eth.next().as<senf::IPv4Packet>());
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") );
134 BOOST_AUTO_UNIT_TEST(MPESection_create)
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;
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));
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");
150 senf::IPv4Packet ip (senf::IPv4Packet::createAfter(eth));
154 ip->source() = senf::INet4Address::from_string("10.1.2.2");
155 ip->destination() = senf::INet4Address::from_string("239.1.2.3");
157 unsigned char payload_data[] = {
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
168 senf::DataPacket payload (senf::DataPacket::createAfter(ip, payload_data));
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,
190 BOOST_CHECK( equal( sec.data().begin(), sec.data().end(), sec_data ));
193 ///////////////////////////////cc.e////////////////////////////////////////
200 // c-file-style: "senf"
201 // indent-tabs-mode: nil
202 // ispell-local-dictionary: "american"
203 // compile-command: "scons -u test"
204 // comment-column: 40