LEFT | RIGHT |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2013 Universita' di Firenze, Italy | 3 * Copyright (c) 2013 Universita' di Firenze, Italy |
4 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 #ifndef SIXLOWPANHEADER_H_ | 22 #ifndef SIXLOWPANHEADER_H_ |
23 #define SIXLOWPANHEADER_H_ | 23 #define SIXLOWPANHEADER_H_ |
24 | 24 |
25 #include "ns3/header.h" | 25 #include "ns3/header.h" |
26 #include "ns3/ipv6-address.h" | 26 #include "ns3/ipv6-address.h" |
27 #include "ns3/packet.h" | 27 #include "ns3/packet.h" |
28 #include "ns3/ipv6-header.h" | 28 #include "ns3/ipv6-header.h" |
29 | 29 |
30 namespace ns3 { | 30 namespace ns3 { |
31 namespace sixlowpan { | |
32 | 31 |
33 /** | 32 /** |
34 * \ingroup sixlowpan | 33 * \ingroup sixlowpan |
35 * \brief Dispatch header. This is a virtual class. | 34 * \brief Dispatch header helper. This class only purpose is to interpret |
| 35 * the Dispatch header into its correct type. |
36 * | 36 * |
37 * The dispatch type is defined by a zero bit as the first bit and a one | 37 * The dispatch type is defined by a zero bit as the first bit and a one |
38 * bit as the second bit. | 38 * bit as the second bit. |
39 \verbatim | 39 \verbatim |
40 1 2 3 | 40 1 2 3 |
41 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 | 41 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 |
42 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 42 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
43 |0 1| Dispatch | type-specific header | 43 |0 1| Dispatch | type-specific header |
44 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 44 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
45 \endverbatim | 45 \endverbatim |
46 */ | 46 */ |
47 class SixLowPanDispatch : public Header | 47 class SixLowPanDispatch |
48 { | 48 { |
49 public: | 49 public: |
50 /** | 50 /** |
51 * \brief Dispatch values, as defined in RFC4944 and RFC6282 | 51 * \brief Dispatch values, as defined in RFC4944 and RFC6282 |
52 \verbatim | 52 \verbatim |
53 Pattern Header Type | 53 Pattern Header Type |
54 +------------+------------------------------------------------+ | 54 +------------+------------------------------------------------+ |
55 | 00 xxxxxx | NALP - Not a LoWPAN frame | | 55 | 00 xxxxxx | NALP - Not a LoWPAN frame | |
56 | 01 000000 | ESC - Additional Dispatch byte follows | | 56 | 01 000000 | ESC - Additional Dispatch byte follows | |
57 | 01 000001 | IPv6 - Uncompressed IPv6 Addresses | | 57 | 01 000001 | IPv6 - Uncompressed IPv6 Addresses | |
(...skipping 28 matching lines...) Expand all Loading... |
86 LOWPAN_IPHC_N = 0x7F, | 86 LOWPAN_IPHC_N = 0x7F, |
87 LOWPAN_MESH = 0x80, | 87 LOWPAN_MESH = 0x80, |
88 LOWPAN_MESH_N = 0xBF, | 88 LOWPAN_MESH_N = 0xBF, |
89 LOWPAN_FRAG1 = 0xC0, | 89 LOWPAN_FRAG1 = 0xC0, |
90 LOWPAN_FRAG1_N = 0xC7, | 90 LOWPAN_FRAG1_N = 0xC7, |
91 LOWPAN_FRAGN = 0xE0, | 91 LOWPAN_FRAGN = 0xE0, |
92 LOWPAN_FRAGN_N = 0xE7, | 92 LOWPAN_FRAGN_N = 0xE7, |
93 LOWPAN_UNSUPPORTED = 0xFF | 93 LOWPAN_UNSUPPORTED = 0xFF |
94 }; | 94 }; |
95 | 95 |
| 96 /** |
| 97 * \brief Dispatch values for Next Header compression. |
| 98 * |
| 99 * The dispatch values reflect the dispatch use, since |
| 100 * some dispatch bits carry actual header compression bits. |
| 101 */ |
96 enum NhcDispatch_e | 102 enum NhcDispatch_e |
97 { | 103 { |
98 LOWPAN_NHC = 0xE0, | 104 LOWPAN_NHC = 0xE0, |
99 LOWPAN_NHC_N = 0xEF, | 105 LOWPAN_NHC_N = 0xEF, |
100 LOWPAN_UDPNHC = 0xF0, | 106 LOWPAN_UDPNHC = 0xF0, |
101 LOWPAN_UDPNHC_N = 0xF7, | 107 LOWPAN_UDPNHC_N = 0xF7, |
102 LOWPAN_NHCUNSUPPORTED = 0xFF | 108 LOWPAN_NHCUNSUPPORTED = 0xFF |
103 }; | 109 }; |
104 | 110 |
105 SixLowPanDispatch (void); | 111 SixLowPanDispatch (void); |
106 SixLowPanDispatch (Dispatch_e dispatch); | |
107 | |
108 static TypeId GetTypeId (void); | |
109 | |
110 /** | |
111 * \brief Return the instance type identifier. | |
112 * \return instance type ID | |
113 */ | |
114 virtual TypeId GetInstanceTypeId (void) const; | |
115 | |
116 virtual void Print (std::ostream& os) const; | |
117 | |
118 /** | |
119 * \brief Get the serialized size of the packet. | |
120 * \return size | |
121 */ | |
122 virtual uint32_t GetSerializedSize (void) const; | |
123 | |
124 /** | |
125 * \brief Serialize the packet. | |
126 * \param start Buffer iterator | |
127 */ | |
128 virtual void Serialize (Buffer::Iterator start) const; | |
129 | |
130 /** | |
131 * \brief Deserialize the packet. | |
132 * \param start Buffer iterator | |
133 * \return size of the packet | |
134 */ | |
135 virtual uint32_t Deserialize (Buffer::Iterator start); | |
136 | |
137 /** | |
138 * \brief Get the Dispatch type. | |
139 * \return the Dispatch type | |
140 */ | |
141 virtual Dispatch_e GetDispatchType (void) const; | |
142 | 112 |
143 /** | 113 /** |
144 * \brief Get the Dispatch type. | 114 * \brief Get the Dispatch type. |
145 * \param dispatch the dispatch value | 115 * \param dispatch the dispatch value |
146 * \return the Dispatch type | 116 * \return the Dispatch type |
147 */ | 117 */ |
148 static Dispatch_e GetDispatchType (uint8_t dispatch); | 118 static Dispatch_e GetDispatchType (uint8_t dispatch); |
149 | 119 |
150 /** | 120 /** |
151 * \brief Get the NhcDispatch type. | 121 * \brief Get the NhcDispatch type. |
152 * \param dispatch the dispatch value | 122 * \param dispatch the dispatch value |
153 * \return the NhcDispatch type | 123 * \return the NhcDispatch type |
154 */ | 124 */ |
155 static NhcDispatch_e GetNhcDispatchType (uint8_t dispatch); | 125 static NhcDispatch_e GetNhcDispatchType (uint8_t dispatch); |
156 | 126 |
157 }; | 127 }; |
158 | 128 |
159 std::ostream & operator<< (std::ostream & os, SixLowPanDispatch const & h); | 129 /** |
160 | 130 * \ingroup sixlowpan |
161 | 131 * \brief 6LoWPAN HC1 header - see RFC 4944 |
162 class SixLowPanHc1 : public SixLowPanDispatch | 132 */ |
| 133 class SixLowPanHc1 : public Header |
163 { | 134 { |
164 public: | 135 public: |
165 /** | 136 /** |
166 * \brief Kind of address compression. | 137 * \brief Kind of address compression. |
167 * | 138 * |
168 * The address compression is handled in 4 bits and might mean: | 139 * The address compression is handled in 4 bits and might mean: |
169 * PI: Prefix inline, PC: Prefix Compressed, | 140 * PI: Prefix inline, PC: Prefix Compressed, |
170 * II: Interface Identifier, Inline, IC: Interface Identifier Compressed | 141 * II: Interface Identifier, Inline, IC: Interface Identifier Compressed |
171 */ | 142 */ |
172 enum LowPanHc1Addr_e | 143 enum LowPanHc1Addr_e |
(...skipping 14 matching lines...) Expand all Loading... |
187 { | 158 { |
188 HC1_NC = 0x00, | 159 HC1_NC = 0x00, |
189 HC1_UDP = 0x01, | 160 HC1_UDP = 0x01, |
190 HC1_ICMP = 0x02, | 161 HC1_ICMP = 0x02, |
191 HC1_TCP = 0x03 | 162 HC1_TCP = 0x03 |
192 }; | 163 }; |
193 | 164 |
194 SixLowPanHc1 (void); | 165 SixLowPanHc1 (void); |
195 | 166 |
196 /** | 167 /** |
197 * \brief Return the instance type identifier. | 168 * \brief Get the type ID. |
198 * \return instance type ID | 169 * \return the object TypeId |
199 */ | 170 */ |
200 static TypeId GetTypeId (void); | 171 static TypeId GetTypeId (void); |
201 | 172 |
202 /** | 173 /** |
203 * \brief Return the instance type identifier. | 174 * \brief Return the instance type identifier. |
204 * \return instance type ID | 175 * \return instance type ID |
205 */ | 176 */ |
206 | 177 |
207 virtual TypeId GetInstanceTypeId (void) const; | 178 virtual TypeId GetInstanceTypeId (void) const; |
208 | 179 |
(...skipping 15 matching lines...) Expand all Loading... |
224 * \brief Deserialize the packet. | 195 * \brief Deserialize the packet. |
225 * \param start Buffer iterator | 196 * \param start Buffer iterator |
226 * \return size of the packet | 197 * \return size of the packet |
227 */ | 198 */ |
228 virtual uint32_t Deserialize (Buffer::Iterator start); | 199 virtual uint32_t Deserialize (Buffer::Iterator start); |
229 | 200 |
230 /** | 201 /** |
231 * \brief Get the Dispatch type. | 202 * \brief Get the Dispatch type. |
232 * \return the Dispatch type | 203 * \return the Dispatch type |
233 */ | 204 */ |
234 virtual Dispatch_e GetDispatchType (void) const; | 205 // virtual Dispatch_e GetDispatchType (void) const; |
235 | 206 |
236 /** | 207 /** |
237 * \brief Set the "Hop limit" field (TTL). | 208 * \brief Set the "Hop limit" field (TTL). |
238 * \param limit the hop limit value | 209 * \param limit the hop limit value |
239 */ | 210 */ |
240 void SetHopLimit (uint8_t limit); | 211 void SetHopLimit (uint8_t limit); |
241 | 212 |
242 /** | 213 /** |
243 * \brief Get the "Hop limit" field (TTL). | 214 * \brief Get the "Hop limit" field (TTL). |
244 * \return the hop limit value | 215 * \return the hop limit value |
245 */ | 216 */ |
246 uint8_t GetHopLimit (void) const; | 217 uint8_t GetHopLimit (void) const; |
247 | 218 |
| 219 /** |
| 220 * \brief Get Destination Compression type |
| 221 * \returns the kind of address compression |
| 222 */ |
248 LowPanHc1Addr_e GetDstCompression () const; | 223 LowPanHc1Addr_e GetDstCompression () const; |
| 224 |
| 225 /** |
| 226 * \brief Get the destination interface |
| 227 * \returns the destination interface |
| 228 */ |
249 const uint8_t* GetDstInterface () const; | 229 const uint8_t* GetDstInterface () const; |
| 230 |
| 231 /** |
| 232 * \brief Get the destination prefix |
| 233 * \returns the destination prefix |
| 234 */ |
250 const uint8_t* GetDstPrefix () const; | 235 const uint8_t* GetDstPrefix () const; |
251 | 236 |
| 237 /** |
| 238 * \brief Get the Flow Label value |
| 239 * \returns the Flow Label |
| 240 */ |
252 uint32_t GetFlowLabel () const; | 241 uint32_t GetFlowLabel () const; |
| 242 |
| 243 /** |
| 244 * \brief Get the Next Header value |
| 245 * \returns the Next Header value |
| 246 */ |
253 uint8_t GetNextHeader () const; | 247 uint8_t GetNextHeader () const; |
254 | 248 |
| 249 /** |
| 250 * \brief Get Source Compression type |
| 251 * \returns the kind of address compression |
| 252 */ |
255 LowPanHc1Addr_e GetSrcCompression () const; | 253 LowPanHc1Addr_e GetSrcCompression () const; |
| 254 |
| 255 /** |
| 256 * \brief Get the source interface |
| 257 * \returns the source interface |
| 258 */ |
256 const uint8_t* GetSrcInterface () const; | 259 const uint8_t* GetSrcInterface () const; |
| 260 |
| 261 /** |
| 262 * \brief Get the source prefix |
| 263 * \returns the source prefix |
| 264 */ |
257 const uint8_t* GetSrcPrefix () const; | 265 const uint8_t* GetSrcPrefix () const; |
258 | 266 |
| 267 /** |
| 268 * \brief Get the Traffic Class value |
| 269 * \returns the Traffic Class value |
| 270 */ |
259 uint8_t GetTrafficClass () const; | 271 uint8_t GetTrafficClass () const; |
260 | 272 |
| 273 /** |
| 274 * \brief Check if the Traffic Class and Flow Labels are compressed |
| 275 * \returns true if TC and FL are compressed |
| 276 */ |
261 bool IsTcflCompression () const; | 277 bool IsTcflCompression () const; |
| 278 |
| 279 /** |
| 280 * \brief Check if there is a HC2 compressed header |
| 281 * \returns true if next header is HC2 copressed |
| 282 */ |
262 bool IsHc2HeaderPresent () const; | 283 bool IsHc2HeaderPresent () const; |
263 | 284 |
| 285 /** |
| 286 * \brief Set Destination Compression type |
| 287 * \param dstCompression the kind of address compression |
| 288 */ |
264 void SetDstCompression (LowPanHc1Addr_e dstCompression); | 289 void SetDstCompression (LowPanHc1Addr_e dstCompression); |
| 290 |
| 291 /** |
| 292 * \brief Set the destination interface |
| 293 * \param dstInterface the destination interface |
| 294 */ |
265 void SetDstInterface (const uint8_t* dstInterface); | 295 void SetDstInterface (const uint8_t* dstInterface); |
| 296 |
| 297 /** |
| 298 * \brief Set the destination prefix |
| 299 * \param dstPrefix the destination prefix |
| 300 */ |
266 void SetDstPrefix (const uint8_t* dstPrefix); | 301 void SetDstPrefix (const uint8_t* dstPrefix); |
| 302 |
| 303 /** |
| 304 * \brief Set the Flow Label value |
| 305 * \param flowLabel the Flow Label |
| 306 */ |
267 void SetFlowLabel (uint32_t flowLabel); | 307 void SetFlowLabel (uint32_t flowLabel); |
| 308 |
| 309 /** |
| 310 * \brief Set the Next Header value |
| 311 * \param nextHeader the Next Header value |
| 312 */ |
268 void SetNextHeader (uint8_t nextHeader); | 313 void SetNextHeader (uint8_t nextHeader); |
| 314 |
| 315 /** |
| 316 * \brief Set Source Compression type |
| 317 * \param srcCompression the kind of address compression |
| 318 */ |
269 void SetSrcCompression (LowPanHc1Addr_e srcCompression); | 319 void SetSrcCompression (LowPanHc1Addr_e srcCompression); |
| 320 |
| 321 /** |
| 322 * \brief Set the source interface |
| 323 * \param srcInterface the source interface |
| 324 */ |
270 void SetSrcInterface (const uint8_t* srcInterface); | 325 void SetSrcInterface (const uint8_t* srcInterface); |
| 326 |
| 327 /** |
| 328 * \brief Set the source prefix |
| 329 * \param srcPrefix the source prefix |
| 330 */ |
271 void SetSrcPrefix (const uint8_t* srcPrefix); | 331 void SetSrcPrefix (const uint8_t* srcPrefix); |
| 332 |
| 333 /** |
| 334 * \brief Set the Traffic Class and Flow Labels as compressed |
| 335 * \param tcflCompression true if TC and FL are compressed |
| 336 */ |
272 void SetTcflCompression (bool tcflCompression); | 337 void SetTcflCompression (bool tcflCompression); |
| 338 |
| 339 /** |
| 340 * \brief Set the next header a HC2 compressed header |
| 341 * \param hc2HeaderPresent true if next header is HC2 compressed |
| 342 */ |
| 343 void SetHc2HeaderPresent (bool hc2HeaderPresent); |
| 344 |
| 345 /** |
| 346 * \brief Set the Traffic Class value |
| 347 * \param trafficClass the Traffic Class value |
| 348 */ |
273 void SetTrafficClass (uint8_t trafficClass); | 349 void SetTrafficClass (uint8_t trafficClass); |
274 void SetHc2HeaderPresent (bool hc2HeaderPresent); | |
275 | 350 |
276 private: | 351 private: |
277 // uint8_t m_serializedSize; | 352 uint8_t m_hopLimit; //!< Hop Limit |
278 // uint8_t m_encoding; | 353 uint8_t m_srcPrefix[8]; //!< Source prefix |
279 uint8_t m_hopLimit; | 354 uint8_t m_srcInterface[8]; //!< Source interface |
280 uint8_t m_srcPrefix[8]; | 355 uint8_t m_dstPrefix[8]; //!< Destinaiton prefix |
281 uint8_t m_srcInterface[8]; | 356 uint8_t m_dstInterface[8]; //!< Destination interface |
282 uint8_t m_dstPrefix[8]; | 357 uint8_t m_trafficClass; //!< Traffic Class |
283 uint8_t m_dstInterface[8]; | 358 uint32_t m_flowLabel; //!< Flow Label |
284 uint8_t m_trafficClass; | 359 uint8_t m_nextHeader; //!< Next header |
285 uint32_t m_flowLabel; | 360 LowPanHc1Addr_e m_srcCompression; //!< Source compresison type |
286 uint8_t m_nextHeader; | 361 LowPanHc1Addr_e m_dstCompression; //!< Destination compresison type |
287 LowPanHc1Addr_e m_srcCompression; | 362 bool m_tcflCompression; //!< is TC and FL compressed |
288 LowPanHc1Addr_e m_dstCompression; | 363 LowPanHc1NextHeader_e m_nextHeaderCompression; //!< next header compression |
289 bool m_tcflCompression; | 364 bool m_hc2HeaderPresent; //!< is next header HC2 compressed |
290 LowPanHc1NextHeader_e m_nextHeaderCompression; | |
291 bool m_hc2HeaderPresent; | |
292 | |
293 // uint8_t m_hcUdpEncoding; | |
294 // uint16_t m_hcUdpSrcPort; | |
295 // uint16_t m_hcUdpDstPort; | |
296 // uint16_t m_hcUdpLength; | |
297 // uint16_t m_hcUdpChecksum; | |
298 }; | 365 }; |
299 | 366 |
300 std::ostream & operator<< (std::ostream & os, SixLowPanHc1 const & h); | 367 /** |
301 | 368 * \brief Stream insertion operator. |
302 class SixLowPanFrag1 : public SixLowPanDispatch | 369 * |
| 370 * \param os the reference to the output stream |
| 371 * \param header the HC1 Header |
| 372 * \returns the reference to the output stream |
| 373 */ |
| 374 std::ostream & operator<< (std::ostream & os, SixLowPanHc1 const &header); |
| 375 |
| 376 /** |
| 377 * \ingroup sixlowpan |
| 378 * \brief 6LoWPAN FRAG1 header - see RFC 4944 |
| 379 */ |
| 380 class SixLowPanFrag1 : public Header |
303 { | 381 { |
304 public: | 382 public: |
305 SixLowPanFrag1 (void); | 383 SixLowPanFrag1 (void); |
306 | 384 |
| 385 /** |
| 386 * \brief Get the type ID. |
| 387 * \return the object TypeId |
| 388 */ |
307 static TypeId GetTypeId (void); | 389 static TypeId GetTypeId (void); |
308 | 390 |
309 /** | 391 /** |
310 * \brief Return the instance type identifier. | 392 * \brief Return the instance type identifier. |
311 * \return instance type ID | 393 * \return instance type ID |
312 */ | 394 */ |
313 virtual TypeId GetInstanceTypeId (void) const; | 395 virtual TypeId GetInstanceTypeId (void) const; |
314 | 396 |
315 virtual void Print (std::ostream& os) const; | 397 virtual void Print (std::ostream& os) const; |
316 | 398 |
(...skipping 13 matching lines...) Expand all Loading... |
330 * \brief Deserialize the packet. | 412 * \brief Deserialize the packet. |
331 * \param start Buffer iterator | 413 * \param start Buffer iterator |
332 * \return size of the packet | 414 * \return size of the packet |
333 */ | 415 */ |
334 virtual uint32_t Deserialize (Buffer::Iterator start); | 416 virtual uint32_t Deserialize (Buffer::Iterator start); |
335 | 417 |
336 /** | 418 /** |
337 * \brief Get the Dispatch type. | 419 * \brief Get the Dispatch type. |
338 * \return the Dispatch type | 420 * \return the Dispatch type |
339 */ | 421 */ |
340 virtual Dispatch_e GetDispatchType (void) const; | 422 // virtual Dispatch_e GetDispatchType (void) const; |
341 | 423 |
342 void SetDatagramSize (uint16_t datagramsize); | 424 /** |
343 | 425 * \brief Set the datagram size |
| 426 * \param datagramSize the datagram size |
| 427 */ |
| 428 void SetDatagramSize (uint16_t datagramSize); |
| 429 |
| 430 /** |
| 431 * \brief Get the datagram size |
| 432 * \returns the datagram size |
| 433 */ |
344 uint16_t GetDatagramSize (void) const; | 434 uint16_t GetDatagramSize (void) const; |
345 | 435 |
346 void SetDatagramTag (uint16_t datagramtag); | 436 /** |
347 | 437 * \brief Set the datagram tag |
| 438 * \param datagramTag the datagram tag |
| 439 */ |
| 440 void SetDatagramTag (uint16_t datagramTag); |
| 441 |
| 442 /** |
| 443 * \brief Get the datagram tag |
| 444 * \returns the datagram tag |
| 445 */ |
348 uint16_t GetDatagramTag (void) const; | 446 uint16_t GetDatagramTag (void) const; |
349 | 447 |
350 private: | 448 private: |
351 uint16_t m_datagramSize; | 449 uint16_t m_datagramSize; //!< datagram size |
352 uint16_t m_datagramTag; | 450 uint16_t m_datagramTag; //!< datagram tag |
353 | 451 |
354 }; | 452 }; |
355 | 453 |
356 std::ostream & operator<< (std::ostream & os, SixLowPanFrag1 const & h); | 454 /** |
357 | 455 * \brief Stream insertion operator. |
358 class SixLowPanFragN : public SixLowPanDispatch | 456 * |
| 457 * \param os the reference to the output stream |
| 458 * \param header the Frag1 Header |
| 459 * \returns the reference to the output stream |
| 460 */ |
| 461 std::ostream & operator<< (std::ostream & os, SixLowPanFrag1 const & header); |
| 462 |
| 463 /** |
| 464 * \ingroup sixlowpan |
| 465 * \brief 6LoWPAN FRAGN header - see RFC 4944 |
| 466 */ |
| 467 class SixLowPanFragN : public Header |
359 { | 468 { |
360 public: | 469 public: |
361 SixLowPanFragN (void); | 470 SixLowPanFragN (void); |
362 | 471 |
| 472 /** |
| 473 * \brief Get the type ID. |
| 474 * \return the object TypeId |
| 475 */ |
363 static TypeId GetTypeId (void); | 476 static TypeId GetTypeId (void); |
364 | 477 |
365 /** | 478 /** |
366 * \brief Return the instance type identifier. | 479 * \brief Return the instance type identifier. |
367 * \return instance type ID | 480 * \return instance type ID |
368 */ | 481 */ |
369 virtual TypeId GetInstanceTypeId (void) const; | 482 virtual TypeId GetInstanceTypeId (void) const; |
370 | 483 |
371 virtual void Print (std::ostream& os) const; | 484 virtual void Print (std::ostream& os) const; |
372 | 485 |
(...skipping 13 matching lines...) Expand all Loading... |
386 * \brief Deserialize the packet. | 499 * \brief Deserialize the packet. |
387 * \param start Buffer iterator | 500 * \param start Buffer iterator |
388 * \return size of the packet | 501 * \return size of the packet |
389 */ | 502 */ |
390 virtual uint32_t Deserialize (Buffer::Iterator start); | 503 virtual uint32_t Deserialize (Buffer::Iterator start); |
391 | 504 |
392 /** | 505 /** |
393 * \brief Get the Dispatch type. | 506 * \brief Get the Dispatch type. |
394 * \return the Dispatch type | 507 * \return the Dispatch type |
395 */ | 508 */ |
396 virtual Dispatch_e GetDispatchType (void) const; | 509 // virtual Dispatch_e GetDispatchType (void) const; |
397 | 510 |
398 void SetDatagramSize (uint16_t datagramsize); | 511 /** |
399 | 512 * \brief Set the datagram size |
| 513 * \param datagramSize the datagram size |
| 514 */ |
| 515 void SetDatagramSize (uint16_t datagramSize); |
| 516 |
| 517 /** |
| 518 * \brief Get the datagram size |
| 519 * \returns the datagram size |
| 520 */ |
400 uint16_t GetDatagramSize (void) const; | 521 uint16_t GetDatagramSize (void) const; |
401 | 522 |
402 void SetDatagramTag (uint16_t datagramtag); | 523 /** |
403 | 524 * \brief Set the datagram tag |
| 525 * \param datagramTag the datagram tag |
| 526 */ |
| 527 void SetDatagramTag (uint16_t datagramTag); |
| 528 |
| 529 /** |
| 530 * \brief Get the datagram tag |
| 531 * \returns the datagram tag |
| 532 */ |
404 uint16_t GetDatagramTag (void) const; | 533 uint16_t GetDatagramTag (void) const; |
405 | 534 |
406 void SetDatagramOffset (uint8_t datagramoffset); | 535 /** |
407 | 536 * \brief Set the datagram offset |
| 537 * \param datagramOffset the datagram offset |
| 538 */ |
| 539 void SetDatagramOffset (uint8_t datagramOffset); |
| 540 |
| 541 /** |
| 542 * \brief Get the datagram offset |
| 543 * \returns the datagram offset |
| 544 */ |
408 uint8_t GetDatagramOffset (void) const; | 545 uint8_t GetDatagramOffset (void) const; |
409 | 546 |
410 private: | 547 private: |
411 uint16_t m_datagramSize; | 548 uint16_t m_datagramSize; //!< datagram size |
412 uint16_t m_datagramTag; | 549 uint16_t m_datagramTag; //!< datagram tag |
413 uint8_t m_datagramOffset; | 550 uint8_t m_datagramOffset; //!< datagram offset |
414 | 551 |
415 }; | 552 }; |
416 | 553 |
417 std::ostream & operator<< (std::ostream & os, SixLowPanFragN const & h); | 554 /** |
| 555 * \brief Stream insertion operator. |
| 556 * |
| 557 * \param os the reference to the output stream |
| 558 * \param header the FragN Header |
| 559 * \returns the reference to the output stream |
| 560 */ |
| 561 std::ostream & operator<< (std::ostream & os, SixLowPanFragN const &header); |
418 | 562 |
419 /** | 563 /** |
420 * \ingroup sixlowpan | 564 * \ingroup sixlowpan |
421 * \brief LOWPAN_IPHC base Encoding | 565 * \brief LOWPAN_IPHC base Encoding - see RFC 6262 |
422 \verbatim | 566 \verbatim |
423 0 1 | 567 0 1 |
424 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | 568 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 |
425 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 569 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ |
426 | 0 | 1 | 1 | TF |NH | HLIM |CID|SAC| SAM | M |DAC| DAM | | 570 | 0 | 1 | 1 | TF |NH | HLIM |CID|SAC| SAM | M |DAC| DAM | |
427 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 571 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ |
428 \endverbatim | 572 \endverbatim |
429 */ | 573 */ |
430 class SixLowPanIphc : public SixLowPanDispatch | 574 class SixLowPanIphc : public Header |
431 { | 575 { |
432 public: | 576 public: |
433 /** | 577 /** |
434 * \brief TF: Traffic Class, Flow Label | 578 * \brief TF: Traffic Class, Flow Label |
435 * | 579 * |
436 * 00: ECN + DSCP + 4-bit Pad + Flow Label (4 bytes) | 580 * 00: ECN + DSCP + 4-bit Pad + Flow Label (4 bytes) |
437 * 01: ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided. | 581 * 01: ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided. |
438 * 10: ECN + DSCP (1 byte), Flow Label is elided. | 582 * 10: ECN + DSCP (1 byte), Flow Label is elided. |
439 * 11: Traffic Class and Flow Label are elided. | 583 * 11: Traffic Class and Flow Label are elided. |
440 * | 584 * |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 */ | 617 */ |
474 enum HeaderCompression_e | 618 enum HeaderCompression_e |
475 { | 619 { |
476 HC_INLINE = 0, | 620 HC_INLINE = 0, |
477 HC_COMPR_64, | 621 HC_COMPR_64, |
478 HC_COMPR_16, | 622 HC_COMPR_16, |
479 HC_COMPR_0 | 623 HC_COMPR_0 |
480 }; | 624 }; |
481 | 625 |
482 SixLowPanIphc (void); | 626 SixLowPanIphc (void); |
| 627 /** |
| 628 * \brief Constructor |
| 629 * \param dispatch dispatch value |
| 630 */ |
483 SixLowPanIphc (uint8_t dispatch); | 631 SixLowPanIphc (uint8_t dispatch); |
484 | 632 |
485 /** | 633 /** |
486 * \brief Return the instance type identifier. | 634 * \brief Get the type ID. |
487 * \return instance type ID | 635 * \return the object TypeId |
488 */ | 636 */ |
489 static TypeId GetTypeId (void); | 637 static TypeId GetTypeId (void); |
490 | 638 |
491 /** | 639 /** |
492 * \brief Return the instance type identifier. | 640 * \brief Return the instance type identifier. |
493 * \return instance type ID | 641 * \return instance type ID |
494 */ | 642 */ |
495 virtual TypeId GetInstanceTypeId (void) const; | 643 virtual TypeId GetInstanceTypeId (void) const; |
496 | 644 |
497 virtual void Print (std::ostream& os) const; | 645 virtual void Print (std::ostream& os) const; |
(...skipping 14 matching lines...) Expand all Loading... |
512 * \brief Deserialize the packet. | 660 * \brief Deserialize the packet. |
513 * \param start Buffer iterator | 661 * \param start Buffer iterator |
514 * \return size of the packet | 662 * \return size of the packet |
515 */ | 663 */ |
516 virtual uint32_t Deserialize (Buffer::Iterator start); | 664 virtual uint32_t Deserialize (Buffer::Iterator start); |
517 | 665 |
518 /** | 666 /** |
519 * \brief Get the Dispatch type. | 667 * \brief Get the Dispatch type. |
520 * \return the Dispatch type | 668 * \return the Dispatch type |
521 */ | 669 */ |
522 virtual Dispatch_e GetDispatchType (void) const; | 670 // virtual Dispatch_e GetDispatchType (void) const; |
523 | 671 |
524 /** | 672 /** |
525 * \brief Set the TF (Traffic Class, Flow Label) compression. | 673 * \brief Set the TF (Traffic Class, Flow Label) compression. |
526 * \param tfField ECN, DSCP, Flow Label compression type | 674 * \param tfField ECN, DSCP, Flow Label compression type |
527 */ | 675 */ |
528 void SetTf (TrafficClassFlowLabel_e tfField); | 676 void SetTf (TrafficClassFlowLabel_e tfField); |
529 | 677 |
530 /** | 678 /** |
531 * \brief Get the TF (Traffic Class, Flow Label) compression. | 679 * \brief Get the TF (Traffic Class, Flow Label) compression. |
532 * \return the ECN, DSCP, Flow Label compression type | 680 * \return the ECN, DSCP, Flow Label compression type |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 */ | 879 */ |
732 void SetDstAddress (Ipv6Address dstAddress); | 880 void SetDstAddress (Ipv6Address dstAddress); |
733 | 881 |
734 /** | 882 /** |
735 * \brief Get the Destination Address. | 883 * \brief Get the Destination Address. |
736 * \return the Destination Address. | 884 * \return the Destination Address. |
737 */ | 885 */ |
738 Ipv6Address GetDstAddress () const; | 886 Ipv6Address GetDstAddress () const; |
739 | 887 |
740 private: | 888 private: |
741 uint16_t m_baseFormat; | 889 uint16_t m_baseFormat; //!< Dispatch + encoding fields |
742 uint8_t m_srcdstContextId; | 890 uint8_t m_srcdstContextId; //!< Src and Dst Context ID |
743 uint8_t m_ecn : 2; | 891 uint8_t m_ecn : 2; //!< ECN bits |
744 uint8_t m_dscp : 6; | 892 uint8_t m_dscp : 6; //!< DSCP bits |
745 uint32_t m_flowLabel : 20; | 893 uint32_t m_flowLabel : 20; //!< Flow Label bits |
746 uint8_t m_nextHeader; | 894 uint8_t m_nextHeader; //!< Next header |
747 uint8_t m_hopLimit; | 895 uint8_t m_hopLimit; //!< Hop Limit |
748 Ipv6Address m_srcAddress; | 896 Ipv6Address m_srcAddress; //!< Src address |
749 Ipv6Address m_dstAddress; | 897 Ipv6Address m_dstAddress; //!< Dst address |
750 | 898 |
| 899 /** |
| 900 * \brief Post-process the Source address stateful compression |
| 901 * \note currently unsupported |
| 902 */ |
751 void PostProcessSac (); | 903 void PostProcessSac (); |
| 904 /** |
| 905 * \brief Post-process the Destination address stateful compression |
| 906 * \note currently unsupported |
| 907 */ |
752 void PostProcessDac (); | 908 void PostProcessDac (); |
753 | 909 |
754 }; | 910 }; |
755 | 911 |
756 std::ostream & operator<< (std::ostream & os, SixLowPanIphc const &); | 912 /** |
| 913 * \brief Stream insertion operator. |
| 914 * |
| 915 * \param os the reference to the output stream |
| 916 * \param header the IPHC Header |
| 917 * \returns the reference to the output stream |
| 918 */ |
| 919 std::ostream & operator<< (std::ostream & os, SixLowPanIphc const &header); |
757 | 920 |
758 /** | 921 /** |
759 * \ingroup sixlowpan | 922 * \ingroup sixlowpan |
760 * \brief LOWPAN_NHC Extension Header Encoding | 923 * \brief LOWPAN_NHC Extension Header Encoding - see RFC 6262 |
761 \verbatim | 924 \verbatim |
762 0 1 2 3 4 5 6 7 | 925 0 1 2 3 4 5 6 7 |
763 +---+---+---+---+---+---+---+---+ | 926 +---+---+---+---+---+---+---+---+ |
764 | 1 | 1 | 1 | 0 | EID |NH | | 927 | 1 | 1 | 1 | 0 | EID |NH | |
765 +---+---+---+---+---+---+---+---+ | 928 +---+---+---+---+---+---+---+---+ |
766 \endverbatim | 929 \endverbatim |
767 */ | 930 */ |
768 class SixLowPanNhcExtension : public SixLowPanDispatch | 931 class SixLowPanNhcExtension : public Header |
769 { | 932 { |
770 public: | 933 public: |
771 /** | 934 /** |
772 * \brief EID: IPv6 Extension Header ID | 935 * \brief EID: IPv6 Extension Header ID |
773 * | 936 * |
774 * EID: IPv6 Extension Header ID: | 937 * EID: IPv6 Extension Header ID: |
775 * 0: IPv6 Hop-by-Hop Options Header [RFC2460] | 938 * 0: IPv6 Hop-by-Hop Options Header [RFC2460] |
776 * 1: IPv6 Routing Header [RFC2460] | 939 * 1: IPv6 Routing Header [RFC2460] |
777 * 2: IPv6 Fragment Header [RFC2460] | 940 * 2: IPv6 Fragment Header [RFC2460] |
778 * 3: IPv6 Destination Options Header [RFC2460] | 941 * 3: IPv6 Destination Options Header [RFC2460] |
779 * 4: IPv6 Mobility Header [RFC6275] | 942 * 4: IPv6 Mobility Header [RFC6275] |
780 * 5: Reserved | 943 * 5: Reserved |
781 * 6: Reserved | 944 * 6: Reserved |
782 * 7: IPv6 Header | 945 * 7: IPv6 Header |
783 */ | 946 */ |
784 enum Eid_e | 947 enum Eid_e |
785 { | 948 { |
786 EID_HOPBYHOP_OPTIONS_H = 0, | 949 EID_HOPBYHOP_OPTIONS_H = 0, |
787 EID_ROUTING_H, | 950 EID_ROUTING_H, |
788 EID_FRAGMENTATION_H, | 951 EID_FRAGMENTATION_H, |
789 EID_DESTINATION_OPTIONS_H, | 952 EID_DESTINATION_OPTIONS_H, |
790 EID_MOBILITY_H, | 953 EID_MOBILITY_H, |
791 EID_IPv6_H = 7 | 954 EID_IPv6_H = 7 |
792 }; | 955 }; |
793 | 956 |
794 SixLowPanNhcExtension (void); | 957 SixLowPanNhcExtension (void); |
795 | 958 |
796 /** | 959 /** |
797 * \brief Return the instance type identifier. | 960 * \brief Get the type ID. |
798 * \return instance type ID | 961 * \return the object TypeId |
799 */ | 962 */ |
800 static TypeId GetTypeId (void); | 963 static TypeId GetTypeId (void); |
801 | 964 |
802 /** | 965 /** |
803 * \brief Return the instance type identifier. | 966 * \brief Return the instance type identifier. |
804 * \return instance type ID | 967 * \return instance type ID |
805 */ | 968 */ |
806 virtual TypeId GetInstanceTypeId (void) const; | 969 virtual TypeId GetInstanceTypeId (void) const; |
807 | 970 |
808 virtual void Print (std::ostream& os) const; | 971 virtual void Print (std::ostream& os) const; |
(...skipping 14 matching lines...) Expand all Loading... |
823 * \brief Deserialize the packet. | 986 * \brief Deserialize the packet. |
824 * \param start Buffer iterator | 987 * \param start Buffer iterator |
825 * \return size of the packet | 988 * \return size of the packet |
826 */ | 989 */ |
827 virtual uint32_t Deserialize (Buffer::Iterator start); | 990 virtual uint32_t Deserialize (Buffer::Iterator start); |
828 | 991 |
829 /** | 992 /** |
830 * \brief Get the NhcDispatch type. | 993 * \brief Get the NhcDispatch type. |
831 * \return the NhcDispatch type | 994 * \return the NhcDispatch type |
832 */ | 995 */ |
833 virtual NhcDispatch_e GetNhcDispatchType (void) const; | 996 virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType (void) const; |
834 | 997 |
835 /** | 998 /** |
836 * \brief Set the Extension Header Type. | 999 * \brief Set the Extension Header Type. |
837 * \param extensionHeaderType the Extension Header Type | 1000 * \param extensionHeaderType the Extension Header Type |
838 */ | 1001 */ |
839 void SetEid (Eid_e extensionHeaderType); | 1002 void SetEid (Eid_e extensionHeaderType); |
840 | 1003 |
841 /** | 1004 /** |
842 * \brief Get the Extension Header Type. | 1005 * \brief Get the Extension Header Type. |
843 * \return the Extension Header Type | 1006 * \return the Extension Header Type |
(...skipping 17 matching lines...) Expand all Loading... |
861 * \param nhField the NH field value | 1024 * \param nhField the NH field value |
862 */ | 1025 */ |
863 void SetNh (bool nhField); | 1026 void SetNh (bool nhField); |
864 | 1027 |
865 /** | 1028 /** |
866 * \brief Get the Next Header field value. | 1029 * \brief Get the Next Header field value. |
867 * \return the NH field value | 1030 * \return the NH field value |
868 */ | 1031 */ |
869 bool GetNh (void) const; | 1032 bool GetNh (void) const; |
870 | 1033 |
| 1034 /** |
| 1035 * \brief Set the option header data blob. |
| 1036 * \param blob a buffer holding the blob data |
| 1037 * \param size the data blob size |
| 1038 */ |
| 1039 void SetBlob (const uint8_t* blob, uint32_t size); |
| 1040 |
| 1041 /** |
| 1042 * \brief Get the option header data blob. |
| 1043 * \param blob a buffer to copy the blob data into |
| 1044 * \param size the size of the buffer |
| 1045 * \return the length of the copied data |
| 1046 */ |
| 1047 uint32_t CopyBlob (uint8_t* blob, uint32_t size) const; |
| 1048 |
871 private: | 1049 private: |
872 uint8_t m_nhcExtensionHeader; | 1050 uint8_t m_nhcExtensionHeader; //!< NHC extension header type |
873 uint8_t m_nhcNextHeader; | 1051 uint8_t m_nhcNextHeader; //!< Next header |
874 | 1052 uint8_t m_nhcBlobLength; //!< Length of the NHC compressed header |
| 1053 uint8_t m_nhcBlob[256]; //!< NHC compressed header |
875 }; | 1054 }; |
| 1055 |
| 1056 /** |
| 1057 * \brief Stream insertion operator. |
| 1058 * |
| 1059 * \param os the reference to the output stream |
| 1060 * \param header the NHC Extension Header |
| 1061 * \returns the reference to the output stream |
| 1062 */ |
| 1063 std::ostream & operator<< (std::ostream & os, SixLowPanNhcExtension const &heade
r); |
| 1064 |
876 | 1065 |
877 /** | 1066 /** |
878 * \ingroup sixlowpan | 1067 * \ingroup sixlowpan |
879 * \brief UDP LOWPAN_NHC Extension Header Encoding | 1068 * \brief UDP LOWPAN_NHC Extension Header Encoding - see RFC 6262 |
880 \verbatim | 1069 \verbatim |
881 0 1 2 3 4 5 6 7 | 1070 0 1 2 3 4 5 6 7 |
882 +---+---+---+---+---+---+---+---+ | 1071 +---+---+---+---+---+---+---+---+ |
883 | 1 | 1 | 1 | 1 | 0 | C | P | | 1072 | 1 | 1 | 1 | 1 | 0 | C | P | |
884 +---+---+---+---+---+---+---+---+ | 1073 +---+---+---+---+---+---+---+---+ |
885 \endverbatim | 1074 \endverbatim |
886 */ | 1075 */ |
887 class SixLowPanUdpNhcExtension : public SixLowPanDispatch | 1076 class SixLowPanUdpNhcExtension : public Header |
888 { | 1077 { |
889 public: | 1078 public: |
890 /** | 1079 /** |
891 * \brief Ports: | 1080 * \brief Ports: |
892 * | 1081 * |
893 * 00: 16 bits for both Source Port and Destination Port | 1082 * 00: 16 bits for both Source Port and Destination Port |
894 * 01: 16 bits for Source Port. Last 8 bits for Destination Port | 1083 * 01: 16 bits for Source Port. Last 8 bits for Destination Port |
895 * 10: Last 8 bits for Source Port. All 16 bits for Destination Port | 1084 * 10: Last 8 bits for Source Port. All 16 bits for Destination Port |
896 * 11: Last 4 bits of both Source Port and Destination Port | 1085 * 11: Last 4 bits of both Source Port and Destination Port |
897 */ | 1086 */ |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 * \brief Deserialize the packet. | 1124 * \brief Deserialize the packet. |
936 * \param start Buffer iterator | 1125 * \param start Buffer iterator |
937 * \return size of the packet | 1126 * \return size of the packet |
938 */ | 1127 */ |
939 virtual uint32_t Deserialize (Buffer::Iterator start); | 1128 virtual uint32_t Deserialize (Buffer::Iterator start); |
940 | 1129 |
941 /** | 1130 /** |
942 * \brief Get the NhcDispatch type. | 1131 * \brief Get the NhcDispatch type. |
943 * \return the NhcDispatch type | 1132 * \return the NhcDispatch type |
944 */ | 1133 */ |
945 virtual NhcDispatch_e GetNhcDispatchType (void) const; | 1134 virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType (void) const; |
946 | 1135 |
947 /** | 1136 /** |
948 * \brief Set the Ports Type. | 1137 * \brief Set the compressed Src and Dst Ports. |
949 * \param extensionHeaderType the Ports | 1138 * \param port Src and Dst the Ports |
950 */ | 1139 */ |
951 void SetPorts (Ports_e port); | 1140 void SetPorts (Ports_e port); |
952 | 1141 |
953 /** | 1142 /** |
954 * \brief Get the Extension Header Type. | 1143 * \brief Get the compressed Src and Dst Ports. |
955 * \return the Extension Header Type | 1144 * \return the Src and Dst Ports |
956 */ | 1145 */ |
957 Ports_e GetPorts (void) const; | 1146 Ports_e GetPorts (void) const; |
958 | 1147 |
959 /** | 1148 /** |
960 * \brief Set the Destination Port. | 1149 * \brief Set the Destination Port. |
961 * \param port the Destination Port. | 1150 * \param port the Destination Port. |
962 */ | 1151 */ |
963 void SetSrcPort (uint16_t port); | 1152 void SetSrcPort (uint16_t port); |
964 | 1153 |
965 /** | 1154 /** |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 */ | 1187 */ |
999 void SetChecksum (uint16_t checksum); | 1188 void SetChecksum (uint16_t checksum); |
1000 | 1189 |
1001 /** | 1190 /** |
1002 * \brief Get the Checksum field value. | 1191 * \brief Get the Checksum field value. |
1003 * \return the Checksum field value | 1192 * \return the Checksum field value |
1004 */ | 1193 */ |
1005 uint16_t GetChecksum (void) const; | 1194 uint16_t GetChecksum (void) const; |
1006 | 1195 |
1007 private: | 1196 private: |
1008 uint8_t m_baseFormat; | 1197 uint8_t m_baseFormat; //!< Dispatch + encoding fields |
1009 uint16_t m_checksum; | 1198 uint16_t m_checksum; //!< Checksum |
1010 uint16_t m_srcPort; | 1199 uint16_t m_srcPort; //!< Source port |
1011 uint16_t m_dstPort; | 1200 uint16_t m_dstPort; //!< Destination port |
1012 }; | 1201 }; |
1013 | 1202 |
1014 std::ostream & operator<< (std::ostream & os, SixLowPanUdpNhcExtension const &); | 1203 /** |
| 1204 * \brief Stream insertion operator. |
| 1205 * |
| 1206 * \param os the reference to the output stream |
| 1207 * \param header the UDP NHC Extension Header |
| 1208 * \returns the reference to the output stream |
| 1209 */ |
| 1210 std::ostream & operator<< (std::ostream & os, SixLowPanUdpNhcExtension const &he
ader); |
1015 | 1211 |
1016 } | 1212 } |
1017 } | |
1018 | 1213 |
1019 #endif /* SIXLOWPANHEADER_H_ */ | 1214 #endif /* SIXLOWPANHEADER_H_ */ |
LEFT | RIGHT |