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.
25 //#include "MPESection.test.hh"
26 //#include "MPESection.test.ih"
29 #include "MPESection.hh"
31 #include "../../Utils/auto_unit_test.hh"
32 #include "../../Packets/DefaultBundle/LlcSnapPacket.hh"
33 #include "../../Packets/DefaultBundle/EthernetPacket.hh"
34 #include "../../Packets/DefaultBundle/IPv4Packet.hh"
35 #include <boost/test/test_tools.hpp>
38 ///////////////////////////////cc.p////////////////////////////////////////
42 BOOST_AUTO_UNIT_TEST(MPESection_parse_chain)
44 // MPE section captured with dvbsnoop
45 unsigned char data[] = {
47 0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
48 0x04, 0xd8, 0x12, 0x0c,
50 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x62,
52 0x01, 0x00, 0x5e, 0x01, 0x02, 0x03, 0x12, 0xb0,
53 0x43, 0x61, 0x5d, 0x99, 0x08, 0x00,
55 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00,
56 0x01, 0x01, 0xc6, 0xfb, 0xc0, 0xa8, 0x01, 0x01,
57 0xef, 0x01, 0x02, 0x03,
59 0x08, 0x00, 0x0e, 0xa3, 0xf2, 0x72, 0x55, 0xea,
60 0xa2, 0xae, 0x56, 0x47, 0xbb, 0x06, 0x02, 0x00,
61 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
62 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
63 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
64 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
65 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
66 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
68 0xb5, 0x77, 0x4c, 0x3c
71 senf::MPESection sec (senf::MPESection::create(data));
73 BOOST_CHECK_EQUAL( sec->table_id(), 0x3eu );
74 BOOST_CHECK( sec->section_syntax_indicator() );
75 BOOST_CHECK( ! sec->private_indicator() );
76 BOOST_CHECK_EQUAL( sec->section_length(), 0x77u );
77 BOOST_CHECK_EQUAL( sec->mac_addr_6(), 0x0u );
78 BOOST_CHECK_EQUAL( sec->mac_addr_5(), 0x0u );
79 BOOST_CHECK_EQUAL( sec->payload_scrmbl_ctrl(), 0x0u );
80 BOOST_CHECK_EQUAL( sec->addr_scrmbl_ctrl(), 0x0u );
81 BOOST_CHECK ( sec->llc_snap_flag() );
82 BOOST_CHECK ( sec->curr_next_indicator() );
83 BOOST_CHECK_EQUAL( sec->section_num(), 0x0u );
84 BOOST_CHECK_EQUAL( sec->last_section_num(), 0x0u );
85 BOOST_CHECK_EQUAL( sec->real_time_parameters().delta_t(), 0x04du );
86 BOOST_CHECK_EQUAL( sec->real_time_parameters().table_boundary(), 1 );
87 BOOST_CHECK_EQUAL( sec->real_time_parameters().frame_boundary(), 0 );
88 BOOST_CHECK_EQUAL( sec->real_time_parameters().address(), 0x120cu );
89 BOOST_CHECK_EQUAL( sec->crc(), 3044494396u );
90 BOOST_CHECK_EQUAL( sec->crc(), sec->calcCrc() );
92 std::ostringstream oss (std::ostringstream::out);
93 SENF_CHECK_NO_THROW( sec.dump( oss));
95 BOOST_REQUIRE( sec.next().is<senf::LlcSnapPacket>() );
96 senf::LlcSnapPacket llcsnap (sec.next().as<senf::LlcSnapPacket>());
98 BOOST_CHECK_EQUAL( llcsnap->dsap(), 0xaau );
99 BOOST_CHECK_EQUAL( llcsnap->ssap(), 0xaau );
100 BOOST_CHECK_EQUAL( llcsnap->ctrl(), 0x3u );
101 BOOST_CHECK_EQUAL( llcsnap->protocolId(), 0x0u );
102 // in the captured section the llcsnap type/length field was set to the
103 // length of the following ethernet packet; the ethertype 0x6558 (Trans
104 // Ether Bridging [RFC1701]) would be possible as well (see next test)
105 BOOST_CHECK_EQUAL( llcsnap->type_length(), 0x62u );
107 BOOST_REQUIRE( llcsnap.next().is<senf::EthernetPacket>() );
108 senf::EthernetPacket eth (llcsnap.next().as<senf::EthernetPacket>());
110 BOOST_CHECK_EQUAL( eth->destination().value(), senf::MACAddress::from_string("01:00:5e:01:02:03") );
111 BOOST_CHECK_EQUAL( eth->source().value(), senf::MACAddress::from_string("12:b0:43:61:5d:99") );
112 BOOST_CHECK_EQUAL( eth->type_length(), 0x800u );
114 BOOST_REQUIRE( eth.next().is<senf::IPv4Packet>() );
115 senf::IPv4Packet ip (eth.next().as<senf::IPv4Packet>());
117 BOOST_CHECK_EQUAL( ip->version(), 0x4u );
118 BOOST_CHECK_EQUAL( ip->ihl(), 0x5u );
119 BOOST_CHECK_EQUAL( ip->tos(), 0x0u );
120 BOOST_CHECK_EQUAL( ip->length(), 0x54u );
121 BOOST_CHECK_EQUAL( ip->identifier(), 0x0u );
122 BOOST_CHECK_EQUAL( ip->df(), 1 );
123 BOOST_CHECK_EQUAL( ip->mf(), 0 );
124 BOOST_CHECK_EQUAL( ip->frag(), 0x0u );
125 BOOST_CHECK_EQUAL( ip->ttl(), 1 );
126 BOOST_CHECK_EQUAL( ip->protocol(), 1 );
127 BOOST_CHECK_EQUAL( ip->checksum(), 0xc6fb );
128 BOOST_CHECK_EQUAL( ip->source().value(), senf::INet4Address::from_string("192.168.1.1") );
129 BOOST_CHECK_EQUAL( ip->destination().value(), senf::INet4Address::from_string("239.1.2.3") );
133 BOOST_AUTO_UNIT_TEST(MPESection_create)
135 senf::MPESection sec (senf::MPESection::create());
136 sec->real_time_parameters().delta_t() = 0x027u;
137 sec->real_time_parameters().table_boundary() = 1;
138 sec->real_time_parameters().frame_boundary() = 0;
139 sec->real_time_parameters().address() = 0xfffffu;
141 // the type/length field will be set to the ethertype 0x6558 (Trans
142 // Ether Bridging [RFC1701]) on finalize()
143 senf::LlcSnapPacket llcsnap (senf::LlcSnapPacket::createAfter(sec));
145 senf::EthernetPacket eth (senf::EthernetPacket::createAfter(llcsnap));
146 eth->destination() = senf::MACAddress::from_string("01:00:5e:01:02:03");
147 eth->source() = senf::MACAddress::from_string("92:4c:a2:1c:da:81");
149 senf::IPv4Packet ip (senf::IPv4Packet::createAfter(eth));
153 ip->source() = senf::INet4Address::from_string("10.1.2.2");
154 ip->destination() = senf::INet4Address::from_string("239.1.2.3");
156 unsigned char payload_data[] = {
158 0x08, 0x00, 0x52, 0x73, 0x0e, 0x02, 0x00, 0x20,
159 0xa4, 0x3a, 0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00,
160 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
161 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
162 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
163 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
164 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
165 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
167 senf::DataPacket payload (senf::DataPacket::createAfter(ip, payload_data));
171 unsigned char sec_data[] = {
172 0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
173 0x02, 0x7b, 0xff, 0xff, 0xaa, 0xaa, 0x03, 0x00,
174 0x00, 0x00, 0x65, 0x58, 0x01, 0x00, 0x5e, 0x01,
175 0x02, 0x03, 0x92, 0x4c, 0xa2, 0x1c, 0xda, 0x81,
176 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x00, 0x00,
177 0x40, 0x00, 0x01, 0x01, 0x7c, 0xa2, 0x0a, 0x01,
178 0x02, 0x02, 0xef, 0x01, 0x02, 0x03, 0x08, 0x00,
179 0x52, 0x73, 0x0e, 0x02, 0x00, 0x20, 0xa4, 0x3a,
180 0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00, 0x08, 0x09,
181 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
182 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
183 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
184 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
185 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
186 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0xdf,
189 BOOST_CHECK( equal( sec.data().begin(), sec.data().end(), sec_data ));
192 ///////////////////////////////cc.e////////////////////////////////////////
199 // c-file-style: "senf"
200 // indent-tabs-mode: nil
201 // ispell-local-dictionary: "american"
202 // compile-command: "scons -u test"
203 // comment-column: 40