- updated MPESection creation
[senf.git] / 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 // Unit tests
24
25 //#include "MPESection.test.hh"
26 //#include "MPESection.test.ih"
27
28 // Custom includes
29 #include "MPESection.hh"
30
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>
37
38 #define prefix_
39 ///////////////////////////////cc.p////////////////////////////////////////
40
41 using namespace senf;
42
43 BOOST_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     BOOST_REQUIRE( sec.next().is<senf::LlcSnapPacket>() );
94     senf::LlcSnapPacket llcsnap (sec.next().as<senf::LlcSnapPacket>());
95
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 );
104
105     BOOST_REQUIRE( llcsnap.next().is<senf::EthernetPacket>() );
106     senf::EthernetPacket eth (llcsnap.next().as<senf::EthernetPacket>());
107     
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                                             );
111
112     BOOST_REQUIRE( eth.next().is<senf::IPv4Packet>() );
113     senf::IPv4Packet ip (eth.next().as<senf::IPv4Packet>());
114     
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")   );
128 }
129
130
131 BOOST_AUTO_UNIT_TEST(MPESection_create)
132 {
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;
138     
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));
142     
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");
146     
147     senf::IPv4Packet ip (senf::IPv4Packet::createAfter(eth));
148     ip->df()          = 1;
149     ip->ttl()         = 1;
150     ip->protocol()    = 1;
151     ip->source()      = senf::INet4Address::from_string("10.1.2.2");
152     ip->destination() = senf::INet4Address::from_string("239.1.2.3");
153     
154     unsigned char payload_data[] = { 
155             // Payload (ICMP)
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
164     };
165     senf::DataPacket payload (senf::DataPacket::createAfter(ip, payload_data));
166     
167     sec.finalize();
168     
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,
185             0x6a, 0x1d
186     };    
187     BOOST_CHECK( equal( sec.data().begin(), sec.data().end(), sec_data ));    
188 }
189
190 ///////////////////////////////cc.e////////////////////////////////////////
191 #undef prefix_
192
193 \f
194 // Local Variables:
195 // mode: c++
196 // fill-column: 100
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
202 // End: