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>
36 #include <senf/Utils/hexdump.hh>
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 BOOST_REQUIRE( sec.next().is<senf::LlcSnapPacket>() );
94 senf::LlcSnapPacket llcsnap (sec.next().as<senf::LlcSnapPacket>());
96 BOOST_CHECK_EQUAL( llcsnap->dsap(), 0xaau );
97 BOOST_CHECK_EQUAL( llcsnap->ssap(), 0xaau );
98 BOOST_CHECK_EQUAL( llcsnap->ctrl(), 0x3u );
99 BOOST_CHECK_EQUAL( llcsnap->protocolId(), 0x0u );
100 // in the captured section the llcsnap type/length field was set to the
101 // length of the following ethernet packet; the ethertype 0x6558 (Trans
102 // Ether Bridging [RFC1701]) would be possible as well (see next test)
103 BOOST_CHECK_EQUAL( llcsnap->type_length(), 0x62u );
105 BOOST_REQUIRE( llcsnap.next().is<senf::EthernetPacket>() );
106 senf::EthernetPacket eth (llcsnap.next().as<senf::EthernetPacket>());
108 BOOST_CHECK_EQUAL( eth->destination().value(), senf::MACAddress::from_string("01:00:5e:01:02:03") );
109 BOOST_CHECK_EQUAL( eth->source().value(), senf::MACAddress::from_string("12:b0:43:61:5d:99") );
110 BOOST_CHECK_EQUAL( eth->type_length(), 0x800u );
112 BOOST_REQUIRE( eth.next().is<senf::IPv4Packet>() );
113 senf::IPv4Packet ip (eth.next().as<senf::IPv4Packet>());
115 BOOST_CHECK_EQUAL( ip->version(), 0x4u );
116 BOOST_CHECK_EQUAL( ip->ihl(), 0x5u );
117 BOOST_CHECK_EQUAL( ip->tos(), 0x0u );
118 BOOST_CHECK_EQUAL( ip->length(), 0x54u );
119 BOOST_CHECK_EQUAL( ip->identifier(), 0x0u );
120 BOOST_CHECK_EQUAL( ip->df(), 1 );
121 BOOST_CHECK_EQUAL( ip->mf(), 0 );
122 BOOST_CHECK_EQUAL( ip->frag(), 0x0u );
123 BOOST_CHECK_EQUAL( ip->ttl(), 1 );
124 BOOST_CHECK_EQUAL( ip->protocol(), 1 );
125 BOOST_CHECK_EQUAL( ip->checksum(), 0xc6fb );
126 BOOST_CHECK_EQUAL( ip->source().value(), senf::INet4Address::from_string("192.168.1.1") );
127 BOOST_CHECK_EQUAL( ip->destination().value(), senf::INet4Address::from_string("239.1.2.3") );
131 BOOST_AUTO_UNIT_TEST(MPESection_create)
133 senf::MPESection sec (senf::MPESection::create());
134 sec->real_time_parameters().delta_t() = 0x027u;
135 sec->real_time_parameters().table_boundary() = 1;
136 sec->real_time_parameters().frame_boundary() = 0;
137 sec->real_time_parameters().address() = 0xfffffu;
139 // the type/length field will be set to the ethertype 0x6558 (Trans
140 // Ether Bridging [RFC1701]) on finalize()
141 senf::LlcSnapPacket llcsnap (senf::LlcSnapPacket::createAfter(sec));
143 senf::EthernetPacket eth (senf::EthernetPacket::createAfter(llcsnap));
144 eth->destination() = senf::MACAddress::from_string("01:00:5e:01:02:03");
145 eth->source() = senf::MACAddress::from_string("92:4c:a2:1c:da:81");
147 senf::IPv4Packet ip (senf::IPv4Packet::createAfter(eth));
151 ip->source() = senf::INet4Address::from_string("10.1.2.2");
152 ip->destination() = senf::INet4Address::from_string("239.1.2.3");
154 unsigned char payload_data[] = {
156 0x08, 0x00, 0x52, 0x73, 0x0e, 0x02, 0x00, 0x20,
157 0xa4, 0x3a, 0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00,
158 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
159 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
160 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
161 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
162 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
163 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
165 senf::DataPacket payload (senf::DataPacket::createAfter(ip, payload_data));
169 unsigned char sec_data[] = {
170 0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
171 0x02, 0x7b, 0xff, 0xff, 0xaa, 0xaa, 0x03, 0x00,
172 0x00, 0x00, 0x65, 0x58, 0x01, 0x00, 0x5e, 0x01,
173 0x02, 0x03, 0x92, 0x4c, 0xa2, 0x1c, 0xda, 0x81,
174 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x00, 0x00,
175 0x40, 0x00, 0x01, 0x01, 0x7c, 0xa2, 0x0a, 0x01,
176 0x02, 0x02, 0xef, 0x01, 0x02, 0x03, 0x08, 0x00,
177 0x52, 0x73, 0x0e, 0x02, 0x00, 0x20, 0xa4, 0x3a,
178 0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00, 0x08, 0x09,
179 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
180 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
181 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
182 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
183 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
184 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0xdf,
187 BOOST_CHECK( equal( sec.data().begin(), sec.data().end(), sec_data ));
190 ///////////////////////////////cc.e////////////////////////////////////////
197 // c-file-style: "senf"
198 // indent-tabs-mode: nil
199 // ispell-local-dictionary: "american"
200 // compile-command: "scons -u test"
201 // comment-column: 40