View | Details | Raw Unified | Return to bug 38
Collapse All | Expand All

(-)a/src/common/packet.cc (-53 lines)
 Lines 121-176   Packet::Print (std::ostream &os) const Link Here 
121
}; // namespace ns3
121
}; // namespace ns3
122
122
123
123
124
125
#ifdef RUN_SELF_TESTS
126
127
#include "ns3/test.h"
128
#include <string>
129
130
namespace ns3 {
131
132
class PacketTest: public Test {
133
public:
134
  virtual bool RunTests (void);
135
  PacketTest ();
136
};
137
138
139
PacketTest::PacketTest ()
140
  : Test ("Packet") {}
141
142
143
bool
144
PacketTest::RunTests (void)
145
{
146
  bool ok = true;
147
148
  Packet pkt1 (reinterpret_cast<const uint8_t*> ("hello"), 5);
149
  Packet pkt2 (reinterpret_cast<const uint8_t*> (" world"), 6);
150
  Packet packet;
151
  packet.AddAtEnd (pkt1);
152
  packet.AddAtEnd (pkt2);
153
  
154
  if (packet.GetSize () != 11)
155
    {
156
      Failure () << "expected size 11, got " << packet.GetSize () << std::endl;
157
      ok = false;
158
    }
159
160
  std::string msg = std::string (reinterpret_cast<const char *>(packet.PeekData ()),
161
                                 packet.GetSize ());
162
  if (msg != "hello world")
163
    {
164
      Failure () << "expected size 'hello world', got " << msg << std::endl;
165
      ok = false;
166
    }
167
168
  return ok;
169
}
170
171
172
static PacketTest gPacketTest;
173
174
}; // namespace ns3
175
176
#endif /* RUN_SELF_TESTS */
(-)fa5b85a032f9 (+266 lines)
Added Link Here 
1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
 * Copyright (c) 2007 INESC Porto
4
 * All rights reserved.
5
 *
6
 * This program is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License version 2 as
8
 * published by the Free Software Foundation;
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 *
19
 * Author: Gustavo J. A. M. Carneiro  <gjc@inescporto.pt>
20
 */
21
22
#include "ns3/assert.h"
23
24
#include "olsr-header.h"
25
26
#define IPV4_ADDRESS_SIZE 4
27
#define OLSR_MSG_HEADER_SIZE 12
28
#define OLSR_PKT_HEADER_SIZE 4
29
30
namespace ns3 {
31
32
// ---------------- OLSR Packet -------------------------------
33
34
OlsrPacketHeader::OlsrPacketHeader ()
35
{}
36
37
OlsrPacketHeader::~OlsrPacketHeader ()
38
{}
39
40
uint32_t 
41
OlsrPacketHeader::GetSerializedSize (void) const
42
{
43
  return OLSR_PKT_HEADER_SIZE;
44
}
45
46
void 
47
OlsrPacketHeader::PrintTo (std::ostream &os) const
48
{
49
  // TODO
50
}
51
52
void
53
OlsrPacketHeader::SerializeTo (Buffer::Iterator start) const
54
{
55
  Buffer::Iterator i = start;
56
  i.WriteHtonU16 (m_packetLength);
57
  i.WriteHtonU16 (m_packetSequenceNumber);
58
}
59
60
uint32_t
61
OlsrPacketHeader::DeserializeFrom (Buffer::Iterator start)
62
{
63
  Buffer::Iterator i = start;
64
  m_packetLength  = i.ReadNtohU16 ();
65
  m_packetSequenceNumber = i.ReadNtohU16 ();
66
  return GetSerializedSize ();
67
}
68
69
70
// ---------------- OLSR Message -------------------------------
71
72
OlsrMessageHeader::OlsrMessageHeader ()
73
{}
74
75
OlsrMessageHeader::~OlsrMessageHeader ()
76
{}
77
78
uint32_t 
79
OlsrMessageHeader::GetSerializedSize (void) const
80
{
81
  return OLSR_MSG_HEADER_SIZE;
82
}
83
84
void 
85
OlsrMessageHeader::PrintTo (std::ostream &os) const
86
{
87
  // TODO
88
}
89
90
void
91
OlsrMessageHeader::SerializeTo (Buffer::Iterator start) const
92
{
93
  Buffer::Iterator i = start;
94
  i.WriteU8 (m_messageType);
95
  i.WriteU8 (m_VTime);
96
  i.WriteHtonU16 (m_messageSize);
97
  i.WriteHtonU32 (m_originatorAddress.GetHostOrder ());
98
  i.WriteU8 (m_timeToLive);
99
  i.WriteU8 (m_hopCount);
100
  i.WriteHtonU16 (m_messageSequenceNumber);
101
}
102
103
uint32_t
104
OlsrMessageHeader::DeserializeFrom (Buffer::Iterator start)
105
{
106
  Buffer::Iterator i = start;
107
  m_messageType  = i.ReadU8 ();
108
  m_VTime  = i.ReadU8 ();
109
  m_messageSize  = i.ReadNtohU16 ();
110
  m_originatorAddress = Ipv4Address (i.ReadNtohU32 ());
111
  m_timeToLive  = i.ReadU8 ();
112
  m_hopCount  = i.ReadU8 ();
113
  m_messageSequenceNumber = i.ReadNtohU16 ();
114
  return GetSerializedSize ();
115
}
116
117
118
// ---------------- OLSR MID Message -------------------------------
119
120
OlsrMidMessageHeader::OlsrMidMessageHeader ()
121
{}
122
123
OlsrMidMessageHeader::~OlsrMidMessageHeader ()
124
{}
125
126
uint32_t 
127
OlsrMidMessageHeader::GetSerializedSize (void) const
128
{
129
  return m_interfaceAddresses.size () * IPV4_ADDRESS_SIZE;
130
}
131
132
void 
133
OlsrMidMessageHeader::PrintTo (std::ostream &os) const
134
{
135
  // TODO
136
}
137
138
void
139
OlsrMidMessageHeader::SerializeTo (Buffer::Iterator start) const
140
{
141
  Buffer::Iterator i = start;
142
143
  for (std::list<Ipv4Address>::const_iterator iter = m_interfaceAddresses.begin ();
144
       iter != m_interfaceAddresses.end (); iter++)
145
    {
146
      i.WriteHtonU32 (iter->GetHostOrder ());
147
    }
148
}
149
150
uint32_t
151
OlsrMidMessageHeader::DeserializeFrom (Buffer::Iterator start)
152
{
153
  Buffer::Iterator i = start;
154
155
  m_interfaceAddresses.clear ();
156
  NS_ASSERT (m_messageSize >= 0);
157
  NS_ASSERT (m_messageSize % IPV4_ADDRESS_SIZE == 0);
158
  
159
  int numAddresses = m_messageSize / IPV4_ADDRESS_SIZE;
160
  m_interfaceAddresses.erase (m_interfaceAddresses.begin(),
161
                              m_interfaceAddresses.end ());
162
  for (int n = 0; n < numAddresses; ++n)
163
      m_interfaceAddresses.push_back (Ipv4Address (i.ReadNtohU32 ()));
164
  return GetSerializedSize ();
165
}
166
167
168
}; // namespace ns3
169
170
171
#ifdef RUN_SELF_TESTS
172
173
174
#include "ns3/test.h"
175
#include "ns3/packet.h"
176
177
178
namespace ns3 {
179
180
class OlsrHeaderTest : public ns3::Test {
181
private:
182
public:
183
  OlsrHeaderTest ();
184
  virtual bool RunTests (void);
185
186
187
};
188
189
OlsrHeaderTest::OlsrHeaderTest ()
190
  : ns3::Test ("OlsrHeader")
191
{}
192
193
194
#define NS_TEST_ASSERT_EQUAL(got, expected)             \
195
    if ((got) != (expected))                            \
196
      {                                                 \
197
        Failure () << __FILE__ << ":" <<__LINE__        \
198
                   << ": expected " << (expected)       \
199
                   << ", got " << (got) << std::endl;   \
200
        result = false;                                 \
201
      }
202
203
204
bool 
205
OlsrHeaderTest::RunTests (void)
206
{
207
  bool result = true;
208
  Packet packet;
209
210
  {
211
    OlsrPacketHeader hdr;
212
213
    Packet pkt1;
214
    OlsrMessageHeader msg1;
215
    OlsrMidMessageHeader mid1;
216
217
    Packet pkt2;
218
    OlsrMessageHeader msg2;
219
    OlsrMidMessageHeader mid2;
220
    
221
    // MID message #1
222
    mid1.m_interfaceAddresses.push_back (Ipv4Address ("1.2.3.4"));
223
    mid1.m_interfaceAddresses.push_back (Ipv4Address ("1.2.3.5"));
224
    pkt1.AddHeader (mid1);
225
226
    msg1.m_messageSize = pkt1.GetSize ();
227
    msg1.m_timeToLive = 255;
228
    msg1.m_originatorAddress = Ipv4Address ("11.22.33.44");
229
    msg1.m_VTime = 9;
230
    msg1.m_messageType = OlsrMessageHeader::MID_MESSAGE;
231
    msg1.m_messageSequenceNumber = 7;
232
    pkt1.AddHeader (msg1);
233
234
    packet.AddAtEnd (pkt1);
235
236
    // MID message #2
237
    mid2.m_interfaceAddresses.push_back (Ipv4Address ("2.2.3.4"));
238
    mid2.m_interfaceAddresses.push_back (Ipv4Address ("2.2.3.5"));
239
    pkt2.AddHeader (mid2);
240
241
    msg2.m_messageSize = pkt2.GetSize ();
242
    msg2.m_timeToLive = 255;
243
    msg2.m_originatorAddress = Ipv4Address ("12.22.33.44");
244
    msg2.m_VTime = 9;
245
    msg2.m_messageType = OlsrMessageHeader::MID_MESSAGE;
246
    msg2.m_messageSequenceNumber = 7;
247
    pkt2.AddHeader (msg2);
248
249
    // Build an OLSR packet with the two messages
250
    hdr.m_packetLength = pkt1.GetSize () + pkt2.GetSize ();
251
    hdr.m_packetSequenceNumber = 123;
252
253
    packet.AddAtEnd (pkt2);
254
    packet.AddHeader (hdr);
255
  }    
256
257
258
  return result;
259
}
260
261
static OlsrHeaderTest gOlsrHeaderTest;
262
263
}; // namespace
264
265
266
#endif /* RUN_SELF_TESTS */
(-)fa5b85a032f9 (+154 lines)
Added Link Here 
1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
 * Copyright (c) 2007 INESC Porto
4
 * All rights reserved.
5
 *
6
 * This program is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License version 2 as
8
 * published by the Free Software Foundation;
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 *
19
 * Author: Gustavo J. A. M. Carneiro  <gjc@inescporto.pt>
20
 */
21
22
#ifndef OLSR_HEADER_H
23
#define OLSR_HEADER_H
24
25
#include <stdint.h>
26
#include <list>
27
#include "ns3/header.h"
28
#include "ns3/ipv4-address.h"
29
30
namespace ns3 {
31
32
// 3.3.  Packet Format
33
//
34
//    The basic layout of any packet in OLSR is as follows (omitting IP and
35
//    UDP headers):
36
//
37
//        0                   1                   2                   3
38
//        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
39
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40
//       |         Packet Length         |    Packet Sequence Number     |
41
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42
//       |  Message Type |     Vtime     |         Message Size          |
43
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44
//       |                      Originator Address                       |
45
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46
//       |  Time To Live |   Hop Count   |    Message Sequence Number    |
47
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48
//       |                                                               |
49
//       :                            MESSAGE                            :
50
//       |                                                               |
51
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52
//       |  Message Type |     Vtime     |         Message Size          |
53
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54
//       |                      Originator Address                       |
55
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56
//       |  Time To Live |   Hop Count   |    Message Sequence Number    |
57
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58
//       |                                                               |
59
//       :                            MESSAGE                            :
60
//       |                                                               |
61
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62
//       :                                                               :
63
//                (etc.)
64
class OlsrPacketHeader : public Header
65
{
66
public:
67
  OlsrPacketHeader ();
68
  virtual ~OlsrPacketHeader ();
69
70
  uint16_t m_packetLength;
71
  uint16_t m_packetSequenceNumber;
72
  
73
private:
74
  virtual void PrintTo (std::ostream &os) const;
75
  virtual uint32_t GetSerializedSize (void) const;
76
  virtual void SerializeTo (Buffer::Iterator start) const;
77
  virtual uint32_t DeserializeFrom (Buffer::Iterator start);
78
};
79
80
81
//        0                   1                   2                   3
82
//        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
83
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84
//       |  Message Type |     Vtime     |         Message Size          |
85
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
86
//       |                      Originator Address                       |
87
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
88
//       |  Time To Live |   Hop Count   |    Message Sequence Number    |
89
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
90
class OlsrMessageHeader : public Header
91
{
92
public:
93
94
  enum MessageTypes {
95
    HELLO_MESSAGE         = 1,
96
    TC_MESSAGE            = 2,
97
    MID_MESSAGE           = 3,
98
    HNA_MESSAGE           = 4,
99
  };
100
101
102
  OlsrMessageHeader ();
103
  virtual ~OlsrMessageHeader ();
104
105
  uint8_t m_messageType;
106
  uint8_t m_VTime;
107
  uint16_t m_messageSize;
108
  Ipv4Address m_originatorAddress;
109
  uint8_t m_timeToLive;
110
  uint8_t m_hopCount;
111
  uint16_t m_messageSequenceNumber;
112
  
113
private:
114
  virtual void PrintTo (std::ostream &os) const;
115
  virtual uint32_t GetSerializedSize (void) const;
116
  virtual void SerializeTo (Buffer::Iterator start) const;
117
  virtual uint32_t DeserializeFrom (Buffer::Iterator start);
118
};
119
120
// 5.1.  MID Message Format
121
//
122
//    The proposed format of a MID message is as follows:
123
//
124
//        0                   1                   2                   3
125
//        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
126
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
127
//       |                    OLSR Interface Address                     |
128
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
129
//       |                    OLSR Interface Address                     |
130
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
131
//       |                              ...                              |
132
//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133
class OlsrMidMessageHeader : public Header
134
{
135
public:
136
137
  OlsrMidMessageHeader ();
138
  virtual ~OlsrMidMessageHeader ();
139
140
  uint32_t m_messageSize; // has to be manually set before deserialization
141
142
  std::list<Ipv4Address> m_interfaceAddresses;
143
  
144
private:
145
  virtual void PrintTo (std::ostream &os) const;
146
  virtual uint32_t GetSerializedSize (void) const;
147
  virtual void SerializeTo (Buffer::Iterator start) const;
148
  virtual uint32_t DeserializeFrom (Buffer::Iterator start);
149
};
150
151
}; // namespace ns3
152
153
#endif /* OLSR_HEADER_H */
154
(-)fa5b85a032f9 (+18 lines)
Added Link Here 
1
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
2
3
def configure(conf):
4
    conf.env.append_value('NS3_MODULES', 'ns3-olsr')
5
6
def build(bld):
7
    obj = bld.create_obj('cpp', 'shlib')
8
    obj.name = 'ns3-olsr'
9
    obj.target = obj.name
10
    obj.uselib_local = ['ns3-internet-node']
11
    obj.source = [
12
        'olsr-header.cc',
13
        ]
14
15
    #headers = bld.create_obj('ns3header')
16
    #headers.source = [
17
    #    'olsr-header.h',
18
    #    ]
(-)a/src/wscript (+1 lines)
 Lines 17-22   all_modules = [ Link Here 
17
    'internet-node',
17
    'internet-node',
18
    'devices/p2p',
18
    'devices/p2p',
19
    'applications',
19
    'applications',
20
    'routing/olsr',
20
    ]
21
    ]
21
22
22
23

Return to bug 38