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) 2006 INRIA | 3 * Copyright (c) 2006 INRIA |
4 * Copyright (c) 2009 MIRKO BANCHI | 4 * Copyright (c) 2009 MIRKO BANCHI |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 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· | 7 * it under the terms of the GNU General Public License version 2 as· |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 uint32_t | 383 uint32_t |
384 MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) | 384 MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) |
385 { | 385 { |
386 Buffer::Iterator i = start; | 386 Buffer::Iterator i = start; |
387 i = m_capability.Deserialize (i); | 387 i = m_capability.Deserialize (i); |
388 i = m_code.Deserialize (i); | 388 i = m_code.Deserialize (i); |
389 m_aid = i.ReadNtohU16 (); | 389 m_aid = i.ReadNtohU16 (); |
390 i = m_rates.Deserialize (i); | 390 i = m_rates.Deserialize (i); |
391 return i.GetDistanceFrom (start); | 391 return i.GetDistanceFrom (start); |
392 } | 392 } |
393 | 393 /********************************************************** |
394 /**************************** | 394 * ActionFrame |
395 * Action frames | 395 **********************************************************/ |
396 ******************************/ | 396 WifiActionHeader::WifiActionHeader () |
397 | 397 { |
398 NS_OBJECT_ENSURE_REGISTERED (MgtActionFrameHeader); | 398 } |
399 | 399 WifiActionHeader::~WifiActionHeader () |
| 400 { |
| 401 } |
| 402 void |
| 403 WifiActionHeader::SetAction (WifiActionHeader::CategoryValue type, |
| 404 WifiActionHeader::ActionValue action) |
| 405 { |
| 406 m_category = type; |
| 407 |
| 408 switch (type) |
| 409 { |
| 410 case BLOCK_ACK: |
| 411 { |
| 412 m_actionValue = action.blockAck; |
| 413 break; |
| 414 } |
| 415 case MESH_PEERING_MGT: |
| 416 { |
| 417 m_actionValue = action.peerLink; |
| 418 break; |
| 419 } |
| 420 case MESH_PATH_SELECTION: |
| 421 { |
| 422 m_actionValue = action.pathSelection; |
| 423 break; |
| 424 } |
| 425 case MESH_LINK_METRIC: |
| 426 case MESH_INTERWORKING: |
| 427 case MESH_RESOURCE_COORDINATION: |
| 428 case MESH_PROXY_FORWARDING: |
| 429 break; |
| 430 } |
| 431 } |
| 432 WifiActionHeader::CategoryValue |
| 433 WifiActionHeader::GetCategory () |
| 434 { |
| 435 switch (m_category) |
| 436 { |
| 437 case BLOCK_ACK: |
| 438 return BLOCK_ACK; |
| 439 case MESH_PEERING_MGT: |
| 440 return MESH_PEERING_MGT; |
| 441 case MESH_LINK_METRIC: |
| 442 return MESH_LINK_METRIC; |
| 443 case MESH_PATH_SELECTION: |
| 444 return MESH_PATH_SELECTION; |
| 445 case MESH_INTERWORKING: |
| 446 return MESH_INTERWORKING; |
| 447 case MESH_RESOURCE_COORDINATION: |
| 448 return MESH_RESOURCE_COORDINATION; |
| 449 case MESH_PROXY_FORWARDING: |
| 450 return MESH_PROXY_FORWARDING; |
| 451 default: |
| 452 NS_FATAL_ERROR ("Unknown action value"); |
| 453 return MESH_PEERING_MGT; |
| 454 } |
| 455 } |
| 456 WifiActionHeader::ActionValue |
| 457 WifiActionHeader::GetAction () |
| 458 { |
| 459 ActionValue retval; |
| 460 retval.peerLink = PEER_LINK_OPEN; // Needs to be initialized to something to q
uiet valgrind in default cases |
| 461 switch (m_category) |
| 462 { |
| 463 case BLOCK_ACK: |
| 464 switch (m_actionValue) |
| 465 { |
| 466 case BLOCK_ACK_ADDBA_REQUEST: |
| 467 retval.blockAck = BLOCK_ACK_ADDBA_REQUEST; |
| 468 return retval; |
| 469 case BLOCK_ACK_ADDBA_RESPONSE: |
| 470 retval.blockAck = BLOCK_ACK_ADDBA_RESPONSE; |
| 471 return retval; |
| 472 case BLOCK_ACK_DELBA: |
| 473 retval.blockAck = BLOCK_ACK_DELBA; |
| 474 return retval; |
| 475 } |
| 476 case MESH_PEERING_MGT: |
| 477 switch (m_actionValue) |
| 478 { |
| 479 case PEER_LINK_OPEN: |
| 480 retval.peerLink = PEER_LINK_OPEN; |
| 481 return retval; |
| 482 case PEER_LINK_CONFIRM: |
| 483 retval.peerLink = PEER_LINK_CONFIRM; |
| 484 return retval; |
| 485 case PEER_LINK_CLOSE: |
| 486 retval.peerLink = PEER_LINK_CLOSE; |
| 487 return retval; |
| 488 default: |
| 489 NS_FATAL_ERROR ("Unknown mesh peering management action code"); |
| 490 retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ |
| 491 return retval; |
| 492 } |
| 493 case MESH_PATH_SELECTION: |
| 494 switch (m_actionValue) |
| 495 { |
| 496 case PATH_SELECTION: |
| 497 retval.pathSelection = PATH_SELECTION; |
| 498 return retval; |
| 499 default: |
| 500 NS_FATAL_ERROR ("Unknown mesh path selection action code"); |
| 501 retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ |
| 502 return retval; |
| 503 } |
| 504 case MESH_LINK_METRIC: |
| 505 // not yet supported |
| 506 case MESH_INTERWORKING: |
| 507 // not yet supported |
| 508 case MESH_RESOURCE_COORDINATION: |
| 509 // not yet supported |
| 510 default: |
| 511 NS_FATAL_ERROR ("Unsupported mesh action"); |
| 512 retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */ |
| 513 return retval; |
| 514 } |
| 515 } |
400 TypeId | 516 TypeId |
401 MgtActionFrameHeader::GetTypeId (void) | 517 WifiActionHeader::GetTypeId () |
402 { | 518 { |
403 static TypeId tid = TypeId ("ns3::MgtActionFrameHeader") | 519 static TypeId tid = TypeId ("ns3::WifiActionHeader") |
404 .SetParent<Header> () | 520 .SetParent<Header> () |
405 ; | 521 .AddConstructor<WifiActionHeader> (); |
406 return tid; | 522 return tid; |
407 } | 523 } |
408 | |
409 TypeId | 524 TypeId |
410 MgtActionFrameHeader::GetInstanceTypeId (void) const | 525 WifiActionHeader::GetInstanceTypeId () const |
411 { | 526 { |
412 return GetTypeId (); | 527 return GetTypeId (); |
413 } | 528 } |
414 | 529 void |
415 void | 530 WifiActionHeader::Print (std::ostream &os) const |
416 MgtActionFrameHeader::Print (std::ostream &os) const | 531 { |
417 {} | 532 } |
418 | 533 uint32_t |
419 uint32_t | 534 WifiActionHeader::GetSerializedSize () const |
420 MgtActionFrameHeader::GetSerializedSize (void) const | |
421 { | 535 { |
422 return 2; | 536 return 2; |
423 } | 537 } |
424 | 538 void |
425 void | 539 WifiActionHeader::Serialize (Buffer::Iterator start) const |
426 MgtActionFrameHeader::Serialize (Buffer::Iterator start) const | 540 { |
427 { | 541 start.WriteU8 (m_category); |
428 //This header MUST be serialized with Action Frames. | 542 start.WriteU8 (m_actionValue); |
429 } | 543 } |
430 | 544 uint32_t |
431 uint32_t | 545 WifiActionHeader::Deserialize (Buffer::Iterator start) |
432 MgtActionFrameHeader::Deserialize (Buffer::Iterator start) | 546 { |
433 { | 547 Buffer::Iterator i = start; |
434 Buffer::Iterator i = start; | 548 m_category = i.ReadU8 (); |
435 m_category = start.ReadU8 (); | 549 m_actionValue = i.ReadU8 (); |
436 m_action = start.ReadU8 (); | |
437 return i.GetDistanceFrom (start); | 550 return i.GetDistanceFrom (start); |
438 } | |
439 | |
440 ActionFrameType | |
441 MgtActionFrameHeader::GetType (void) const | |
442 { | |
443 switch (m_category) { | |
444 case SPECTRUM_MANAGEMENT: | |
445 case QOS: | |
446 case DLS: | |
447 case BLOCK_ACK: | |
448 switch (m_action) { | |
449 case 0: | |
450 return BLOCK_ACK_ADDBA_REQUEST; | |
451 break; | |
452 case 1: | |
453 return BLOCK_ACK_ADDBA_RESPONSE; | |
454 break; | |
455 case 2: | |
456 return BLOCK_ACK_DELBA; | |
457 break; | |
458 } | |
459 break; | |
460 } | |
461 NS_ASSERT (false); | |
462 return (enum ActionFrameType)-1; | |
463 } | |
464 | |
465 bool | |
466 MgtActionFrameHeader::IsAddBaRequest (void) const | |
467 { | |
468 return (m_category == 3 && m_action == 0)?true:false; | |
469 } | |
470 | |
471 bool | |
472 MgtActionFrameHeader::IsAddBaResponse (void) const | |
473 { | |
474 return (m_category == 3 && m_action == 1)?true:false; | |
475 } | |
476 | |
477 bool | |
478 MgtActionFrameHeader::IsDelBa (void) const | |
479 { | |
480 return (m_category == 3 && m_action == 2)?true:false; | |
481 } | 551 } |
482 | 552 |
483 /*************************************************** | 553 /*************************************************** |
484 * ADDBARequest | 554 * ADDBARequest |
485 ****************************************************/ | 555 ****************************************************/ |
486 | 556 |
487 NS_OBJECT_ENSURE_REGISTERED (MgtAddBaRequestHeader); | 557 NS_OBJECT_ENSURE_REGISTERED (MgtAddBaRequestHeader); |
488 | 558 |
489 MgtAddBaRequestHeader::MgtAddBaRequestHeader () | 559 MgtAddBaRequestHeader::MgtAddBaRequestHeader () |
490 : m_dialogToken (1), | 560 : m_dialogToken (1), |
(...skipping 18 matching lines...) Expand all Loading... |
509 } | 579 } |
510 | 580 |
511 void | 581 void |
512 MgtAddBaRequestHeader::Print (std::ostream &os) const | 582 MgtAddBaRequestHeader::Print (std::ostream &os) const |
513 {} | 583 {} |
514 | 584 |
515 uint32_t | 585 uint32_t |
516 MgtAddBaRequestHeader::GetSerializedSize (void) const | 586 MgtAddBaRequestHeader::GetSerializedSize (void) const |
517 { | 587 { |
518 uint32_t size = 0; | 588 uint32_t size = 0; |
519 size += 1; //Category· | |
520 size += 1; //Action | |
521 size += 1; //Dialog token | 589 size += 1; //Dialog token |
522 size += 2; //Block ack parameter set | 590 size += 2; //Block ack parameter set |
523 size += 2; //Block ack timeout value | 591 size += 2; //Block ack timeout value |
524 size += 2; //Starting sequence control | 592 size += 2; //Starting sequence control |
525 return size; | 593 return size; |
526 } | 594 } |
527 | 595 |
528 void | 596 void |
529 MgtAddBaRequestHeader::Serialize (Buffer::Iterator start) const | 597 MgtAddBaRequestHeader::Serialize (Buffer::Iterator start) const |
530 { | 598 { |
531 Buffer::Iterator i = start; | 599 Buffer::Iterator i = start; |
532 i.WriteU8 (M_CATEGORY); | |
533 i.WriteU8 (M_ACTION); | |
534 i.WriteU8 (m_dialogToken); | 600 i.WriteU8 (m_dialogToken); |
535 i.WriteHtolsbU16 (GetParameterSet ()); | 601 i.WriteHtolsbU16 (GetParameterSet ()); |
536 i.WriteHtolsbU16 (m_timeoutValue); | 602 i.WriteHtolsbU16 (m_timeoutValue); |
537 i.WriteHtolsbU16 (GetStartingSequenceControl ()); | 603 i.WriteHtolsbU16 (GetStartingSequenceControl ()); |
538 } | 604 } |
539 | 605 |
540 uint32_t | 606 uint32_t |
541 MgtAddBaRequestHeader::Deserialize (Buffer::Iterator start) | 607 MgtAddBaRequestHeader::Deserialize (Buffer::Iterator start) |
542 { | 608 { |
543 Buffer::Iterator i = start; | 609 Buffer::Iterator i = start; |
544 i.Next (1); //m_category = i.ReadU8 (); | |
545 i.Next (1); //m_action = i.ReadU8 (); | |
546 m_dialogToken = i.ReadU8 (); | 610 m_dialogToken = i.ReadU8 (); |
547 SetParameterSet (i.ReadLsbtohU16 ()); | 611 SetParameterSet (i.ReadLsbtohU16 ()); |
548 m_timeoutValue = i.ReadLsbtohU16 (); | 612 m_timeoutValue = i.ReadLsbtohU16 (); |
549 SetStartingSequenceControl (i.ReadLsbtohU16 ()); | 613 SetStartingSequenceControl (i.ReadLsbtohU16 ()); |
550 return i.GetDistanceFrom (start); | 614 return i.GetDistanceFrom (start); |
551 } | 615 } |
552 | 616 |
553 void | 617 void |
554 MgtAddBaRequestHeader::SetDelayedBlockAck () | 618 MgtAddBaRequestHeader::SetDelayedBlockAck () |
555 { | 619 { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 void | 756 void |
693 MgtAddBaResponseHeader::Print (std::ostream &os) const | 757 MgtAddBaResponseHeader::Print (std::ostream &os) const |
694 { | 758 { |
695 os <<"status code="<<m_code; | 759 os <<"status code="<<m_code; |
696 } | 760 } |
697 | 761 |
698 uint32_t | 762 uint32_t |
699 MgtAddBaResponseHeader::GetSerializedSize (void) const | 763 MgtAddBaResponseHeader::GetSerializedSize (void) const |
700 { | 764 { |
701 uint32_t size = 0; | 765 uint32_t size = 0; |
702 size += 1; //Category· | |
703 size += 1; //Action | |
704 size += 1; //Dialog token | 766 size += 1; //Dialog token |
705 size += m_code.GetSerializedSize (); //Status code | 767 size += m_code.GetSerializedSize (); //Status code |
706 size += 2; //Block ack parameter set | 768 size += 2; //Block ack parameter set |
707 size += 2; //Block ack timeout value | 769 size += 2; //Block ack timeout value |
708 return size; | 770 return size; |
709 } | 771 } |
710 | 772 |
711 void | 773 void |
712 MgtAddBaResponseHeader::Serialize (Buffer::Iterator start) const | 774 MgtAddBaResponseHeader::Serialize (Buffer::Iterator start) const |
713 { | 775 { |
714 Buffer::Iterator i = start; | 776 Buffer::Iterator i = start; |
715 i.WriteU8 (M_CATEGORY); | |
716 i.WriteU8 (M_ACTION); | |
717 i.WriteU8 (m_dialogToken); | 777 i.WriteU8 (m_dialogToken); |
718 i = m_code.Serialize (i); | 778 i = m_code.Serialize (i); |
719 i.WriteHtolsbU16 (GetParameterSet ()); | 779 i.WriteHtolsbU16 (GetParameterSet ()); |
720 i.WriteHtolsbU16 (m_timeoutValue); | 780 i.WriteHtolsbU16 (m_timeoutValue); |
721 } | 781 } |
722 | 782 |
723 uint32_t | 783 uint32_t |
724 MgtAddBaResponseHeader::Deserialize (Buffer::Iterator start) | 784 MgtAddBaResponseHeader::Deserialize (Buffer::Iterator start) |
725 { | 785 { |
726 Buffer::Iterator i = start; | 786 Buffer::Iterator i = start; |
727 i.Next (1); //m_category = i.ReadU8 (); | |
728 i.Next (1); //m_action = i.ReadU8 (); | |
729 m_dialogToken = i.ReadU8 (); | 787 m_dialogToken = i.ReadU8 (); |
730 i = m_code.Deserialize (i); | 788 i = m_code.Deserialize (i); |
731 SetParameterSet (i.ReadLsbtohU16 ()); | 789 SetParameterSet (i.ReadLsbtohU16 ()); |
732 m_timeoutValue = i.ReadLsbtohU16 (); | 790 m_timeoutValue = i.ReadLsbtohU16 (); |
733 return i.GetDistanceFrom (start); | 791 return i.GetDistanceFrom (start); |
734 } | 792 } |
735 | 793 |
736 void | 794 void |
737 MgtAddBaResponseHeader::SetDelayedBlockAck () | 795 MgtAddBaResponseHeader::SetDelayedBlockAck () |
738 { | 796 { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 } | 917 } |
860 | 918 |
861 void | 919 void |
862 MgtDelBaHeader::Print (std::ostream &os) const | 920 MgtDelBaHeader::Print (std::ostream &os) const |
863 {} | 921 {} |
864 | 922 |
865 uint32_t | 923 uint32_t |
866 MgtDelBaHeader::GetSerializedSize (void) const | 924 MgtDelBaHeader::GetSerializedSize (void) const |
867 { | 925 { |
868 uint32_t size = 0; | 926 uint32_t size = 0; |
869 size += 1; //Category | |
870 size += 1; //Action | |
871 size += 2; //DelBa parameter set | 927 size += 2; //DelBa parameter set |
872 size += 2; //Reason code | 928 size += 2; //Reason code |
873 return size; | 929 return size; |
874 } | 930 } |
875 | 931 |
876 void | 932 void |
877 MgtDelBaHeader::Serialize (Buffer::Iterator start) const | 933 MgtDelBaHeader::Serialize (Buffer::Iterator start) const |
878 { | 934 { |
879 Buffer::Iterator i = start; | 935 Buffer::Iterator i = start; |
880 i.WriteU8 (M_CATEGORY); | |
881 i.WriteU8 (M_ACTION); | |
882 i.WriteHtolsbU16 (GetParameterSet ()); | 936 i.WriteHtolsbU16 (GetParameterSet ()); |
883 i.WriteHtolsbU16 (m_reasonCode); | 937 i.WriteHtolsbU16 (m_reasonCode); |
884 } | 938 } |
885 | 939 |
886 uint32_t | 940 uint32_t |
887 MgtDelBaHeader::Deserialize (Buffer::Iterator start) | 941 MgtDelBaHeader::Deserialize (Buffer::Iterator start) |
888 { | 942 { |
889 Buffer::Iterator i = start; | 943 Buffer::Iterator i = start; |
890 i.Next (1); //m_category = i.ReadU8 (); | |
891 i.Next (1); //m_action = i.ReadU8 (); | |
892 SetParameterSet (i.ReadLsbtohU16 ()); | 944 SetParameterSet (i.ReadLsbtohU16 ()); |
893 m_reasonCode = i.ReadLsbtohU16 (); | 945 m_reasonCode = i.ReadLsbtohU16 (); |
894 return i.GetDistanceFrom (start); | 946 return i.GetDistanceFrom (start); |
895 } | 947 } |
896 | 948 |
897 bool | 949 bool |
898 MgtDelBaHeader::IsByOriginator (void) const | 950 MgtDelBaHeader::IsByOriginator (void) const |
899 { | 951 { |
900 return (m_initiator == 1)?true:false; | 952 return (m_initiator == 1)?true:false; |
901 } | 953 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 } | 989 } |
938 | 990 |
939 void | 991 void |
940 MgtDelBaHeader::SetParameterSet (uint16_t params) | 992 MgtDelBaHeader::SetParameterSet (uint16_t params) |
941 { | 993 { |
942 m_initiator = (params >> 11) & 0x01; | 994 m_initiator = (params >> 11) & 0x01; |
943 m_tid = (params >> 12) & 0x0f; | 995 m_tid = (params >> 12) & 0x0f; |
944 } | 996 } |
945 | 997 |
946 } // namespace ns3 | 998 } // namespace ns3 |
LEFT | RIGHT |